a
    DgX0                     @   sx  d 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mZ ddlmZ ddlmZ G dd deZ G dd de Z!G dd de Z"G dd de Z#G dd de Z$G dd de Z%G dd de Z&G dd de Z'G d d! d!e Z(G d"d# d#e Z)ed$d%d&d' Z*G d(d) d)Z+d$S )*zXHandles rendering of the list of actions in the footer of the snippet create/edit views.    )	lru_cache)warn)settings)quote)Media)render_to_string)reverse)cached_property)gettext_lazy)hooks)	Component)DraftStateMixinLockableMixinWorkflowMixin)get_permission_name)RemovedInWagtail70Warningc                   @   sJ   e Zd ZdZdZdZdZdZdZdZ	dddZ
dd	 Zd
d Zdd ZdS )ActionMenuItemzHDefines an item in the actions drop-up on the snippet creation/edit viewd   z3wagtailsnippets/snippets/action_menu/menu_item.html Nc                 C   s   |d ur|| _ d S Norderselfr    r   [/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/snippets/action_menu.py__init__   s    zActionMenuItem.__init__c                 C   s   | d S )a~  
        Whether this action should be shown on this request; permission checks etc should go here.

        request = the current request object

        context = dictionary containing at least:
            'view' = 'create' or 'edit'
            'model' = the model of the snippet being created/edited
            'instance' (if view = 'edit') = the snippet being edited
        locked_for_usergetr   contextr   r   r   is_shown#   s    zActionMenuItem.is_shownc              
   C   sD   |  }| |}|| j|| j| j| j|d |d dkd |S )z>Defines context for the template, overridable to use more datarequestviewZrevisions_revert)labelurlname	classname	icon_namer#   Zis_revision)copyget_urlupdater%   r'   r(   r)   )r   parent_contextr!   r&   r   r   r   get_context_data0   s    

zActionMenuItem.get_context_datac                 C   s   d S r   r   )r   r-   r   r   r   r+   B   s    zActionMenuItem.get_url)N)__name__
__module____qualname____doc__r   template_namer%   r'   r(   r)   r   r"   r.   r+   r   r   r   r   r      s   
r   c                   @   s(   e Zd ZdZedZdZdZdd ZdS )PublishMenuItemzaction-publishZPublishuploadz1wagtailsnippets/snippets/action_menu/publish.htmlc                 C   s*   t d|d }|d j|o(|d S )Npublishmodelr#   r   r   userhas_permr   r   r!   Zpublish_permissionr   r   r   r"   L   s    zPublishMenuItem.is_shownN)	r/   r0   r1   r'   _r%   r)   r3   r"   r   r   r   r   r4   F   s
   r4   c                       s4   e Zd ZdZedZdZdd Z fddZ  Z	S )SubmitForModerationMenuItemzaction-submitzSubmit for moderationZresubmitc                 C   s\   t tddsdS |drdS |d dkr:|d  d uS |d dkoZ|d	 joZ|d	 j S )
NWAGTAIL_WORKFLOW_ENABLEDTFr   r$   creater7   editinstance)getattrr   r   get_default_workflowhas_workflowworkflow_in_progressr    r   r   r   r"   X   s    

z$SubmitForModerationMenuItem.is_shownc                    s   t  |}|d}|r |jnd }|rP|j|jkrPtdd|jjj	i |d< n4|r^|
 }n|d  }|rtdd|j	i |d< |S )NrA   zResubmit to %(task_name)sZ	task_namer%   r7   zSubmit to %(workflow_name)sZworkflow_name)superr.   r   current_workflow_statestatusZSTATUS_NEEDS_CHANGESr<   Zcurrent_task_statetaskr'   Zget_workflowrC   )r   r-   r!   rA   workflow_stateZworkflow	__class__r   r   r.   h   s$    




z,SubmitForModerationMenuItem.get_context_data)
r/   r0   r1   r'   r<   r%   r)   r"   r.   __classcell__r   r   rK   r   r=   S   s
   r=   c                       s<   e Zd ZdZ fddZ fddZdd Zdd	 Z  ZS )
