
    Bh"                        d dl mZ d dlmZ d dlmZmZ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 d d	lmZmZ d d
lmZmZ  G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zy)    )get_permission_codename)Site)MultiWidgetSelect	TextInput)NoReverseMatchreverse_lazy)	force_str)escapeescapejs)	mark_safe)get_page_choicesget_site_choices)PagePageUser)admin_reversestatic_with_versionc                   ^     e Zd ZdZdZ G d d      Zd fd	Zd Zd Zd Z	 fd	Z
d
 Z xZS )PageSelectWidgetz|A widget that allows selecting a page by first selecting a site and then
    a page on that site in a two-step process.
    z!cms/widgets/pageselectwidget.htmlc                       e Zd Z ed      fZy)PageSelectWidget.Mediaz0cms/js/dist/bundle.forms.pageselectwidget.min.jsN__name__
__module____qualname__r   js     A/home/dcms/DCMS/lib/python3.12/site-packages/cms/forms/widgets.pyMediar      s     RS
r   r    c                     ||j                         | _        ni | _        g | _        t        |   t
        t
        t
        f|       y N)copyattrschoicessuper__init__r   )selfsite_choicespage_choicesr$   	__class__s       r   r'   zPageSelectWidget.__init__   s:    DJDJ&&&159r   c                     |rCt         j                  j                  |      }|j                  |j                  |j                  gS t
        j                  j                         }|j                  ddgS )z
        receives a page_id in value and returns the site_id and page_id
        of that page or the current site_id and None if no page_id is given.
        )pkN)r   objectsgetsite_idr-   r   get_current)r(   valuepagesites       r   
decompresszPageSelectWidget.decompress!   sZ    
 <<##u#-DLL$''47733||'')t$$r   c                 z    |t        |      dk\  r
|d   dv rd}n|}|d}n|}t        |      t        |      k7  ryy)z;
        Return True if data differs from initial.
              )N r9   TF)lenr
   )r(   initialdata
data_valueinitial_values        r   _has_changedzPageSelectWidget._has_changed,   sO     <CINtAw*/DJJ?M#M]#y'<<r   c                     t               }t               }|| _        || _        t	        |      t	        dg      t	        | j                  ddi      f| _        y )N)r%   )r9   z----stylezdisplay:none;)r%   r$   )r   r   r)   r%   r   widgets)r(   r)   r*   s      r   _build_widgetszPageSelectWidget._build_widgetsB   sO    ')')(#<(L>*4<</IJ
r   c                 ^    | j                          t        | 	  |||      }d|i|d   d<   |S )Nnamewidgetscript_data)rC   r&   get_contextr(   rE   r2   r$   contextr+   s        r   rH   zPageSelectWidget.get_contextM   s:    '%dE59,2D>-(r   c                 $    dj                  |      S )N )join)r(   rendered_widgetss     r   format_outputzPageSelectWidget.format_outputS   s    xx())r   )NNN)r   r   r   __doc__template_namer    r'   r5   r?   rC   rH   rO   __classcell__r+   s   @r   r   r      s7     8M
 

:	%,	
*r   r   c                   R     e Zd ZdZdZ G d d      Zd	 fd	Zd Zd Z fdZ	 xZ
S )
PageSmartLinkWidgetzgPresents the user with a Select2 widget to select a page and returns the link to this page as a string.z$cms/widgets/pagesmartlinkwidget.htmlc                   &    e Zd ZddiZ ed      fZy)PageSmartLinkWidget.Mediaall)zcms/js/select2/select2.cssz$cms/js/select2/select2-bootstrap.cssz3cms/js/dist/bundle.forms.pagesmartlinkwidget.min.jsN)r   r   r   cssr   r   r   r   r   r    rW   [   s#     
   UV
r   r    c                 R    t         |   |       | j                  |      | _        y )N)	ajax_view)r&   r'   get_ajax_urlajax_url)r(   r$   r[   r+   s      r   r'   zPageSmartLinkWidget.__init__f   s%    ))I)>r   c                 J    	 t        |      S # t        $ r t        d      w xY w)NzXYou should provide an ajax_view argument that can be reversed to the PageSmartLinkWidget)r	   r   	Exception)r(   r[   s     r   r\   z PageSmartLinkWidget.get_ajax_urlj   s1    		** 	j 	s   
 "c                     |j                  dd      t        |j                  dd            | j                  t        | j                        dS )Nidr9   placeholder_text)ra   textlangurl)r/   strlanguager
   r]   )r(   rE   r2   r$   s       r   _build_script_dataz&PageSmartLinkWidget._build_script_datar   sA    ))D"%		"4b9:MMT]]+	
 	
r   c                 h    t         |   |||      }| j                  |||d   d         |d   d<   |S NrF   r$   rG   r&   rH   rh   rI   s        r   rH   zPageSmartLinkWidget.get_contextz   F    '%dE59+/+B+B4PWX`PabiPj+k-(r   NN)r   r   r   rP   rQ   r    r'   r\   rh   rH   rR   rS   s   @r   rU   rU   W   s.    q:M	
 	
