
    Y~hjp                     T    d dl mZ d dlT ddlmZ d dlZ G d dej                  ZdS )    fields)*   )cmf_approveNc                       e Zd ZdZej        j        ddgz   Zed             Zed             Z	e	 	 	 	 	 	 	 dd	            Z
ed
             Zed             Zed             Zedd            Zed             Zed             Zd Zedd            Zed             ZddZed             Zed             Zd Z fdZed             Z fdZ xZS )
CmfApproveu   
        Модель для утверждения объектов в системе.
        Утверждает объекта его конкретную cmf_version
    add_approverapprove_onec                 D   g }t           j                            dd          }|D ]}|j        dk    r|j        r|j        |vrt          |j        |j        d|j        j        z   |d|j        j         d|j        j         d	          }t           j	                            d
d|d
         gdd|d         gdd|d         gdd|d         gdd|d         gg dg          }|s%t          j	        di |}|
                                 |                    |j                   d S )Nztask.doc_need_approve:defaultT)codecache_inmemorypersonu(   Необходимо утвердить u   Утвердите: <a href="z">z</a>)responsibleparentname
logic_typetextr   =r   r   r   r   cache_status_type!=CLOSEDfilter )modelsCmfLogicTypegetapprove_typeapproverdictobjr   hrefCmfTasksaveappend)clsapprovesexisting_approversr   approveparamstasks          (./modules/settings/models/cmf_approve.py_create_approve_tasksz CmfApprove._create_approve_tasks   sj     (,,2Qbf,gg
 	< 	<G#x//G4D/IYasIsIs ' 0";CgkFVV)c9IccW[M]ccc   ~))"C)>?sF8$45S&.1!3|(<=S&.19992)     !>33F33DIIKKK"))'*:;;;-	< 	<    c                     t           j                            dd|gg dg dgdg          }|D ]5}|j                            d          |_        |                                 6d S )Nr   r   )logic_prefixr   ztask.doc_need_approver   workflowr   r   r   )r   r%   listr3   get_default_statusstatusr&   )r(   r#   tasksr-   s       r.   _delete_approve_tasksz CmfApprove._delete_approve_tasks5   s    ##3$>>>555
 < $ 
 
  	 	D-::8DDDKIIKKKK	 	r0   r   Nstandartc           	         dd|gdd|gdd|gdd|gdd|gdd|gdd|gg}t           j                            |d	g
          }	|	s!t                               |||||||          }	|dk    rN|	j        sGt           j                            |d          }
|
rd|
_        |
                    d           d|	_        d|	_        d |	_        d|	_        |	                                 |	S )Nr    ==r#   obj_version
obj_statusapprove_groupr!   approver_levelis_cur_approver4   )r    r#   r=   r>   r?   r!   r@   fullT)r#   rA   F	only_dataopen )r   r	   r   rA   r&   r7   
resolutionr   )r(   r    r#   r=   r>   r@   r!   r?   r   r+   old_cur_approves              r.   _create_or_update_approvez$CmfApprove._create_or_update_approveC   sA    "$|4udC6H=Z^`kJlo{  }A  CM  oN"D-8:tX:VYikoq  YAB#''v?O>P'QQ 	''\038C7A:G7?=K (  G 6!!'*@!$/33D3QQO 516.$$t$444%)G"!r0   c                     g }|j         j        D ]c}t          |t          j                  r|                    |           2|j                                        D ]}|                    |           d|S N)r7   master_approvers
isinstancer   	CmfPersonr'   
rg_membersload)r(   r#   resr!   r   s        r.   _get_status_master_approversz'CmfApprove._get_status_master_approversi   s    
3 	' 	'H(F$455 '

8$$$$&16688 ' 'FJJv&&&&' 
r0   c           
         |                     g d           g }|                     d|||j                  }|                     |          D ]}t	          |t
          j                  r!|                     d|||j        d|          }n<|j                                        D ]"}|                     d|||j        d|          }#|	                    |           |j        j
        D ],}|                    |                     |||                     -t	          |t
          j                  s|                     |           |rdd|gd	d|gg d
ddd |D             gdd|j        gg}t
          j                            |          D ]=}	|	                                 t$                              d|	j        j                    >t-          |d          r-d |D             }