WorkflowMenuItemz<wagtailsnippets/snippets/action_menu/workflow_menu_item.htmlc                    s>   || _ || _|| _|dr(|d| _t j|i | d S )Nr)   )r'   r%   launch_modalr   popr)   rF   r   )r   r'   r%   rO   argskwargsrK   r   r   r      s    
zWorkflowMenuItem.__init__c                    s   t  |}| j|d< |S )NrO   )rF   r.   rO   )r   r-   r!   rK   r   r   r.      s    
z!WorkflowMenuItem.get_context_datac                 C   s   |d dko| d S )Nr$   r@   r   r   r    r   r   r   r"      s    zWorkflowMenuItem.is_shownc                 C   s2   |d }|j d}t|t|j| j|jjfdS )NrA   Zcollect_workflow_action_datarQ   )snippet_viewsetget_url_namer   r   pkr'   Zcurrent_workflow_task_state)r   r-   rA   url_namer   r   r   r+      s    zWorkflowMenuItem.get_url)	r/   r0   r1   r3   r   r.   r"   r+   rM   r   r   rK   r   rN      s
   
rN   c                   @   s(   e Zd ZedZdZdZdZdd ZdS )RestartWorkflowMenuItemzRestart workflow zaction-restart-workflowzbutton--icon-flippedloginc                 C   s`   t tddsdS |d dkr dS |d j}|d o^|d jo^|d j o^|o^||d jS )	Nr>   TFr$   r@   rA   r   r#   )rB   r   rG   r   rD   rE   user_can_cancelr9   r   r!   rJ   r   r   r   r"      s    

z RestartWorkflowMenuItem.is_shownN)	r/   r0   r1   r<   r%   r'   r(   r)   r"   r   r   r   r   rX      s
   rX   c                   @   s$   e Zd ZedZdZdZdd ZdS )CancelWorkflowMenuItemzCancel workflow zaction-cancel-workflowerrorc                 C   s.   |d dkrdS |d j }|o,||d jS )Nr$   r@   FrA   r#   )rG   rZ   r9   r[   r   r   r   r"      s    
zCancelWorkflowMenuItem.is_shownN)r/   r0   r1   r<   r%   r'   r)   r"   r   r   r   r   r\      s   r\   c                   @   s,   e Zd ZedZdZdZdd Zdd ZdS )	UnpublishMenuItemZ	Unpublishzaction-unpublishdownloadc                 C   sF   | drdS |d dkrB|d jrBtd|d }|d j|S dS )	Nr   Fr$   r@   rA   r6   r7   r#   )r   Zliver   r9   r:   r;   r   r   r   r"      s    
zUnpublishMenuItem.is_shownc                 C   s(   |d }|j d}t|t|jgdS )NrA   Z	unpublishrS   rT   rU   r   r   rV   r   r!   rA   rW   r   r   r   r+      s    zUnpublishMenuItem.get_urlN)	r/   r0   r1   r<   r%   r'   r)   r"   r+   r   r   r   r   r^      s
   r^   c                       s>   e Zd ZdZedZdZd fdd	Zdd Zd	d
 Z	  Z
S )DeleteMenuItemzaction-deleteDeletebinNc                    s   t  | tdt d S )NzgDeleteMenuItem is deprecated. The delete option is now provided via EditView.get_header_more_buttons().)rF   r   r   r   r   rK   r   r   r      s
    zDeleteMenuItem.__init__c                 C   s6   t d|d }|d dko4|d j|o4|d S )Ndeleter7   r$   r@   r#   r   r8   )r   r!   Zdelete_permissionr   r   r   r"      s    
zDeleteMenuItem.is_shownc                 C   s(   |d }|j d}t|t|jgdS )NrA   re   rS   r`   ra   r   r   r   r+      s    zDeleteMenuItem.get_url)N)r/   r0   r1   r'   r<   r%   r)   r   r"   r+   rM   r   r   rK   r   rb      s   	rb   c                   @   s    e Zd ZdZedZdZdZdS )SaveMenuItemzaction-saveZSaver_   z.wagtailsnippets/snippets/action_menu/save.htmlN)r/   r0   r1   r'   r<   r%   r)   r3   r   r   r   r   rf      s   rf   c                   @   s$   e Zd ZdZedZdZdd ZdS )LockedMenuItemzaction-lockedLockedz0wagtailsnippets/snippets/action_menu/locked.htmlc                 C   s
   | dS )Nr   r   r    r   r   r   r"     s    zLockedMenuItem.is_shownN)r/   r0   r1   r'   r<   r%   r3   r"   r   r   r   r   rg      s   rg   N)maxsizec                 C   s   t ddg}t| tr.|tddtddg7 }t| trX|tddtddtddg7 }t| t	rr|
