a
    DgF                     @   sp  d dl Z d dlZd dlmZ d dlmZ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 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(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z; G dd de!Z<G dd dZ=G dd dZ>G dd de/Z?G d d! d!e<e=e>e!e"Z@G d"d# d#e=e>ZAG d$d% d%ZBG d&d' d'eBeAe@ZCG d(d) d)ZDG d*d+ d+eDeAe@ZEG d,d- d-ZFG d.d/ d/e=ZGG d0d1 d1eGeFe"ZHG d2d3 d3e=ZIG d4d5 d5eIeFe"ZJG d6d7 d7ZKG d8d9 d9eKeAeFe"ZLdS ):    N)settings)quoteunquote)ImproperlyConfiguredObjectDoesNotExistPermissionDenied)InvalidPage	Paginator)Model)modelform_factory)Http404)render_to_string)TemplateResponse)reverse)cached_property)gettext_lazy)ContextMixinView)hooks)AdminURLFinder)BaseFilterFormCollectionFilterMixinLocaleFilterMixinSearchFilterMixin)render_modal_workflow)ColumnTableTitleColumn)resolve_model_string)CollectionMemberTranslatableMixin)BlanketPermissionPolicyModelPermissionPolicy)class_is_indexedc                       s,   e Zd ZdZdZdZdZ fddZ  ZS )ModalPageFurnitureMixinzH
    Add icon, page title and page subtitle to the template context
    Nc                    s.   t  jf i |}|| j| j| jd |S )N)Zheader_icon
page_titlepage_subtitle)superget_context_dataupdateiconr%   r&   )selfkwargscontext	__class__ b/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/admin/views/generic/chooser.pyr(   /   s    z(ModalPageFurnitureMixin.get_context_data)	__name__
__module____qualname____doc__r*   r%   r&   r(   __classcell__r0   r0   r.   r1   r$   &   s
   r$   c                   @   s    e Zd ZdZdZedd ZdS )ModelLookupMixinz
    Allows a class to have a `model` attribute, which can be set as either a model class or a string,
    and then retrieve it as `model_class` to consistently get back a model class
    Nc                 C   s   | j rt| j S d S N)modelr   r+   r0   r0   r1   model_classC   s    zModelLookupMixin.model_class)r2   r3   r4   r5   r9   r   r;   r0   r0   r0   r1   r7   ;   s   r7   c                   @   s*   e Zd ZdZdgZedd Zdd ZdS )PreserveURLParametersMixinz
    Adds support for passing designated URL parameters from the current request when constructing URLs
    for links / form actions.
    multiplec              	   C   sD   i }| j D ],}z| jj| ||< W q
 ty4   Y q
0 q
tj|S r8   )preserve_url_parametersrequestGETKeyErrorurllibparse	urlencode)r+   paramsparamr0   r0   r1   _preserved_param_stringQ   s    
z2PreserveURLParametersMixin._preserved_param_stringc                 C   s0   | j r,d|v r|d| j  7 }n|d| j  7 }|S )z
        Given a base URL (which might already include URL parameters), append any URL parameters
        from the preserve_url_parameters list that are present in the current request URL
        ?&)rG   )r+   urlr0   r0   r1   append_preserved_url_parameters\   s
    z:PreserveURLParametersMixin.append_preserved_url_parametersN)r2   r3   r4   r5   r>   r   rG   rK   r0   r0   r0   r1   r<   I   s
   

r<   c                   @   s   e Zd ZdZdS )CheckboxSelectColumnz6wagtailadmin/generic/chooser/checkbox_select_cell.htmlN)r2   r3   r4   Zcell_template_namer0   r0   r0   r1   rL   j   s   rL   c                       s   e Zd ZdZdZdZdZdZdZdZ	e
dZdZdZdZdZg Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zedd Zedd Zedd Zedd Zdd Zd d! Z fd"d#Z d$d% Z!  Z"S )&BaseChooseViewz
    Provides common functionality for views that present a (possibly searchable / filterable) list
    of objects to choose from
    
   NZsnippetZChoosez)wagtailadmin/generic/chooser/chooser.htmlz)wagtailadmin/generic/chooser/results.htmlc                 C   s   | j j S r8   )r;   objectsallr:   r0   r0   r1   get_object_list   s    zBaseChooseView.get_object_listc                 C   sH   t | jttfr|j| j }n&| jr2|| j}n|jr:n