|
r|
|_        |                    d           d S d S )N)	r   projectzstatus.master_approverszstatus.approve_groupsz#status.approve_groups.min_approverszstatus.approve_groups.approversz&status.approve_groups.master_approversz*status.approve_groups.approvers.rg_membersz1status.approve_groups.master_approvers.rg_membersrB   )r    r#   r=   r>   r   grand_master)r    r#   r=   r>   r@   r!   r#   r   r=   )r    r   r   idzNOT INc                 2    g | ]}|j         d k    |j        S r   )r    rV   .0apprs     r.   
<listcomp>z/CmfApprove._create_approves.<locals>.<listcomp>   s(    !h!h!hd$J[_gJgJg$'JgJgJgr0   r>   r   u   Удалили аппрув approvers_forc                 J    g | ] }|j         d k    |j        |j        j        !S rX   )r    r!   value)rZ   r+   s     r.   r\   z/CmfApprove._create_approves.<locals>.<listcomp>   sG      N  N  NW^WkowWwWw  }D  }MWwW-3WwWwWwr0   TrC   )load_fieldsrI   r7   rR   rM   r   rN   default_membersrP   r'   approve_groupsextendcreate_approvegroup_approvesr%   r/   r	   r5   deletegdebugrV   r_   hasattrr]   r&   )r(   r#   r=   created_approvesr+   r!   r   app_grr   r[   new_approverss              r.   _create_approveszCmfApprove._create_approvesu   s    | | | 	} 	} 	} //V,/4?36: 0 * * 88== 	- 	-H(F$455 277X038C7:z;I5= 8 ? ? '6;;== 2 2F!;;47<G;>:?M9? < 2 2GG ##G,,,,j/ 	` 	`F##C$D$DVSR]$^$^____ #v~.. 	8%%&6777  	HS![1///x!h!h6F!h!h!hisCJ/F )..f.== H HFtw}FFGGGG3(( 	% N  NCS  N  N  NM 2$1!HHtH$$$$$	% 	%r0   c                     t           j                            ||          }|D ]}d|_        |                                 d S )N)r?   r#   closed)r   r	   r5   r7   r&   )r(   rj   r#   r)   r+   s        r.   remove_approvegroup_approvesz'CmfApprove.remove_approvegroup_approves   sL    $))C)HH 	 	G#GNLLNNNN	 	r0   r   c                 |   g }|                      d|||j        |          }|j        dk    rR|j        }|sd}t	          |          D ]7}|                      d|||j        d|          }|                    |           8|                    d|j        j        |          D ]8}|                      d|||j        |d|	          }|                    |           9|                    d
|j        j        |          D ]}|                      d|||j        |d|	          }|                    |           |                    d
|j        j        |          D ]8}|                      d|||j        |d|	          }|                    |           9t          |t          j                  s|                     |           |S )Nr?   )r    r#   r=   r>   r?   custom   r   r:   )r    r#   r=   r>   r@   r?   	approversr    r#   r=   r>   r?   r@   r!   rL   master)rI   r7   required_signsmin_approversranger'   get_all_approversrT   r_   rM   r   r%   r/   )	r(   rj   r#   r=   ri   r+   min_apprir!   s	            r.   rd   z'CmfApprove.create_approvegroup_approves   s;    //_47<G;>:>D	 0 2 2  H,,+H 8__ 1 177X<?DOCF:GQFL 8 : : !''000000ck>OQTUU 		- 		-H338;@K?BzBHCM=E 4 6 6G ##G,,,,001CS[EVX[\\ 	5 	5H338;@K?BzBHCK=E 4 6 6G ##G,,, #445GIZ\_`` 	5 	5!;;038C7:z:@;C5= < . .G %++G4444	5 #v~.. 	8%%&6777r0   c                 *     | j         ||g|R i | d S rK   )rl   )r(   r#   r=   argskwargss        r.   start_approve_processz CmfApprove.start_approve_process   s/     	S+?????????r0   c                 0    |                      |           d S rK   )r9   )r(   r#   r}   r~   s       r.   cancel_approve_processz!CmfApprove.cancel_approve_process   s    !!#&&&&&r0   c                 t    |                      g d           |                     | j        | j                   d S )N)r#   
obj.statuszobj.project)r`   calc_statusr#   r=   )selfs    r.   _calc_statuszCmfApprove._calc_status  s>    ===>>>4#344444r0   c                     |                      ||           t          j                            ||ddg          }|j        }|dk    r|                                 |dk    r|                                 dS dS )u   
        Рассчитывает агрегаты и, если надо, двигает статусы объекта по БП
        rB   rG   )r#   r=   r    r   approvedrejectedN)calc_aggreg_resultr   r	   r   rG   _approve_approved_approve_rejected)r(   r#   r=   aggreg
app_results        r.   r   zCmfApprove.calc_status  s    
 	sK000"&&3KV\fres&tt&
*$$!!###*$$!!##### %$r0   c                 Z   |j                             g d           |j         j        sd S t          j                            ||j         |dg d          }t          j                            ||j         |d          }d |D             }d |D             D ])}|j        |_        d	|_         |                                 *d
}	|j         j	        D ]}
| 
                    |
||          }t          j                            ||j         j        |d|
          }|r<||_        |dk    rd}	|j        r|j        dk    rd	|_         |                                 |dk    r%d|_        d	|_         |                                  d S |	rd|_        d	|_         nd|_        |                                 d S )N)	rs   need_approverL   rb   zapprove_groups.approverszapprove_groups.master_approverszapprove_groups.min_approverszapprove_groups.required_signsz(approve_groups.is_all_approvers_requiredr   )r@   rG   r?   r    r#   r>   r=   r    r   rB   )r#   r>   r=   r    c                 L    g | ]!}|j         d k    |j        |j        dk    |"S )rU   NrB   )r@   rG   r    rZ   as     r.   r\   z1CmfApprove.calc_aggreg_result.<locals>.<listcomp>$  sb      P  P  PQa6F6V6V[\[g[sxy  yG  IO  yO  yOq  yO  yO  yOr0   c                 >    g | ]}|j         d k    s|j         dk    |S )r   r   rG   r   s     r.   r\   z1CmfApprove.calc_aggreg_result.<locals>.<listcomp>%  s3    sssa!,*:T:TXYXdhrXrXrXrXrXrr0   rn   Tr?   )r#   r>   r=   r    r?   r   F
in_approver   )r7   r`   r   r   r	   r5   r   rG   r&   rb   get_approve_group_statusr_   )r(   r#   r=   r}   r~   r)   aggreg_fullfull_master_approver+   all_approvedr?   approve_group_statusaggreg_groups                r.   r   zCmfApprove.calc_aggreg_result  s>   
  L  L  L 	M 	M 	M z& 	4$))ccjVapx  BC  BC  BC)  D  D '++
