U
    ?hD                     @   s*   d dl T d dlZG dd dejjjZdS )    )*Nc                       s   e Zd Zedd Zdd Zdd Zdd Z fd	d
Z fddZ	 fddZ
dd Zdd Zdd Zdd Zed fdd	Zdd fdd
Z  ZS )CmfSchemeWfc                 C   s   ddg}d}| j r<t| j dr<| j dd |D  | j j}|sdtjjddd	gd
d| jgg|d	d}|stjjddd	gdddgg|d	d}|S )uy   
        Возвращает CmfSchemeWf
        Алгоритм выбора схемы для объекта
        default_task_logic_typedefault_subtask_logic_typeN	scheme_wfc                 S   s   g | ]}d | qS )z
scheme_wf. .0fr   r    ./common/models/cmf_scheme_wf.py
<listcomp>   s     z+CmfSchemeWf.calc_scheme.<locals>.<listcomp>system=Tactivity)filterfieldscache_inmemorycodezsystem:default)parenthasattrload_fieldsr   modelsr   getr   )objZautoload_fieldsr   r   r   r   calc_scheme   s0    
  zCmfSchemeWf.calc_schemec                 C   s   |j dkr|jrN|jj  |jjr2|jjjdksN| jr>| jS tjjdddS t	|j
dkrt|j
d j }|rt|S | jr| jS tjjdddS |j dkrtjjd	ddS |j d
krtjjdddS |j dkrtjjdddS |j dkrtjjdddS d S )NCmfTask)	task.epicztask.gantt_projectztask.sub:defaultT)r   r   r   ztask.base:defaultZ
CmfProjectzproject.base:defaultCmfDocumentzdocument.base:defaultZCmfDealzdeal.base:defaultCmfListzlist.base:default)
class_nameZparent_tasklogic_prefixloadvaluer   r   ZCmfLogicTyper   lenlistsr   )selfr   ltr   r   r   calc_logic_type    s.    




zCmfSchemeWf.calc_logic_typec                 C   s  dg}d}| j ||d}|r<td| d| d|   |S |jr||jjj|dr||jj}td| d| d|j  |S |jdkr:|jd	kr:|jr|	d
d |D  |j
j}td| d| d |S |jdkr | jj|d}|stjjd|dd}td| d| d |S |jdkrn| jj|d}|sRtjjd|dd}td| d| d |S |jr|j	dd |D  |jjjr|jjS | jj|d |jD ]8}|	dd |D  |jjr|j| jkr|j}q|rtd| d| d |S |jdkr,| jj|d}n| jj|d}|jdkr|jr|jr|j
j}|	| td| d| d |S |jrt|jtjkr|jjj|d |jjr|jj}td| d| d |S | jj|d}|jdkrB|jdkr| jj|d}n|jdkr.| jj|d}|sB| j j|d}|rhtd| d| d|   |S tjjd |dd}td| d! |S )"uW   
        Возвращает CmfWorkflow для данного объекта
        save_eval_codeN)r   u*   DEV: calc_workflow: для объекта u    найден wf u    по CmfSchemeRules u&    по obj.logic_type.default_workflow r   )r   task.subprojectc                 S   s   g | ]}d | qS )zcloned_from.workflow.r   r   r   r   r   r   X   s     z-CmfSchemeWf.calc_workflow.<locals>.<listcomp>u    по obj.cloned_from.workflowr   ztask.epic:defaultT)r   r   r   u    из default_epic_workflowr)   ztask.subproject:defaultu!    из default_subproject_workflowc                 S   s   g | ]}d | qS zdefault_task_workflow.r   r   r   r   r   r   p   s     c                 S   s   g | ]}d | qS r*   r   r   r   r   r   r   v   s     u     по list.default_task_workflowztask.subr   u,    по obj.cloned_from.default_clone_workflowu    по tree_parent.workflowr   zlist.releasezlist.agile_sprintu*    по CmfSchemeRules.default_NNN_workflow default.system:defaultu2    не нашли wf, вернули system:default)!_find_wf_in_rulesgdebug
logic_typeZdefault_workflowr!   r   r    Zcloned_from_idr   Zcloned_fromworkflowdefault_epic_workflowr   CmfWorkflowr   default_subproject_workflowZ	main_listdefault_task_workflowZis_not_nullr$   default_subtask_workflowis_newZdefault_clone_workflowZtree_parentZcmfutilZget_model_by_idZtree_parent_idr   default_document_workflowdefault_release_workflowdefault_sprint_workflowdefault_list_workflow)r%   r   Z	wf_fieldsr0   Zlist_r   r   r   calc_workflow;   s    



zCmfSchemeWf.calc_workflowc              	   C   s   t jjdd| gdddd gdd|jggdddd gdd|jggdddd gdd|jgggdgddddg| d	d
 |D  dd}|sd S |jr| |jkrtd| d|j  |j	|S |j
