a
    Dg                  	   @   s  d dl Z d dlmZmZmZ d dl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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%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l0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z= d dl>m?Z?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZFmGZG d dlHmIZI d dlHmJZK d dlLmMZMmNZNmOZO d d lPmQZQ d d!lRmSZS d d"lTmUZU d#d$lVmWZWmXZX d#d%lYmZZZm[Z[m\Z\m]Z] d#d&l^m_Z_ G d'd( d(eBe\e_eWZ`G d)d* d*e\e]e_eZeXe%ZaG d+d, d,ZbG d-d. d.ebeaZcG d/d0 d0e\e]e_eZeXe'ZdG d1d2 d2e\e]e_eZeXe&ZeG d3d4 d4e_eXe#ZfG d5d6 d6eXe#ZgG d7d8 d8e[eXe#ZhG d9d: d:eXe#ZidS );    N)label_for_fieldquoteunquote)ContentType)FieldDoesNotExistImproperlyConfiguredPermissionDenied)modelstransaction)
LOOKUP_SEP)Cast)Http404HttpResponseRedirect)get_object_or_404redirect)reverse)cached_property)capfirst)gettext)gettext_lazy)TemplateView)BaseCreateViewBaseDeleteViewBaseUpdateView)UnpublishAction)messages)WagtailFilterSet)WagtailAdminModelForm)get_edit_handler)	ComponentMediaContainer)display_class_registry)StatusSidePanel)ButtonsColumnMixinColumnTitleColumnUpdatedAtColumn)get_latest_strget_valid_next_url_from_request)SpreadsheetExportMixin)ButtonButtonWithDropdownHeaderButtonListingButton)log)registry)DraftStateMixinLocaleReferenceIndex)ModelLogEntry)class_is_indexed)RemovedInWagtail70Warning   )BaseListingViewWagtailAdminTemplateMixin)BeforeAfterHookMixinHookResponseMixinLocaleMixin
PanelMixin)PermissionCheckedMixinc                       sB  e Zd ZdZdZdZdZdZdZdZ	dZ
g dZdZde gZdZdZdd Zed	d
 Zedd Zedd Zdd Z fddZdd ZefddZef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)d* Z$d+d, Z%d-d. Z&ed/d0 Z'ed1d2 Z( fd3d4Z) fd5d6Z*  Z+S )7	IndexViewNzwagtailadmin/generic/index.htmlz'wagtailadmin/generic/index_results.htmladdchangedeleteview__str__Fc                 C   s   t dt | jS )NzX`IndexView.get_search_url` is deprecated. Use `IndexView.get_index_results_url` instead.)warningswarnr5   index_url_nameself rJ   a/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/admin/views/generic/models.pyget_search_urlQ   s
    zIndexView.get_search_urlc                 C   s   |   S N)rL   rH   rJ   rJ   rK   
search_url^   s    zIndexView.search_urlc                 C   s*   | j rt| j s| jsdS t| jp&| jS )NF)modelr4   Zsearch_fieldsboolindex_results_urlrN   rH   rJ   rJ   rK   is_searchableb   s    zIndexView.is_searchablec                    sD    j r js jsd S G  fddd}t j j dtfd|iS )Nc                       s   e Zd Z jZ jpg ZdS )z'IndexView.filterset_class.<locals>.MetaN)__name__
__module____qualname__rO   list_filterfieldsrJ   rH   rJ   rK   Metav   s   rX   Z	FilterSet)rO   rV   localetyperS   r   )rI   rX   rJ   rH   rK   filterset_classl   s    zIndexView.filterset_classc                 C   st   t |j}|rt|ts|S |jjtjj|jddt	t
dt
 ddddd d }|jt
|d	S )
NF)Zfor_concrete_modelpk)content_typeZ	object_idz
-timestamp-pk	timestampr6   )_updated_at)log_registryZget_log_model_for_modelrO   
issubclassr3   objectsfilterr   Zget_for_modelr   r	   ZOuterRefZ	CharFieldorder_byvaluesZannotateZSubquery)rI   querysetZ	log_modelZ
latest_logrJ   rJ   rK   _annotate_queryset_updated_at   s"    
z'IndexView._annotate_queryset_updated_atc                    s   t dd | jD }|r"| |}| jdkrD|tdjddS | jdkrf|tdjddS t	 
|}|js|r|tdjddd}n
|d}|S d S )	Nc                 s   s   | ]}t |d ddkV  qdS )accessorNr`   )getattr).0columnrJ   rJ   rK   	<genexpr>   s   z+IndexView.order_queryset.<locals>.<genexpr>r`   T)Znulls_firstz-_updated_at)Z
nulls_lastr^   )anycolumnsrh   Zorderingre   r	   FZascdescsuperorder_querysetZordered)rI   rg   Zhas_updated_at_column	__class__rJ   rK   rs      s"    



zIndexView.order_querysetc                    s0   t |ts, fdd}t|jt|fd|i}|S )Nc                    s
     |S rM   )get_list_buttons)rl   instanceargskwargsrH   rJ   rK   get_buttons   s    z6IndexView._get_title_column_class.<locals>.get_buttonsrz   )rb   r#   rZ   rS   )rI   column_classrz   rJ   rH   rK   _get_title_column_class   s    
