
    BhKX                        d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d dl m!Z! d dl"m#Z#m$Z$m%Z% d dl&m'Z'm(Z(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6  ejn                  d      jp                  jr                  Z: G d de%      Z; G d de;      Z< e=d e>e:e<gz          e?             Z@ G d de;      ZAy)     N)OrderedDict)flatten_context)apps)settings)	get_token)render_to_string)Resolver404resolve)cached_property)override)__version__)LEFTREFRESH_PAGE)CMSToolbarLoginForm)PlaceholderUserSettingsTemplatesCache)
ButtonListMenuToolbarAPIMixin)get_object_edit_urlget_object_preview_urlget_object_structure_url)toolbar_pool)get_language_from_request)DJANGO_VERSIONPYTHON_VERSION)installed_appsget_cms_setting)get_site_language_from_requestcmsc                       e Zd Zg Z ed      Zed        Zed        Zed        Z	d Z
ed        Zed        Zed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zy)BaseToolbarCMS_TOOLBAR_URL__DISABLEc                    t        | j                  dd       r| j                  j                  S 	 t        | d      rt	        | j
                        }|S t	        | j                  j                        }	 |S # t        $ r d }Y |S w xY w)Nresolver_matchrequest_path)getattrrequestr(   hasattrr
   r)   	path_infor	   )selfmatchs     C/home/dcms/DCMS/lib/python3.12/site-packages/cms/toolbar/toolbar.py_resolver_matchzBaseToolbar._resolver_match*   s    4<<!148<<...	t^, 1 12
    6 67   	E	s   !A4 A4 4BBc                 z    | j                   j                  }|r|j                  nd }t        | j                   |      S N)r+   current_pagesite_idr"   )r.   cms_pager5   s      r0   site_languagezBaseToolbar.site_language8   s1    <<,,&.(""D-dllGDD    c                 t    t         j                  rt        | j                        }|S t         j                  }|S r3   )r   USE_I18Nr   r+   LANGUAGE_CODE)r.   languages     r0   request_languagezBaseToolbar.request_language>   s2    0>H   --Hr8   c                 J    | j                   r| j                  S | j                  S r3   )uses_legacy_structure_modelegacy_renderercontent_rendererr.   s    r0   get_content_rendererz BaseToolbar.get_content_rendererF   s#    **'''$$$r8   c                 4    ddl m}  || j                        S )Nr   )LegacyRendererr+   )cms.plugin_renderingrE   r+   )r.   rE   s     r0   r@   zBaseToolbar.legacy_rendererK   s    7dll33r8   c                 4    ddl m}  || j                        S )Nr   )ContentRendererrF   )rG   rI   r+   )r.   rI   s     r0   rA   zBaseToolbar.content_rendererQ   s    8t||44r8   c                 4    ddl m}  || j                        S )Nr   )StructureRendererrF   )rG   rK   r+   )r.   rK   s     r0   structure_rendererzBaseToolbar.structure_rendererW   s    : 66r8   c                 f    | j                   r%| j                  r| j                  j                  dk(  S y)N'cms_placeholder_render_object_structureFis_staffr1   url_namerB   s    r0   structure_mode_activez!BaseToolbar.structure_mode_active]   s,    ==T11''004]]]r8   c                     | j                   sy| j                  ry| j                  r%| j                  r| j                  j                  dk(  S y)z7``True`` if the structure board editing mode is active.FT"cms_placeholder_render_object_edit)show_toolbarrR   rP   r1   rQ   rB   s    r0   edit_mode_activezBaseToolbar.edit_mode_activec   sF       %%==T11''004XXXr8   c                 f    | j                   r%| j                  r| j                  j                  dk(  S y)z#``True`` if preview mode is active.%cms_placeholder_render_object_previewFrO   rB   s    r0   preview_mode_activezBaseToolbar.preview_mode_activeo   s.     ==T11''004[[[r8   c                 8    | j                   xr | j                   S )z#``True`` if content mode is active.)rP   rV   rB   s    r0   content_mode_activezBaseToolbar.content_mode_activev   s     }}:T%:%:!::r8   c                      yNF rB   s    r0   r?   z&BaseToolbar.uses_legacy_structure_mode{   s    r8   c                     t               S r3   r   rB   s    r0   	templateszBaseToolbar.templates   s    r8   c                     t        d      S )NSIDEFRAME_ENABLEDr    rB   s    r0   sideframe_enabledzBaseToolbar.sideframe_enabled   s    233r8   N)__name__
