U
    {hIE                     @   sV  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 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mZ d dlmZ d dlmZ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- G dd deeZ.G dd dZ/G dd de/eZ0edddddgZ1G dd de.eZ2d S )!    )
namedtuple)quoteunquote)ImproperlyConfigured)models)get_object_or_404redirect)reversereverse_lazy)date_format)cached_property)gettext_lazy)View)ContextMixinTemplateResponseMixin)BaseListView)ChoiceFilterDateFromToRangeFilterModelChoiceFilterModelMultipleChoiceFilterMultipleChoiceFilter)messages)ColumnTable)get_valid_next_url_from_request)ButtonWithDropdown)flatten_choicesc                       s   e Zd ZdZdZdZdZdZede	ddgZ
dZg Zg Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Z fddZ fddZ  ZS )WagtailAdminTemplateMixinz
    Mixin for views that render a template response using the standard Wagtail admin
    page furniture.
    Provides accessors for page title, subtitle and header icon.
     FZwagtailadmin_homeZHome)urllabelzwagtailadmin/generic/base.htmlc                 C   s   | j S N)
page_titleself r%   h/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/admin/views/generic/base.pyget_page_title.   s    z(WagtailAdminTemplateMixin.get_page_titlec                 C   s   | j S r!   )page_subtitler#   r%   r%   r&   get_page_subtitle1   s    z+WagtailAdminTemplateMixin.get_page_subtitlec                 C   s&   |   }|  }|r"| d| }|S )Nz: )r'   r)   )r$   titlesubtitler%   r%   r&   get_header_title4   s
    z*WagtailAdminTemplateMixin.get_header_titlec                 C   s   | j S r!   )header_iconr#   r%   r%   r&   get_header_icon;   s    z)WagtailAdminTemplateMixin.get_header_iconc                 C   s   | j S r!   )breadcrumbs_itemsr#   r%   r%   r&   get_breadcrumbs_items>   s    z/WagtailAdminTemplateMixin.get_breadcrumbs_itemsc                 C   s8   t | j}|  }|r4|t|ddtdidd |S )Nzdots-horizontalz
aria-labelZActionszw-h-slim-header)buttonsZ	icon_nameattrs	classname)sortedheader_buttonsget_header_more_buttonsappendr   _)r$   r1   Zmore_buttonsr%   r%   r&   get_header_buttonsA   s    

z,WagtailAdminTemplateMixin.get_header_buttonsc                 C   s
   t | jS r!   )r4   header_more_buttonsr#   r%   r%   r&   r6   P   s    z1WagtailAdminTemplateMixin.get_header_more_buttonsc                    sh   t  jf |}|  |d< |  |d< |  |d< |  |d< d |d< | jrd|  |d< |  |d< |S )Nr"   r(   r-   Zheader_titler/   r5   )	superget_context_datar'   r)   r.   r,   _show_breadcrumbsr0   r9   )r$   kwargscontext	__class__r%   r&   r<   S   s    z*WagtailAdminTemplateMixin.get_context_datac                    s    t | jttfr| jS t  S r!   )
isinstancetemplate_namelisttupler;   get_template_namesr#   r@   r%   r&   rF   d   s    z,WagtailAdminTemplateMixin.get_template_names)__name__
__module____qualname____doc__r"   r(   r-   r=   r
   r8   r/   rC   r5   r:   r'   r)   r,   r.   r0   r9   r6   r<   rF   __classcell__r%   r%   r@   r&   r      s$   r   c                       s@   e Zd ZdZdZdZ fddZdd Zdd	 Zd
d Z	  Z
S )BaseObjectMixinz2Mixin for views that make use of a model instance.Npkc                    s6   t  j|f|| |  | _|  | _| jj| _d S r!   )r;   setupget_pkrM   
get_objectobject_metaZ
model_optsr$   requestargsr>   r@   r%   r&   rN   s   s    