?
 r   rU   c                   $     e Zd ZdZd fd	Z xZS )UserSelectAdminWidgetaH  Special widget used in page permission inlines, because we have to render
    an add user (plus) icon, but point it somewhere else - to special user creation
    view, which is accessible only if user haves "add user" permissions.

    Current user should be assigned to widget in form constructor as an user
    attribute.
    c                    t         |   ||||      g}t        | d      r| j                  j                  sQ| j                  j                  t        j                  j                  dz   t        dt        j                        z         r#t        d      }|j                  d|d|d       t        d	j                  |            S )
N)rendereruser.addcms_pageuser_addz	<a href="z!" class="add-another" id="add_id_z/" onclick="return showAddAnotherPopup(this);"> r9   )r&   renderhasattrrr   is_superuserhas_permr   _meta	app_labelr   r   appendr   rM   )	r(   rE   r2   r$   r%   rq   outputadd_urlr+   s	           r   rv   zUserSelectAdminWidget.render   s    '.ueh.GH4 II""dii&8&8((3.1HPXP^P^1__'a $$67GMM$  ))r   )Nr   N)r   r   r   rP   rv   rR   rS   s   @r   ro   ro      s    * *r   ro   c                   V     e Zd ZdZ G d d      Zddi f fd	Zd
 fd	Zd Zd	 Z xZ	S )AppHookSelectzSpecial widget used for the App Hook selector in the Advanced Settings
    of the Page Admin. It adds support for a data attribute per option and
    includes supporting JS into the page.
    c                       e Zd Z ed      fZy)AppHookSelect.Media-cms/js/dist/bundle.forms.apphookselect.min.jsNr   r   r   r   r    r           OP
r   r    Nr   c                 4    || _         t        | 	  ||       y r"   )app_namespacesr&   r'   )r(   r$   r%   r   r+   s       r   r'   zAppHookSelect.__init__   s    ,(r   c           	          t         	|   |||||||      }|| j                  v rt        | j                  |         |d   d<   |S )Nr$   zdata-namespace)r&   create_optionr   r   )
r(   rE   r2   labelselectedindexsubindexr$   optionr+   s
            r   r   zAppHookSelect.create_option   sQ    &tUE8UHV[\D'''06t7J7J57Q0RF7O,-r   c                    |d}t        |      }||v r)t        d      }| j                  s|j                  |       nd}|| j                  v r%t        dt        | j                  |         z        }nd}|||t        |      fS )Nr9   z selected="selected"z data-namespace="%s")r
   r   allow_multiple_selectedremover   r   )r(   selected_choicesoption_valueoption_labelselected_html	data_htmls         r   _build_optionzAppHookSelect._build_option   s    L .++%&<=M// ''5M4...!"86$BUBUVbBc;d"deII]Iy7NNNr   c                 2    | j                  |||      }d|z  S )Nz"<option value="%s"%s%s>%s</option>)r   )r(   r   r   r   option_datas        r   render_optionzAppHookSelect.render_option   s"    (()9<V3kAAr   rm   )
r   r   r   rP   r    r'   r   r   r   rR   rS   s   @r   r   r      s1    

 

 "2b )O$Br   r   c                   R     e Zd ZdZdZ G d d      Zddi f fd	Zd Z fd	Z xZ	S )
ApplicationConfigSelectah  
    Special widget -populate by javascript- that shows application configurations
    depending on selected Apphooks.

    Required data are injected in the page as JSON data that forms.apphookselect.js
    uses to create the appropriate data structure.

    A stub 'addlink' link is created and filled in with the correct URL by the same
    javascript.
    z(cms/widgets/applicationconfigselect.htmlc                       e Zd Z ed      fZy)ApplicationConfigSelect.Mediar   Nr   r   r   r   r    r      r   r   r    Nr   c                 4    || _         t        | 	  ||       y r"   )app_configsr&   r'   )r(   r$   r%   r   r+   s       r   r'   z ApplicationConfigSelect.__init__   s    &(r   c                    | j                   j                         D ci c]K  \  }}t        |      |j                         D cg c]"  }t        |j                        t        |      g$ c}M }}}}| j                   j                         D ci c]  \  }}t        |      |j                         ! }}}|||dS c c}w c c}}}w c c}}w )N)apphooks_configurationapphooks_configuration_urlapphooks_configuration_value)r   itemsrf   get_configsr-   get_config_add_url)	r(   rE   r2   r$   applicationcms_appconfigconfigsurlss	            r   rh   z*ApplicationConfigSelect._build_script_data   s     )-(8(8(>(>(@
 
$W 7K^K^K`aFIIF<aa
 
 )-(8(8(>(>(@
$W g88::
 
 '.*.,1
 	
 b

s   $C'B=*C$C	=Cc                 h    t         |   |||      }| j                  |||d   d         |d   d<   |S rj   rk   rI   s        r   rH   z#ApplicationConfigSelect.get_context   rl   r   )
r   r   r   rP   rQ   r    r'   rh   rH   rR   rS   s   @r   r   r      s6    	 ?M
 

 "22 )
  r   r   N) django.contrib.authr   django.contrib.sites.modelsr   django.forms.widgetsr   r   r   django.urlsr   r	   django.utils.encodingr
   django.utils.htmlr   r   django.utils.safestringr   cms.forms.utilsr   r   
cms.modelsr   r   cms.utils.urlutilsr   r   r   rU   ro   r   r   r   r   r   <module>r      si    7 , ? ? 4 + . - > % AF*{ F*R&) &R*F *.*BF *BZ)f )r   