z!IndexView._get_title_column_classc                    sH     |} fdd} js0|dtdt|dS  j||fd|i|S )Nc                    s     |  }r|S  | S rM   )get_edit_urlget_inspect_url)rw   edit_urlrH   rJ   rK   get_url   s    z,IndexView._get_title_column.<locals>.get_urlnameName)labelri   r   r   )r|   rO   r   str_get_custom_column)rI   
field_namer{   ry   r   rJ   rH   rK   _get_title_column   s     
zIndexView._get_title_columnc                 K   s   t | j|r|gn|t}|^ }}| j}d}|D ]}	|j|	}
|
j}|
j}q4t||dd\}}|rzt	d||d }t
|dd }|d u r|}|}|rd|}||ft||d|S )	N T)Zreturn_attrz&%(related_model_name)s %(field_label)s)Zrelated_model_nameZfield_labelZadmin_order_field.)r   sort_key)hasattrrO   splitr   _meta	get_fieldverbose_namerelated_modelr   _rj   joinr   )rI   r   r{   ry   lookupsZ	relationsfieldZmodel_classZforeign_field_namerO   Zforeign_fieldr   attrr   ri   rJ   rJ   rK   r      s>    


zIndexView._get_custom_columnc                 C   sT   g }t | jD ]@\}}t|tr&|}n|dkr:| |}n
| |}|| q|S Nr   )	enumeratelist_display
isinstancer$   r   r   append)rI   ro   ir   rl   rJ   rJ   rK   ro     s    

zIndexView.columnsc                 C   s*   | j r&| dr&t| j t|jfdS d S NrA   rx   )edit_url_nameuser_has_permissionr   r   r\   rI   rw   rJ   rJ   rK   r}     s    zIndexView.get_edit_urlc                 C   s*   | j r&| dr&t| j t|jfdS d S Nr@   r   )copy_url_namer   r   r   r\   r   rJ   rJ   rK   get_copy_url  s    zIndexView.get_copy_urlc                 C   s.   | j r*| h dr*t| j t|jfdS d S )N>   rA   rC   r@   rB   r   )inspect_url_nameZuser_has_any_permissionr   r   r\   r   rJ   rJ   rK   r~     s    
zIndexView.get_inspect_urlc                 C   s*   | j r&| dr&t| j t|jfdS d S NrB   r   )delete_url_namer   r   r   r\   r   rJ   rJ   rK   get_delete_url  s    zIndexView.get_delete_urlc                 C   s$   | j r | dr | t| j S d S )Nr@   )add_url_namer   _set_locale_query_paramr   rH   rJ   rJ   rK   get_add_url#  s    zIndexView.get_add_urlc                 C   s   |   S rM   r   rH   rJ   rJ   rK   add_url'  s    zIndexView.add_urlc                 C   s    | j s| jrt| jjjS | j S rM   )
page_titlerO   r   r   verbose_name_pluralrH   rJ   rJ   rK   get_page_title+  s    zIndexView.get_page_titlec                 C   s&   g }| j r"|t| j| j dd |S )Nplusurl	icon_name)r   r   r,   add_item_label)rI   buttonsrJ   rJ   rK   header_buttons0  s    zIndexView.header_buttonsc                 C   s   g }|  | }rB|ttd|ddtddt|i idd | | }r|ttd|d	dtd
dt|i idd | | }r|ttd|ddtddt|i idd | | }r|ttd|ddtddt|i idd |S )NEditedit
aria-labelzEdit '%(title)s'title
   )r   r   attrspriorityCopycopyzCopy '%(title)s'   Inspectinfo-circlezInspect '%(title)s'DeletebinzDelete '%(title)s'   )r}   r   r-   r   r   r   r~   r   )rI   rw   r   r   copy_urlinspect_url
