a
    Dgt                     @   s  d dl 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 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" 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/m0Z0m1Z1 d dl2m3Z3 d dl2m4Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@ G dd dZAG dd deAZBG d d! d!ZCG d"d# d#ZDG d$d% d%ZEG d&d' d'ZFG d(d) d)ZGdS )*    N)settings)quote)ContentType)modelstransaction)Media)get_object_or_404)render_to_string)reverse)timezone)cached_property)format_html)	mark_safe)capfirst)gettext)hooks)messages)EditingSession)user_display_name)EditingSessionsModule)TitleColumn)get_latest_strset_query_params)	BasicLockScheduledForPublishLockWorkflowLock)log)registry)DraftStateMixinLocaleLockableMixinPreviewableMixinRevisionMixinTranslatableMixinWorkflowMixinWorkflowState)render_timestampc                   @   s   e Zd ZdZdd ZdS )HookResponseMixinzD
    A mixin for class-based views to run hooks by `hook_name`.
    c                 O   s4   t |D ]$}||i |}t|dr
|  S q
dS )z
        Run the named hook, passing args and kwargs to each function registered under that hook name.
        If any return an HttpResponse, stop processing and return that response
        status_codeN)r   Z	get_hookshasattr)self	hook_nameargskwargsfnresult r0   a/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/admin/views/generic/mixins.pyrun_hook.   s
    

zHookResponseMixin.run_hookN)__name__
__module____qualname____doc__r2   r0   r0   r0   r1   r'   )   s   r'   c                       s<   e Zd ZdZdd Zdd Z fddZ fdd	Z  ZS )
BeforeAfterHookMixinz
    A mixin for class-based views to support hooks like `before_edit_page` and
    `after_edit_page`, which are triggered during execution of some operation and
    can return a response to halt that operation and/or change the view response.
    c                 C   s   dS )a  
        Define how to run the hooks before the operation is executed.
        The `self.run_hook(hook_name, *args, **kwargs)` from HookResponseMixin
        can be utilised to call the hooks.

        If this method returns a response, the operation will be aborted and the
        hook response will be returned as the view response, skipping the default
        response.
        Nr0   r*   r0   r0   r1   run_before_hookA   s    
z$BeforeAfterHookMixin.run_before_hookc                 C   s   dS )av  
        Define how to run the hooks after the operation is executed.
        The `self.run_hook(hook_name, *args, **kwargs)` from HookResponseMixin
        can be utilised to call the hooks.

        If this method returns a response, it will be returned as the view
        response immediately after the operation finishes, skipping the default
        response.
        Nr0   r8   r0   r0   r1   run_after_hookM   s    
