
    @iNs                     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 fdZed             Z fdZ xZS )
CmfApproveu   
        Модель для утверждения объектов в системе.
        Утверждает объекта его конкретную cmf_version
    add_approverapprove_onec                 F   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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>	9_disable)responsibleparentname
logic_typetextfull_search_typer   =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   sm     (,,2Qbf,gg
 	< 	<G#x//G4D/IYasIsIs ' 0";CgkFVV)c9IccW[M]ccc%0   ~))"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'   listr5   get_default_statusstatusr(   )r*   r%   tasksr/   s       r0   _delete_approve_tasksz CmfApprove._delete_approve_tasks6   s    ##3$>>>555
 < $ 
 
  	 	D-::8DDDKIIKKKK	 	r2   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                            |g d	
          }	|	r|s'|dk    r!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_approver%   r"   r6   r   )r"   r%   r?   r@   rA   r#   rB   fullT)r%   rC   F	only_dataopen )r   r	   r!   rC   r(   r9   
resolutionr   )r*   r"   r%   r?   r@   rB   r#   rA   r   r-   old_cur_approves              r0   _create_or_update_approvez$CmfApprove._create_or_update_approveD   sU    "$|4udC6H=Z^`kJlo{  }A  CM  oN"D-8:tX:VYikoq  YAB#''v>g>g>g'hh 	x 	L(,B,B''\038C7A:G7?=K (  G 6!!'*@!$/33D3QQO 516.$$t$444%)G"!r2   c                     g }|j         j        D ]c}t          |t          j                  r|                    |           2|j                                        D ]}|                    |           d|S N)r9   master_approvers
isinstancer   	CmfPersonr)   
rg_membersload)r*   r%   resr#   r   s        r0   _get_status_master_approversz'CmfApprove._get_status_master_approversj   s    
3 	' 	'H(F$455 '

8$$$$&16688 ' 'FJJv&&&&' 
r2   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_membersrD   )r"   r%   r?   r@   r   grand_master)r"   r%   r?   r@   rB   r#   r%   r   r?   )r"   r   r   idzNOT INc                 2    g | ]}|j         d k    |j        S r   )r"   rX   .0apprs     r0   
<listcomp>z/CmfApprove._create_approves.<locals>.<listcomp>   s(    !h!h!hd$J[_gJgJg$'JgJgJgr2   r@   r   u   Удалили аппрув approvers_forc                 J    g | ] }|j         d k    |j        |j        j        !S rZ   )r"   r#   value)r\   r-   s     r0   r^   z/CmfApprove._create_approves.<locals>.<listcomp>   sG      N  N  NW^WkowWwWw  }D  }MWwW-3WwWwWwr2   TrE   )load_fieldsrK   r9   rT   rO   r   rP   default_membersrR   r)   approve_groupsextendcreate_approvegroup_approvesr'   r1   r	   r7   deletegdebugrX   ra   hasattrr_   r(   )r*   r%   r?   created_approvesr-   r#   r   app_grr   r]   new_approverss              r0   _create_approveszCmfApprove._create_approvesv   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$$$$$	% 	%r2   c                     t           j                            ||          }|D ]}d|_        |                                 d S )N)rA   r%   closed)r   r	   r7   r9   r(   )r*   rl   r%   r+   r-   s        r0   remove_approvegroup_approvesz'CmfApprove.remove_approvegroup_approves   sL    $))C)HH 	 	G#GNLLNNNN	 	r2   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 )NrA   )r"   r%   r?   r@   rA   custom   r   r<   )r"   r%   r?   r@   rB   rA   	approversr"   r%   r?   r@   rA   rB   r#   rN   master)rK   r9   required_signsmin_approversranger)   get_all_approversrV   ra   rO   r   r'   r1   )	r*   rl   r%   r?   rk   r-   min_apprir#   s	            r0   rf   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r2   c                 *     | j         ||g|R i | d S rM   )rn   )r*   r%   r?   argskwargss        r0   start_approve_processz CmfApprove.start_approve_process   s/     	S+?????????r2   c                 0    |                      |           d S rM   )r;   )r*   r%   r   r   s       r0   cancel_approve_processz!CmfApprove.cancel_approve_process  s    !!#&&&&&r2   c                 t    |                      g d           |                     | j        | j                   d S )N)r%   
obj.statuszobj.project)rb   calc_statusr%   r?   )selfs    r0   _calc_statuszCmfApprove._calc_status  s>    ===>>>4#344444r2   c                 n   t           j                            |||j        ddg          }|j        dk    rdS |                     ||           t           j                            |||j        ddg          }|j        }|dk    r|                                 |dk    r|                                 dS dS )	u   
        Рассчитывает агрегаты и, если надо, двигает статусы объекта по БП
        rD   r9   )r%   r?   r@   r"   r   rp   NrI   approvedrejected)r   r	   r!   r9   calc_aggreg_resultrI   _approve_approved_approve_rejected)r*   r%   r?   full_approveaggreg
app_results         r0   r   zCmfApprove.calc_status	  s     (,,zz - 
 
 (**4sK000"&& ' 
 

 &
*$$!!###*$$!!##### %$r2   c           	      ^   |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|
dg          }|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)	ru   need_approverN   rd   zapprove_groups.approverszapprove_groups.master_approverszapprove_groups.min_approverszapprove_groups.required_signsz(approve_groups.is_all_approvers_requiredr   )rB   rI   rA   r"   r%   r@   r?   r"   r   rD   )r%   r@   r?   r"   c                 L    g | ]!}|j         d k    |j        |j        dk    |"S )rW   NrD   )rB   rI   r"   r\   as     r0   r^   z1CmfApprove.calc_aggreg_result.<locals>.<listcomp>1  sb      P  P  PQa6F6V6V[\[g[sxy  yG  IO  yO  yOq  yO  yO  yOr2   c                 >    g | ]}|j         d k    s|j         dk    |S )r   r   rI   r   s     r0   r^   z1CmfApprove.calc_aggreg_result.<locals>.<listcomp>2  s3    sssa!,*:T:TXYXdhrXrXrXrXrXrr2   rp   TrA   r%   )r%   r@   r?   r"   rA   r   r   F
in_approver   )r9   rb   r   r   r	   r7   r!   rI   r(   rd   get_approve_group_statusra   )r*   r%   r?   r   r   r+   aggreg_fullfull_master_approver-   all_approvedrA   approve_group_statusaggreg_groups                r0   r   zCmfApprove.calc_aggreg_result%  sE   
  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]j9> 1 A AL  $*>'':55#(L* 3|/F,/V/V*2L'!!####z11)3&%-"  """	 2  	2%/K"!)K%1K"r2   c                    |                      g d           t          j                            | j        | j        | j        ddg          }| 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_grouprB   r?   r#   zapprove_group.required_signsr@   rD   r9   r   rs   uV   Ошибка! Попытка согласовать чужое утверждение!T)abortr   rw   u   Резолюция Согласовано за всех доступна только для мастер-утвержденияacceptedui   Резолюция Согласовано недоступна для мастер-утвержденияrp   )rb   r   r	   r!   r%   r@   r?   r#   rA   rx   rh   current_user	cmf_alertrB   r9   datetimenowapproved_atrI   r   r(   r   )r   rI   r   r   r   s        r0   _approve_onezCmfApprove._approve_oneU  s    	  o  o  o  	p  	p  	p'++T_bfbr  BH  RZ  Q[+  \  \} 	+!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"			 	r2   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<   rw   rW   ANDrA   r>   r%   )r"   r>   r   )r#   r   Nr@   rB   r?   )r#   rI   rB   r9   r?   r6   ru   rN   r#   rp   c                     g | ]	}|j         
S r   )r#   r[   s     r0   r^   z.CmfApprove.update_approves.<locals>.<listcomp>  s    #P#P#PdDM#P#P#Pr2   r   rv   N)r9   r   r	   r7   r{   rV   ra   rT   r(   rK   r)   rO   r'   r1   )r*   rl   r%   r?   approver_levelsrB   filtexisting_approvescurrent_approvesr-   rk   r#   s               r0   update_approveszCmfApprove.update_approvesy  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(	< (	<r2   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 )rw   )rB   rA   r\   r   rl   s     r0   r^   z7CmfApprove.get_approve_group_status.<locals>.<listcomp>  s5    iii!2BH2L2LQRQ`bhQhQh1QhQhQhr2   c                 T    g | ]%}|j         d k    s|j         dk    s|j         dk    #|&S )r   r   r   r   r   s     r0   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r2   c                 @    g | ]}|j         k    |j        d k    |S )r   )rA   rI   r   s     r0   r^   z7CmfApprove.get_approve_group_status.<locals>.<listcomp>  s2    \\\!1?f#<#<Q[A[A[AA[A[A[r2   r   c                 `    g | ]*}|j         k    |j        d k    s|j        dk    #|j        +S )r   r   )rA   rI   r#   r   s     r0   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r2   Nrs   rt   fixedr   r   )rI   ry   ra   rx   lenru   is_all_approvers_required)r*   rl   r+   r%   master_approvesr-   approved_approversry   s    `      r0   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:<r2   c                 8   | j         r*t                              | j         j                  dk    rd S | 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CmfDocumentr   u&   Требуется утвердить )r%   r   r   msgr   )r%   cmfutilget_class_name_by_idrX   r"   r#   is_new
is_changedr   r   	CmfNotifyplace_notify)r   messages     r0   _place_notifyzCmfApprove._place_notify  s    8 	44TX[BB]RRF((F} 	F{ 	4=#; 	FJ48=JJ%%= 	& 	 	 	 	 	r2   c                 N    t                                                      g dz   S )N)r#   r"   z
obj.parent)supersave_preload_fields)r   	__class__s    r0   r   zCmfApprove.save_preload_fields  s%    ww**,,/Y/Y/YYYr2   c                 ^    |                                    t                      j        |i |S rM   )r   r   r(   )r   r   r   r   s      r0   r(   zCmfApprove.save  s0    uww|T,V,,,r2   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:   Аппрувгруппа
        r9   r   r   )rX   :rP   T)all_nested_personsNr   rG   r<   )