zBaseObjectMixin.setupc                 C   s   t t| j| j S r!   )r   strr>   pk_url_kwargr#   r%   r%   r&   rO   y   s    zBaseObjectMixin.get_pkc                 C   s   | j j S r!   )model_default_managerallr#   r%   r%   r&   get_base_object_queryset|   s    z(BaseObjectMixin.get_base_object_querysetc                 C   s    | j stdt|  | jdS )NztSubclasses of wagtail.admin.views.generic.base.BaseObjectMixin must provide a model attribute or a get_object method)rM   )rX   r   r   r[   rM   r#   r%   r%   r&   rP      s
    zBaseObjectMixin.get_object)rG   rH   rI   rJ   rX   rW   rN   rO   r[   rP   rK   r%   r%   r@   r&   rL   m   s   rL   c                       sT   e Zd ZdZdZdZdZ fddZdd Zdd	 Z	d
d Z
dd Zdd Z  ZS )BaseOperationViewzKBase view to perform an operation on a model instance using a POST request.Nr   c                    s"   t  j|f|| t|| _d S r!   )r;   rN   r   next_urlrS   r@   r%   r&   rN      s    zBaseOperationView.setupc                 C   s   t d S r!   )NotImplementedErrorr#   r%   r%   r&   perform_operation   s    z#BaseOperationView.perform_operationc                 C   s   | j S r!   )success_messager#   r%   r%   r&   get_success_message   s    z%BaseOperationView.get_success_messagec                 C   s$   |   }|r tj| j|| jd d S )N)Z
extra_tags)ra   r   successrT   success_message_extra_tags)r$   r`   r%   r%   r&   add_success_message   s    z%BaseOperationView.add_success_messagec                 C   s2   | j std| jr| jS t| j t| jjgdS )NzSubclasses of wagtail.admin.views.generic.base.BaseOperationView must provide a success_url_name attribute or a get_success_url method)rU   )success_url_namer   r]   r	   r   rQ   rM   r#   r%   r%   r&   get_success_url   s    z!BaseOperationView.get_success_urlc                 O   s   |    |   t|  S r!   )r_   rd   r   rf   rS   r%   r%   r&   post   s    zBaseOperationView.post)rG   rH   rI   rJ   r`   rc   re   rN   r_   ra   rd   rf   rg   rK   r%   r%   r@   r&   r\      s   	
r\   ActiveFilterauto_idZfield_labelvalueZremoved_filter_urlc                       s  e Zd ZdZdZdZeZdZe	de
ddgZdZdZdZdZdZ fd	d
Zedd Zedd Zdd Zdd Zdd Zdd Zedd Zdd Zedd Zdd Zedd  Zd!d" Zd#d$ Zd%d& Z d'd( Z!d)d* Z"ed+d, Z#d-d. Z$ed/d0 Z%d1d2 Z& fd3d4Z'  Z(S )5BaseListingViewz!wagtailadmin/generic/listing.htmlz)wagtailadmin/generic/listing_results.htmlFN__str__ZTitle)r    pc                    s2   | j r$t| jttfr| jS | jgS t  S d S r!   )results_onlyrB   results_template_namerD   rE   r;   rF   r#   r@   r%   r&   rF      s
    z"BaseListingView.get_template_namesc                 C   s&   | j r"| j f |  }|jjr"|S d S r!   )filterset_classget_filterset_kwargsformfields)r$   Z	filtersetr%   r%   r&   filters   s    zBaseListingView.filtersc                 C   s   | j o| j  o| j j S r!   )rt   is_validrr   Zhas_changedr#   r%   r%   r&   is_filtering   s    zBaseListingView.is_filteringc                 C   s   | j j| j dS )N)datarT   rT   GETr#   r%   r%   r&   rq      s    z$BaseListingView.get_filterset_kwargsc                 C   s    | j r| j  r| j |}|S r!   )rt   ru   filter_querysetr$   querysetr%   r%   r&   rz      s    zBaseListingView.filter_querysetc                 C   st   | j dd }| jj }|| jd t|tt	frP|D ]}||d q<n||d d|d< |d |
  S )zd
        Return the index URL with the given filter parameter removed from the query string
        ?r   N   _w_filter_fragment)index_results_urlsplitrT   ry   copypop
page_kwargrB   rD   rE   	urlencode)r$   parambase_url
query_dictrm   r%   r%   r&   get_url_without_filter_param   s    z,BaseListingView.get_url_without_filter_paramc                    sb   | j dd }| jj }|| jd || fdd||D  d|d< |d |	  S )z
        Return the index URL where the filter parameter with the given value has been removed
        from the query string, preserving all other values for that parameter
        r}   r   Nc                    s   g | ]}|t  kr|qS r%   )rV   ).0vrj   r%   r&   
<listcomp>   s      zFBaseListingView.get_url_without_filter_param_value.<locals>.<listcomp>r~   r   )
r   r   rT   ry   r   r   r   Zsetlistgetlistr   )r$   r   rj   r   r   r%   r   r&   "get_url_without_filter_param_value   s     z2BaseListingView.get_url_without_filter_param_valuec           
         s(  g }| j s|S | j jjD ] | j j   }| j j  }z| j jj  }W n tk