Xcrx+yy P  P(  P  P  Pss#6sss 	 	G%,%7K"!)K  Z6 	 	M#&#?#?xY\#]#] !,00SSZEUcn>M]j 1 l lL $*>'':55#(L* 3|/F,/V/V*2L'!!####z11)3&%-"  """	 2  	2%/K"!)K%1K"r0   c                    |                      g d           t          j                            | j        | j        | j        ddg          }|r|j        dk    rt          dd           | j	        s!| j
        j        d	k    rt          j        | _	        | j	        t          j        k    rt          d
d           |dk    r| j        dk    rt          dd           |dk    r| j        dk    rt          dd           d| _        t          j                                        | _        || _        || _        |                                  |                                  | S )u  
        Аппрувит текущего пользователя
        :params:
        approve_group - Аппрув группа, которой принадлежит аппрув. Один чел может аппрувить за разные группы.
        text - Комментарий пользователя при утверждении/отклонении
        )	r#   r   zobj.workflowzobj.approve_groupr@   r=   r!   zapprove_group.required_signsr>   rB   r7   r   rn   uo   Нельзя переголосовать по завершенному процессу утвержденияT)abortrq   uV   Ошибка! Попытка согласовать чужое утверждение!r   ru   u   Резолюция Согласовано за всех доступна только для мастер-утвержденияacceptedui   Резолюция Согласовано недоступна для мастер-утверждения)r`   r   r	   r   r#   r>   r=   r7   	cmf_alertr!   r?   rv   rf   current_userr@   datetimenowapproved_atrG   r   r&   r   )r   rG   r   r~   r   s        r.   _approve_onezCmfApprove._approve_oneG  s    	  o  o  o  	p  	p  	p'++T_bfbr  BH  RZ  Q[+  \  \ 	U;-99  H  PT  U  U  U  U} 	+!3!Bh!N!NNDM=AN**nvz{{{{
 ##(;x(G(G  Y  ae  f  f  f  f##(;x(G(G  B  JN  O  O  O  O#,0022"			 	r0   c                    |rddg}ndg}|D ]Q}ddd|gdd|gg dg d	d
