a
    Dg'x                     @   s  d dl Z d dlmZ d dlmZmZ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 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 m!Z!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0 d:ddZ1dd Z2d;ddZ3G dd de*Z4G dd de(Z5G dd  d e(Z6G d!d" d"e(Z7G d#d$ d$e(Z8G d%d& d&e(Z9G d'd( d(eZ:G d)d* d*eZ;G d+d, d,eZ<G d-d. d.eZ=d/Z>d0Z?d1Z@G d2d3 d3e=ZAG d4d5 d5e=ZBG d6d7 d7e=ZCG d8d9 d9e=ZDdS )<    N)defaultdict)parse_qsquote	urlencodeurlsplit)settings)InvalidPage	Paginator)Http404)get_object_or_404)TemplateResponse)NoReverseMatch)reverse)gettext_lazy)View)hooks)AnchorLinkChooserFormEmailLinkChooserFormExternalLinkChooserFormPhoneLinkChooserForm)
SearchForm)render_modal_workflow)Column
DateColumnTable)resolve_model_string)LocalePageSitec                 C   sJ   | j d| j d| j d| j d| j dd}|rF|| |S )Nparent_page_idallow_external_linkallow_email_linkallow_phone_linkallow_anchor_link)r   r    r!   r"   r#   )GETgetupdate)requestZextra_contextcontext r)   Z/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/admin/views/chooser.pyshared_context   s    





r+   c                 C   s@   g }|  dD ](}t|}t|ts,td|| qt|S )N,zModel is not a page)splitr   
issubclassr   
ValueErrorappendtuple)stringZpage_modelsZ
sub_stringZ
page_modelr)   r)   r*   page_models_from_string.   s    
r3   Tc           	      C   s   |sg }|s| j |vrdS |r<t| j p(t|s<|tfks<dS |sL|  rLdS |dv r|}|D ]<}| j|jksv| |r| dS |dkr\|||   S q\|dv r| | S dS )zReturns boolean indicating of the user can choose page.
    will check if the root page can be selected and if user permissions
    should be checked.
    F)move_toZbulk_move_tor4   >   Zcopy_toZadd_subpageT)	Zspecific_classr.   r   is_rootpkZis_descendant_ofZpermissions_for_userZcan_move_toZcan_add_subpage)	pageuserdesired_classescan_choose_root	user_permtarget_pagesmatch_subclassZpages_to_moveZpage_to_mover)   r)   r*   can_choose_page<   s.    r>   c                       s:   e Zd ZdZdd fdd
Z fddZdd	 Z  ZS )
PageChooserTablezlisting chooserFshow_locale_labelsc                   s   t  j|i | || _d S N)super__init__rA   )selfrA   argskwargs	__class__r)   r*   rD   j   s    zPageChooserTable.__init__c                    s   t  |}| j|d< |S NrA   )rC   get_context_datarA   )rE   parent_contextr(   rH   r)   r*   rK   n   s    
z!PageChooserTable.get_context_datac                 C   s>   g }|j r|d |js$|d |js4|d d|S )Nzparent-pageZunpublisheddisabled )is_parent_pager0   Zlive
can_choosejoin)rE   r7   Z
classnamesr)   r)   r*   get_row_classnames   s    


z"PageChooserTable.get_row_classname)__name__
__module____qualname__	classnamerD   rK   rR   __classcell__r)   r)   rH   r*   r?   g   s   r?   c                       s:   e Zd ZdZdd fdd
Zdd Z fdd	Z  ZS )
PageTitleColumnz0wagtailadmin/chooser/tables/page_title_cell.htmlF)is_multiple_choicec                   s   t  j|i | || _d S rB   )rC   rD   rY   )rE   rY   rF   rG   rH   r)   r*   rD      s    zPageTitleColumn.__init__c                 C   s   |  S rB   )get_admin_display_titlerE   instancer)   r)   r*   	get_value   s    zPageTitleColumn.get_valuec                    s2   t  ||}||d< |do(|jdk|d< |S )Nr7   rA      )rC   get_cell_context_datar%   depthrE   r\   rL   r(   rH   r)   r*   r_      s
    z%PageTitleColumn.get_cell_context_data)rS   rT   rU   cell_template_namerD   r]   r_   rW   r)   r)   rH   r*   rX      s   rX   c                       s(   e Zd ZdZdd Z fddZ  ZS )ParentPageColumnz1wagtailadmin/chooser/tables/parent_page_cell.htmlc                 C   s   |  S rB   )
