B
    f                 @   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	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idz!=workflow=r   )filteru   Статус с кодом (u/   ) уже создан в данном Workflow.T)r   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   z!=r   r   r   )r   uk   У Workflow обязательно должен быть хотя бы один статус с типом u   . Нельзя удалить последний статус с этим типом. Сначала создайте новый статус.T)r   )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_rejected)r   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_fields)r   )	__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   Нельзя создать Статус без указания StatusCodeT)r   )args)r   r   r   r   Zmaster_approversr   Zschedule_deferred_jobr   CmfWorkflowZrecalc_all_approvesr   r   r   r"   r!   )r   r%   kwargs)r$   r   r   r!   W   s    zCmfStatus.savec             C   s    | j  rt|dr|  dS )u]   Событие. Возникает при переключении на этот статусZstart_approveN)need_approver   hasattrZapprove_object)r   objr   r   r   event_inc   s    zCmfStatus.event_inc             C   s    | j  rt|dr|  dS )u_   Событие. Возникает при переключении с этого статусаcancel_approveN)r(   r   r)   r,   )r   r*   r   r   r   	event_outh   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)r/   r   r.   c                s*   g | ]"}|j r  |j j kr|qS r   )r	   lowervalue).0status)r0   r   r   
<listcomp>   s    z0CmfStatus.field_options_list.<locals>.<listcomp>r      )relation_field_nameobject_fieldsr   fieldsr.   )r   r   r&   Zget_status_listr"   field_options_list)
clsr9   r:   r   r;   r.   r'   Zwfr1   ret)r$   )r0   r   r<   m   s.    zCmfStatus.field_options_listF)TEXKOM_db_deleteforcec               sv   t jj| drtddd |s*|s*|   x*t jjdd| g|dD ]}|j|d qBW tt	| j|||d	| d
S )ug   
        :param bool force: - используется когда удаляем весь БП
        )r6   u   Нельзя удалять статусы, которые в данный момент используются задачамиT)r   Z	status_toz==)r   Zinclude_deleted)r?   )r?   r@   N)
r   ZCmfTaskr    r   r   ZCmfTranslistdeleter"   r   )r   r?   r@   r%   r'   Ztrans)r$   r   r   rB      s    zCmfStatus.delete)NNNN)__name__
__module____qualname__r   r   r   r   r   r#   r!   r+   r-   classmethodr<   rB   __classcell__r   r   )r$   r   r      s   
r   )Zcmf.includeZcommon.fields.cmf_statuscommonr;   Z
cmf_statusr   r   r   r   r   <module>   s   