__module____qualname__watch_modelsr!   disable_urlr   r1   r7   r=   rC   r@   rA   rL   rR   rV   rY   r[   r?   r`   rc   r^   r8   r0   r%   r%   #   s    L!"<=K  E E
  %
 4 4
 5 5
 7 7
  
 	 	   ; ;       4 4r8   r%   c                   \    e Zd ZdZd% fd	Zd&dZed        Zed        Zd Z	d	 Z
ed
        ZdedfdZddedfdZddddedfdZddddedefdZddddeddfdZddedfdZd Zd Zd Zd Zd Zd Zd Zd&dZd&dZd Zd Zd Z d Z!ed        Z"d Z#d  Z$d! Z%d" Z&d# Z'd$ Z( xZ)S )'CMSToolbarBasea  
    The toolbar is an instance of the :class:`~cms.toolbar.toolbar.CMSToolbar` class. This should not be
    confused with the :class:`~cms.toolbar_base.CMSToolbar`, the base class for *toolbar modifier
    classes* in other applications, that add items to and otherwise manipulates the toolbar.

    It is strongly recommended that you **only** interact with the toolbar in your own code via:

    #. the APIs documented here
    #. toolbar modifier classes based on :class:`~cms.toolbar_base.CMSToolbar`

    Several of the following methods to create and add objects other objects to the toolbar are
    inherited from :class:`~cms.toolbar.items.ToolbarAPIMixin`.
    NFc                    t         |           || _        g | _        g | _        g | _        g | _        d| _        d| _        i | _	        d | _
        d | _        d | _        d | _        d | _        d | _        d | _        d| _        | j%                  ||       | j&                  xs | j"                  | _        t+        | j,                        5  	 t/        | j0                        j2                  }	 |r6t5        |dd      r)|j6                  d   j8                  j:                  | _        n
t?               	 d d d        tE        jF                         }| j<                  jI                  d      }|r8djK                  |      }|tM               v r|| _        n|jO                          |r8tQ               | _)        |D ]S  }||   jU                  || j<                        }	 ||   | j                  | |	| j<                        }
|
| jR                  |<   U y # t@        t>        f$ r |j:                  | _        Y w xY w# tB        t>        f$ r d| _        Y w xY w# 1 sw Y   xY w)	NFT)r)   __closure__r    .)r+   toolbaris_current_appapp_path)+super__init___asyncright_items
left_itemslast_left_itemslast_right_items	populatedpost_template_populatedmenusobjredirect_urlr+   rP   	clipboardtoolbar_languagetoolbar_language_bidirU   init_toolbarrV   _cache_disabledforce_languager=   r
   r)   funcr*   rl   cell_contentsre   app_nameAttributeError	TypeErrorr	   r   get_toolbarssplitjoinr   popr   toolbarscheck_current_app)r.   r+   r)   rt   	decoratorr   partspathkeyrp   ro   	__class__s              r0   rs   zCMSToolbarBase.__init__   s1   ! "',$
  $%)" '=  $44I8I8ID112 	###D$5$56;;		9 !WYu%M(1(=(=a(@(N(N(Y(Y,.. &	#  ,,.##C(88E?D~'' $IIK  $ 	)C%c]<<S$--PN#hsm-	G ")DMM#	)! ">2 9$-$8$8DM9  0 # "#	# 	#sO   I	H+)AH+H+ H(%H+'H((H++IIIIIc                    || _         |xs |j                  | _        | j                   j                  j                  | _        | j                  | _        t        d      }t        d      }t        d      }|r5|j                  j                  r|| j                   j                  v rd| _        | j
                  r| j                  xr | j                  j                  dk(  }|| j                   j                  v s|rd| _        nM|| j                   j                  v rd| _        n-| j                   j                  j                  dd      rd| _        | j                  | _        | j                  r| j                  }t         j"                  r%|j$                  t'        t         j(                        v s-t         j"                  s/|j$                  t         j*                  k(  r|j$                  | _        n!| j                  |_        |j-                          |j.                  | _        | j                  t         j0                  v | _        t5        | d      rA| j6                  j9                         D ]#  \  }}	| j                   | j6                  |   _         % y y )	NTOOLBAR_ANONYMOUS_ONCMS_TOOLBAR_URL__ENABLEr&   TrT   Fcms_toolbar_disabledr   )r+   r-   r)   userrP   rU   r!   is_anonymousGETr1   rQ   sessiongetr=   r   user_settingsr   r:   r<   dict	LANGUAGESr;   saver~   LANGUAGES_BIDIr   r,   r   items)
r.   r+   r)   anonymous_onenable_toolbardisable_toolbar	edit_moder   r   ro   s
             r0   r   zCMSToolbarBase.init_toolbar   s   (=G,=,=))22 MM&'=>()BC)*DE W\\66NdllN^N^<^ $D$$ Z((115YY  !1!11Y$(! DLL$4$44$)!%%))*@%H$)! !% 5 5== ..M!!m&<&<XEWEW@X&X ))m.D.DH^H^.^(5(>(>%)-)>)>&""$*44DN%)%:%:h>U>U%U"4$ $ 3 3 5 :W-1\\c"*: %r8   c                 "    | j                         S r3   )get_user_settingsrB   s    r0   r   zCMSToolbarBase.user_settings  s    %%''r8   c                     | j                   sy 	 | j                   j                         j                  d      d   }|j                         }|S # t        $ r d }Y |S w xY w)Nplaceholderr   )r~   get_pluginsselect_relatedget_bound_plugin
IndexError)r.   pluginbound_plugins      r0   clipboard_pluginzCMSToolbarBase.clipboard_plugin  sh    ~~	5^^//1@@OPQRF "224L	  	 L 		 s   ,A AAc                 j   d }| j                   r	 t        j                  j                  d      j	                  | j
                  j                        }|j                  rA|j                  j                  s+||j                  _	        |j                  j                          |S |S # t        j                  $ r{ t        j                  j                  d      }t        j                  j                  || j                  | j
                  j                        }||_	        |j                          Y |S w xY w)Nr~   )r   )slot)r~   r<   r   )rP   r   objectsr   r   r+   r   r~   	object_idsourcer   DoesNotExistr   creater=   )r.   r   r   s      r0   r   z CMSToolbarBase.get_user_settings  s   ==# , 4 4 C CK P T TZ^ZfZfZkZk T l **=3J3J3T3T5BM++2!++002 }  ,, #)1188k8J , 4 4 ; ;)!22** !< !
 &3"  "#s   BB$ $B
D21D2c                    ddl m} t        | j                  j	                               }|D cg c]  }|j
                  |k(  s| }}|r0|d   |v r)|j                  |d          |j                  d|d          |S c c}w )Nr   )BasicToolbar)cms.cms_toolbarsr   listr   valuesr   removeinsert)r.   r   r   ro   basic_toolbars        r0   _reorder_toolbarsz CMSToolbarBase._reorder_toolbars'  s{    1,,./08^WG<M<MQ]<]^^]1-9OOM!,-OOA}Q/0	 _s   A=A=c                 0    t        | j                        }|S r3   )r   r+   )r.   tokens     r0   
csrf_tokenzCMSToolbarBase.csrf_token0  s    $,,'r8   c                 ^    | j                          || j                  v r| j                  |   S y)zDWill return the ``Menu`` identified with :option:`key`, or ``None``.N)populater{   )r.   r   verbose_namesidepositions        r0   get_menuzCMSToolbarBase.get_menu7  s(    $**::c?"r8   c                 d   | j                          || j                  v rV| j                  |   }|r||_        |j                  |k7  r||_        |r$| j	                  |       | j                  ||       |S t        || j                  ||      }|| j                  |<   | j                  ||       |S )z
        If a :class:`~cms.toolbar.items.Menu` with :option:`key` already exists, this method will
        return that menu. Otherwise it will create a menu with the ``key`` identifier.
        r   )disabledr   )r   r{   namer   remove_itemadd_itemr   r   )r.   r   r   r   r   r   menus          r0   get_or_create_menuz!CMSToolbarBase.get_or_create_menu>  s    
 	$**::c?D(	yyD  	  &dX6KL$//H4P

3dX.r8   c	                     | j                          t        ||      }	|	j                  |||||       | j                  |	|       |	S )z9Adds a :class:`~cms.toolbar.items.Button` to the toolbar.extra_classesr   )activer   r   r   )r   r   
add_buttonr   )
r.   r   urlr   r   r   extra_wrapper_classesr   r   items
             r0   r   zCMSToolbarBase.add_buttonS  sF     	(=DIc&8S`adX.r8   c
                     | j                          t        ||      }