delete_urlrJ   rJ   rK   get_list_more_buttons=  s`    
zIndexView.get_list_more_buttonsc              
   C   s>   |  |}g }|r:|t|ddtddt|i id |S )Nzdots-horizontalr   zMore options for '%(title)s'r   )r   r   r   )r   r   r+   r   r   )rI   rw   Zmore_buttonsr   rJ   rJ   rK   rv   r  s    


zIndexView.get_list_buttonsc                 C   s(   | j r ttdd| j jji S tdS )NzAdd %(model_name)s
model_nameAdd)rO   r   r   r   r   rH   rJ   rJ   rK   r     s
    zIndexView.add_item_labelc                 C   s   | j r| j jjS d S rM   )rO   r   r   rH   rJ   rJ   rK   r     s    
zIndexView.verbose_name_pluralc                    sz   t  j|i |}| d|d< |d rD| j |d< |d< | j|d< | jrd| jsd| j|d< | j|d< | jop| jj	|d< |S )	Nr@   can_addr   Zheader_action_urlZheader_action_labelrR   rN   
model_opts)
rr   get_context_datar   r   r   rR   rQ   rN   rO   r   )rI   rx   ry   contextrt   rJ   rK   r     s    


zIndexView.get_context_datac                    s4   | j r | |d | jjdS t j|fi |S )NZobject_listexport)Z	is_exportZas_spreadsheetrequestGETgetrr   render_to_response)rI   r   Zresponse_kwargsrt   rJ   rK   r     s
    zIndexView.render_to_response),rS   rT   rU   rO   template_nameZresults_template_namer   r   r   r   r   any_permission_requiredro   r&   r   rV   Zshow_other_searchesrL   r   rN   rR   r[   rh   rs   r|   r%   r   r$   r   r}   r   r~   r   r   r   r   r   r   rv   r   r   r   r   __classcell__rJ   rJ   rt   rK   r>   =   sZ   


	
-


5

r>   c                       s"  e Zd ZdZdZdZdZdZdZe	dZ
dZe	dZe	dZe	dZe	dZd	gZ f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dd Zdd Zdd Zd d! Zed"d# Z fd$d%Zd&d' Z d(d) Z!d*d+ Z" fd,d-Z#d.d/ Z$d0d1 Z%d2d3 Z& fd4d5Z'  Z(S )6
CreateViewNz wagtailadmin/generic/create.htmlZNewr@   z$%(model_name)s '%(object)s' created.z6The %(model_name)s could not be created due to errors.ZCreateu   Creating…createc                    s*   t  j|g|R i | | || _d S rM   rr   setup
get_actionactionrI   r   rx   ry   rt   rJ   rK   r     s    zCreateView.setupc                 C   s,   |   D ]}|jd| r|  S qdS )Naction-r   get_available_actionsPOSTr   rI   r   r   rJ   rJ   rK   r     s    
zCreateView.get_actionc                 C   s   | j S rM   actionsrH   rJ   rJ   rK   r     s    z CreateView.get_available_actionsc                 C   s    | j s| jrt| jjjS | j S rM   )Zpage_subtitlerO   r   r   r   rH   rJ   rJ   rK   get_page_subtitle  s    zCreateView.get_page_subtitlec                 C   s`   | j s| jS g }| jr6|t| jt| j jjd |dtdd| 	 i d | j| S )Nr   r   r   zNew: %(model_name)sr   )
rO   breadcrumbs_itemsrG   r   r   r   r   r   r   r   rI   itemsrJ   rJ   rK   get_breadcrumbs_items  s"    
z CreateView.get_breadcrumbs_itemsc                 C   s   | j std| t| j S )NzzSubclasses of wagtail.admin.views.generic.models.CreateView must provide an add_url_name attribute or a get_add_url method)r   r   r   r   rH   rJ   rJ   rK   r     s
    zCreateView.get_add_urlc                 C   s   |   S rM   r   rH   rJ   rJ   rK   r     s    zCreateView.add_urlc                 C   s&   | j stdt| j t| jjfdS )Nz|Subclasses of wagtail.admin.views.generic.models.CreateView must provide an edit_url_name attribute or a get_edit_url methodr   r   r   r   r   objectr\   rH   rJ   rJ   rK   r}     s
    zCreateView.get_edit_urlc                 C   s   | j std| t| j S )NzSubclasses of wagtail.admin.views.generic.models.CreateView must provide an index_url_name attribute or a get_success_url method)rG   r   r   r   rH   rJ   rJ   rK   get_success_url  s
    zCreateView.get_success_urlc                 C   s.   | j d u rd S t| j || jo$| jjjd S N)r   r   )success_messager   rO   r   r   r   rJ   rJ   rK   get_success_message  s    
zCreateView.get_success_messagec                 C   s   t |  tdgS Nr   r   buttonr}   r   rH   rJ   rJ   rK   get_success_buttons  s    zCreateView.get_success_buttonsc                 C   s,   | j d u rd S t| j d| jo$| jjji S Nr   error_messager   rO   r   r   rH   rJ   rJ   rK   get_error_message  s    
zCreateView.get_error_messagec                 C   s   | j jS rM   formZis_boundrH   rJ   rJ   rK   has_unsaved_changes  s    zCreateView.has_unsaved_changesc                    sl   t  jf i |}|d| _|  }| j|d< | j|d< | j|d< ||d< |d  |j7  < | j	|d< |S )Nr   
action_urlsubmit_button_labelsubmit_button_active_labelside_panelsmediar   )
rr   r   r   r   get_side_panelsr   r   r   r  r   rI   ry   r   r   rt   rJ   rK   r     s    



zCreateView.get_context_datac                 C   s2   g }| j r*|t| jj| j| j | jd t|S )N)rY   translations)rY   r   r"   r   rw   r   r  r    )rI   r   rJ   rJ   rK   r  )  s    zCreateView.get_side_panelsc                    s$    fddt j j jjdD S )Nc                    s    g | ]}|   j|d qS )rY   r   )r   r   )rk   rY   rH   rJ   rK   
<listcomp>7  s   z/CreateView.get_translations.<locals>.<listcomp>id)r1   rc   allexcluderY   r  rH   rJ   rH   rK   get_translations6  s    
zCreateView.get_translationsc                 C   s   | j r|  }| j |_ |S d S rM   )rY   rO   r   rJ   rJ   rK   get_initial_form_instance?  s    z$CreateView.get_initial_form_instancec                    s>   |    }r|| _t  }|  }t|tr:| jj|d< |S NZfor_user)	r  r   rr   get_form_kwargsget_form_classrb   r   r   user)rI   rw   ry   
form_classrt   rJ   rK   r  E  s    

zCreateView.get_form_kwargsc                 C   s   | j  }t|ddd |S )z
        Called after the form is successfully validated - saves the object to the db
        and returns the new object. Override this to implement custom save logic.
        zwagtail.createTrw   r   Zcontent_changed)r   saver.   r   rJ   rJ   rK   save_instanceQ  s    
zCreateView.save_instancec                 C   s:   |  | j}|  }|d ur.tj| j||d t|  S Nr   )r   r   r   r   successr   r   r   rI   r   success_buttonsrJ   rJ   rK   save_actionZ  s    zCreateView.save_actionc                 C   sX   || _ t  |  | _W d    n1 s.0    Y  |  }|  }|d urT|S |S rM   r   r
   atomicr  r   r  run_after_hookrI   r   responsehook_responserJ   rJ   rK   
form_valide  s    
(zCreateView.form_validc                    s2   || _ |  }|d ur&t| j|| t |S rM   r   r   r   Zvalidation_errorr   rr   form_invalidrI   r   r   rt   rJ   rK   r#  r  s
    zCreateView.form_invalid))rS   rT   rU   rO   r  rG   r   r   r   r   r   permission_requiredr   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  r!  r#  r   rJ   rJ   rt   rK   r     sN   

		r   c                   @   s   e Zd ZdddZdd ZdS )CopyViewMixinNc                 C   s   t | jtt| j| j dS N)r\   )r   rO   r   r   ry   pk_url_kwargrI   rg   rJ   rJ   rK   
