
    oi                     h    d dl  d dlZ G d dej                  j                  j
                        Zy)    )*Nc                        e Zd Zd Zd Zd Zd ZddZ fdZ fdZ	 fdZ
d	 Zd
 Zed fd	       Zddd fd
Z xZS )	CmfStatusc                 4   | j                   j                  s%| j                  r| j                   r| j                  sy | j                   st	        d| j
                   dd       | j                   j                  | _        | j                   j                  | _        y )Nu.   DEV: Нельзя созадть статус u    без status_codeTabort)status_code
is_changedstatus_typeis_new	cmf_alertnamecodeselfs    ./common/models/cmf_status.py_calc_status_codezCmfStatus._calc_status_code   sw      ++'''';;FtyykQdemqr$$))	++77    c                 p   | j                  dd| j                  gdd| j                  gdd| j                  gg      }|rt	        d| j                   d| d	d
       | j                  dd| j                  gdd| j                  gdd| j
                  gg      }|rt	        d| j
                   dd
       y y )Nid!=workflow=r	   filteru   Статус с кодом (u/   ) уже создан в данном Workflow.Tr   r   u   Статус "up   " уже существует, используйте его или переименуйте созданный.)getr   r   r	   r   r   )r   dublicates_by_codedublicates_by_names      r   _check_dublicateszCmfStatus._check_dublicates   s    !XX4!dmm,C!1!12.
X 
 -d.>.>-?qAS@T  UD  E
 "XX4!dmm,S$))$.
X 
    ,\  ] r   c                    | j                   dvry| j                  j                          | j                  dd| j                  gdd| j                  gdd| j                   gg      }|st        d	| j                    d
d       t        j                  j                  ddd| ggdd| gg      }|D cg c]  }|j                  j                   }}|r t        ddj                  |       d       yyc c}w )ux   У Workflow обязательно должен быть хотя бы один статус open, in_progress и closed)OPENIN_PROGRESSCLOSEDNr   r   r   r   r   r   uk   У Workflow обязательно должен быть хотя бы один статус с типом u   . Нельзя удалить последний статус с этим типом. Сначала создайте новый статус.Tr   ORstatus_fromIN	status_to==ui   Нельзя удалить статус, который используется в переходах: z, )r   r   loadr   r   r   modelsCmfTranslistr   valuejoin)r   other_primaryexist_transelexist_trans_namess        r   _check_primary_status_deletez&CmfStatus._check_primary_status_delete2   sC   #DD4!dmm,C!1!12)
 
 }  C  O  O  ~P P` a oo**D4&)$%3
* 
 6AArRWW]]AA{  }A  }F  }F  GX  }Y  |Z  [  Bs   1C3c                    | j                   j                  r+| j                   d k7  r| j                  | j                   d       | j                  j                  r-| j                  d k7  r| j                  | j                  d       y y y )Nz
9 approvedz10 rejected)trans_approvedr
   _create_trans_filtertrans_rejectedr   s    r   _create_trans_filterszCmfStatus._create_trans_filtersQ   so    ))d.A.AT.I%%d&9&9<H))d.A.AT.I%%d&9&9=I /J)r   c                     t         j                  j                  dd| j                  gdd|gdd|gg      s1t         j                  | j                  ||      j	                          y y )Nr   r   
transition
logic_typer   )r   r;   r<   )r+   CmfTransFilterexistsr   save)r   r;   r<   s      r   r7   zCmfStatus._create_trans_filterX   sl    $$++S$--0sJ/sJ/ , 
 !!4==Z\f!glln
r   c                 *    t         |          ddgz   S )Nr   r	   )supersave_preload_fields)r   	__class__s    r   rB   zCmfStatus.save_preload_fieldsb   s    w*,
M/JJJr   c                 T   | j                   st        dd       | j                          | j                          | j                  j
                  r:t        t        j                  j                  | j                  j                  g       | j                          t        | 8  |i |S )NuK   Нельзя создать Статус без указания StatusCodeTr   )args)r	   r   r   r    master_approversr
   schedule_deferred_jobr+   CmfWorkflowrecalc_all_approvesr   r   r9   rA   r?   r   rE   kwargsrC   s      r   r?   zCmfStatus.savee   s    ckop    ++!&"4"4"H"HPTP]P]P`P`Oab""$w|T,V,,r   c                 D    | j                          t        |   |i | y )N)r   rA   _save_importrJ   s      r   rM   zCmfStatus._save_importq   s!     d-f-r   c                 t    | j                   j                         rt        |d      r|j                          yyy)u]   Событие. Возникает при переключении на этот статусstart_approveN)need_approver*   hasattrapprove_objectr   objs     r   event_inzCmfStatus.event_inu   s2    !!#_(E  )F#r   c                 t    | j                   j                         rt        |d      r|j                          yyy)u_   Событие. Возникает при переключении с этого статусаcancel_approveN)rP   r*   rQ   rW   rS   s     r   	event_outzCmfStatus.event_outz   s3    !!#5E(F  )G#r   c           	         |sg }|s|j                  dd       }|sdg}|dv r|j                  dd       }|j                  dd       }|j                  dd       }	|rdd|gg|g}t        j                  j                  d||||d|}
|rQ|
D cg c]F  }|j                  s|j                         |j                  j                  j                         v sE|H }
}|	r|
|	d	   |	d
    }
|
S y t        |    d|||||d|S c c}w )Norder_byorderno)r6   r8   trans_updatedtrans_expiredworkflow_idsearchslicer'   )r^   r   rZ   fieldsr      )relation_field_nameobject_fieldsr   ra   rZ    )	r   r+   rH   get_status_listr   lowerr.   rA   field_options_list)clsrc   rd   r   ra   rZ   rK   wfr_   r`   retstatusrC   s               r   rh   zCmfStatus.field_options_list   sV   Fzz*d3H%;"hh""=$7BZZ$/FJJw-E($5v>((88  "!%!	
  03sfv{{v||~Y_YdYdYjYjYpYpYrGr6sCseAhuQx0C
  7-  nBUer  {A  JP  [c  n  gm  n  n ts   C?4C?C?FTEXKOM_db_deleteforcec                *   t         j                  j                  |       rt        dd       |s|s| j	                          t         j
                  j                  dd| g|      D ]  }|j                  |        t        t        |   |||d	| y
)ug   
        :param bool force: - используется когда удаляем весь БП
        )rl   u   Нельзя удалять статусы, которые в данный момент используются задачамиTr   r(   r)   )r   include_deleted)rn   rm   N)
r+   CmfTaskr>   r   r4   r,   r-   deleterA   r   )r   rn   ro   rE   rK   transrC   s         r   rs   zCmfStatus.delete   s     >>   -  Z  bf  g--/__))+d41H:J * L 	<ELL*:L;	< 	i%t>NV[f_efr   )r;   zmodels.CmfTransFilterr<   str)NNNN)__name__
__module____qualname__r   r    r4   r9   r7   rB   r?   rM   rU   rX   classmethodrh   rs   __classcell__)rC   s   @r   r   r      sa    8*.>JoK
-.!
!
 n n: .3% g gr   r   )cmf.includecommon.fields.cmf_statuscommonra   
cmf_statusr   re   r   r   <module>r      s+     eg((22 egr   