|
j                  ||||||	       | j                  |
|       |
S )z>Adds a :class:`~cms.toolbar.items.ModalButton` to the toolbar.r   r   r   r   on_closer   )r   r   add_modal_buttonr   r.   r   r   r   r   r   r   r   r   r   r   s              r0   r   zCMSToolbarBase.add_modal_button\  sR     	(=DI#fx}_g 	 	
 	dX.r8   c
                     | j                          t        ||      }
|
j                  ||||||	       | j                  |
|       |
S )zBAdds a :class:`~cms.toolbar.items.SideframeButton` to the toolbar.r   r   r   )r   r   add_sideframe_buttonr   r   s              r0   r   z#CMSToolbarBase.add_sideframe_buttong  sR     	(=DI!!#fx}_g 	" 	
 	dX.r8   c                 h    | j                          t        |||      }| j                  ||       |S )zUAdds an (empty) :class:`~cms.toolbar.items.ButtonList` to the toolbar and returns it.r   r   )r   r   r   )r.   
identifierr   r   r   r   s         r0   add_button_listzCMSToolbarBase.add_button_lists  s.    *MMdX.r8   c                 ,    | j                   s|| _         yy)a  
        Associates an object with the toolbar.

        Sets the toolbar's object if one has not already been set. This object is typically
        a Django model instance that the toolbar should operate on, such as a :class:`~cms.models.contentmodels.PageContent` object or any
        other model that supports editable placeholders through a :class:`~cms.models.fields.PlaceholderRelationField`.

        The object is used by other toolbar methods like :meth:`get_object_edit_url`,
        :meth:`get_object_preview_url`, and :meth:`get_object_structure_url` to generate
        appropriate URLs for the object.

        :param obj: The object to associate with the toolbar
        :type obj: django.db.models.Model
        Nr|   r.   r|   s     r0   