r`   Y qY nX ||jkrnqt|tr|j}|D ],}|	t
|j|j|||  |j qqt|trt|jj}|D ]4}|	t
|j|j|t|t||  | qqt|tr>|j}|	t
|j|j|||   qt|tr|jr\t|jnd}|jrrt|jnd}	|jj|	t
|j|jd||	f |  fddjD  qt|tr t|jj}|	t
|j|j|t|t||   q|	t
|j|jt||   q|S )Nr   z%s - %sc                    s   g | ]}  |qS r%   )suffixed)r   suffix
field_namewidgetr%   r&   r   B  s   z2BaseListingView.active_filters.<locals>.<listcomp>)rt   rr   Zchanged_dataZcleaned_dataKeyErrorinitialrB   r   fieldr7   rh   ri   r    Zlabel_from_instancer   rM   r   r   choicesgetrV   r   r   r   startr   stopr   suffixesr   )
r$   rt   Z
filter_defZbound_fieldrj   r   itemr   Zstart_date_displayZend_date_displayr%   r   r&   active_filters  s    


 


		zBaseListingView.active_filtersc                 C   s6   g }| j D ]&}|jr
||j |d|j  q
|S )Nz-%s)columnssort_keyr7   )r$   Z	orderingscolr%   r%   r&   get_valid_orderings_  s    
z#BaseListingView.get_valid_orderingsc                 C   s   d| j jkS Norderingrx   r#   r%   r%   r&   is_explicitly_orderedg  s    z%BaseListingView.is_explicitly_orderedc                 C   s(   | j jd| j}||  kr$| j}|S r   )rT   ry   r   default_orderingr   )r$   r   r%   r%   r&   get_orderingk  s    zBaseListingView.get_orderingc                 C   s   |   S r!   )r   r#   r%   r%   r&   r   q  s    zBaseListingView.orderingc                 C   s.   | j s
|S | j }t|ttfs$|f}|j| S r!   )r   rB   rD   rE   Zorder_by)r$   r|   r   r%   r%   r&   order_querysetu  s    zBaseListingView.order_querysetc                 C   sV   | j d k	r&| j }t|tjrR| }n,| jd k	r>| jj }ntdd| jj	i |S )Nzj%(cls)s is missing a QuerySet. Define %(cls)s.model, %(cls)s.queryset, or override %(cls)s.get_queryset().cls)
r|   rB   r   ZQuerySetrZ   rX   rY   r   rA   rG   r{   r%   r%   r&   get_base_queryset~  s    



z!BaseListingView.get_base_querysetc                 C   s    |   }| |}| |}|S r!   )r   r   rz   r{   r%   r%   r&   get_queryset  s    

zBaseListingView.get_querysetc                 C   s   | j | j| jdS )N)r   r3   r   )r   table_classname	index_urlr#   r%   r%   r&   get_table_kwargs  s    z BaseListingView.get_table_kwargsc                 C   s   | j | j|f|  S r!   )table_classr   r   )r$   object_listr%   r%   r&   	get_table  s    zBaseListingView.get_tablec                 C   s   |   S r!   )get_index_urlr#   r%   r%   r&   r     s    zBaseListingView.index_urlc                 C   s   | j rt| j S d S r!   )index_url_namer	   r#   r%   r%   r&   r     s    zBaseListingView.get_index_urlc                 C   s   |   S r!   )get_index_results_urlr#   r%   r%   r&   r     s    z!BaseListingView.index_results_urlc                 C   s   | j rt| j S d S r!   )index_results_url_namer	   r#   r%   r%   r&   r     s    z%BaseListingView.get_index_results_urlc                    s   t  j||}| |d }| j|d< | j|d< ||d< |j|d< |d d k	|d< |d rj|d j|d	< nt|d |d	< | jr| j|d
< | j	|d< |d  | jj
j7  < | jjdo| jo| j|d< |do| j|d< |S )Nr   r   r   tablemediaZpage_objZis_paginatedZ	paginatorZitems_countrt   rv   r   Zrender_filters_fragmentr5   Zrender_buttons_fragment)r;   r<   r   r   r   r   countlenrt   rv   rr   rT   ry   r   rn   )r$   rU   r>   r?   r   r@   r%   r&   r<     s,    




z BaseListingView.get_context_data))rG   rH   rI   rC   ro   rn   r   r   r   r   r8   r   r   r   r   r   rp   rF   r   rt   rv   rq   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r<   rK   r%   r%   r@   r&   rk      sP   


Z

	

rk   N)3collectionsr   Zdjango.contrib.admin.utilsr   r   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.shortcutsr   r   Zdjango.urlsr	   r
   Zdjango.utils.formatsr   Zdjango.utils.functionalr   Zdjango.utils.translationr   r8   Zdjango.viewsr   Zdjango.views.generic.baser   r   Zdjango.views.generic.listr   Zdjango_filters.filtersr   r   r   r   r   Zwagtail.adminr   Zwagtail.admin.ui.tablesr   r   Zwagtail.admin.utilsr   Zwagtail.admin.widgets.buttonr   Zwagtail.utils.utilsr   r   rL   r\   rh   rk   r%   r%   r%   r&   <module>   s2   P+ 
