U
    [Se                     @   s*   d dl T d dlZG dd dejjjZdS )    )*Nc                       sv   e Zd Zdd Zdd Z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_codeZ
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                    s   t   ddg S )Nr   r   )supersave_preload_fieldsr   	__class__r   r   r   C   s    zCmfStatus.save_preload_fieldsc                    s0   | j stddd |   |   t j||S )NuK   Нельзя создать Статус без указания StatusCodeTr   )r   r   r   r   r   save)r   argskwargsr   r   r   r   F   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_inM   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   	event_outR   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)Ztrans_approvedZtrans_rejectedZ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r+   r   r   
<listcomp>m   s       z0CmfStatus.field_options_list.<locals>.<listcomp>r      )relation_field_nameobject_fieldsr   fieldsr)   )r   modelsZCmfWorkflowZget_status_listr   field_options_list)
clsr5   r6   r   r7   r)   r!   Zwfr,   retr   r2   r   r9   W   s2    zCmfStatus.field_options_listFTEXKOM_db_deleteforcec                   sX   |s|s|    tjjdd| g|dD ]}|j|d q&tt| j|||d| dS )ug   
        :param bool force: - используется когда удаляем весь БП
        Z	status_toz==)r   Zinclude_deleted)r=   r<   N)r   r8   ZCmfTranslistdeleter   r   )r   r=   r>   r    r!   Ztransr   r   r   r@   t   s    
zCmfStatus.delete)NNNN)__name__
__module____qualname__r   r   r   r   r   r&   r(   classmethodr9   r@   __classcell__r   r   r   r   r      s   r   )Zcmf.includeZcommon.fields.cmf_statuscommonr7   Z
cmf_statusr   r   r   r   r   <module>   s   