tdd td	D ]}|| }|r||
| q||S )
z
    Retrieve the global list of menu items for the snippet action menu,
    which may then be customised on a per-request basis
    r   r         (   2   <   i'  Z!register_snippet_action_menu_item)rf   
issubclassr   r^   r4   r   r\   rX   r=   r   appendrg   r   	get_hooks)r7   
menu_itemshookZaction_menu_itemr   r   r   "get_base_snippet_action_menu_items  s(    


rt   c                   @   s,   e Zd ZdZdd Zdd Zedd ZdS )	SnippetActionMenuz.wagtailsnippets/snippets/action_menu/menu.htmlc                    st  | _ | _| jd<  jd}|r4t| jd< t jd t jd<  fddt jd D  _|rt|t	r|j
}|j}|o|j}|r|||j}|D ]b\}}	}
d}|dkr|rttd	d
stdd|	i }	d}t||	|
|d}| jr j| q jjdd d tdD ]}| j j  j q(z jd _W n tyn   d  _Y n0 d S )Nr#   rA   r7   Zdraftstate_enabledc                    s   g | ]}|  jr|qS r   )r"   r!   .0Z	menu_itemr   r   r   
<listcomp>4  s   z.SnippetActionMenu.__init__.<locals>.<listcomp>r@   ZapproveZ+WAGTAIL_WORKFLOW_REQUIRE_REAPPROVAL_ON_EDITFz%(label)s and Publishr%   success)r)   c                 S   s   | j S r   r   )itemr   r   r   <lambda>T      z,SnippetActionMenu.__init__.<locals>.<lambda>)keyZconstruct_snippet_action_menur   )r#   r!   r   typero   r   rt   rr   
isinstancer   Zcurrent_workflow_taskrG   Zis_at_final_taskZget_actionsr9   rB   r   r<   rN   r"   rp   sortr   rq   rP   default_item
IndexError)r   r#   rR   rA   rI   rG   Zis_final_taskactionsr'   r%   rO   r)   r{   rs   r   rx   r   r   '  sR    



zSnippetActionMenu.__init__c                    sL    j s
dS  fdd jD } j  j}t j|t j|d jdS )Nr   c                    s   g | ]}|  jqS r   )render_htmlr!   rv   rx   r   r   ry   b  s   z1SnippetActionMenu.render_html.<locals>.<listcomp>)Zdefault_menu_itemZ	show_menurendered_menu_items)r#   )r   rr   r   r!   r   templateboolr#   )r   r   Zrendered_default_itemr   rx   r   r   ^  s    
zSnippetActionMenu.render_htmlc                 C   s.   | j r| j jnt }| jD ]}||j7 }q|S r   )r   mediar   rr   )r   r   r{   r   r   r   r   q  s    
zSnippetActionMenu.mediaN)r/   r0   r1   r   r   r   r	   r   r   r   r   r   ru   $  s
   7ru   ),r2   	functoolsr   warningsr   Zdjango.confr   Zdjango.contrib.admin.utilsr   Zdjango.formsr   Zdjango.template.loaderr   Zdjango.urlsr   Zdjango.utils.functionalr	   Zdjango.utils.translationr
   r<   Zwagtailr   Zwagtail.admin.ui.componentsr   Zwagtail.modelsr   r   r   Zwagtail.snippets.permissionsr   Zwagtail.utils.deprecationr   r   r4   r=   rN   rX   r\   r^   rb   rf   rg   rt   ru   r   r   r   r   <module>   s6   2."	