|d}|S )Npk)
isinstanceorderinglisttupleZorder_byZordered)r+   rO   r0   r0   r1   apply_object_list_ordering   s    
z)BaseChooseView.apply_object_list_orderingc                 C   s   | j r| j S tg}| jrnt| jr.|dt t| jtrF|dt t	t
dd}|rnt| jtrn|dt tdt|i S d S )Nr   ZWAGTAIL_I18N_ENABLEDF
FilterForm)filter_form_classr   r;   r#   insertr   
issubclassr   r   getattrr   r    r   typerV   )r+   basesZi18n_enabledr0   r0   r1   get_filter_form_class   s     
z$BaseChooseView.get_filter_form_classc                 C   s   |   }|| jjS r8   )r_   r?   r@   )r+   rX   r0   r0   r1   get_filter_form   s    zBaseChooseView.get_filter_formc              	   C   s   i }| j D ],}z| jj| ||< W q
 ty4   Y q
0 q
|rL|jf i |}| jrpt| jD ]}||| j}q^| j	 r| j|}|S r8   )
url_filter_parametersr?   r@   rA   filterconstruct_queryset_hook_namer   Z	get_hooksfilter_formis_valid)r+   rO   filtersrb   hookr0   r0   r1   filter_object_list   s    

z!BaseChooseView.filter_object_listc                 C   s   |  t| jS r8   )rK   r   results_url_namer:   r0   r0   r1   get_results_url   s    zBaseChooseView.get_results_urlc                 C   s   |  t| jS r8   )rK   r   chosen_multiple_url_namer:   r0   r0   r1   get_chosen_multiple_url   s    z&BaseChooseView.get_chosen_multiple_urlc                 C   s   | j jdS )Nr=   )r?   r@   getr:   r0   r0   r1   is_multiple_choice   s    z!BaseChooseView.is_multiple_choicec                 C   s   | j gS r8   )title_columnr:   r0   r0   r1   columns   s    zBaseChooseView.columnsc                    s@    j rtdtdtddS tdtdt fddddid	S d S )
NtitleZTitlezchooser-modal-select)labelaccessorZlabel_prefixc                    s     t jt| jfdS )N)args)rK   r   chosen_url_namer   rR   )objr:   r0   r1   <lambda>   s   z-BaseChooseView.title_column.<locals>.<lambda>zdata-chooser-modal-choiceT)rr   rs   get_urlZ
link_attrs)rn   r   _strr:   r0   r:   r1   ro      s    
zBaseChooseView.title_columnc                 C   s   t dtddddS )NselectZSelectz1%rR   )rr   widthrs   )rL   ry   r:   r0   r0   r1   checkbox_column   s    zBaseChooseView.checkbox_columnc                 C   s\   |   }| |}| |}t|| jd}z||jddW S  tyV   t	Y n0 d S )N)per_pagep   )
rQ   rW   rh   r	   r~   pager@   rm   r   r   )r+   r?   rO   Z	paginatorr0   r0   r1   get_results_page   s    

