a
    DgoW                     @   s  d dl 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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) d dl*m+Z+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 G dd deeZ7G dd dZ8G dd de8eZ9edg dZ:G d d! d!e7eZ;dS )"    N)
namedtuple)quoteunquote)ImproperlyConfigured)models)Q)get_object_or_404redirect)reversereverse_lazy)date_format)cached_property)gettext_lazy)View)ContextMixinTemplateResponseMixin)BaseListView)ChoiceFilterDateFromToRangeFilterModelChoiceFilterModelMultipleChoiceFilterMultipleChoiceFilter)messages)
SearchForm)ColumnTable)get_valid_next_url_from_request)ButtonWithDropdown)get_search_backend)class_is_indexed)flatten_choicesc                       s   e 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.
     Zwagtailadmin_homeZHome)urllabelzwagtailadmin/generic/base.htmlc                 C   s   | j S N)
page_titleself r)   _/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/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_subtitle>   s    z+WagtailAdminTemplateMixin.get_page_subtitlec                 C   s&   |   }|  }|r"| d| }|S )Nz: )r+   r-   )r(   titleZsubtitler)   r)   r*   get_header_titleA   s
    z*WagtailAdminTemplateMixin.get_header_titlec                 C   s   | j S r%   )header_iconr'   r)   r)   r*   get_header_iconH   s    z)WagtailAdminTemplateMixin.get_header_iconc                 C   s   | j S )z
        Define the current path to the view by copying the base
        :attr:`breadcrumbs_items` and appending the list.

        If breadcrumbs are not required, return an empty list.
        )breadcrumbs_itemsr'   r)   r)   r*   get_breadcrumbs_itemsK   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(   r4   Zmore_buttonsr)   r)   r*   get_header_buttonsT   s    

z,WagtailAdminTemplateMixin.get_header_buttonsc                 C   s
   t | jS r%   )r7   header_more_buttonsr'   r)   r)   r*   r9   c   s    z1WagtailAdminTemplateMixin.get_header_more_buttonsc                    s^   t  jf i |}|  |d< |  |d< |  |d< |  |d< |  |d< |  |d< |S )Nr&   r,   r0   Zheader_titler2   r8   )superget_context_datar+   r-   r1   r/   r3   r<   )r(   kwargscontext	__class__r)   r*   r?   f   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'   rB   r)   r*   rH   t   s    z,WagtailAdminTemplateMixin.get_template_names)__name__
__module____qualname____doc__r&   r,   r0   r   r;   r2   rE   r8   r=   r+   r-   r/   r1   r3   r<   r9   r?   rH   __classcell__r)   r)   rB   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                    s<   t  j|g|R i | |  | _|  | _| jj| _d S r%   )r>   setupget_pkrO   
get_objectobjectZ_metaZ
model_optsr(   requestargsr@   rB   r)   r*   rP      s    

zBaseObjectMixin.setupc                 C   s   t t| j| j S r%   )r   strr@   pk_url_kwargr'   r)   r)   r*   rQ      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)rO   )rY   r   r   r\   rO   r'   r)   r)   r*   rR      s
    zBaseObjectMixin.get_object)rI   rJ   rK   rL   rY   rX   rP   rQ   r\   rR   rM   r)   r)   rB   r*   rN   }   s   rN   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|g|R i | t|| _d S r%   )r>   rP   r   next_urlrT   rB   r)   r*   rP      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)rb   r   successrU   success_message_extra_tags)r(   ra   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)rV   )success_url_namer   r^   r
   r   rS   rO   r'   r)   r)   r*   get_success_url   s    z!BaseOperationView.get_success_urlc                 O   s   |    |   t|  S r%   )r`   re   r	   rg   rT   r)   r)   r*   post   s    zBaseOperationView.post)rI   rJ   rK   rL   ra   rd   rf   rP   r`   rb   re   rg   rh   rM   r)   r)   rB   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dZd