S )Nr   r   ORZcmf_model_namer/   r   Zordernotarget_scheme_wfc                 S   s   g | ]}d | qS )ztarget_workflow.r   r   r   r   r   r      s     z1CmfSchemeWf._find_wf_in_rules.<locals>.<listcomp>T)r   Zorder_byr   r   u.   DEV: _find_wf_in_rules: для объекта u>    рекурсивно перешли в rule.target_scheme_wf=)r   CmfSchemeWfRuler   r   r/   r   r=   r-   r.   r;   Ztarget_workflow)r%   r   r   ruler   r   r   r,      s     zCmfSchemeWf._find_wf_in_rulesc                    s.   ddddddddd	d
ddddg}t   | S )Ntemplater4   r:   r1   r3   r8   r9   r7   r5   r   r   strict_task_logic_typestrict_list_logic_typestrict_document_logic_type)supersave_preload_fields)r%   r   	__class__r   r   rE      s     zCmfSchemeWf.save_preload_fieldsc                    s   ddl m} | jr$| js$tddd | jsJ| jjrJd| jjkrJtddd | js| jjr| 	dd	g | j
r| j
| jkrtd
| j
j  | jjr| jr| jj  | jjjdstddd |   t j|| d S )Nr   )translituG   Для создания SchemeWf нужно указать шаблонTabortz:defaultuF   Нельзя менять код у типов по умолчаниюzstrict_task_logic_type.namer   u  Логический тип по умолчанию для новых задач отсутствует в Разрешенных логических типах задач. Выберите в поле Логический тип по умолчанию один из разрешенных логических типов, иначе в проекте могут появиться задачи с логическим типом z	task.sub:u   В поле Логический тип по умолчанию для новых Подзадач можно указывать только логические типы для Подзадач (task.sub))ZtransliteraterH   r6   r@   	cmf_alertr   Z
is_changedoldrA   r   r   namer   r!   r"   
startswith_calc_default_workflowsrD   save)r%   argskwargsrH   rF   r   r   rP      s$    zCmfSchemeWf.savec                    s   |    t j|| d S N)rO   rD   _save_import)r%   rQ   rR   rF   r   r   rT      s    zCmfSchemeWf._save_importc                 C   s  | j s| jj  | _ | js(| jj | _| js<| jj | _| jsP| jj | _| jsd| jj | _| jsx| jj | _| js| jj | _| j	s| jj	 | _	| j
s| jj
 | _
| js| jj | _| js| jr| jj | _| js| jr| jj | _| js| jr| jj | _dS )uG   
        Бизнес-процессы по умолчанию
        N)r4   r@   r!   r:   r1   r3   r8   r9   r7   r5   r   r   rA   rB   rC   r%   r   r   r   rO      s4    z#CmfSchemeWf._calc_default_workflowsc                 C   s   d S rS   r   rU   r   r   r   _calc_scheme_wf  s    zCmfSchemeWf._calc_scheme_wfc                 C   s   d S rS   r   rU   r   r   r   _calc_logic_type  s    zCmfSchemeWf._calc_logic_typec                 C   s$   | j r
d S tjjdddgd| _ d S )Nr+   Tr(   )r   r   r   )r0   r   r2   r   rU   r   r   r   _calc_workflow  s    zCmfSchemeWf._calc_workflowNc                    s   |sg }|dkr|dddgg}|dkr4|dddgg}|dkrJ|dddgg}|d	kr`|dd
dgg}|dkrv|dddgg}t  j|fd|i|S )NrA   r   ZLIKEztask.%rB   zlist.%rC   z
document.%r   zNOT LIKEz
task.sub:%r   r   )rD   field_options_list)clsZrelation_field_namer   rR   rF   r   r   rY     s    zCmfSchemeWf.field_options_listF)TEXKOM_db_deletec                   s   ddl m} tjjddd| gdd| gg||dD ]}|j|d|i| q0| D ]L}|jdd| g||dD ]0}|rd |_|jd	d
 qlt	d| dd	d qlqRt
 j|d|i|S )Nr   )CmfActiveEntityr<   r   z==r=   )r   Zinclude_deletedZinclude_systemr[   T)Z	only_datau.   Эта схема используется в u(   , удаление невозможно.rI   )Zcommon.models.cmf_active_entityr\   r   r>   listdeleteZiter_subclassesr   rP   rK   rD   )r%   r[   rQ   rR   r\   r?   Zmodelr   rF   r   r   r^   (  s      
 
zCmfSchemeWf.delete)N)__name__
__module____qualname__staticmethodr   r'   r;   r,   rE   rP   rT   rO   rV   rW   rX   classmethodrY   r^   __classcell__r   r   rF   r   r      s   
kr   )Zcmf.includeZcommon.fields.cmf_scheme_wfcommonr   Zcmf_scheme_wfr   r   r   r   r   <module>   s   