o
    h~.                  	   @   sx  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mZmZ d dlmZ d dlm Z m!Z! d dl"m#Z#m$Z$m%Z%m&Z&m'Z' d dl(m)Z) G dd dej*Z+G dd dej,Z-G dd deej.Z/G dd dej*Z0ej1e%e'e-e/dddgdZ2G dd dej,Z3d&d!d"Z4d#d$ Z5d%S )'    )forms)ContentType)ImproperlyConfiguredValidationError)transaction)Q)cached_property)capfirst)gettext)gettext_lazy)widgets)WagtailAdminModelForm)BaseFormSetMixin)
FieldPanelInlinePanel
ObjectList)AdminTaskChooser)get_content_type_labelget_model_string)PageTaskWorkflowWorkflowContentTypeWorkflowPage)get_workflow_enabled_modelsc                       sV   e Zd Zejede ddZdd fdd
Zdd	 Z	e
d
d Zdd Z  ZS )TaskChooserSearchFormzSearch termF)labelwidgetrequiredN)task_type_choicesc                   s   | dtd}t j|i | d|i| jd j_|r8t|dkr8tj	d tdfgdd |D  dd	| jd
< dd |D | _
d S )Nplaceholderu	   Search…q   z	All typesc                 S   s   g | ]
\}}t ||fqS  r   .0modelverbose_namer#   r#   ]/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/admin/forms/workflows.py
<listcomp>'   s    
z2TaskChooserSearchForm.__init__.<locals>.<listcomp>F)choicesr   	task_typec                 S   s   i | ]	\}}t ||qS r#   r$   r%   r#   r#   r)   
<dictcomp>0   s    z2TaskChooserSearchForm.__init__.<locals>.<dictcomp>)pop_super__init__fieldsr   attrslenr   ChoiceFieldr   )selfr   argskwargsr    	__class__r#   r)   r1      s   zTaskChooserSearchForm.__init__c                 C   s   |   ot| jdS )z?
        Returns True if the user typed a search query
        r!   )is_validboolcleaned_datagetr6   r#   r#   r)   is_searching4   s   z"TaskChooserSearchForm.is_searchingc                 C   sR   t | j }t|dkr|d S |  r'| jd}|r'|| jv r'| j| S tS )a  
        Returns the selected task model.

        This looks for the task model in the following order:
         1) If there's only one task model option, return it
         2) If a task model has been selected, return it
         3) Return the generic Task model
        r"   r   r,   )listr   valuesr4   r;   r=   r>   r   )r6   models
model_namer#   r#   r)   
task_model:   s   

z TaskChooserSearchForm.task_modelc                 C   s
   | j tuS N)rE   r   r?   r#   r#   r)   specific_task_model_selectedO   s   
z2TaskChooserSearchForm.specific_task_model_selected)__name__
__module____qualname__r   	CharFieldr   	TextInputr!   r1   r@   r   rE   rG   __classcell__r#   r#   r9   r)   r      s    
r   c                   @   sL   e Zd Zejej ej	egdddZ
G dd dZdd Zdd	d
ZdS )WorkflowPageFormT)target_modelscan_choose_root)querysetr   c                   @   s   e Zd ZeZdgZdS )zWorkflowPageForm.MetapageN)rH   rI   rJ   r   r'   r2   r#   r#   r#   r)   MetaY   s    
rS   c                 C   sp   | j d}z'|jj}| js(|| j d kr+| dttdd|i dd W d S W d S W d S  ty7   Y d S w )NrR   workflowz<This page already has workflow '%(workflow_name)s' assigned.workflow_nameexisting_workflow)code)	r=   r>   workflowpagerT   errors	add_errorr   r/   AttributeError)r6   rR   rV   r#   r#   r)   clean]   s&   
zWorkflowPageForm.cleanFc                 C   s0   | j d }|rtjj|d| j d id d S d S )NrR   rT   )rR   defaults)r=   r   objectsupdate_or_create)r6   commitrR   r#   r#   r)   saves   s   

zWorkflowPageForm.saveNF)rH   rI   rJ   r   ModelChoiceFieldr   r^   allr   AdminPageChooserrR   rS   r\   ra   r#   r#   r#   r)   rN   S   s    rN   c                   @      e Zd Zdd ZdS )BaseWorkflowPagesFormSetc                    sH   t  jrdS  fdd jD }tt|t|kr"ttddS )z6Checks that no two forms refer to the same page objectNc                    s*   g | ]}| j vrd |jv r|jd  qS )rR   )deleted_formsr=   )r&   formr?   r#   r)   r*      s
    z2BaseWorkflowPagesFormSet.clean.<locals>.<listcomp>z@You cannot assign this workflow to the same page multiple times.)anyrY   r   r4   setr   r/   )r6   pagesr#   r?   r)   r\   ~   s   

zBaseWorkflowPagesFormSet.cleanN)rH   rI   rJ   r\   r#   r#   r#   r)   rg   }       rg   c                       sn   e Zd ZG dd dejZG dd dejZeej	 e ddZ
dd fd	d