set_objectzCMSToolbarBase.set_objectz  s     xxDH r8   c                     | j                   S )aW  
        Returns the object currently associated with the toolbar.

        This returns the object that was previously set using :meth:`set_object`,
        or ``None`` if no object has been associated with the toolbar.

        :returns: The object associated with the toolbar, or None
        :rtype: django.db.models.Model or None
        r   rB   s    r0   
get_objectzCMSToolbarBase.get_object  s     xxr8   c                     | j                   rQ| j                   j                  j                   d| j                   j                  j                   j	                         S y)Nrn   rm   )r|   _meta	app_labelobject_namelowerrB   s    r0   get_object_modelzCMSToolbarBase.get_object_model  sD    88hhnn../q1K1K0LMSSUUr8   c                 H    | j                   r| j                   j                  S y)Nrm   )r|   pkrB   s    r0   get_object_pkzCMSToolbarBase.get_object_pk  s    8888;;r8   c                 ^    | j                   r!t        | j                   | j                        S yN)r<   rm   )r|   r   r=   rB   s    r0   r   z%CMSToolbarBase.get_object_preview_url  s#    88)$((T=R=RSSr8   c                 ^    | j                   r!t        | j                   | j                        S yr   )r|   r   r=   rB   s    r0   r   z"CMSToolbarBase.get_object_edit_url  s#    88&txx$:O:OPPr8   c                 ^    | j                   r!t        | j                   | j                        S yr   )r|   r   r=   rB   s    r0   r   z'CMSToolbarBase.get_object_structure_url  s#    88+DHHt?T?TUUr8   c                 x    |xs | j                   }|r(t        |d      r|j                  | j                        S yy)Nis_editableTF)r|   r,   r   r+   r   s     r0   object_is_editablez!CMSToolbarBase.object_is_editable  s5    oTXXsM*t||44r8   c                 $   | |_         |j                  r,|r|dk  r| j                  }t        |      }n8| j                  }n+|r|dk  r| j
                  }t        |      }n| j                  }||j                  ||       y |j                  |       y )Nr   )	ro   rightrx   absru   rw   rv   r   append)r.   r   r   targets       r0   	_add_itemzCMSToolbarBase._add_item  s~    ::HqL..x=))HqL--x=MM(D)MM$r8   c                 n   || j                   v r| j                   j                  |       y || j                  v r| j                  j                  |       y || j                  v r| j                  j                  |       y || j                  v r| j                  j                  |       y t        d|z        )NzItem %r not found)ru   r   rx   rv   rw   KeyErrorr.   r   s     r0   _remove_itemzCMSToolbarBase._remove_item  s    4#####D)T***!!((.T__$OO""4(T)))  ''-.566r8   c                     |j                   r| j                  j                  |      S | j                  j                  |      S r3   )r   ru   indexrv   r  s     r0   _item_positionzCMSToolbarBase._item_position  s5    ::##))$//??((..r8   c                 |    | j                          | j                  t        t        | j                              z   }|S r3   )r   rv   r   reversedrw   r.   r   s     r0   get_left_itemszCMSToolbarBase.get_left_items  s.    $x0D0D'E"FFr8   c                 |    | j                          | j                  t        t        | j                              z   }|S r3   )r   ru   r   r	  rx   r
  s     r0   get_right_itemszCMSToolbarBase.get_right_items  s0      41F1F(G#HHr8   c                     | j                          | j                  j                         }t        j                  t
        j                  d |D              S )Nc              3   4   K   | ]  }|j                     y wr3   )media).0ro   s     r0   	<genexpr>z'CMSToolbarBase.media.<locals>.<genexpr>  s     .Uw}}.Us   )r   r   r   	functoolsreduceoperatoradd)r.   r   s     r0   r  zCMSToolbarBase.media  s:    =='').UH.UVVr8   c                     | j                   ryd| _         | j                  j                  j                  sy| j	                  d       y)z;
        Populates the toolbar with the CMS items.
        NTr   )ry   r+   r   rP   _call_toolbarrB   s    r0   r   zCMSToolbarBase.populate  s;     >> ||  )):&r8   c                     | j                          | j                  ry d| _        | j                  j                  j                  sy | j                  d       y )NTpost_template_populate)r   rz   r+   r   rP   r  rB   s    r0   r  z%CMSToolbarBase.post_template_populate   sF    '''+$ ||  ))34r8   c                 6   t        | j                        5  d}|D ]1  }| j                  j                  |      }|s! t	        ||              3 | j                  D ]'  }||v r| j                  |   } t	        ||              ) 	 d d d        y # 1 sw Y   y xY w)N)zcms.cms_toolbars.BasicToolbarz#cms.cms_toolbars.PlaceholderToolbar)r   r   r   r   r*   )r.   	func_namefirstr   ro   s        r0   r  zCMSToolbarBase._call_toolbar  s    D112 	.\E .--++C0++-	. }} .%<--,++-	.	. 	. 	.s   A/BBc           
         | j                   r| j                  s| j                  }n| j                         }| || j	                         | j                         | j                         t        t        t               t        d	}|S )N)	cms_toolbarcms_renderercms_edit_urlcms_preview_urlcms_structure_urlcms_versiondjango_version
login_formpython_version)rR   r?   rL   rC   r   r   r   r   r   r   r   )r.   renderercontexts      r0   get_render_contextz!CMSToolbarBase.get_render_context  sw    %%d.M.M ..H002H  $ 446#::<!%!>!>!@&,-/,

 r8   c                     | j                          | j                          | j                         }t        | j                        5  t        d|| j                        cd d d        S # 1 sw Y   y xY w)Nzcms/toolbar/toolbar.htmlrF   )r   r  r*  r   r   r   r+   )r.   r)  s     r0   renderzCMSToolbarBase.render0  s`    ##%))+D112 	_#$>QUQ]Q]^	_ 	_ 	_s   A((A1c                    | j                          |j                  | j                                t        | j                        5  t        dt        |             d d d        |j                  |      }| j                          t        | j                        5  t        dt        |            }d d d         d| S # 1 sw Y   dxY w# 1 sw Y   xY w)Nz#cms/toolbar/toolbar_javascript.htmlz'cms/toolbar/toolbar_with_structure.html
)	r   updater*  r   r   r   r   r,  r  )r.   r)  nodelistrendered_contentsro   s        r0   render_with_structurez$CMSToolbarBase.render_with_structure9  s    t..01D112 	^BOT[D\]	^
 %OOG4##%D112 	l&'PRabiRjkG	l "./00	^ 	^	l 	ls   B>C
>C
Cr]   r3   )*rd   re   rf   __doc__rs   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r  r  r*  r,  r2  __classcell__r   s   @r0   rj   rj      sI   <)|+:Z ( ( 
 
(   *.D4  48%d]a * ,15PTlpt 27VZrv"TL	 6;UZ^37dT\`
 *.TW[ $





 (
7/

 W W
'	5. *_1r8   rj   
CMSToolbarc                   4     e Zd ZdZdZdZdZ fdZd Z xZ	S )EmptyToolbarFTc                 0    || _         t        | 	          y r3   )r+   rr   rs   )r.   r+   r   s     r0   rs   zEmptyToolbar.__init__[  s    r8   c                      y r3   r^   rB   s    r0   r   zEmptyToolbar.get_object_  s    r8   )
rd   re   rf   rP   rU   r   r   rs   r   r5  r6  s   @r0   r9  r9  R  s#    HL IOr8   r9  )Br  r  collectionsr   classytags.utilsr   django.appsr   django.confr   django.middleware.csrfr   django.template.loaderr   django.urlsr	   r
   django.utils.functionalr   django.utils.translationr   r   r#   r   cms.constantsr   r   cms.forms.loginr   
cms.modelsr   r   cms.templatesr   cms.toolbar.itemsr   r   r   cms.toolbar.utilsr   r   r   cms.toolbar_poolr   	cms.utilsr   cms.utils.compatr   r   cms.utils.compat.djr   cms.utils.confr!   cms.utils.i18nr"   get_app_configcms_extensiontoolbar_mixinscms_toolbar_extensionsr%   rj   typetupler   r7  r9  r^   r8   r0   <module>rW     s      # ,    , 3 , 3 ?  , / 0 ( ? ? 
 * / ; . * 9,,,U3AAPP b4/ b4JC1[ C1N ,&<?O&O PRVRXY
; r8   