ZdZdZdZ fddZdd Zdd Zedd Zedd Zedd Z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/d0 Z)d1d2 Z*d3d4 Z+d5d6 Z,d7d8 Z-d9d: Z.ed;d< Z/d=d> Z0ed?d@ Z1dAdB Z2edCdD Z3 fdEdFZ4  Z5S )GBaseListingViewz!wagtailadmin/generic/listing.htmlz)wagtailadmin/generic/listing_results.htmlFN__str__ZTitle)r$   pqdefaultc                    s2   | j r$t| jttfr| jS | jgS t  S d S r%   )results_onlyrD   results_template_namerF   rG   r>   rH   r'   rB   r)   r*   rH      s
    z"BaseListingView.get_template_namesc                 C   s   | j d|  |  dg S )Nr"   )r#   r$   Zsublabel)r2   r+   r-   r'   r)   r)   r*   r3      s    z%BaseListingView.get_breadcrumbs_itemsc                 C   s*   | j s
d S | j| jjv r$t| jjS t S r%   )is_searchablesearch_kwargrU   GETr   r'   r)   r)   r*   get_search_form   s
    zBaseListingView.get_search_formc                 C   s   |   S r%   )rv   r'   r)   r)   r*   search_form   s    zBaseListingView.search_formc                 C   s"   | j r| j  r| j j| j S dS )Nr"   )rw   is_validcleaned_datart   r'   r)   r)   r*   search_query   s    zBaseListingView.search_queryc                 C   s
   t | jS r%   )boolrz   r'   r)   r)   r*   is_searching   s    zBaseListingView.is_searchingc                 C   s   | j s
|S t|jrx| jrxt| j}|j rH|j| j|| j| j	 dS t
j|j dtd |j| j|| j| j	 dS t }| jpg D ] }|tf i |d | jiO }q||S )N)fieldsZorder_by_relevancez is defined as Indexable but does not specify any AutocompleteFields. Searches within the admin will only respond to complete words.)categoryZ__icontains)r|   r   rY   search_backend_namer   Zget_autocomplete_search_fieldsautocompleterz   search_fieldsis_explicitly_orderedwarningswarnRuntimeWarningsearchr   filter)r(   querysetZsearch_backendqueryfieldr)   r)   r*   search_queryset  s2    


zBaseListingView.search_querysetc                 C   s*   | j r&| j f i |  }|jjr&|S d S r%   )filterset_classget_filterset_kwargsformr}   )r(   Z	filtersetr)   r)   r*   filters&  s    zBaseListingView.filtersc                 C   s   | j o| j  o| j j S r%   )r   rx   r   Zhas_changedr'   r)   r)   r*   is_filtering.  s    zBaseListingView.is_filteringc                 C   s   | j j| j dS )N)datarU   rU   ru   r'   r)   r)   r*   r   5  s    z$BaseListingView.get_filterset_kwargsc                 C   s    | j r| j  r| j |}|S r%   )r   rx   filter_querysetr(   r   r)   r)   r*   r   ;  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splitrU   ru   copypop
page_kwargrD   rF   rG   	urlencode)r(   parambase_url
query_dictrn   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)   )rW   ).0vrk   r)   r*   
<listcomp>X      zFBaseListingView.get_url_without_filter_param_value.<locals>.<listcomp>r   r   )
r   r   rU   ru   r   r   r   Zsetlistgetlistr   )r(   r   rk   r   r   r)   r   r*   "get_url_without_filter_param_valueO  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y^   Y qY n0 ||jkrlq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rZt|jnd}|jrpt|jnd}	|jj|	t
|j|j| d|	 |  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 - c                    s   g | ]}  |qS r)   )Zsuffixed)r   suffix
field_namewidgetr)   r*   r     s   z2BaseListingView.active_filters.<locals>.<listcomp>)r   r   Zchanged_datary   KeyErrorinitialrD   r   r   r:   ri   rj   r$   Zlabel_from_instancer   rO   r   r    choicesgetrW   r   r   r   startr   stopr   suffixesr   )
r(   r   Z
filter_defZbound_fieldrk   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_keyr:   )r(   Z	orderingscolr)   r)   r*   get_valid_orderings  s    
z#BaseListingView.get_valid_orderingsc                 C   s   d| j jv S Norderingr   r'   r)   r)   r*   r     s    z%BaseListingView.is_explicitly_orderedc                 C   s(   | j jd| j}||  vr$| j}|S r   )rU   ru   r   default_orderingr   )r(   r   r)   r)   r*   get_ordering  s    zBaseListingView.get_orderingc                 C   s   |   S r%   )r   r'   r)   r)   r*   r     s    zBaseListingView.orderingc                 C   s.   | j s
|S | j }t|ttfs$|f}|j| S r%   )r   rD   rF   rG   Zorder_by)r(   r   r   r)   r)   r*   order_queryset  s    zBaseListingView.order_querysetc                 C   sV   | j d ur&| j }t|tjrR| }n,| jd u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   rD   r   ZQuerySetr[   rY   rZ   r   rC   rI   r   r)   r)   r*   get_base_queryset  s    