d|j         gdd|gdd|gg}t          j                            |g d          }|dk    r"|                    d|j        j        |          }n=|dk    r"|                    d|j        j        |          }n|                     |          }|D ]'}	|	d         |vrd|	_         |	                                 (g }
|D ]F}|d |D             vr6| 	                    d|||j         |||          }	|

                    |	           Gt          |t          j                  s|                     |
           SdS )u   
        Вызывается при изменении реквизитов аппрув-группы или мастер-аппруверов статуса
        Перезаполняет аппрувы
        r:   ru   rU   ANDr?   r<   r#   )r    r<   r   )r!   r   Nr>   r@   r=   )r!   rG   r@   r7   r=   r4   rs   rL   r!   rn   c                     g | ]	}|j         
S r   )r!   rY   s     r.   r\   z.CmfApprove.update_approves.<locals>.<listcomp>  s    #P#P#PdDM#P#P#Pr0   r   rt   N)r7   r   r	   r5   ry   rT   r_   rR   r&   rI   r'   rM   r%   r/   )r(   rj   r#   r=   approver_levelsr@   filtexisting_approvescurrent_approvesr+   ri   r!   s               r.   update_approveszCmfApprove.update_approvesm  s     	/)84OO-.O- (	< (	<NOT6:D#&444,,,!44%t^<"D+68D !' 1 6 6d ?D  ?D  ?D !7 !E !E ++#)#;#;KIZ\_#`#`  8++#)#;#;<NPSP[Pacf#g#g  #&#C#CC#H#H , # #z*.>>>%-GNLLNNN!, 
5 
5#P#P>O#P#P#PPP!;;@CHSGJzJPKYEM < > >G %++G444c6>22 <))*:;;;Q(	< (	<r0   c                 p   fd|D             }d |D             D ]
}|j         c S fd|D             rdS fd|D             }j        j        .j        dk    rd}n'j        d	k    rt	          j                  }nj        }j        j        rt	          |          }t	          |          |k    rd
S dS )ui  
        Получает статус аппрув-группы, исходя из списка собранных подписей
        :param app_gr: Аппрувгруппа
        :param approves: Все подписи объекта
        :param obj: Объект аппрува
        :rtype: str
        :return:
            approved - Утверждено (Все необходимые подписи собраны)
            rejected - Отклонено
            in_approve- В процессе утверждения
            None - Утверждение не требуется
        c                 @    g | ]}|j         d k    |j        k    |S )ru   )r@   r?   rZ   r   rj   s     r.   r\   z7CmfApprove.get_approve_group_status.<locals>.<listcomp>  s5    iii!2BH2L2LQRQ`bhQhQh1QhQhQhr0   c                 T    g | ]%}|j         d k    s|j         dk    s|j         dk    #|&S )r   r   r   r   r   s     r.   r\   z7CmfApprove.get_approve_group_status.<locals>.<listcomp>  sc      N  N  Naalj6P6PTUT`dnTnTnrsr~  CM  sM  sM  sM  sM  sMr0   c                 @    g | ]}|j         k    |j        d k    |S )r   )r?   rG   r   s     r.   r\   z7CmfApprove.get_approve_group_status.<locals>.<listcomp>  s2    \\\!1?f#<#<Q[A[A[AA[A[A[r0   r   c                 `    g | ]*}|j         k    |j        d k    s|j        dk    #|j        +S )r   r   )r?   rG   r!   r   s     r.   r\   z7CmfApprove.get_approve_group_status.<locals>.<listcomp>  sk      X  X  XQaoQW>W>W]^]imw]w]w{|  |H  LV  |V  |Vaj  |V  |V  |Vr0   Nrq   rr   fixedr   r   )rG   rw   r_   rv   lenrs   is_all_approvers_required)r(   rj   r)   r#   master_approvesr+   approved_approversrw   s    `      r.   r   z#CmfApprove.get_approve_group_status  s2    jiiihiii N  N?  N  N  N 	& 	&G%%%% ]\\\x\\\ 	: X  X  X  X(  X  X  X %-$00 !&'11 #F$4 5 5"0M +1 	*MMM !""m33:<r0   c                    |                      g d           | j        dk    rd S | j        sd S | j        s| j        j        sd S d| j        j         }t          j        	                    | j        | j        |||           d S )N)r!   r    r#   r   u&   Требуется утвердить )r#   r   r   msgr   )