get_object{  s    zCopyViewMixin.get_objectc                 C   s   |   S rM   )r*  rH   rJ   rJ   rK   r    s    z'CopyViewMixin.get_initial_form_instance)N)rS   rT   rU   r*  r  rJ   rJ   rJ   rK   r&  z  s   
r&  c                   @   s   e Zd ZdS )CopyViewN)rS   rT   rU   rJ   rJ   rJ   rK   r+    s   r+  c                       s  e Zd Zd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edZedZedZedZed	Zd
gZ fddZedd Zdd Zdd ZdE fdd	Zdd Zdd Z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&d)d* Z'd+d, Z(d-d. Z)d/d0 Z* fd1d2Z+d3d4 Z,d5d6 Z-d7d8 Z.d9d: Z/d;d< Z0d=d> Z1 fd?d@Z2edAdB Z3 fdCdDZ4  Z5S )FEditViewNZEditingzwagtailadmin/generic/edit.htmlrA   r   z$%(model_name)s '%(object)s' updated.z4The %(model_name)s could not be saved due to errors.ZSaveu	   Saving…r   c                    s*   t  j|g|R i | | || _d S rM   r   r   rt   rJ   rK   r     s    zEditView.setupc                 C   s:   z| j | j }W n ty,   | jd }Y n0 tt|S r   )ry   r(  KeyErrorrx   r   r   )rI   	quoted_pkrJ   rJ   rK   	object_pk  s
    zEditView.object_pkc                 C   s,   |   D ]}|jd| r|  S qdS )Nr   r   r   r   rJ   rJ   rK   r     s    
zEditView.get_actionc                 C   s   | j S rM   r   rH   rJ   rJ   rK   r     s    zEditView.get_available_actionsc                    s   | j | j| j< t |S rM   )r/  ry   r(  rr   r*  r)  rt   rJ   rK   r*    s    zEditView.get_objectc                 C   s
   t | jS rM   r'   r   rH   rJ   rJ   rK   r     s    zEditView.get_page_subtitlec                 C   sT   | j s| jS g }| jr6|t| jt| j jjd |d|  d | j| S )Nr   r   )	rO   r   rG   r   r   r   r   r   r   r   rJ   rJ   rK   r     s    zEditView.get_breadcrumbs_itemsc                 C   sL   g }|   }|  }|s|rD|t| j| j| j| j|||  d t	|S )N)rY   r  	usage_urlhistory_urlZlast_updated_info)
get_usage_urlget_history_urlr   r"   r   r   rY   r  get_last_updated_infor    )rI   r   r1  r2  rJ   rJ   rK   r    s     zEditView.get_side_panelsc                 C   s   t | jd S )Nr  )ra   Zget_logs_for_instancer   select_relatedfirstrH   rJ   rJ   rK   r5    s    zEditView.get_last_updated_infoc                 C   s   |  d| jS )NrB   )Z user_has_permission_for_instancer   rH   rJ   rJ   rK   
can_delete  s    zEditView.can_deletec                 C   s~   g }|    }r*|ttd|ddd | jrT|   }rT|t| j|ddd |   }rz|ttd|dd	d |S )
Nr   r   r   r   r   r   r   r   r   r   r   )r   r   r*   r   r8  r   delete_item_labelr~   )rI   r   r   r   r   rJ   rJ   rK   header_more_buttons  s:    zEditView.header_more_buttonsc                 C   s&   | j stdt| j t| jjfdS )NzzSubclasses of wagtail.admin.views.generic.models.EditView must provide an edit_url_name attribute or a get_edit_url methodr   r   rH   rJ   rJ   rK   r}     s
    zEditView.get_edit_urlc                 C   s,   | j r(| dr(t| j t| jjfdS d S r   )r   r   r   r   r   r\   rH   rJ   rJ   rK   r     s    zEditView.get_copy_urlc                 C   s"   | j rt| j t| jjfdS d S Nr   )r   r   r   r   r\   rH   rJ   rJ   rK   r     s    zEditView.get_delete_urlc                 C   s"   | j rt| j t| jjfdS d S r<  history_url_namer   r   r   r\   rH   rJ   rJ   rK   r4    s    zEditView.get_history_urlc                 C   s"   | j rt| j t| jjfdS d S r<  )r   r   r   r   r\   rH   rJ   rJ   rK   r~   #  s    zEditView.get_inspect_urlc                 C   s"   | j rt| j t| jjgdS d S r<  usage_url_namer   r   r   r\   rH   rJ   rJ   rK   r3  '  s    zEditView.get_usage_urlc                 C   s   | j stdt| j S )Nz~Subclasses of wagtail.admin.views.generic.models.EditView must provide an index_url_name attribute or a get_success_url methodrG   r   r   rH   rJ   rJ   rK   r   +  s
    zEditView.get_success_urlc                    s(    j s
g S  fdd j dD S )Nc                    s*   g | ]"}|j t jt|jgd dqS )r   r  )rY   r   r   r   r\   )rk   translationrH   rJ   rK   r  6  s   z-EditView.get_translations.<locals>.<listcomp>rY   )r   r   r  r6  rH   rJ   rH   rK   r  3  s
    
zEditView.get_translationsc                    s,   t   }|  }t|tr(| jj|d< |S r  )rr   r  r  rb   r   r   r  )rI   ry   r  rt   rJ   rK   r  >  s
    