zBaseChooseView.get_results_pagec                 C   sF   |   | _| || _| j}| jr0|d| j t|| j| _	| 
 S )Nr   )r`   rd   r   resultsrp   rn   rZ   r}   r   tablerender_to_response)r+   r?   rp   r0   r0   r1   rm      s    
zBaseChooseView.getc                    sr   t  jf i |}|  }tdd|}|| j| j||| jj	| jj
| j| jj|  d	 | jrn|  |d< |S )Nz\?.*$ )	r   r   results_urlresults_pagination_urlis_searchingis_filtering_by_collectionrn   search_query
can_createZchosen_multiple_url)r'   r(   rj   resubr)   r   r   rd   r   r   rn   r   r   rl   )r+   r,   r-   r   r   r.   r0   r1   r(     s$    zBaseChooseView.get_context_datac                 C   s
   t  d S r8   )NotImplementedErrorr:   r0   r0   r1   r      s    z!BaseChooseView.render_to_response)#r2   r3   r4   r5   r~   rT   ru   rk   ri   r*   ry   r%   rY   template_nameresults_template_namerc   ra   rQ   rW   r_   r`   rh   rj   rl   r   rn   propertyrp   ro   r}   r   rm   r(   r   r6   r0   r0   r.   r1   rM   n   s@   



rM   c                   @   sp   e Zd ZdZdZdZdZdZdZe	dZ
dZd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 )CreationFormMixinz8
    Provides a form class for creating new objects
    Nz/wagtailadmin/generic/chooser/creation_form.htmlcreateZCreatec                 C   s4   | j r| j S | jr(t| jtr(t| jS td S d S r8   )permission_policyr;   r[   r
   r"   r!   r:   r0   r0   r1   get_permission_policy3  s
    
z'CreationFormMixin.get_permission_policyc                 C   s   |   | jjdS )Nadd)r   Zuser_has_permissionr?   userr:   r0   r0   r1   r   ;  s    zCreationFormMixin.can_createc                 C   s8   | j r| j S | jd us | jd ur4t| j| j| jdS d S )N)fieldsexclude)creation_form_classform_fieldsexclude_form_fieldsr   r;   r:   r0   r0   r1   get_creation_form_class@  s    z)CreationFormMixin.get_creation_form_classc                 C   s,   i }| j jdv r(|| j j| j jd |S )N)POSTPUT)datafiles)r?   methodr)   r   ZFILES)r+   r,   r0   r0   r1   get_creation_form_kwargsJ  s    z*CreationFormMixin.get_creation_form_kwargsc                 C   s"   |   }|sd S |f i |  S r8   )r   r   )r+   Z
form_classr0   r0   r1   get_creation_formU  s    z#CreationFormMixin.get_creation_formc                 C   s&   | j stdt|  | t| j S )NzF%r must provide a create_url_name attribute or a get_create_url method)create_url_namer   r]   rK   r   r:   r0   r0   r1   get_create_url\  s    z CreationFormMixin.get_create_urlc                 C   s   ||   | j| jdS )N)creation_formZcreate_action_urlcreate_action_labelcreate_action_clicked_label)r   r   r   r+   formr0   r0   r1   get_creation_form_context_datad  s
    z0CreationFormMixin.get_creation_form_context_data)r2   r3   r4   r5   r   r   r   creation_form_template_nameZcreation_tab_idry   r   r   r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   r   $  s"   
r   c                       s<   e Zd ZdZedZdZ fddZdd Zdd	 Z	  Z
S )
ChooseViewMixinz
    A view that renders a complete modal response for the chooser, including a tab for the object
    listing and (optionally) a 'create' form
    ZSearchNc                    sX   t  jf i |}|| j| j| jp(| jd |d rT|  }|rT|| | |S )N)rd   search_tab_labelcreation_tab_labelr   )	r'   r(   r)   rd   r   r   r   r   r   )r+   r,   r-   r   r.   r0   r1   r(   v  s    	z ChooseViewMixin.get_context_datac                 C   s   ddiS )Nstepchooser0   r:   r0   r0   r1   get_response_json_data  s    z&ChooseViewMixin.get_response_json_datac                 C   s   t | j| jd |  |  dS )NZ	json_data)r   r?   r   r(   r   r:   r0   r0   r1   r     s    z"ChooseViewMixin.render_to_response)r2   r3   r4   r5   ry   r   r   r(   r   r   r6   r0   r0   r.   r1   r   m  s   r   c                   @   s   e Zd ZdS )
ChooseViewNr2   r3   r4   r0   r0   r0   r1   r     s   r   c                   @   s   e Zd ZdZdd ZdS )ChooseResultsViewMixinz
    A view that renders just the object listing as an HTML fragment, used to replace the listing
    when paginating or searching
    c                 C   s   t | j| j|  S r8   )r   r?   r   r(   r:   r0   r0   r1   r     s
    z)ChooseResultsViewMixin.render_to_responseN)r2   r3   r4   r5   r   r0   r0   r0   r1   r     s   r   c                   @   s   e Zd ZdS )ChooseResultsViewNr   r0   r0   r0   r1   r     s   r   c                   @   sP   e Zd ZdZd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 )ChosenResponseMixinzS
    Provides methods for returning the chosen object from the modal workflow.
    rq   Zchosenc                 C   s   |j S r8   rR   r+   instancer0   r0   r1   get_object_id  s    z!ChosenResponseMixin.get_object_idc                 C   s   t |S )zM
        Return a string representation of the given object instance
        )rz   r   r0   r0   r1   get_display_title  s    z%ChosenResponseMixin.get_display_titlec                 C   s   t | jjd|S )N)r   )r   r?   r   Zget_edit_urlr   r0   r0   r1   get_edit_item_url  s    z%ChosenResponseMixin.get_edit_item_urlc                 C   s(   dt | || j| |d| |iS )zY
        Generate the result value to be returned when an object has been chosen
        idZedit_url)rz   r   response_data_title_keyr   r   )r+   itemr0   r0   r1   get_chosen_response_data  s    
z,ChosenResponseMixin.get_chosen_response_datac                 C   s   t | jddd| j|ddS )zP
        Wrap a response_data JSON payload in a modal workflow response
        N)r   resultr   )r   r?   chosen_response_name)r+   response_datar0   r0   r1   _wrap_chosen_response_data  s    