r`   r    r!   is_new
is_changedr#   r   r   	CmfNotifyplace_notify)r   messages     r.   _place_notifyzCmfApprove._place_notify  s    <<<===((F} 	F{ 	4=#; 	FJ48=JJ%%= 	& 	 	 	 	 	r0   c                 ^    |                                    t                      j        |i |S rK   )r   superr&   )r   r}   r~   	__class__s      r.   r&   zCmfApprove.save  s0    uww|T,V,,,r0   c                    t                               |dg          }t          |t          j                  r|                    |          }|j        }nd}|}t          j                            |          }g }g }	|	                    d          d         }
|
dk    rt          j
                            |          }|                    |j        d          }||g}|D ]a}t          j        dd
|||j        d||d	d|d
|}|                                 |                    |           |	                    |           bn|
dk    rt          j                            |          }d
|||j        dd	d|d|}d t          j        j        di |ddgiD             }|j                                        D ]_}|j        |vrTt          j        di |||d}|                                 |                    |           |	                    |           `t          |t          j                  r4|	r2|j                            |	           |                    d           d	S |                     |           d	S )u  
        Добавляет либо один аппрув, если пришла персона, либо аппрувы всех членов группы персон или еще там какого орг.юнита
        :param obj_id: Объект, который аппрувим:
        :param approver_id: Персона или группа персон\подразделение итп:
        :param approve_group_id:   Аппрувгруппа
        r7   r   r   )rV   :rN   T)all_nested_personsNr   rE   r:   )
r    r#   r=   r>   r7   r!   r   rG   r@   r?   CmfPersonGroup)r    r#   r=   r>   r7   rG   r@   r?   c                     g | ]	}|j         
S r   )approver_id)rZ   els     r.   r\   z+CmfApprove.add_approver.<locals>.<listcomp>)  s'          #%     r0   r   r   )r!   r   rC   r   )cmfutilget_obj_by_idrM   r   CmfDocumentget_in_approvedoc_versionCmfApproveGroupr   splitrN   extract_var_objr   r	   r7   r&   r'   r   r5   rO   
all_nestedrV   r%   r]   rc   r/   )r(   r#   r!   r?   r=   r~   r   versionri   rs   appr_prefixmembersmemberr+   _filter_kwargsobj_approver_idss                   r.   r
   zCmfApprove.add_approver  s    ##C
#;;c6-.. 	'',,F(GGGF.22m2DD	 nnS))!,+%%'++x+88H ))(-D)QQG#*! ) ) + 
6038?7:z395;397;;E:G
6 
6 /5
6 
6  ''000  (((()  ,,,,00H0==H (&!j "",!.
 
 
N   $)SSNSSM?SSS      %/::<< / / ;&666$/cc.c8\bccccGLLNNN$++G444$$X...c6>** 	8y 	8$$Y///HHtH$$$$$%%&677777r0   c                    |                      ddg           t                              | j                  }|t          j        j        k    rpt          j                            | j        d          }|rH| j        |j	        j
        v r5|j	                            | j                   |                    d            t                      j        |i | d S )Nobj_idr!   )r]   )rV   r   TrC   )r`   r   get_class_name_by_idr   r   r%   __name__r   r!   r]   r_   remover&   r   re   )r   r}   r~   r(   r-   r   s        r.   re   zCmfApprove.delete<  s    (J/000**4;77&.)))>%%=O%PPD *);)AAA"))$-888		D	)))''''''r0   )r   NNNr:   NN)r   rK   )r   
__module____qualname____doc__r   r	   api_methodsclassmethodr/   r9   rI   rR   rl   ro   rd   r   r   r   r   r   r   r   r   r   r&   r
   re   __classcell__)r   s   @r.   r	   r	      sV         (48
 
K
 < < [<:   [ 4<048<7;;E59:># # # [#J 	 	 [	 :% :% [:%x   [ ?  ?  ?  [? B @ @ [@ ' ' ['5 5 5 $ $ $ [$ , , [,\$ $ $ $L 4< 4< [4<l + + [+Z  (- - - - - M8 M8 [M8^	( 	( 	( 	( 	( 	( 	( 	( 	(r0   r	   )cmfr   cmf.includer   r   r	   r   r0   r.   <module>r      s                          ~( ~( ~( ~( ~(' ~( ~( ~( ~( ~(r0   