o
    hX0                     @   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 d S Norderselfr    r   \/var/www/html/ndineBlogger/venv/lib/python3.10/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viewrevisions_revert)labelurlname	classname	icon_namer#   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_urlr   )__name__
__module____qualname____doc__r   template_namer&   r(   r)   r*   r   r"   r0   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-publish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!   publish_permissionr   r   r   r"   L   s   zPublishMenuItem.is_shownN)	r1   r2   r3   r(   _r&   r*   r5   r"   r   r   r   r   r6   F   s    r6   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 moderation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o-|d	 jo-|d	 j S )
NWAGTAIL_WORKFLOW_ENABLEDTFr   r$   creater:   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 }|r)|j|jkr)tdd|jjj	i |d< |S |r0|
 }n|d  }|rCtdd|j	i |d< |S )NrF   zResubmit to %(task_name)s	task_namer&   r:   zSubmit to %(workflow_name)sworkflow_name)superr0   r   current_workflow_statestatusSTATUS_NEEDS_CHANGESr@   current_task_statetaskr(   get_workflowrH   )r   r/   r!   rF   workflow_stateworkflow	__class__r   r   r0   h   s$   




z,SubmitForModerationMenuItem.get_context_data)
r1   r2   r3   r(   r@   r&   r*   r"   r0   __classcell__r   r   rV   r   rA   S   s    rA   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*   rM   r   )r   r(   r&   rZ   argskwargsrV   r   r   r      s   
zWorkflowMenuItem.__init__c                    s   t  |}| j|d< |S )NrZ   )rM   r0   rZ   )r   r/   r!   rV   r   r   r0      s   
z!WorkflowMenuItem.get_context_datac                 C   s   |d dko| d S )Nr$   rE   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 )NrF   collect_workflow_action_datar\   )snippet_viewsetget_url_namer   r   pkr(   current_workflow_task_state)r   r/   rF   url_namer   r   r   r-      s   zWorkflowMenuItem.get_url)	r1   r2   r3   r5   r   r0   r"   r-   rX   r   r   rV   r   rY      s    
rY   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 )	NrC   TFr$   rE   rF   r   r#   )rG   r   rN   r   rI   rJ   user_can_cancelr<   r   r!   rT   r   r   r   r"      s   

z RestartWorkflowMenuItem.is_shownN)	r1   r2   r3   r@   r&   r(   r)   r*   r"   r   r   r   r   re      s    re   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$   rE   FrF   r#   )rN   rg   r<   rh   r   r   r   r"      s   
zCancelWorkflowMenuItem.is_shownN)r1   r2   r3   r@   r&   r(   r*   r"   r   r   r   r   ri      s
    ri   c                   @   s,   e Zd ZedZdZdZdd Zdd ZdS )	UnpublishMenuItem	Unpublishzaction-unpublishdownloadc                 C   sF   | drdS |d dkr!|d jr!td|d }|d j|S dS )	Nr   Fr$   rE   rF   r9   r:   r#   )r   liver   r<   r=   r>   r   r   r   r"      s   
zUnpublishMenuItem.is_shownc                 C   (   |d }|j d}t|t|jgdS )NrF   	unpublishr_   r`   ra   r   r   rb   r   r!   rF   rd   r   r   r   r-         zUnpublishMenuItem.get_urlN)	r1   r2   r3   r@   r&   r(   r*   r"   r-   r   r   r   r   rk      s    rk   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().)rM   r   r   r   r   rV   r   r   r      s
   zDeleteMenuItem.__init__c                 C   s6   t d|d }|d dko|d j|o|d S )Ndeleter:   r$   rE   r#   r   r;   )r   r!   delete_permissionr   r   r   r"      s   
zDeleteMenuItem.is_shownc                 C   ro   )NrF   rw   r_   rq   rr   r   r   r   r-      rs   zDeleteMenuItem.get_urlr   )r1   r2   r3   r(   r@   r&   r*   r   r"   r-   rX   r   r   rV   r   rt      s    	rt   c                   @   s    e Zd ZdZedZdZdZdS )SaveMenuItemzaction-saveSaverm   z.wagtailsnippets/snippets/action_menu/save.htmlN)r1   r2   r3   r(   r@   r&   r*   r5   r   r   r   r   ry      s
    ry   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)r1   r2   r3   r(   r@   r&   r5   r"   r   r   r   r   r{      s
    r{   N)maxsizec                 C   s   t ddg}t| tr|tddtddg7 }t| tr,|tddtddtddg7 }t| t	r9|
tdd td	D ]}|| }|rK|
| 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'  !register_snippet_action_menu_item)ry   
issubclassr   rk   r6   r   ri   re   rA   r   appendr{   r   	get_hooks)r:   
menu_itemshookaction_menu_itemr   r   r   "get_base_snippet_action_menu_items  s*   



r   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                    sj  | _ | _| jd<  jd}|rt| jd< t jd t jd<  fddt jd D  _|rt|t	r|j
}|j}|oE|j}|r|||j}|D ]1\}}	}
d}|dkrn|rlttd	d
sltdd|	i }	d}t||	|
|d}| jr j| qQ jjdd d tdD ]}| j j  j qz
 jd _W d S  ty   d  _Y d S w )Nr#   rF   r:   draftstate_enabledc                    s   g | ]
}|  jr|qS r   )r"   r!   .0	menu_itemr   r   r   
<listcomp>4  s    
z.SnippetActionMenu.__init__.<locals>.<listcomp>rE   approve+WAGTAIL_WORKFLOW_REQUIRE_REAPPROVAL_ON_EDITFz%(label)s and Publishr&   success)r*   c                 S   s   | j S r   r   )itemr   r   r   <lambda>T  s    z,SnippetActionMenu.__init__.<locals>.<lambda>)keyconstruct_snippet_action_menur   )r#   r!   r   typer   r   r   r   
isinstancer   current_workflow_taskrN   is_at_final_taskget_actionsr<   rG   r   r@   rY   r"   r   sortr   r   r[   default_item
IndexError)r   r#   r]   rF   rR   rN   is_final_taskactionsr(   r&   rZ   r*   r   r   r   r   r   r   '  sV   



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!   r   r   r   r   r   b  s    z1SnippetActionMenu.render_html.<locals>.<listcomp>)default_menu_item	show_menurendered_menu_items)r#   )r   r   r   r!   r   templateboolr#   )r   r   rendered_default_itemr   r   r   r   ^  s   
zSnippetActionMenu.render_htmlc                 C   s.   | j r| j jnt }| jD ]}||j7 }q|S r   )r   mediar   r   )r   r   r   r   r   r   r   q  s   
zSnippetActionMenu.mediaN)r1   r2   r3   r   r   r   r	   r   r   r   r   r   r   $  s    7r   ),r4   	functoolsr   warningsr   django.confr   django.contrib.admin.utilsr   django.formsr   django.template.loaderr   django.urlsr   django.utils.functionalr	   django.utils.translationr
   r@   wagtailr   wagtail.admin.ui.componentsr   wagtail.modelsr   r   r   wagtail.snippets.permissionsr   wagtail.utils.deprecationr   r   r6   rA   rY   re   ri   rk   rt   ry   r{   r   r   r   r   r   r   <module>   s8    2."	