z.ChosenResponseMixin._wrap_chosen_response_datac                    s    fdd|D }  |S )Nc                    s   g | ]}  |qS r0   )r   ).0r   r:   r0   r1   
<listcomp>      zDChosenResponseMixin.get_multiple_chosen_response.<locals>.<listcomp>)r   )r+   itemsr   r0   r:   r1   get_multiple_chosen_response  s    z0ChosenResponseMixin.get_multiple_chosen_responsec                 C   s(   |  |}| jjdr|g}| |S )zU
        Return the HTTP response to indicate that an object has been chosen
        r=   )r   r?   r@   rm   r   )r+   r   r   r0   r0   r1   get_chosen_response  s    
z'ChosenResponseMixin.get_chosen_responseN)r2   r3   r4   r5   r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   r     s   
r   c                   @   s    e Zd ZdZdd Zdd ZdS )ChosenViewMixinz
    A view that takes an object ID in the URL and returns a modal workflow response indicating
    that object has been chosen
    c                 C   s   | j jj|dS )Nr   )r;   rO   rm   )r+   rR   r0   r0   r1   
get_object  s    zChosenViewMixin.get_objectc                 C   s4   z|  t|}W n ty(   tY n0 | |S r8   )r   r   r   r   r   )r+   r?   rR   r   r0   r0   r1   rm     s
    
zChosenViewMixin.getN)r2   r3   r4   r5   r   rm   r0   r0   r0   r1   r     s   r   c                   @   s   e Zd ZdS )
ChosenViewNr   r0   r0   r0   r1   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )ChosenMultipleViewMixinz
    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   | j jj|dS )N)Zpk__in)r;   rO   rb   )r+   Zpksr0   r0   r1   get_objects  s    z#ChosenMultipleViewMixin.get_objectsc                 C   s   |  |jd}| |S )Nr   )r   r@   getlistr   )r+   r?   r   r0   r0   r1   rm   
  s    zChosenMultipleViewMixin.getN)r2   r3   r4   r5   r   rm   r0   r0   r0   r1   r     s   r   c                   @   s   e Zd ZdS )ChosenMultipleViewNr   r0   r0   r0   r1   r     s   r   c                       sD   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	  Z
S )CreateViewMixinz>
    A view that handles submissions of the 'create' form
    Nc                    s&   |   stt j|g|R i |S r8   )r   r   r'   dispatch)r+   r?   rt   r,   r.   r0   r1   r     s    zCreateViewMixin.dispatchc                 C   s   |   | _|  S r8   )r   r   !get_reshow_creation_form_response)r+   r?   r0   r0   r1   rm     s    
zCreateViewMixin.getc                 C   s   |  S r8   )saver   r0   r0   r1   	save_form#  s    zCreateViewMixin.save_formc                 C   s6   |   | _| j r*| | j}| |S |  S d S r8   )r   r   re   r   r   r   )r+   r?   objectr0   r0   r1   post&  s
    


zCreateViewMixin.postc                 C   sD   d| i}| | | j t| j|| j}t| jd d d d|ddS )NviewZreshow_creation_form)r   ZhtmlFragmentr   )r)   r   r   r   r   r?   r   )r+   r-   Zresponse_htmlr0   r0   r1   r   .  s    
z1CreateViewMixin.get_reshow_creation_form_response)r2   r3   r4   r5   r9   r   rm   r   r   r   r6   r0   r0   r.   r1   r     s   r   c                   @   s   e Zd ZdS )
CreateViewNr   r0   r0   r0   r1   r   @  s   r   )Mr   urllib.parserB   Zdjango.confr   Zdjango.contrib.admin.utilsr   r   Zdjango.core.exceptionsr   r   r   Zdjango.core.paginatorr   r	   Zdjango.db.modelsr
   Zdjango.forms.modelsr   Zdjango.httpr   Zdjango.template.loaderr   Zdjango.template.responser   Zdjango.urlsr   Zdjango.utils.functionalr   Zdjango.utils.translationr   ry   Zdjango.views.generic.baser   r   Zwagtailr   Zwagtail.admin.admin_url_finderr   Zwagtail.admin.forms.choosersr   r   r   r   Zwagtail.admin.modal_workflowr   Zwagtail.admin.ui.tablesr   r   r   Zwagtail.coreutilsr   Zwagtail.modelsr   r    Zwagtail.permission_policiesr!   r"   Zwagtail.search.indexr#   r$   r7   r<   rL   rM   r   r   r   r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   <module>   s^   !
 7I+<-