get_parentr[   r)   r)   r*   r]      s    zParentPageColumn.get_valuec                    s    t  ||}|d|d< |S rJ   )rC   r_   r%   ra   rH   r)   r*   r_      s    z&ParentPageColumn.get_cell_context_data)rS   rT   rU   rb   r]   r_   rW   r)   r)   rH   r*   rc      s   rc   c                   @   s   e Zd ZdZdd ZdS )PageStatusColumnz1wagtailadmin/chooser/tables/page_status_cell.htmlc                 C   s   |S rB   r)   r[   r)   r)   r*   r]      s    zPageStatusColumn.get_valueNrS   rT   rU   rb   r]   r)   r)   r)   r*   re      s   re   c                   @   s   e Zd ZdZdd ZdS )PageNavigateToChildrenColumnz?wagtailadmin/chooser/tables/page_navigate_to_children_cell.htmlc                 C   s   |S rB   r)   r[   r)   r)   r*   r]      s    z&PageNavigateToChildrenColumn.get_valueNrf   r)   r)   r)   r*   rg      s   rg   c                   @   s   e Zd ZdZdS )PageCheckboxSelectColumnz:wagtailadmin/chooser/tables/page_checkbox_select_cell.htmlN)rS   rT   rU   rb   r)   r)   r)   r*   rh      s   rh   c                   @   s2   e Zd Zedd Zdd Zdd Zd
dd	ZdS )
BrowseViewc              	   C   s|   t dtd| jdtdtddddtd	td
dddtdtdddtddddg}| jrx|dtdtdddd |S )NtitleTitlelabelrY   updatedUpdated12%latest_revision_created_atrm   widthaccessortypeTypepage_type_display_namestatusStatusrm   rs   children z10%r   selectSelect1%r6   )	rX   _rY   r   r   re   rg   insertrh   rE   colsr)   r)   r*   columns   s8    zBrowseView.columnsc                 C   s&   | j    }| jr"|d}|S )Nlocale)parent_pageZget_childrenZdefer_streamfieldsspecifici18n_enabledselect_related)rE   pagesr)   r)   r*   get_object_list   s    
zBrowseView.get_object_listc                 C   sL   t dD ]}||| j}q
| jtfkrH|j| j }|jdd}||B }|S )Nconstruct_page_chooser_querysetr   )Znumchild__gt)r   	get_hooksr'   r9   r   ru   filter)rE   r   hookZchoosable_pagesZdescendable_pagesr)   r)   r*   filter_object_list   s    zBrowseView.filter_object_listNc                 C   s  t tdd| _|jd| _|jdp*d}|jdd}zt|| _W n tt	fyb   t
Y n0 |rxtt|d| _n4| jtfkrt | _ntj j| j }| | _| jj| _|  }| |}|jdd}tjjd	d
 |jdg D d}|jdd}	t| j|j| j||||	d| j_d| j_d| j_d }
g }| jr|j }|dd  | j r|jdrtt |jd d}
|
j!}n
t " j!}t#d}t jj|$ddj%|dD ],}|j&|d< |'||d |(  d qn| jj)}
|dd  dd tj*| j+ddD }| jj!||
j!< t jjt,|- dj%|
j!dD ]6}t#d||j! gd}|'||d |(  d qP|
r|j|
d}t.|dd}z|/|jdd }W n t0y   t
Y n0 |D ]2}t||j| j||||	d|_|1 |_d|_qt2| j3| jgt,| | jd!}t4|| j| jj!||t5 |d"d
 | jD |dk| j||