z#BeforeAfterHookMixin.run_after_hookc                    s&   |   }|d ur|S t j|i |S N)r9   superdispatch)r*   r,   r-   hooks_result	__class__r0   r1   r=   Y   s    zBeforeAfterHookMixin.dispatchc                    s$   t  |}|  }|d ur |S |S r;   )r<   
form_validr:   )r*   formresponser>   r?   r0   r1   rA   `   s
    zBeforeAfterHookMixin.form_valid)	r3   r4   r5   r6   r9   r:   r=   rA   __classcell__r0   r0   r?   r1   r7   :   s
   r7   c                       sN   e Zd Zedd Zedd Zdd Zdd Z fd	d
ZdddZ	  Z
S )LocaleMixinc                 C   s   |   S r;   )
get_localer8   r0   r0   r1   localek   s    zLocaleMixin.localec                 C   s   | j r|  S g S r;   )rG   get_translationsr8   r0   r0   r1   translationso   s    zLocaleMixin.translationsc                 C   sn   t | dd sd S t tdd}|r,t| jts0d S t| drH| jrH| jjS | jj	
d}|rftt|dS t S )NmodelZWAGTAIL_I18N_ENABLEDFobjectrG   )language_code)getattrr   
issubclassrJ   r#   r)   rK   rG   requestGETgetr   r   get_default)r*   Zi18n_enabledZselected_localer0   r0   r1   rF   s   s    zLocaleMixin.get_localec                 C   s   g S r;   r0   r8   r0   r0   r1   rH      s    zLocaleMixin.get_translationsc                    s4   t  jf i |}| js|S | j|d< | j|d< |S )NrG   rI   )r<   get_context_datarG   rI   r*   r-   contextr?   r0   r1   rS      s    

zLocaleMixin.get_context_dataNc                 C   s"   |p| j  }s|S t|d|jiS )NrG   )rG   r   rL   )r*   urlrG   r0   r0   r1   _set_locale_query_param   s    z#LocaleMixin._set_locale_query_param)N)r3   r4   r5   r   rG   rI   rF   rH   rS   rW   rD   r0   r0   r?   r1   rE   j   s   

	rE   c                       sH   e Zd ZdZ fddZdd Zdd Z fdd	Z fd
dZ  Z	S )
PanelMixinNc                    s(   t  j|g|R i | |  | _d S r;   )r<   setup	get_panelpanelr*   rO   r,   r-   r?   r0   r1   rY      s    zPanelMixin.setupc                 C   s   | j S r;   )r[   r8   r0   r0   r1   rZ      s    zPanelMixin.get_panelc                 C   s    | j s
d S | j j| j|j|dS )N)rO   instancerB   )r[   get_bound_panelrO   r]   r*   rB   r0   r0   r1   r^      s
    
zPanelMixin.get_bound_panelc                    s    | j s| jst  S | j S r;   )Z
form_classr[   r<   get_form_classr8   r?   r0   r1   r`      s    
zPanelMixin.get_form_classc                    sd   t  jf i |}|d}| |}|dt }|rB||j7 }|rP||j7 }|||d |S )NrB   media)r[   ra   )r<   rS   rQ   r^   r   ra   update)r*   r-   rU   rB   r[   ra   r?   r0   r1   rS      s    



zPanelMixin.get_context_data)
r3   r4   r5   r[   rY   rZ   r^   r`   rS   rD   r0   r0   r?   r1   rX      s   rX   c                       s0   e Zd ZdZef fdd	Z fddZ  ZS )IndexViewOptionalFeaturesMixinz
    A mixin for generic IndexView to support optional features that are applied
    to the model as mixins (e.g. DraftStateMixin, RevisionMixin).
    c                    s6   | dd }|s|dkrt}t j||fd|i|S )Naccessor__str__)popr   r<   _get_title_column)r*   
field_nameZcolumn_classr-   rd   r?   r0   r1   rg      s    z0IndexViewOptionalFeaturesMixin._get_title_columnc                    s8   t |jtr,|d}|jtdd}|S t |S )Nlatest_revisionZlatest_revision__created_at)Z_updated_at)	rN   rJ   r"   Zselect_relatedZannotater   Fr<   _annotate_queryset_updated_atr*   querysetr?   r0   r1   rk      s    
z<IndexViewOptionalFeaturesMixin._annotate_queryset_updated_at)r3   r4   r5   r6   r   rg   rk   rD   r0   r0   r?   r1   rc      s   
rc   c                       st  e 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edd Zedd	 Zed
d Zedd Zedd Z fddZdd Z fddZdF f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dGd&d'Z fd(d)Zd*d+ Z d,d- Z!d.d/ Z"d0d1 Z#d2d3 Z$d4d5 Z%d6d7 Z&d8d9 Z' fd:d;Z(d<d= Z)d>d? Z*d@dA Z+ fdBdCZ,dDdE Z-  Z.S )H#CreateEditViewOptionalFeaturesMixinz
    A mixin for generic CreateView/EditView to support optional features that
    are applied to the model as mixins (e.g. DraftStateMixin, RevisionMixin).
    createNc                    s   || _ || _|| _| jo"t| jt| _| jo6t| jt| _| joJt| jt	| _
| joht| jtoh| jdk| _|  | _|  | _| jo| j|j| _t j|g|R i | d S Nro   )rO   r,   r-   rJ   rN   r!   preview_enabledr"   revision_enabledr   draftstate_enabledr    	view_namelocking_enabled
get_objectrK   get_locklockfor_useruserlocked_for_userr<   rY   r\   r?   r0   r1   rY      s    


z)CreateEditViewOptionalFeaturesMixin.setupc                 C   s0   | j rt| j tsd S | jr&| j S | j  S r;   )rJ   rN   r$   rK   Zget_workflowZget_default_workflowr8   r0   r0   r1   workflow  s
    
z,CreateEditViewOptionalFeaturesMixin.workflowc                 C   s
   | j d uS r;   )r|   r8   r0   r0   r1   workflow_enabled
  s    z4CreateEditViewOptionalFeaturesMixin.workflow_enabledc                 C   s*   | j r| jsd S | jjp(| jjd S )N
created_at)r}   rK   Zcurrent_workflow_stateZworkflow_statesZorder_bylastr8   r0   r0   r1   workflow_state  s
    z2CreateEditViewOptionalFeaturesMixin.workflow_statec                 C   s   | j r| jsd S | jjS r;   )r}   rK   current_workflow_taskr8   r0   r0   r1   r     s    z9CreateEditViewOptionalFeaturesMixin.current_workflow_taskc                 C   s   | j s
g S | j  S r;   )r   Zall_tasks_with_statusr8   r0   r0   r1   workflow_tasks  s    z2CreateEditViewOptionalFeaturesMixin.workflow_tasksc                    s   | j j}|dkr0| jr0|jr dS | j| j|S |dkrj|jrBdS | jj|jkrTdS | jrj| j| j|S t	 
|}|r~dS |dkr| jr| j| j| j jrdS dS )Nrx   TunlockZchangeF)rO   rz   r   Zis_superuseruser_can_lockrK   Zlocked_by_idpkuser_can_unlockr<   user_has_permissionZuser_can_access_editor)r*   Z
permissionrz   Zhas_base_permissionr?   r0   r1   r   #  s2    
z7CreateEditViewOptionalFeaturesMixin.user_has_permissionc                 C   sF   | j s
dS | jjd| _| j | j| jj}dd |D }| j|v S )NFzworkflow-action-namec                 S   s   g | ]\}}}|qS r0   r0   ).0nameverbose_namemodalr0   r0   r1   
<listcomp>T  s   zPCreateEditViewOptionalFeaturesMixin.workflow_action_is_valid.<locals>.<listcomp>)r   rO   POSTrQ   workflow_actionZget_actionsrK   rz   )r*   Zavailable_actionsZavailable_action_namesr0   r0   r1   workflow_action_is_validM  s    
z<CreateEditViewOptionalFeaturesMixin.workflow_action_is_validc                    s   g t   }| jjdkr|S | jrF| jr<| j| jjdrF|d | j	r|d | j
r| j
| jjr|d | jr| jjs|d |  r|d |S )Nr   publishsubmitcancel-workflowrestart-workflowzworkflow-action)r<   get_available_actionsrO   methodrs   Zpermission_policyr   rz   appendr}   r   Zuser_can_cancelrK   Zworkflow_in_progressr   )r*   actionsr?   r0   r1   r   Y  s(    




z9CreateEditViewOptionalFeaturesMixin.get_available_actionsc                    s2   | j dkrd S t || _| jr,| j S | jS rp   )rt   r<   rv   Zlive_objectrs   Zget_latest_revision_as_objectrl   r?   r0   r1   rv   t  s    

z.CreateEditViewOptionalFeaturesMixin.get_objectc                 C   s   | j s
d S | j S r;   )ru   rK   rw   r8   r0   r0   r1   rw   |  s    z,CreateEditViewOptionalFeaturesMixin.get_lockc                 C   s(   | j r| jsd S t| jt| jjgdS Nr,   )ru   lock_url_namer
   r   rK   r   r8   r0   r0   r1   get_lock_url  s    z0CreateEditViewOptionalFeaturesMixin.get_lock_urlc                 C   s(   | j r| jsd S t| jt| jjgdS r   )ru   unlock_url_namer
   r   rK   r   r8   r0   r0   r1   get_unlock_url  s    z2CreateEditViewOptionalFeaturesMixin.get_unlock_urlc                 C   s:   | j r| jsd S | jdkrg nt| jjg}t| j|dS )Nro   r   )rq   preview_url_namert   r   rK   r   r
   )r*   r,   r0   r0   r1   get_preview_url  s    z3CreateEditViewOptionalFeaturesMixin.get_preview_urlc                 C   s(   | j r| jsd S t| jt| jjgdS r   )r}   workflow_history_url_namer
   r   rK   r   r8   r0   r0   r1   get_workflow_history_url  s    z<CreateEditViewOptionalFeaturesMixin.get_workflow_history_urlc                 C   s(   | j r| jsd S t| jt| jjgdS r   )r}   &confirm_workflow_cancellation_url_namer
   r   rK   r   r8   r0   r0   r1   %get_confirm_workflow_cancellation_url  s
    zICreateEditViewOptionalFeaturesMixin.get_confirm_workflow_cancellation_urlc                    s8   | j dkrd S | jr.ttdd| jjji S t  S )Nr   z5The %(model_name)s could not be saved as it is locked
model_name)	actionr{   r   _rJ   _metar   r<   get_error_messager8   r?   r0   r1   r     s    
z5CreateEditViewOptionalFeaturesMixin.get_error_messagec                 C   s   |p| j }td}| jdkr$td}| jdkr|jrn|jt krntd}| jdkr^td}q|jrtd}ntd}| jdkrtd	}| jd
krtd}| jdkrtd}| jdkrtd}| jdkrtd}|t| j	j
jt|d S )Nz$%(model_name)s '%(object)s' updated.ro   z$%(model_name)s '%(object)s' created.r   z>%(model_name)s '%(object)s' has been scheduled for publishing.zA%(model_name)s '%(object)s' created and scheduled for publishing.zW%(model_name)s '%(object)s' is live and this version has been scheduled for publishing.z2%(model_name)s '%(object)s' updated and published.z2%(model_name)s '%(object)s' created and published.r   z>%(model_name)s '%(object)s' has been submitted for moderation.zA%(model_name)s '%(object)s' created and submitted for moderation.r   z;Workflow on %(model_name)s '%(object)s' has been restarted.r   z;Workflow on %(model_name)s '%(object)s' has been cancelled.)r   rK   )rK   r   rt   r   
go_live_atr   nowliver   rJ   r   r   r   )r*   r]   rK   messager0   r0   r1   get_success_message  sH    








z7CreateEditViewOptionalFeaturesMixin.get_success_messagec                    s*   h d}| j r | j|v r |  S t  S )N>   r   ro   edit)rs   r   Zget_edit_urlr<   get_success_url)r*   Zremain_actionsr?   r0   r1   r     s    z3CreateEditViewOptionalFeaturesMixin.get_success_urlc                 C   s   | j rH| jj| jdko| jj d}| jdkrRd|_|  | j  n
| j }| jdkpd| j | _d| _	| j
r|j| jjd| _	t|| jdkrdnd| j	| j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.
        r   commitro   FNrz   zwagtail.createzwagtail.edit)r]   r   revisionZcontent_changed)rs   rB   savert   rK   r   Zsave_m2mhas_changedhas_content_changesnew_revisionrr   save_revisionrO   rz   r   )r*   r]   r0   r0   r1   save_instance  s(    

z1CreateEditViewOptionalFeaturesMixin.save_instancec                 C   sT   |  d| j| j}|d ur|S | jj| jjdd |  d| j| j}|d urP|S d S )NZbefore_publishT)rz   Zskip_permission_checksZafter_publish)r2   rO   rK   r   r   rz   )r*   hook_responser0   r0   r1   publish_action  s    z2CreateEditViewOptionalFeaturesMixin.publish_actionc                 C   s>   | j r&| j jtjkr&| j | jj n| j| j	| jj d S r;   )
r   statusr%   ZSTATUS_NEEDS_CHANGESresumerO   rz   r|   startrK   r8   r0   r0   r1   submit_action  s    z1CreateEditViewOptionalFeaturesMixin.submit_actionc                 C   s*   | j j| jjd | j| j| jj d S Nr   )r   cancelrO   rz   r|   r   rK   r8   r0   r0   r1   restart_workflow_action  s    z;CreateEditViewOptionalFeaturesMixin.restart_workflow_actionc                 C   s   | j j| jjd d S r   )r   r   rO   rz   r8   r0   r0   r1   cancel_workflow_action$  s    z:CreateEditViewOptionalFeaturesMixin.cancel_workflow_actionc                 C   sB   | j jdd}t|}| jjj| jj| j j	| j
fi | d S )Nzworkflow-action-extra-dataz{})rO   r   rQ   jsonloadsrK   r   Z	on_actionZcurrent_workflow_task_staterz   r   )r*   Zextra_workflow_data_jsonZextra_workflow_datar0   r0   r1   workflow_action_action(  s    
z:CreateEditViewOptionalFeaturesMixin.workflow_action_actionc                 C   s(   t | | jddd d }|r$| S d S )N-r   _action)rM   r   replace)r*   Zaction_methodr0   r0   r1   run_action_method5  s    z5CreateEditViewOptionalFeaturesMixin.run_action_methodc                 C   sl   || _ t  |  | _W d    n1 s.0    Y  |  }|d urL|S |  }|  }|d urh|S |S r;   )rB   r   Zatomicr   rK   r   Zsave_actionr:   )r*   rB   rC   r   r0   r0   r1   rA   ;  s    
(z.CreateEditViewOptionalFeaturesMixin.form_validc                    sZ   | j dkrN|   tj| j|  |  d |  | _| joJ| j	| jj
| _t |S )Nr   )Zbuttons)r   r   r   successrO   r   Zget_success_buttonsrw   rx   ry   rz   r{   r<   form_invalidr_   r?   r0   r1   r   L  s    

z0CreateEditViewOptionalFeaturesMixin.form_invalidc                 C   sx   | j dkrd S | jr | jjs d S d }| jr<| jjr<| jj}n| jrR| jjrR| jj}|sft| j	 S |j
t|jdS )Nro   )	timestampr   )rt   rs   rK   r   Zlive_revisionrr   ri   log_registryZget_logs_for_instancefirstr~   r   rz   )r*   r   r0   r0   r1   get_last_updated_info[  s    

z9CreateEditViewOptionalFeaturesMixin.get_last_updated_infoc                 C   s*  | j s
i S | j st| jto&| d}t| jto<| d}t| jtoR| d}| j| j|  | 	 ||d}| jr| j
jdkr|S | j| j
j}|r&|rtd|| 	 td}|rtd|t| jt| jj| jjjgdtd	}t| jts| jrtj| j
|dd
 ntj| j
|dd
 |S )Nrx   r   r   )rx   r{   Zlock_urlZ
unlock_urlr   r   rP   z{} <span class="buttons"><button type="button" class="button button-small button-secondary" data-action="w-action#post" data-controller="w-action" data-w-action-url-value="{}">{}</button></span>ZUnlockr   zCancel scheduled publish)Z
extra_tags)ru   rx   
isinstancer   r   r   r   r{   r   r   rO   r   Zget_messagerz   r   r   r
   revisions_unschedule_url_namer   rK   r   Zscheduled_revisionidr   warninginfo)r*   r   r   Zuser_can_unschedulerU   Zlock_messager0   r0   r1   get_lock_contextu  sb    


z4CreateEditViewOptionalFeaturesMixin.get_lock_contextc                 C   s   | j dkrd S t  tj| j}tjj| jj	|| j
jt d}| jrR| j
jnd }t|td| jjj| jjjt| j
j|jfdtd|jfdg |S )Nro   )rz   content_typeZ	object_idZlast_seen_atz"wagtailadmin_editing_sessions:pingr   z%wagtailadmin_editing_sessions:release)rt   r   cleanupr   ZobjectsZget_for_modelrJ   ro   rO   rz   rK   r   r   r   rr   Zlatest_revision_idr   r
   r   Z	app_labelr   r   r   )r*   r   sessionrevision_idr0   r0   r1   get_editing_sessions  s8    

	z8CreateEditViewOptionalFeaturesMixin.get_editing_sessionsc                    s   t  jf i |}||   | j|d< | j|d< | j|d< |  |d< |  |d< t	t
ddojt| j|d< | j|d	< |  |d
< |S )Nrr   rs   r}   Zworkflow_history_urlZ!confirm_workflow_cancellation_urlZ"WAGTAIL_WORKFLOW_CANCEL_ON_PUBLISHTZpublishing_will_cancel_workflowrevisions_compare_url_nameZediting_sessions)r<   rS   rb   r   rr   rs   r}   r   r   rM   r   boolr   r   r   rT   r?   r0   r1   rS     s$    



z4CreateEditViewOptionalFeaturesMixin.get_context_datac                 O   s.   |   }| js | r | |S | |S d S r;   )Zget_formr{   Zis_validrA   r   )r*   rO   r,   r-   rB   r0   r0   r1   post  s    
z(CreateEditViewOptionalFeaturesMixin.post)N)N)/r3   r4   r5   r6   rt   r   r   r   r   r   r   r   rY   r   r|   r}   r   r   r   r   r   r   rv   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rA   r   r   r   r   rS   r   rD   r0   r0   r?   r1   rn      s^   




*

2#;rn   c                       sr   e Zd ZdZdZ fddZ fddZdd Zd	d
 Zdd Z	d fdd	Z
dd Zdd Z fddZ  ZS )RevisionsRevertMixinr   Nc                    s,   | | j| _t j|g|R i | d S r;   )rQ   revision_id_kwargr   r<   rY   r\   r?   r0   r1   rY     s    zRevisionsRevertMixin.setupc                    s"   |    t j|g|R i |S r;   )_add_warning_messager<   rQ   r\   r?   r0   r1   rQ     s    zRevisionsRevertMixin.getc                 C   s   t | jt| jj| jgdS r   )r
   revisions_revert_url_namer   rK   r   r   r8   r0   r0   r1   get_revisions_revert_url  s    z-RevisionsRevertMixin.get_revisions_revert_urlc                 C   sH   t dd| jji}td}t| jjjt| jj	|d}t
|| }|S )Nz$wagtailadmin/shared/user_avatar.htmlrz   z`You are viewing a previous version of this %(model_name)s from <b>%(created_at)s</b> by %(user)s)r   r~   rz   )r	   r   rz   r   r   rJ   r   r   r&   r~   r   )r*   Zuser_avatarZmessage_stringZmessage_datar   r0   r0   r1   get_warning_message  s    
z(RevisionsRevertMixin.get_warning_messagec                 C   s   t | j|   d S r;   )r   r   rO   r   r8   r0   r0   r1   r   
  s    z)RevisionsRevertMixin._add_warning_messagec                    s(   t  |}t|j| jd| _| j S )N)r   )r<   rv   r   Z	revisionsr   r   Z	as_object)r*   rm   rK   r?   r0   r1   rv     s    zRevisionsRevertMixin.get_objectc                 C   sN   t | jt p| jj }| jj|d}| j | _|j	| j