zEditView.get_form_kwargsc                 C   s*   | j  }| j  | _t|d| jd |S )z
        Called after the form is successfully validated - saves the object to the db.
        Override this to implement custom save logic.
        zwagtail.editr  )r   r  has_changedZhas_content_changesr.   r   rJ   rJ   rK   r  E  s    
zEditView.save_instancec                 C   s6   |   }|  }|d ur*tj| j||d t|  S r  )r   r   r   r  r   r   r   r  rJ   rJ   rK   r  V  s    zEditView.save_actionc                 C   s0   | j d u rd S t| j | j| jo&| jjjd S r   )r   r   r   rO   r   r   rH   rJ   rJ   rK   r   a  s    
zEditView.get_success_messagec                 C   s   t |  tdgS r   r   rH   rJ   rJ   rK   r   l  s    zEditView.get_success_buttonsc                 C   s,   | j d u rd S t| j d| jo$| jjji S r   r   rH   rJ   rJ   rK   r   o  s    
zEditView.get_error_messagec                 C   sX   || _ t  |  | _W d    n1 s.0    Y  |  }|  }|d urT|S |S rM   r  r  rJ   rJ   rK   r!  w  s    
(zEditView.form_validc                    s2   || _ |  }|d ur&t| j|| t |S rM   r"  r$  rt   rJ   rK   r#    s
    zEditView.form_invalidc                 C   s   | j jS rM   r   rH   rJ   rJ   rK   r     s    zEditView.has_unsaved_changesc                    s   t  jf i |}|d| _|  }|  |d< |  |d< ||d< |d  |j7  < | j|d< | j	|d< | j
|d< | j|d	< |d	 r|  |d
< | j|d< |S )Nr   r   r2  r   r  r   r   r   r8  r   r:  )rr   r   r   r   r  r}   r4  r  r   r   r   r8  r   r:  r  rt   rJ   rK   r     s    




zEditView.get_context_data)N)6rS   rT   rU   rO   r  rG   r   r   r   r>  r   r@  r   r   context_object_namer   r%  r:  r   r   r   r   r   r   r   r/  r   r   r*  r   r   r  r5  r8  r;  r}   r   r   r4  r~   r3  r   r  r  r  r  r   r   r   r!  r#  r   r   r   rJ   rJ   rt   rK   r,    sh   
	


r,  c                       s   e Zd ZdZdZdZdZdZdZdZ	dZ
edZedZ fddZd  f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dd Zdd Zdd Z fddZ  ZS )!
DeleteViewNz(wagtailadmin/generic/confirm_delete.htmlrB   r   z$%(model_name)s '%(object)s' deleted.c                    s<   t  j|g|R i | |  | _|  | _|  | _d S rM   )rr   r   r*  r   r3  r1  	get_usageusager   rt   rJ   rK   r     s    

zDeleteView.setupc                    s`   t | dd r| jS z| j| j }W n ty>   | jd }Y n0 tt|| j| j< t 	|S )Nr   r   )
rj   r   ry   r(  r-  rx   r   r   rr   r*  )rI   rg   r.  rt   rJ   rK   r*    s    zDeleteView.get_objectc                 C   s   | j s
d S t| jS rM   )r1  r2   get_grouped_references_tor   rH   rJ   rJ   rK   rF    s    zDeleteView.get_usagec                 C   s*   t | j}|r|S | js tdt| jS )NzSubclasses of wagtail.admin.views.generic.models.DeleteView must provide an index_url_name attribute or a get_success_url method)r(   r   rG   r   r   rI   next_urlrJ   rJ   rK   r     s    
zDeleteView.get_success_urlc                 C   s
   t | jS rM   r   r   rH   rJ   rJ   rK   r     s    zDeleteView.get_page_subtitlec                 C   s   g S rM   rJ   rH   rJ   rJ   rK   r     s    z DeleteView.get_breadcrumbs_itemsc                 C   s&   | j stdt| j t| jjfdS )NzSubclasses of wagtail.admin.views.generic.models.DeleteView must provide a delete_url_name attribute or a get_delete_url methodr   )r   r   r   r   r   r\   rH   rJ   rJ   rK   r     s
    zDeleteView.get_delete_urlc                 C   s&   | j r"t| j t| jjfdd S d S )Nr   z?describe_on_delete=1r?  rH   rJ   rJ   rK   r3    s
    zDeleteView.get_usage_urlc                 C   s   t dd| jjji S )Nz4Are you sure you want to delete this %(model_name)s?r   )r   r   r   r   rH   rJ   rJ   rK   confirmation_message  s    
zDeleteView.confirmation_messagec                 C   s.   | j d u rd S t| j t| jjj| jd S )N)r   r   )r   r   r   r   r   rH   rJ   rJ   rK   r     s    
zDeleteView.get_success_messagec                 C   sD   t  ( t| jdd | j  W d    n1 s60    Y  d S )Nzwagtail.delete)rw   r   )r
   r  r.   r   rB   rH   rJ   rJ   rK   delete_action  s    
zDeleteView.delete_actionc                 C   sP   | j r| j jrt|  }|   t| j|   | 	 }|d urH|S t
|S rM   )rG  is_protectedr   r   rM  r   r  r   r   r  r   )rI   r   Zsuccess_urlr   rJ   rJ   rK   r!    s    zDeleteView.form_validc                    sX   t  jf i |}| jj|d< |  |d< | jrT| j|d< | j |d< | jj|d< |S )Nr   nextr1  usage_countrN  )	rr   r   r   r   r   r1  rG  countrN  rI   ry   r   rt   rJ   rK   r     s    
zDeleteView.get_context_data)N)rS   rT   rU   rO   rG   r   r   r@  r   rD  r%  r   r   r   r   r*  rF  r   r   r   r   r3  propertyrL  r   rM  r!  r   r   rJ   rJ   rt   rK   rE    s0   
rE  c                       s   e Zd Zg dZdZedZdZdZdZ	dZ
g Zg ZdZ fddZd dd	Z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dd Zdd Z fddZ  ZS )!InspectViewr?   z!wagtailadmin/generic/inspect.htmlr   Nr\   c                    s@   t  j|g|R i | | j| j | _|  | _|  | _d S rM   )	rr   r   ry   r(  r\   
get_fieldsrW   r*  r   r   rt   rJ   rK   r   )  s    
zInspectView.setupc                 C   s   t | jtt| jdS r'  r   rO   r   r   r\   r)  rJ   rJ   rK   r*  /  s    zInspectView.get_objectc                 C   s
   t | jS rM   r0  rH   rJ   rJ   rK   r   2  s    zInspectView.get_page_subtitlec                 C   sn   g }| j r*|t| j t| jjjd |  }|  }|rN|||d |d| 	 |d | j
| S Nr   r   )r   r   Zsublabel)rG   r   r   r   rO   r   r   r}   r   r   r   )rI   r   r   Z
object_strrJ   rJ   rK   r   5  s$    z!InspectView.get_breadcrumbs_itemsc                 C   sT   g }|    }r*|ttd|ddd |   }rP|ttd|ddd |S )Nr   r   r   r9  r   r   r   )r}   r   r*   r   r   )rI   r   r   r   rJ   rJ   rK   r;  K  s    zInspectView.header_more_buttonsc                    s2    j pdd  jj D } fdd|D }|S )Nc                 S   s*   g | ]"}|j r|jr |js|jr|jqS rJ   )ZconcreteZis_relationZauto_createdr   r   rk   frJ   rJ   rK   r  Y  s   z*InspectView.get_fields.<locals>.<listcomp>c                    s   g | ]}| j vr|qS rJ   )fields_excluderX  rH   rJ   rK   r  `      )rW   rO   r   rU  )rI   rW   rJ   rH   rK   rU  X  s
    