Zdd ZdddZ  ZS )WorkflowContentTypeFormc                   @   rf   )z6WorkflowContentTypeForm.ContentTypeMultipleChoiceFieldc                 C   s   t |S rF   )r   )r6   objr#   r#   r)   label_from_instance   s   zJWorkflowContentTypeForm.ContentTypeMultipleChoiceField.label_from_instanceN)rH   rI   rJ   rp   r#   r#   r#   r)   ContentTypeMultipleChoiceField   rm   rq   c                   @   s(   e Zd ZdZdZdd Z	dddZdS )	z.WorkflowContentTypeForm.CheckboxSelectMultiplezQCustom CheckboxSelectMultiple widget that renders errors for each content type IDzDwagtailadmin/workflows/includes/workflow_content_types_checkbox.htmlc                 C   s:   i }|  D ]}|jo|jd}||g | q|S )Ncontent_type_id)as_dataparamsr>   
setdefaultappend)r6   rY   errors_by_iderrorct_idr#   r#   r)   get_errors_by_id   s
   z?WorkflowContentTypeForm.CheckboxSelectMultiple.get_errors_by_idNc                 C   s0   i |  |||d| |i}| | j||S )Nrw   )get_contextrz   _rendertemplate_name)r6   namevaluer3   rendererrY   contextr#   r#   r)   render_with_errors   s   
zAWorkflowContentTypeForm.CheckboxSelectMultiple.render_with_errors)NNN)rH   rI   rJ   __doc__option_template_namerz   r   r#   r#   r#   r)   CheckboxSelectMultiple   s    r   F)rQ   r   r   NrT   c                   s|   || _ |rd|vrd|j i|d< t j|i | tg d}t D ]}|t|jj|jj	dO }q#t
j|| jd _d S )Ninitialcontent_types)pk__in)	app_labelr'   )rT   workflow_content_typesrd   r0   r1   r   r   _metar   rD   r   r^   filterr2   rQ   )r6   rT   r7   r8   workflow_enabled_qr'   r9   r#   r)   r1      s   


z WorkflowContentTypeForm.__init__c              	   C   sp   | j d}|s
d S tjj|ddj| jd}|D ]}| dtt	dt
|jj|jd dd|jid	 qd S )
Nr   T)content_type__inworkflow__activer   zMSnippet '%(content_type)s' already has workflow '%(workflow_name)s' assigned.)content_typerU   existing_workflow_content_typerr   )rW   rt   )r=   r>   r   r^   r   excluderT   rZ   r   r/   r	   r   r~   rr   )r6   r   existing_assignments
assignmentr#   r#   r)   r\      s2   
zWorkflowContentTypeForm.cleanTc                    s~   |sd S  j d }t ( tjj jdj|d   fdd|D }tjj	|dd W d    d S 1 s8w   Y  d S )Nr   r   )r   c                    s   g | ]	}t  j|d qS ))rT   r   )r   rT   )r&   ctr?   r#   r)   r*      s    z0WorkflowContentTypeForm.save.<locals>.<listcomp>T)ignore_conflicts)
r=   r   atomicr   r^   r   rT   r   deletebulk_create)r6   r`   r   r^   r#   r?   r)   ra      s   


"zWorkflowContentTypeForm.save)T)rH   rI   rJ   r   ModelMultipleChoiceFieldrq   r   r   r^   noner   r1   r\   ra   rM   r#   r#   r9   r)   rn      s    rn   r"   TrR   )ri   formsetextra
can_deleter2   c                   @   s   e Zd ZdS )BaseTaskFormN)rH   rI   rJ   r#   r#   r#   r)   r     s    r   Fc                 C   sf   | j }tj| t|t| di d}|r1t| dg D ]}||jvr*td| j|| jf d|j| _q|S )z
    Generates a form class for the given task model.

    If the form is to edit an existing task, set for_edit to True. This applies
    the readonly restrictions on fields defined in admin_form_readonly_on_edit_fields.
    admin_form_widgets)ri   r2   r   "admin_form_readonly_on_edit_fieldsz`%s.admin_form_readonly_on_edit_fields` contains the field '%s' that doesn't exist. Did you forget to add it to `%s.admin_form_fields`?T)	admin_form_fieldsr   modelform_factoryr   getattrbase_fieldsr   rH   disabled)rE   for_editr2   
form_class
field_namer#   r#   r)   get_task_form_class  s"   

r   c                  C   sP   t dtddtdt dtdddgtd	td
ddg} t| td}|tS )z\
    Returns an edit handler which provides the "name" and "tasks" fields for workflow.
    r~   zGive your workflow a name)headingworkflow_taskstaskF)show_clear_link)r   zAdd tasks to your workflowr   	thumbtack)r   r   icon)base_form_class)r   r/   r   r   r   r   bind_to_modelr   )panelsedit_handlerr#   r#   r)   get_workflow_edit_handler%  s   

r   Nrb   )6djangor   "django.contrib.contenttypes.modelsr   django.core.exceptionsr   r   	django.dbr   django.db.modelsr   django.utils.functionalr   django.utils.textr	   django.utils.translationr
   r/   r   wagtail.adminr   wagtail.admin.formsr   wagtail.admin.forms.formsetsr   wagtail.admin.panelsr   r   r   wagtail.admin.widgets.workflowsr   wagtail.coreutilsr   r   wagtail.modelsr   r   r   r   r   wagtail.snippets.modelsr   Formr   	ModelFormrN   BaseInlineFormSetrg   rn   inlineformset_factoryWorkflowPagesFormSetr   r   r   r#   r#   r#   r)   <module>   sB    >*e