z!BaseListingView.get_base_querysetc                 C   s*   |   }| |}| |}| |}|S r%   )r   r   r   r   r   r)   r)   r*   get_queryset  s
    


zBaseListingView.get_querysetc                 C   sF   | j |||  |  d}| jj| j}||}|||j|	 fS )N)ZorphansZallow_empty_first_page)
Zget_paginatorZget_paginate_orphansZget_allow_emptyrU   ru   r   r   Zget_pageobject_listZhas_other_pages)r(   r   Z	page_size	paginatorZpage_numberpager)   r)   r*   paginate_queryset  s    
z!BaseListingView.paginate_querysetc                 C   s   | j | j| jdS )N)r   r6   r   )r   table_classname	index_urlr'   r)   r)   r*   get_table_kwargs   s    z BaseListingView.get_table_kwargsc                 C   s   | j | j|fi |  S r%   )table_classr   r   )r(   r   r)   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                 C   s>   | j stdS | js| jr,tdd| j i S tdd| j i S )NzThere are no results.z#No %(model_name)s match your query.Z
model_namez'There are no %(model_name)s to display.)verbose_name_pluralr;   r|   r   r'   r)   r)   r*   no_results_message  s    z"BaseListingView.no_results_messagec                    sB  t  j|i |}| |d }| j|d< | j|d< | j|d< | j|d< | j|d< ||d< |j|d< |d	 d u|d
< |d
 r|d j	|d< nt
|d |d< | jr| j|d< | j|d< |d  | jjj7  < | jr| j|d< | j|d< | j|d< |d  | jj7  < | jjdo"| jo"| j|d< |do8| j|d< |S )Nr   r   r   r   r   r   tablemediaZpage_objZis_paginatedr   Zitems_countr   r   rw   r|   Zquery_stringr   Zrender_filters_fragmentr8   Zrender_buttons_fragment)r>   r?   r   r   r   r   r   r   r   countlenr   r   r   rw   r|   rz   rU   ru   r   rq   )r(   rV   r@   rA   r   rB   r)   r*   r?   ,  s<    










z BaseListingView.get_context_data)6rI   rJ   rK   rE   rr   rq   r   r   r   r   r;   r   r   r   r   rs   rt   r   r   r   r   r   rH   r3   rv   r   rw   rz   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r?   rM   r)   r)   rB   r*   rl      sr   		


$


Z

	


rl   )<r   collectionsr   Zdjango.contrib.admin.utilsr   r   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.modelsr   Zdjango.shortcutsr   r	   Zdjango.urlsr
   r   Zdjango.utils.formatsr   Zdjango.utils.functionalr   Zdjango.utils.translationr   r;   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.forms.searchr   Zwagtail.admin.ui.tablesr   r   Zwagtail.admin.utilsr   Zwagtail.admin.widgets.buttonr   Zwagtail.search.backendsr   Zwagtail.search.indexr   Zwagtail.utils.utilsr    r!   rN   r]   ri   rl   r)   r)   r)   r*   <module>   s:   [+