zInspectView.get_fieldsc                 C   s   t t|| jdS )N)rO   )r   r   rO   )rI   r   r   rJ   rJ   rK   get_field_labelc  s    zInspectView.get_field_labelc                 C   s   t | jd| d }|d ur,t|r(| S |S t | j|}t|tjrL| }t|tjrpddd |D pndS t	
|}|r||S |S )Nzget_%s_displayz, c                 s   s   | ]}t |V  qd S rM   )r   )rk   objrJ   rJ   rK   rm   w  r[  z6InspectView.get_field_display_value.<locals>.<genexpr>-)rj   r   callabler   r	   Managerr	  ZQuerySetr   r!   r   )rI   r   r   Z
value_funcvalueZdisplay_classrJ   rJ   rK   get_field_display_valuef  s    
z#InspectView.get_field_display_valuec                 C   sd   z| j j|}W n ty(   d }Y n0 | ||| ||d d}t|d tr`|d |d< |S )N)r   ra  	componentra  rc  )rO   r   r   r   r\  rb  r   r   )rI   r   r   r   rJ   rJ   rK   get_context_for_field  s    


z!InspectView.get_context_for_fieldc                    s    fdd j D S )Nc                    s   g | ]}  |qS rJ   )rd  )rk   r   rH   rJ   rK   r    r[  z2InspectView.get_fields_context.<locals>.<listcomp>)rW   rH   rJ   rH   rK   get_fields_context  s    zInspectView.get_fields_contextc                 C   s,   | j r(| dr(t| j t| jjfdS d S r   )r   r   r   r   r   r\   rH   rJ   rJ   rK   r}     s    zInspectView.get_edit_urlc                 C   s,   | j r(| dr(t| j t| jjfdS d S r   )r   r   r   r   r   r\   rH   rJ   rJ   rK   r     s    zInspectView.get_delete_urlc                    s,   t  jf i |}| j|d< |  |d< |S )Nr   rW   )rr   r   r   re  rR  rt   rJ   rK   r     s    
zInspectView.get_context_data)N)rS   rT   rU   r   r   r   r   rO   rG   r   r   rW   rZ  r(  r   r*  r   r   r   r;  rU  r\  rb  rd  re  r}   r   r   r   rJ   rJ   rt   rK   rT    s0   

rT  c                       s   e Zd ZdZdZdZdZedZedZ	edZ
dZdZdZdd Zed	d
 Z fddZddd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  ZS ) RevisionsCompareViewNr   ZHistoryComparez+wagtailadmin/generic/revisions/compare.htmlTc                 C   s   g }|    }r0| jr0||t| jjjd |   }rP|||  d |   }rn||| j	d |d| 
 |  d | j| S rW  )get_index_urlrO   r   r   r   r   r}   r   r4  history_labelr   r   )rI   r   	index_urlr   r2  rJ   rJ   rK   r     s$    z*RevisionsCompareView.get_breadcrumbs_itemsc                 C   s*   g }|    }r&|t| j|dd |S )Nr   r   )r}   r   r,   