r"   r%   r?   r@   r9   r#   r   rI   rB   rA   CmfPersonGroup)r"   r%   r?   r@   r9   rI   rB   rA   c                     g | ]	}|j         
S r   )approver_id)r\   els     r0   r^   z+CmfApprove.add_approver.<locals>.<listcomp>:  s'          #%     r2   r   r   )r#   r   rE   r   )r   get_obj_by_idrO   r   r   get_in_approvedoc_versionCmfApproveGroupr!   splitrP   extract_var_objr   r	   r9   r(   r)   r   r7   rQ   
all_nestedrX   r'   r_   re   r1   )r*   r%   r#   rA   r?   r   r   versionrk   ru   appr_prefixmembersmemberr-   _filter_kwargsobj_approver_idss                   r0   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7r2   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_   )rX   r   TrE   )rb   r   r   r   r   r'   __name__r!   r#   r_   ra   remover(   r   rg   )r   r   r   r*   r/   r   s        r0   rg   zCmfApprove.deleteM  s    (J/000**4;77&.)))>%%=O%PPD *);)AAA"))$-888		D	)))''''''r2   )r   NNNr<   NN)r   rM   )r   
__module____qualname____doc__r   r	   api_methodsclassmethodr1   r;   rK   rT   rn   rq   rf   r   r   r   r   r   r   r   r   r   r   r(   r
   rg   __classcell__)r   s   @r0   r	   r	      st         (48
 
K
 < < [<<   [ 4<048<7;;E59:># # # [#J 	 	 [	 :% :% [:%x   [ ?  ?  ?  [? B @ @ [@ ' ' ['5 5 5 $ $ $ [$6 - - [-^" " " "H 4< 4< [4<l + + [+Z  .Z Z Z Z Z- - - - -
 M8 M8 [M8^	( 	( 	( 	( 	( 	( 	( 	( 	(r2   r	   )cmfr   cmf.includer   r   r	   r   r2   r0   <module>r      s                          O	( O	( O	( O	( O	(' O	( O	( O	( O	( O	(r2   