o
    hF                     @   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di |}|| j| j| jd |S )N)header_icon
page_titlepage_subtitle )superget_context_dataupdateiconr&   r'   )selfkwargscontext	__class__r(   c/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/admin/views/generic/chooser.pyr*   /   s   z(ModalPageFurnitureMixin.get_context_data)	__name__
__module____qualname____doc__r,   r&   r'   r*   __classcell__r(   r(   r0   r2   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-   r(   r(   r2   model_classC   s   
zModelLookupMixin.model_class)r3   r4   r5   r6   r:   r   r<   r(   r(   r(   r2   r8   ;   s
    r8   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   sB   i }| j D ]}z
| jj| ||< W q ty   Y qw tj|S r9   )preserve_url_parametersrequestGETKeyErrorurllibparse	urlencode)r-   paramsparamr(   r(   r2   _preserved_param_stringQ   s   
z2PreserveURLParametersMixin._preserved_param_stringc                 C   s2   | j rd|v r|d| j  7 }|S |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
        ?&)rH   )r-   urlr(   r(   r2   append_preserved_url_parameters\   s   z:PreserveURLParametersMixin.append_preserved_url_parametersN)r3   r4   r5   r6   r?   r   rH   rL   r(   r(   r(   r2   r=   I   s    

r=   c                   @   s   e Zd ZdZdS )CheckboxSelectColumnz6wagtailadmin/generic/chooser/checkbox_select_cell.htmlN)r3   r4   r5   cell_template_namer(   r(   r(   r2   rM   j   s    rM   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
    
   NsnippetChoosez)wagtailadmin/generic/chooser/chooser.htmlz)wagtailadmin/generic/chooser/results.htmlc                 C   s   | j j S r9   )r<   objectsallr;   r(   r(   r2   get_object_list   s   zBaseChooseView.get_object_listc                 C   sP   t | jttfr|j| j }|S | jr|| j}|S |jr!	 |S |d}|S )Npk)
isinstanceorderinglisttupleorder_byordered)r-   rS   r(   r(   r2   apply_object_list_ordering   s   

z)BaseChooseView.apply_object_list_orderingc                 C   s~   | j r| j S tg}| jr7t| jr|dt t| jtr#|dt t	t
dd}|r7t| jtr7|dt tdt|i S )Nr   WAGTAIL_I18N_ENABLEDF
FilterForm)filter_form_classr   r<   r#   insertr   
issubclassr   r   getattrr   r    r   typerZ   )r-   basesi18n_enabledr(   r(   r2   get_filter_form_class   s    
z$BaseChooseView.get_filter_form_classc                 C   s   |   }|| jjS r9   )rg   r@   rA   )r-   r_   r(   r(   r2   get_filter_form   s   zBaseChooseView.get_filter_formc              	   C   s   i }| j D ]}z
| jj| ||< W q ty   Y qw |r%|jdi |}| jr7t| jD ]}||| j}q.| j	 rB| j|}|S Nr(   )
url_filter_parametersr@   rA   rB   filterconstruct_queryset_hook_namer   	get_hooksfilter_formis_valid)r-   rS   filtersrk   hookr(   r(   r2   filter_object_list   s   

z!BaseChooseView.filter_object_listc                 C      |  t| jS r9   )rL   r   results_url_namer;   r(   r(   r2   get_results_url      zBaseChooseView.get_results_urlc                 C   rs   r9   )rL   r   chosen_multiple_url_namer;   r(   r(   r2   get_chosen_multiple_url   s   z&BaseChooseView.get_chosen_multiple_urlc                 C   s   | j jdS )Nr>   )r@   rA   getr;   r(   r(   r2   is_multiple_choice   s   z!BaseChooseView.is_multiple_choicec                 C   s   | j gS r9   )title_columnr;   r(   r(   r2   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 )
NtitleTitlezchooser-modal-select)labelaccessorlabel_prefixc                    s     t jt| jfdS )N)args)rL   r   chosen_url_namer   rV   )objr;   r(   r2   <lambda>   s    z-BaseChooseView.title_column.<locals>.<lambda>zdata-chooser-modal-choiceT)r   r   get_url
link_attrs)rz   r   _strr;   r(   r;   r2   r{      s   
zBaseChooseView.title_columnc                 C   s   t dtddddS )NselectSelectz1%rV   )r   widthr   )rM   r   r;   r(   r(   r2   checkbox_column   s   zBaseChooseView.checkbox_columnc                 C   sT   |   }| |}| |}t|| jd}z||jddW S  ty)   t	w )N)per_pagep   )
rU   r]   rr   r	   r   pagerA   ry   r   r   )r-   r@   rS   	paginatorr(   r(   r2   get_results_page   s   

zBaseChooseView.get_results_pagec                 C   sF   |   | _| || _| j}| jr|d| j t|| j| _	| 
 S )Nr   )rh   rn   r   resultsr|   rz   ra   r   r   tablerender_to_response)r-   r@   r|   r(   r(   r2   ry      s   
zBaseChooseView.getc                    sr   t  jdi |}|  }tdd|}|| j| j||| jj	| jj
| j| jj|  d	 | jr7|  |d< |S )Nz\?.*$ )	r   r   results_urlresults_pagination_urlis_searchingis_filtering_by_collectionrz   search_query
can_createchosen_multiple_urlr(   )r)   r*   ru   resubr+   r   r   rn   r   r   rz   r   r   rx   )r-   r.   r/   r   r   r0   r(   r2   r*     s$   zBaseChooseView.get_context_datac                 C   s   t  r9   )NotImplementedErrorr;   r(   r(   r2   r         z!BaseChooseView.render_to_response)#r3   r4   r5   r6   r   rX   r   rw   rt   r,   r   r&   r`   template_nameresults_template_namerl   rj   rU   r]   rg   rh   rr   ru   rx   r   rz   propertyr|   r{   r   r   ry   r*   r   r7   r(   r(   r0   r2   rO   n   sB    



rO   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createCreatec                 C   s0   | j r| j S | jrt| jtrt| jS td S r9   )permission_policyr<   rb   r
   r"   r!   r;   r(   r(   r2   get_permission_policy3  s
   