edit_label)rI   r   r   rJ   rJ   rK   r     s    z#RevisionsCompareView.header_buttonsc                    s:   t  j|g|R i | || _|| _|| _|  | _d S rM   )rr   r   r\   revision_id_arevision_id_br*  r   )rI   r   r\   rl  rm  rx   ry   rt   rJ   rK   r     s
    zRevisionsCompareView.setupc                 C   s   t | jtt| jdS r'  rV  r)  rJ   rJ   rK   r*    s    zRevisionsCompareView.get_objectc                 C   s   | j r| j S t| jS rM   )edit_handlerr   rO   rH   rJ   rJ   rK   r     s    z%RevisionsCompareView.get_edit_handlerc                 C   s
   t | jS rM   rK  rH   rJ   rJ   rK   r     s    z&RevisionsCompareView.get_page_subtitlec                 C   s   | j rt| j S d S rM   )rG   r   rH   rJ   rJ   rK   rh    s    z"RevisionsCompareView.get_index_urlc                 C   s"   | j rt| j t| jjfdS d S r<  r=  rH   rJ   rJ   rK   r4    s    z$RevisionsCompareView.get_history_urlc                 C   s"   | j rt| j t| jjfdS d S r<  )r   r   r   r   r\   rH   rJ   rJ   rK   r}     s    z!RevisionsCompareView.get_edit_urlc                 C   s   |dkr| j }td}||fS |dkrD| j jdd }td}nD|dkrj| j jdd }td}nt| j j|d	}|rt|j}|st	|
 }||fS )
NZliveZLiveZearliest
created_atr  ZEarliestZlatestZLatestr  )r   r   	revisionsre   r7  lastr   r   ro  r   Z	as_object)rI   revision_idrevisionZrevision_headingrJ   rJ   rK   _get_revision_and_heading  s"    


z.RevisionsCompareView._get_revision_and_headingc                 C   sJ   |   j| j| jd d }g }|D ] }|||}| r$||g7 }q$|S )N)rw   r   r   )r   Zget_bound_panelr   r   Zget_comparisonrC  )rI   
revision_a
revision_b
comparisonresultcompdiffrJ   rJ   rK   _get_comparison  s    

z$RevisionsCompareView._get_comparisonc              	      s\   t  jf i |}| | j\}}| | j\}}| ||}|| j|||||d |S )N)r   ru  revision_a_headingrv  revision_b_headingrw  )rr   r   rt  rl  rm  r{  updater   )rI   ry   r   ru  r|  rv  r}  rw  rt   rJ   rK   r     s$    z%RevisionsCompareView.get_context_data)N)rS   rT   rU   rn  rG   r   r>  r   rk  ri  r   r   Z_show_breadcrumbsrO   r   r   r   r   r*  r   r   rh  r4  r}   rt  r{  r   r   rJ   rJ   rt   rK   rf    s.   

rf  c                       s   e Zd ZdZdZdZdZdZedZ	edZ
dZ fddZ fddZd#d	d
Zdd Zdd Zdd Zdd 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  ZS )$UnpublishViewNZ	Unpublishz'%(object)s' unpublished.z+wagtailadmin/generic/confirm_unpublish.htmlc                    s.   t  j|g|R i | || _|  | _d S rM   )rr   r   r\   r*  r   )rI   r   r\   rx   ry   rt   rJ   rK   r   3  s    zUnpublishView.setupc                    s$   |   | _t j|g|R i |S rM   )get_objects_to_unpublishobjects_to_unpublishrr   dispatchr   rt   rJ   rK   r  8  s    
zUnpublishView.dispatchc                 C   s.   | j rt| j tstt| j tt| jdS r'  rO   rb   r0   r   r   r   r   r\   r)  rJ   rJ   rK   r*  <  s    zUnpublishView.get_objectc                 C   s   t | jS rM   )r2   rH  r   rH   rJ   rJ   rK   rF  A  s    zUnpublishView.get_usagec                 C   s   g S rM   rJ   rH   rJ   rJ   rK   r   D  s    z#UnpublishView.get_breadcrumbs_itemsc                 C   s   | j gS rM   )r   rH   rJ   rJ   rK   r  G  s    z&UnpublishView.get_objects_to_unpublishc                 C   s
   t | jS rM   r0  rH   rJ   rJ   rK   r   K  s    zUnpublishView.get_page_subtitlec                 C   s"   | j d u rd S | j dt| ji S )Nr   )r   r   r   rH   rJ   rJ   rK   r   N  s    
z!UnpublishView.get_success_messagec                 C   s0   | j r,tt| j t| jjfdtdgS d S Nr   r   )r   r   r   r   r   r   r\   r   rH   rJ   rJ   rK   r   S  s    z!UnpublishView.get_success_buttonsc                 C   s   | j stdt| j S )NzSubclasses of wagtail.admin.views.generic.models.UnpublishView must provide an index_url_name attribute or a get_next_url methodrA  rH   rJ   rJ   rK   get_next_url\  s
    zUnpublishView.get_next_urlc                 C   s&   | j stdt| j t| jjfdS )NzSubclasses of wagtail.admin.views.generic.models.UnpublishView must provide an unpublish_url_name attribute or a get_unpublish_url methodr   )unpublish_url_namer   r   r   r   r\   rH   rJ   rJ   rK   get_unpublish_urld  s
    zUnpublishView.get_unpublish_urlc                 C   s"   | j rt| j t| jjfdS d S r<  r?  rH   rJ   rJ   rK   r3  l  s    zUnpublishView.get_usage_urlc                 C   sh   |  d| j| j}|d ur|S | jD ] }t|| jjd}|jdd q$|  d| j| j}|d urd|S d S )NZbefore_unpublish)r  T)Zskip_permission_checksZafter_unpublish)Zrun_hookr   r   r  r   r  execute)rI   r   r   r   rJ   rJ   rK   	unpublishq  s    
