U
    {h/                  	   @   sj  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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j,Z-G dd dej(Z.ej/e#e%e+e-dddgdZ0G dd dej*Z1d%d d!Z2d"d# Z3d$S )&    )forms)ContentType)ImproperlyConfiguredValidationError)transaction)Q)cached_property)capfirst)gettext)gettext_lazy)widgets)WagtailAdminModelForm)
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|| d|i| jd j_|rlt|dkrlt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modelZverbose_namer"   r"   e/var/www/dating/data/www/fatepal.com/env/lib/python3.8/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>/   s     z2TaskChooserSearchForm.__init__.<locals>.<dictcomp>)pop_super__init__fieldsr   attrslenr   ZChoiceFieldr   )selfr   argskwargsr   	__class__r"   r'   r/      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r3   r"   r"   r'   is_searching3   s    z"TaskChooserSearchForm.is_searchingc                 C   sR   t | j }t|dkr"|d S |  rN| jd}|rN|| jkrN| 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   valuesr2   r8   r:   r;   r   )r3   models
model_namer"   r"   r'   
task_model9   s    

z TaskChooserSearchForm.task_modelc                 C   s
   | j tk	S N)rB   r   r<   r"   r"   r'   specific_task_model_selectedN   s    z2TaskChooserSearchForm.specific_task_model_selected)__name__