z'CreationFormMixin.get_permission_policyc                 C   s   |   | jjdS )Nadd)r   user_has_permissionr@   userr;   r(   r(   r2   r   ;  s   zCreationFormMixin.can_createc                 C   s8   | j r| j S | jd us| jd urt| j| j| jdS d S )N)fieldsexclude)creation_form_classform_fieldsexclude_form_fieldsr   r<   r;   r(   r(   r2   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   FILES)r-   r.   r(   r(   r2   get_creation_form_kwargsJ  s   z*CreationFormMixin.get_creation_form_kwargsc                 C   s"   |   }|sd S |di |  S ri   )r   r   )r-   
form_classr(   r(   r2   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   rd   rL   r   r;   r(   r(   r2   get_create_url\  s   z CreationFormMixin.get_create_urlc                 C   s   ||   | j| jdS )N)creation_formcreate_action_urlcreate_action_labelcreate_action_clicked_label)r   r   r   r-   formr(   r(   r2   get_creation_form_context_datad  s
   z0CreationFormMixin.get_creation_form_context_data)r3   r4   r5   r6   r   r   r   creation_form_template_namecreation_tab_idr   r   r   r   r   r   r   r   r   r   r   r   r(   r(   r(   r2   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
    SearchNc                    sX   t  jdi |}|| j| j| jp| jd |d r*|  }|r*|| | |S )N)rn   search_tab_labelcreation_tab_labelr   r(   )	r)   r*   r+   rn   r   r   r   r   r   )r-   r.   r/   r   r0   r(   r2   r*   v  s   	z ChooseViewMixin.get_context_datac                 C   s   ddiS )Nstepchooser(   r;   r(   r(   r2   get_response_json_data  s   z&ChooseViewMixin.get_response_json_datac                 C   s   t | j| jd |  |  dS )N	json_data)r   r@   r   r*   r   r;   r(   r(   r2   r     s   z"ChooseViewMixin.render_to_response)r3   r4   r5   r6   r   r   r   r*   r   r   r7   r(   r(   r0   r2   r   m  s    r   c                   @      e Zd ZdS )
ChooseViewNr3   r4   r5   r(   r(   r(   r2   r         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 r9   )r   r@   r   r*   r;   r(   r(   r2   r     s
   z)ChooseResultsViewMixin.render_to_responseN)r3   r4   r5   r6   r   r(   r(   r(   r2   r     s    r   c                   @   r   )ChooseResultsViewNr   r(   r(   r(   r2   r     r   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.
    r}   chosenc                 C   s   |j S r9   rV   r-   instancer(   r(   r2   get_object_id  r   z!ChosenResponseMixin.get_object_idc                 C   s   t |S )zM
        Return a string representation of the given object instance
        )r   r   r(   r(   r2   get_display_title  s   z%ChosenResponseMixin.get_display_titlec                 C   s   t | jjd|S )N)r   )r   r@   r   get_edit_urlr   r(   r(   r2   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
        idedit_url)r   r   response_data_title_keyr   r   )r-   itemr(   r(   r2   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_datar(   r(   r2   _wrap_chosen_response_data  s   
z.ChosenResponseMixin._wrap_chosen_response_datac                    s    fdd|D }  |S )Nc                    s   g | ]}  |qS r(   )r   ).0r   r;   r(   r2   
<listcomp>  s    zDChosenResponseMixin.get_multiple_chosen_response.<locals>.<listcomp>)r   )r-   itemsr   r(   r;   r2   get_multiple_chosen_response     
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@   rA   ry   r   )r-   r   r   r(   r(   r2   get_chosen_response  s   

z'ChosenResponseMixin.get_chosen_responseN)r3   r4   r5   r6   r   r   r   r   r   r   r   r   r   r(   r(   r(   r2   r     s    
r   c                   @       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      | j jj|dS )Nr   )r<   rS   ry   )r-   rV   r(   r(   r2   
get_object  rv   zChosenViewMixin.get_objectc                 C   s0   z	|  t|}W n	 ty   tw | |S r9   )r   r   r   r   r   )r-   r@   rV   r   r(   r(   r2   ry     s   
zChosenViewMixin.getN)r3   r4   r5   r6   r   ry   r(   r(   r(   r2   r         r   c                   @   r   )
ChosenViewNr   r(   r(   r(   r2   r     r   r   c                   @   r   )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   r   )N)pk__in)r<   rS   rk   )r-   pksr(   r(   r2   get_objects  rv   z#ChosenMultipleViewMixin.get_objectsc                 C   s   |  |jd}| |S )Nr   )r   rA   getlistr   )r-   r@   r   r(   r(   r2   ry   
  r   zChosenMultipleViewMixin.getN)r3   r4   r5   r6   r   ry   r(   r(   r(   r2   r     r   r   c                   @   r   )ChosenMultipleViewNr   r(   r(   r(   r2   r     r   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 r9   )r   r   r)   dispatch)r-   r@   r   r.   r0   r(   r2   r     s   zCreateViewMixin.dispatchc                 C   s   |   | _|  S r9   )r   r   !get_reshow_creation_form_response)r-   r@   r(   r(   r2   ry     s   
zCreateViewMixin.getc                 C   s   |  S r9   )saver   r(   r(   r2   	save_form#  s   zCreateViewMixin.save_formc                 C   s2   |   | _| j r| | j}| |S |  S r9   )r   r   ro   r   r   r   )r-   r@   objectr(   r(   r2   post&  s
   


zCreateViewMixin.postc                 C   sD   d| i}| | | j t| j|| j}t| jd d d d|ddS )Nviewreshow_creation_form)r   htmlFragmentr   )r+   r   r   r   r   r@   r   )r-   r/   response_htmlr(   r(   r2   r   .  s   
z1CreateViewMixin.get_reshow_creation_form_response)r3   r4   r5   r6   r:   r   ry   r   r  r   r7   r(   r(   r0   r2   r     s    r   c                   @   r   )
CreateViewNr   r(   r(   r(   r2   r  @  r   r  )Mr   urllib.parserC   django.confr   django.contrib.admin.utilsr   r   django.core.exceptionsr   r   r   django.core.paginatorr   r	   django.db.modelsr
   django.forms.modelsr   django.httpr   django.template.loaderr   django.template.responser   django.urlsr   django.utils.functionalr   django.utils.translationr   r   django.views.generic.baser   r   wagtailr   wagtail.admin.admin_url_finderr   wagtail.admin.forms.choosersr   r   r   r   wagtail.admin.modal_workflowr   wagtail.admin.ui.tablesr   r   r   wagtail.coreutilsr   wagtail.modelsr   r    wagtail.permission_policiesr!   r"   wagtail.search.indexr#   r$   r8   r=   rM   rO   r   r   r   r   r   r   r   r   r   r   r   r  r(   r(   r(   r2   <module>   s`    !
 7I+<-