zUnpublishView.unpublishc                 O   sD   |   }|r|S |  }|  }|d ur8tj|||d t|  S r  )r  r   r   r   r  r   r  )rI   r   rx   ry   r   r   r  rJ   rJ   rK   post~  s    zUnpublishView.postc                    sl   t  jf i |}| jj|d< | j|d< |  |d< |  |d< |  |d< |d rh|  }| |d< |S )Nr   r   Zunpublish_urlrJ  r1  rP  )	rr   r   r   r   r  r  r3  rF  rQ  )rI   ry   r   rG  rt   rJ   rK   r     s    
zUnpublishView.get_context_data)N)rS   rT   rU   rO   rG   r   r  r@  r   r   r   r   r   r  r*  rF  r   r  r   r   r   r  r  r3  r  r  r   r   rJ   rJ   rt   rK   r  )  s.   
	r  c                       s   e Zd ZdZdZdZdZedZdZ	edZ
 fddZdddZd	d
 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dd Z  ZS )RevisionsUnscheduleViewNz4Version %(revision_id)s of "%(object)s" unscheduled.z5wagtailadmin/shared/revisions/confirm_unschedule.htmlZ
Unschedulec                    s>   t  j|g|R i | || _|| _|  | _|  | _d S rM   )rr   r   r\   rr  r*  r   get_revisionrs  )rI   r   r\   rr  rx   ry   rt   rJ   rK   r     s
    
zRevisionsUnscheduleView.setupc                 C   s.   | j rt| j tstt| j tt| jdS r'  r  r)  rJ   rJ   rK   r*    s    z"RevisionsUnscheduleView.get_objectc                 C   s   g S rM   rJ   rH   rJ   rJ   rK   r     s    z-RevisionsUnscheduleView.get_breadcrumbs_itemsc                 C   s   t | jj| jdS )Nr  )r   r   rp  rr  rH   rJ   rJ   rK   r    s    z$RevisionsUnscheduleView.get_revisionc                 C   s   t | jt| jj| jjfdS r<  )r   revisions_unschedule_url_namer   r   r\   rs  r  rH   rJ   rJ   rK   get_revisions_unschedule_url  s    z4RevisionsUnscheduleView.get_revisions_unschedule_urlc                 C   s
   t | jS rM   r0  rH   rJ   rJ   rK   get_object_display_title  s    z0RevisionsUnscheduleView.get_object_display_titlec                 C   s&   | j d u rd S | j | jj|  d S )Nrr  r   )r   rs  r  r  rH   rJ   rJ   rK   r     s    
z+RevisionsUnscheduleView.get_success_messagec                 C   s&   t t| jt| jjfdtdgS r  )r   r   r   r   r   r   r\   r   rH   rJ   rJ   rK   r     s    z+RevisionsUnscheduleView.get_success_buttonsc                 C   s8   t | j}|r|S | js tdt| jt| jjfdS )NzSubclasses of wagtail.admin.views.generic.models.RevisionsUnscheduleView  must provide a history_url_name attribute or a get_next_url methodr   )r(   r   r>  r   r   r   r   r\   rI  rJ   rJ   rK   r    s    
z$RevisionsUnscheduleView.get_next_urlc                 C   s   t td| jj|  d S )Nz(revision %(revision_id)s of "%(object)s"r  )r   r   rs  r  r  rH   rJ   rJ   rK   r     s    z)RevisionsUnscheduleView.get_page_subtitlec                    s6   t  jf i |}|| j| j|  |  d |S )N)r   rs  Zrevisions_unschedule_urlrJ  )rr   r   r~  r   rs  r  r  rR  rt   rJ   rK   r     s    z(RevisionsUnscheduleView.get_context_datac                 O   sL   d | j _| j j|jdgd |  }|  }|r@tj|||d t| 	 S )Napproved_go_live_at)r  Zupdate_fieldsr  )
rs  r  r  r  r   r   r   r  r   r  )rI   r   rx   ry   r   r  rJ   rJ   rK   r    s    zRevisionsUnscheduleView.post)N)rS   rT   rU   rO   r   r>  r  r   r   r   r   r   r*  r   r  r  r  r   r   r  r   r   r  r   rJ   rJ   rt   rK   r    s*   
	r  )jrE   Zdjango.contrib.admin.utilsr   r   r   Z"django.contrib.contenttypes.modelsr   Zdjango.core.exceptionsr   r   r   Z	django.dbr	   r
   Zdjango.db.models.constantsr   Zdjango.db.models.functionsr   Zdjango.httpr   r   Zdjango.shortcutsr   r   Zdjango.urlsr   Zdjango.utils.functionalr   Zdjango.utils.textr   Zdjango.utils.translationr   r   r   Zdjango.views.genericr   Zdjango.views.generic.editr   r   r   Zwagtail.actions.unpublishr   Zwagtail.adminr   Zwagtail.admin.filtersr   Zwagtail.admin.forms.modelsr   Zwagtail.admin.panelsr   Zwagtail.admin.ui.componentsr   r    Zwagtail.admin.ui.fieldsr!   Zwagtail.admin.ui.side_panelsr"   Zwagtail.admin.ui.tablesr#   r$   r%   r&   Zwagtail.admin.utilsr'   r(   Zwagtail.admin.views.mixinsr)   Zwagtail.admin.widgets.buttonr*   r+   r,   r-   Zwagtail.log_actionsr.   r/   ra   Zwagtail.modelsr0   r1   r2   Zwagtail.models.audit_logr3   Zwagtail.search.indexr4   Zwagtail.utils.deprecationr5   baser7   r8   Zmixinsr9   r:   r;   r<   Zpermissionsr=   r>   r   r&  r+  r,  rE  rT  rf  r  r  rJ   rJ   rJ   rK   <module>   s   
  n
 R

  
|  
n