U
    /g!                     @   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dd Zdd Zdd Zdd Zd	d
dddZ fddZ fddZ	 fddZ
dd Zdd Zed fdd	Zddd fdd
Z  ZS ) 	CmfStatusc                 C   sR   | j js| jr| j r| jsd S | j s:td| j ddd | j j| _| j j| _d S )Nu.   DEV: Нельзя созадть статус u    без status_codeTabort)status_code
is_changedstatus_typeZis_new	cmf_alertnamecodeself r   ./common/models/cmf_status.py_calc_status_code   s    
zCmfStatus._calc_status_codec                 C   s   | j dd| jgdd| jgdd| jggd}|rJtd| j d| d	d
d | j dd| jgdd| jgdd| jggd}|rtd| j dd
d d S )Nid!=workflow=r   filteru   Статус с кодом (u/   ) уже создан в данном Workflow.Tr   r
   u   Статус "up   " уже существует, используйте его или переименуйте созданный.)getr   r   r   r	   r
   )r   Zdublicates_by_codeZdublicates_by_namer   r   r   _check_dublicates   s(    





zCmfStatus._check_dublicatesc                 C   s`   | j dkrdS | j  | jdd| jgdd| jgdd| j ggd}|s\td	| j  d
dd dS )ux   У Workflow обязательно должен быть хотя бы один статус open, in_progress и closed)ZOPENZIN_PROGRESSZCLOSEDNr   r   r   r   r   r   uk   У Workflow обязательно должен быть хотя бы один статус с типом u   . Нельзя удалить последний статус с этим типом. Сначала создайте новый статус.Tr   )r   r   loadr   r   r	   )r   Zother_primaryr   r   r   _check_primary_status_delete2   s    




z&CmfStatus._check_primary_status_deletec                 C   sD   | j jr | j d kr | | j d | jjr@| jd kr@| | jd d S )Nz
9 approvedz10 rejected)trans_approvedr   _create_trans_filtertrans_rejectedr   r   r   r   _create_trans_filtersC   s    zCmfStatus._create_trans_filterszmodels.CmfTransFilterstr)
transition
logic_typec                 C   sB   t jjdd| jgdd|gdd|ggds>t j| j||d  d S )Nr   r   r!   r"   r   )r   r!   r"   )modelsZCmfTransFilterexistsr   save)r   r!   r"   r   r   r   r   J   s    
zCmfStatus._create_trans_filterc                    s   t   ddg S )Nr   r   )supersave_preload_fieldsr   	__class__r   r   r'   T   s    zCmfStatus.save_preload_fieldsc                    sV   | j stddd |   |   | jjr@ttjj	| j
jgd |   t j||S )NuK   Нельзя создать Статус без указания StatusCodeTr   )args)r   r	   r   r   Zmaster_approversr   Zschedule_deferred_jobr#   CmfWorkflowZrecalc_all_approvesr   r   r   r&   r%   r   r*   kwargsr(   r   r   r%   W   s    zCmfStatus.savec                    s   |    t j|| d S )N)r   r&   _save_importr,   r(   r   r   r.   c   s    zCmfStatus._save_importc                 C   s    | j  rt|dr|  dS )u]   Событие. Возникает при переключении на этот статусZstart_approveN)need_approver   hasattrZapprove_objectr   objr   r   r   event_ing   s    zCmfStatus.event_inc                 C   s    | j  rt|dr|  dS )u_   Событие. Возникает при переключении с этого статусаcancel_approveN)r/   r   r0   r4   r1   r   r   r   	event_outl   s    zCmfStatus.event_outNc           
         s   |sg }|s"| dd }|s"dg}|dkr| dd }| dd  | dd }|rdd|gg|g}tjjf |||d|}	 r fd	d
|	D }	|r|	|d |d  }	|	S nt jf |||||d|S d S )Norder_byZorderno)r   r   Ztrans_updatedZtrans_expiredworkflow_idsearchsliceIN)r7   r   r6   c                    s*   g | ]"}|j r  |j j kr|qS r   )r
   lowervalue).0statusr8   r   r   
<listcomp>   s       z0CmfStatus.field_options_list.<locals>.<listcomp>r      )relation_field_nameobject_fieldsr   fieldsr6   )r   r#   r+   Zget_status_listr&   field_options_list)
clsrB   rC   r   rD   r6   r-   Zwfr9   retr(   r?   r   rE   q   s2    zCmfStatus.field_options_listFTEXKOM_db_deleteforcec                   sr   t jj| drtddd |s*|s*|   t jjdd| g|dD ]}|j|d q@tt	| j|||d	| d
S )ug   
        :param bool force: - используется когда удаляем весь БП
        )r>   u   Нельзя удалять статусы, которые в данный момент используются задачамиTr   Z	status_toz==)r   Zinclude_deleted)rI   rH   N)
r#   ZCmfTaskr$   r	   r   ZCmfTranslistdeleter&   r   )r   rI   rJ   r*   r-   Ztransr(   r   r   rL      s    
zCmfStatus.delete)NNNN)__name__
__module____qualname__r   r   r   r   r   r'   r%   r.   r3   r5   classmethodrE   rL   __classcell__r   r   r(   r   r      s   
r   )Zcmf.includeZcommon.fields.cmf_statuscommonrD   Z
cmf_statusr   r   r   r   r   <module>   s   