| jd#}t6|d$d |d%|d& d'd(S ))NWAGTAIL_I18N_ENABLEDFmultiple	page_typewagtailcore.pageZ
user_perms)idr:   c                 S   s   g | ]}|rt |qS r)   )int).0r6   r)   r)   r*   
<listcomp>      z"BrowseView.get.<locals>.<listcomp>ztarget_pages[]Zpk__inr=   T)r<   r=   pr   )language_codeZwagtailadmin_choose_pageZ	locale_idr6   ?)r   urlc                 S   s   i | ]}|d  |d qS )r   r6   r)   )r   itemr)   r)   r*   
<dictcomp>B  s   z"BrowseView.get.<locals>.<dictcomp>r6   Zwagtailadmin_choose_page_childrF   )r      Zper_page   r@   c                 S   s   g | ]}|  qS r)   )Zget_verbose_name)r   Zdesired_classr)   r)   r*   r     s   )r   r   tableZpagination_pagesearch_formpage_type_stringZpage_type_namesZpage_types_restrictedZshow_locale_controlslocale_optionsselected_localerY   z wagtailadmin/chooser/browse.htmlZbrowser   )stepr   Z	json_data)7getattrr   r   r$   r%   rY   r3   r9   r/   LookupErrorr
   r   r   r   Zget_first_root_nodeobjectsallru   Zfirst_common_ancestorr   r   r   r   getlistr>   r8   rP   rO   Zcan_descendcopypopr5   r   r6   Z
get_activer   Zvalues_listexcluder   r0   r   r   Ztranslation_ofvalueslistkeysr	   r7   r   Zget_children_countr?   r   r+   r   r   )rE   r'   r   r   r;   Zall_desired_pagesr   r:   r<   r=   r   r   
new_paramsZactive_locale_idZ
choose_urlr   Zlocales_and_parent_pagesZchoose_child_url	paginatorr7   r   r(   r)   r)   r*   r%      s    




	









	

zBrowseView.get)N)rS   rT   rU   propertyr   r   r   r%   r)   r)   r)   r*   ri      s
   
ri   c                   @   s    e Zd Zedd Zdd ZdS )
SearchViewc              	   C   s~   t dtd| jdtdtddtdtdd	d
dtdtdd	ddtdtdd	dg}| jrz|dtdtdddd |S )Nrj   rk   rl   parentZParent)rm   rn   ro   rp   rq   rr   ru   rv   rw   rx   ry   rz   r   r}   r~   r   r6   )	rX   r   rY   rc   r   r   re   r   rh   r   r)   r)   r*   r     s8    zSearchView.columnsc           
   
   C   s>  t tdd| _|jd| _|jdp*d}zt|}W n ttfyR   t	Y n0 t