jd| jd| _|S )Nr   T)rz   Z
log_actionZprevious_revision)rN   rJ   r   rK   r   rB   r   r   r   r   rO   rz   r   r   )r*   r   r]   r0   r0   r1   r     s    z"RevisionsRevertMixin.save_instancec                 C   sd   t d}| jr@| jdkr@t d}| jjr@| jjt kr@t d}|t| jj	j
| jt| jjd S )NzN%(model_name)s '%(object)s' has been replaced with version from %(timestamp)s.r   zMVersion from %(timestamp)s of %(model_name)s '%(object)s' has been published.z\Version from %(timestamp)s of %(model_name)s '%(object)s' has been scheduled for publishing.)r   rK   r   )r   rs   r   rK   r   r   r   r   rJ   r   r   r&   r   r~   )r*   r   r0   r0   r1   r      s     
z(RevisionsRevertMixin.get_success_messagec                    s,   t  jf i |}| j|d< |  |d< |S )Nr   Z
action_url)r<   rS   r   r   rT   r?   r0   r1   rS   4  s    
z%RevisionsRevertMixin.get_context_data)N)r3   r4   r5   r   r   rY   rQ   r   r   r   rv   r   r   rS   rD   r0   r0   r?   r1   r     s   r   )Hr   Zdjango.confr   Zdjango.contrib.admin.utilsr   Z"django.contrib.contenttypes.modelsr   Z	django.dbr   r   Zdjango.formsr   Zdjango.shortcutsr   Zdjango.template.loaderr	   Zdjango.urlsr
   Zdjango.utilsr   Zdjango.utils.functionalr   Zdjango.utils.htmlr   Zdjango.utils.safestringr   Zdjango.utils.textr   Zdjango.utils.translationr   r   Zwagtailr   Zwagtail.adminr   Zwagtail.admin.modelsr   Z,wagtail.admin.templatetags.wagtailadmin_tagsr   Z!wagtail.admin.ui.editing_sessionsr   Zwagtail.admin.ui.tablesr   Zwagtail.admin.utilsr   r   Zwagtail.locksr   r   r   Zwagtail.log_actionsr   r   r   Zwagtail.modelsr   r   r    r!   r"   r#   r$   r%   Zwagtail.utils.timestampsr&   r'   r7   rE   rX   rc   rn   r   r0   r0   r0   r1   <module>   sJ   (
0,-    