__module____qualname__r   Z	CharFieldr   Z	TextInputr    r/   r=   r   rB   rD   __classcell__r"   r"   r6   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)Ztarget_modelsZcan_choose_root)querysetr   c                   @   s   e Zd ZeZdgZdS )zWorkflowPageForm.MetapageN)rE   rF   rG   r   r&   r0   r"   r"   r"   r'   MetaX   s   rL   c                 C   sf   | j d}z@|jj}| jsJ|| j d krJ| dttdd|i dd W n tk
r`   Y nX d S )NrK   workflowz<This page already has workflow '%(workflow_name)s' assigned.workflow_nameexisting_workflow)code)	r:   r;   ZworkflowpagerM   errors	add_errorr   r-   AttributeError)r3   rK   rO   r"   r"   r'   clean\   s"    
zWorkflowPageForm.cleanFc                 C   s,   | j d }|r(tjj|d| j d id d S )NrK   rM   )rK   defaults)r:   r   objectsZupdate_or_create)r3   commitrK   r"   r"   r'   saver   s    
zWorkflowPageForm.saveN)F)rE   rF   rG   r   ZModelChoiceFieldr   rV   allr   ZAdminPageChooserrK   rL   rT   rX   r"   r"   r"   r'   rI   R   s   rI   c                       s4   e Zd Z fddZe fddZdd Z  ZS )BaseWorkflowPagesFormSetc                    s.   t  j|| | jD ]}t |jd _qd S NDELETE)r.   r/   r   HiddenInputr0   r   )r3   r4   r5   formr6   r"   r'   r/   }   s    
z!BaseWorkflowPagesFormSet.__init__c                    s   t  j}t |jd _|S r[   )r.   
empty_formr   r]   r0   r   )r3   r_   r6   r"   r'   r_      s    z#BaseWorkflowPagesFormSet.empty_formc                    sH   t  jrdS  fdd jD }tt|t|krDttddS )z6Checks that no two forms refer to the same page objectNc                    s*   g | ]"}| j krd |jkr|jd  qS )rK   )Zdeleted_formsr:   )r%   r^   r<   r"   r'   r(      s   
 
z2BaseWorkflowPagesFormSet.clean.<locals>.<listcomp>z@You cannot assign this workflow to the same page multiple times.)anyrQ   r   r2   setr   r-   )r3   Zpagesr"   r<   r'   rT      s    

zBaseWorkflowPagesFormSet.clean)rE   rF   rG   r/   propertyr_   rT   rH   r"   r"   r6   r'   rZ   |   s   rZ   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                   @   s   e Zd Zdd ZdS )z6WorkflowContentTypeForm.ContentTypeMultipleChoiceFieldc                 C   s   t |S rC   )r   )r3   objr"   r"   r'   label_from_instance   s    zJWorkflowContentTypeForm.ContentTypeMultipleChoiceField.label_from_instanceN)rE   rF   rG   re   r"   r"   r"   r'   ContentTypeMultipleChoiceField   s   rf   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)Zas_dataparamsr;   
setdefaultappend)r3   rQ   errors_by_iderrorZct_idr"   r"   r'   get_errors_by_id   s
    z?WorkflowContentTypeForm.CheckboxSelectMultiple.get_errors_by_idNc                 C   s,   |  |||d| |i}| | j||S )Nrk   )Zget_contextrm   _renderZtemplate_name)r3   namevaluer1   rendererrQ   contextr"   r"   r'   render_with_errors   s
     zAWorkflowContentTypeForm.CheckboxSelectMultiple.render_with_errors)NNN)rE   rF   rG   __doc__Zoption_template_namerm   rs   r"   r"   r"   r'   CheckboxSelectMultiple   s        ru   F)rJ   r   r   NrM   c                   sx   || _ |r$d|kr$d|j i|d< t j|| tg d}t D ]}|t|jj|jj	dO }qBt
j|| jd _d S )Ninitialcontent_types)Zpk__in)	app_labelr&   )rM   Zworkflow_content_typesrY   r.   r/   r   r   _metary   rA   r   rV   filterr0   rJ   )r3   rM   r4   r5   Zworkflow_enabled_qr&   r6   r"   r'   r/      s    

 
z WorkflowContentTypeForm.__init__c              	   C   sp   | j d}|sd S tjj|ddj| jd}|D ]8}| dtt	dt
|jj|jd dd|jid	 q2d S )
Nrx   T)content_type__inZworkflow__activerv   zMSnippet '%(content_type)s' already has workflow '%(workflow_name)s' assigned.)content_typerN   Zexisting_workflow_content_typerg   )rP   rh   )r:   r;   r   rV   r{   excluderM   rR   r   r-   r	   r}   ro   rg   )r3   rx   Zexisting_assignmentsZ
assignmentr"   r"   r'   rT      s0    
zWorkflowContentTypeForm.cleanTc              	      sh   |sd S  j d }t D tjj jdj|d   fdd|D }tjj	|dd W 5 Q R X d S )Nrx   rv   )r|   c                    s   g | ]}t  j|d qS ))rM   r}   )r   rM   )r%   ctr<   r"   r'   r(      s   z0WorkflowContentTypeForm.save.<locals>.<listcomp>T)Zignore_conflicts)
r:   r   Zatomicr   rV   r{   rM   r~   deleteZbulk_create)r3   rW   rx   rV   r"   r<   r'   rX      s    



zWorkflowContentTypeForm.save)T)rE   rF   rG   r   ZModelMultipleChoiceFieldrf   ru   r   rV   nonerx   r/   rT   rX   rH   r"   r"   r6   r'   rc      s   rc   r!   TrK   )r^   ZformsetextraZ
can_deleter0   c                   @   s   e Zd ZdS )BaseTaskFormN)rE   rF   rG   r"   r"   r"   r'   r     s   r   Fc                 C   sf   | j }tj| t|t| di d}|rbt| dg D ]0}||jkrTtd| j|| jf d|j| _q0|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.
    Zadmin_form_widgets)r^   r0   r   Z"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)	Zadmin_form_fieldsr   Zmodelform_factoryr   getattrbase_fieldsr   rE   disabled)rB   Zfor_editr0   Z
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.
    ro   zGive your workflow a name)headingZworkflow_taskstaskF)Zshow_clear_link)r   zAdd tasks to your workflowr   Z	thumbtack)r   r   icon)Zbase_form_class)r   r-   r   r   r   r   Zbind_to_modelr   )ZpanelsZedit_handlerr"   r"   r'   get_workflow_edit_handler0  s    
r   N)F)4djangor   Z"django.contrib.contenttypes.modelsr   Zdjango.core.exceptionsr   r   Z	django.dbr   Zdjango.db.modelsr   Zdjango.utils.functionalr   Zdjango.utils.textr	   Zdjango.utils.translationr
   r-   r   Zwagtail.adminr   Zwagtail.admin.formsr   Zwagtail.admin.panelsr   r   r   Zwagtail.admin.widgets.workflowsr   Zwagtail.coreutilsr   r   Zwagtail.modelsr   r   r   r   r   Zwagtail.snippets.modelsr   ZFormr   Z	ModelFormrI   ZBaseInlineFormSetrZ   rc   Zinlineformset_factoryZWorkflowPagesFormSetr   r   r   r"   r"   r"   r'   <module>   s>   >*!e