j }| jrn|d}tdD ]}|||}qxt|j}| r|jd r|jd	d
}|j| }| }||jd }n| }t|dd}||jd}|D ]}d|_d|_qt| j|| jd}	t|dt|||	||dS )Nr   Fr   r   r   r   r   qr   )r`   r   r   r   Tr@   z)wagtailadmin/chooser/_search_results.html)Z
searchformr   r   r   ) r   r   r   r$   r%   rY   r3   r/   r   r
   r   r   r   r   r   r   r   is_validcleaned_datar   ru   r   autocompletenoner	   Zget_pagerP   rO   r?   r   r   r+   )
rE   r'   r   r9   r   r   r   r   r7   r   r)   r)   r*   r%     sR    




zSearchView.getN)rS   rT   rU   r   r   r%   r)   r)   r)   r*   r     s   
r   c                   @   s    e Zd ZdZdd Zdd ZdS )ChosenMultipleViewz
    A view that takes a list of 'id' URL parameters and returns a modal workflow response indicating
    that those objects have been chosen
    c                 C   s   t | jd d d d|ddS )NZpage_chosenr   resultr   r   r'   rE   r   r)   r)   r*   render_chosen_response  s    z)ChosenMultipleView.render_chosen_responsec                 C   s6   |j d}tjj|d }dd |D }| |S )Nr   r   c              	   S   s6   g | ].}|j | j | td |j fd|jdqS )wagtailadmin_pages:editr   r   ZparentIdZ
adminTitleZeditUrlr   )r6   rd   rZ   r   r   )r   r7   r)   r)   r*   r     s   z*ChosenMultipleView.get.<locals>.<listcomp>)r$   r   r   r   r   r   r   )rE   r'   Zpksr   r   r)   r)   r*   r%      s    
zChosenMultipleView.getN)rS   rT   rU   __doc__r   r%   r)   r)   r)   r*   r     s   	r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )BaseLinkFormViewc                 C   s&   | j | jjddd| jjddiS )Nlink_urlr|   	link_text)link_url_field_namer'   r$   r%   rE   r)   r)   r*   get_initial_data  s    z!BaseLinkFormView.get_initial_datac                 C   s   |S rB   r)   rE   valuer)   r)   r*   get_url_from_field_value  s    z)BaseLinkFormView.get_url_from_field_valuec                 C   s8   | j j| j }| || j jd  p(|d| j jv dS )Nr   r   rj   Zprefer_this_title_as_link_text)formr   r   r   stripchanged_data)rE   Zurl_field_valuer)   r)   r*   get_result_data  s
    
z BaseLinkFormView.get_result_datac                 C   s   | j |  | jd| _|  S Ninitialprefix)
form_classr   form_prefixr   render_form_response)rE   r'   r)   r)   r*   r%   '  s    
zBaseLinkFormView.getc                 C   sB   | j |j|  | jd| _| j r6|  }| |S |  S d S r   	r   POSTr   r   r   r   r   r   r   rE   r'   r   r)   r)   r*   post-  s    

zBaseLinkFormView.postc                 C   s*   t | j| jd t| jd| jid| jidS )Nr   r   r   )r   r'   template_namer+   r   	step_namer   r)   r)   r*   r   8  s    z%BaseLinkFormView.render_form_responsec                 C   s   t | jd d d d|ddS )NZexternal_link_chosenr   r   r   r   r)   r)   r*   r   F  s    z'BaseLinkFormView.render_chosen_responseN)
rS   rT   rU   r   r   r   r%   r   r   r   r)   r)   r)   r*   r     s   r   r   exactZconfirmc                   @   s(   e Zd ZdZeZdZdZdZdd Z	dS )ExternalLinkViewzexternal-link-chooserz'wagtailadmin/chooser/external_link.htmlZexternal_linkr   c                 C   s  | j |j|  | jd| _| j r|  }|d }ttdt	
 }|t	ttfvr^| |S td|d }t|dd }|d u rt }ztddd	}W n ty   d }Y n0 |d
ot|dk}tt}	|r$|D ]F\}
}}}|	|
 | |r||r|	|
 |t|d d   qnz|D ]t\}
}}}||sDq(|	|
 |t|d   |r(||| r(|	|
 |t|t| d d   q(|	 D ]"\}
}tjdj|
d}|jj}|D ]}z ||dd |d
D }W n t y   Y qY n0 |j!j}|j"|# j"|j$td|j"fd	|j%d}|rV|j&|dd n
|j'|d}||kr|tkr| |    S |tkrqn,t(|dd |||j$dd||dd    S qАq| |S | ) S d S )Nr   r   Z%WAGTAILADMIN_EXTERNAL_LINK_CONVERSIONz\?|#r   Z_wagtail_cached_site_root_pathsZwagtail_serve)r|   r   /r   	root_pager   c                 S   s   g | ]}|r|qS r)   r)   )r   	componentr)   r)   r*   r     r   z)ExternalLinkView.post.<locals>.<listcomp>r   r   )r'   z6wagtailadmin/chooser/confirm_external_to_internal.html)submitted_urlZinternal_urlr7   Zconfirm_external_to_internal)r   ZexternalZinternalr   )*r   r   r   r   r   r   r   r   r   LINK_CONVERSION_ALLlowerLINK_CONVERSION_EXACTLINK_CONVERSION_CONFIRMr   rer-   r   Zget_site_root_pathsr   r   
startswithlenr   r   r0   itemsr   r   r%   r   r   router
   r7   r6   rd   Zdraft_titler   Zget_url_partsget_full_urlr   r   )rE   r'   r   r   Zlink_conversionZurl_without_querysitesZ
serve_pathZmatch_relative_pathsZpossible_sitesr6   pathr   r   Zpossible_urlssiter   r   Zmatched_pageZinternal_dataZ
normal_urlr)   r)   r*   r   \  s    





zExternalLinkView.postN)
rS   rT   rU   r   r   r   r   r   r   r   r)   r)   r)   r*   r   U  s   r   c                   @   s(   e Zd ZdZeZdZdZdZdd Z	dS )AnchorLinkViewzanchor-link-chooserz%wagtailadmin/chooser/anchor_link.htmlZanchor_linkr   c                 C   s   d| S )N#r)   r   r)   r)   r*   r     s    z'AnchorLinkView.get_url_from_field_valueN)
rS   rT   rU   r   r   r   r   r   r   r   r)   r)   r)   r*   r     s   r   c                   @   sH   e Zd ZdZeZdZdZdZdd Z	dd Z
d	d
 Zdd Zdd ZdS )EmailLinkViewzemail-link-chooserz$wagtailadmin/chooser/email_link.htmlZ
email_linkemail_addressc                 C   s<   |  | jjdd}|d | jjdd|d |d dS )Nr   r|   emailr   subjectbody)r   r   r   r   )parse_email_linkr'   r$   r%   )rE   Zparsed_emailr)   r)   r*   r     s    zEmailLinkView.get_initial_datac                 C   s   d| S )Nmailto:r)   r   r)   r)   r*   r     s    z&EmailLinkView.get_url_from_field_valuec                 C   s   | j jd | j jd d}tdd | D td}d| j jd  }|rT|d	| 7 }|| j jd
  pp| j jd d
| j jv dS )Nr   r   )r   r   c                 S   s&   i | ]\}}|d ur|dkr||qS )Nr|   r)   )r   kvr)   r)   r*   r     r   z1EmailLinkView.get_result_data.<locals>.<dictcomp>)	quote_viar  r   r   r   r   )r   r   r   r   r   r   r   )rE   paramsZencoded_paramsr   r)   r)   r*   r   	  s    



zEmailLinkView.get_result_datac                 C   sB   | j |j|  | jd| _| j r6|  }| |S |  S d S r   r   r   r)   r)   r*   r   !  s    

zEmailLinkView.postc                 C   s\   i }t |}|j|d< t|j}d|v r4|d d nd|d< d|v rP|d d nd|d< |S )Nr   r   r   r|   r   )r   r   r   query)rE   mailtor   Zmail_resultr  r)   r)   r*   r  ,  s    

zEmailLinkView.parse_email_linkN)rS   rT   rU   r   r   r   r   r   r   r   r   r   r   r  r)   r)   r)   r*   r     s   	r   c                   @   s(   e Zd ZdZeZdZdZdZdd Z	dS )PhoneLinkViewzphone-link-chooserz$wagtailadmin/chooser/phone_link.htmlZ
phone_linkZphone_numberc                 C   s   t dd|}d| S )Nz\sr|   ztel:)r   subr   r)   r)   r*   r   A  s    z&PhoneLinkView.get_url_from_field_valueN)
rS   rT   rU   r   r   r   r   r   r   r   r)   r)   r)   r*   r	  :  s   r	  )N)TNNT)Er   collectionsr   urllib.parser   r   r   r   Zdjango.confr   Zdjango.core.paginatorr   r	   Zdjango.httpr
   Zdjango.shortcutsr   Zdjango.template.responser   Zdjango.urlsr   Zdjango.urls.baser   Zdjango.utils.translationr   r   Zdjango.views.generic.baser   Zwagtailr   Zwagtail.admin.forms.choosersr   r   r   r   Zwagtail.admin.forms.searchr   Zwagtail.admin.modal_workflowr   Zwagtail.admin.ui.tablesr   r   r   Zwagtail.coreutilsr   Zwagtail.modelsr   r   r   r+   r3   r>   r?   rX   rc   re   rg   rh   ri   r   r   r   r   r   r   r   r   r   r	  r)   r)   r)   r*   <module>   sX   
    
+	 eZ@ D