
    iNs                     X    d dl mZ d dl ddlmZ d dlZ G d dej
                        Zy)    fields)*   )cmf_approveNc                   t    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                    g }t         j                  j                  dd      }|D ]"  }|j                  dk(  s|j                  s!|j                  |vs0t        |j                  |j                  d|j                  j                  z   |d|j                  j                   d|j                  j                   dd	
      }t         j                  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                          |j                  |j                         % y )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   sR     ((,,2Qbf,g
 	<G##x/G4D4DIYIYasIs ' 0 0";;CgkkFVFVV)89I9I8J"W[[M]M]L^^bc%0 ~~))"C)>?sF8$45S&.1!3|(<=S&.192)  !>>3F3DIIK"))'*:*:;/	<    c                     t         j                  j                  dd|gg dg dgdg      }|D ]2  }|j                  j	                  d      |_        |j                          4 y )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   sg    ##3$>5
 < $ 
  	D--::8DDKIIK	r2   c           	         dd|gdd|gdd|gdd|gdd|gdd|gdd|gg}t         j                  j                  |g d	
      }	|	r|s!|dk(  rt         j                  |||||||      }	|dk(  rO|	j                  sCt         j                  j                  |d      }
|
rd|
_        |
j	                  d       d|	_        d|	_        d |	_        d|	_        |	j	                          |	S )Nr"   ==r%   obj_version
obj_statusapprove_groupr#   approver_level)is_cur_approver%   r"   r6   r   )r"   r%   r>   r?   r@   r#   rA   fullT)r%   rB   F	only_dataopen )r   r	   r!   rB   r(   r9   
resolutionr   )r*   r"   r%   r>   r?   rA   r#   r@   r   r-   old_cur_approves              r0   _create_or_update_approvez$CmfApprove._create_or_update_approveD   s+    "$|4udC6H=Z^`kJlo{  }A  CM  oN"D-8:tX:VYikoq  YAB##''v>g'hxL(,B''\038C7A:G7?=K ( G 6!'*@*@$//33D3QO16.$$t$4%)G"!r2   c                     g }|j                   j                  D ]^  }t        |t        j                        r|j                  |       /|j                  j                         D ]  }|j                  |        ` |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   sm    

33 	'H(F$4$45

8$&11668 'FJJv&'		' 
r2   c           
         |j                  g d       g }| j                  d|||j                        }| j                  |      D ]  }t	        |t
        j                        r"| j                  d|||j                  d|      }n@|j                  j                         D ]#  }| j                  d|||j                  d|      }% |j                  |        |j                  j                  D ]$  }|j                  | j                  |||             & t	        |t
        j                        s| j                  |       |rdd|gd	d|gg d
dd|D cg c]  }|j                  dk(  s|j                     c}gdd|j                  gg}	t
        j"                  j%                  |	      D ]>  }|j'                          t(        j+                  d|j                   j,                          @ t/        |d      r\|D cg c]5  }|j                  dk(  s|j0                  s |j0                  j,                  7 }
}|
r|
|_        |j5                  d       y y c c}w c c}w )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_membersrC   )r"   r%   r>   r?   r   grand_master)r"   r%   r>   r?   rA   r#   r%   r   r>   )r"   r   r   idzNOT INr?   r   u   Удалили аппрув approvers_forTrD   )load_fieldsrJ   r9   rS   rN   r   rO   default_membersrQ   r)   approve_groupsextendcreate_approvegroup_approvesr'   r1   r"   rW   r	   r7   deletegdebugvaluehasattrr#   rX   r(   )r*   r%   r>   created_approvesr-   r#   r   app_grapprr   new_approverss              r0   _create_approveszCmfApprove._create_approvesv   sr    | 	} //V,/4?36:: 0 * 88= 	-H(F$4$4577X038C7:zz;I5= 8 ? '66;;= 2F!;;47<G;>::?M9? < 2G2 ##G,#	-& jj// 	`F##C$D$DVSR]$^_	` #v~~.%%&67 S![1/x6F!hd$J[J[_gJg$''!hisCJJ/F ))..f.= H6tww}}oFGH 3(CS  NW^WkWkowWw  }D  }M  }MW--33  NM  N$1!HHtH$ ) "i Ns   I(I:IIIc                     t         j                  j                  ||      }|D ]  }d|_        |j	                           y )N)r@   r%   closed)r   r	   r7   r9   r(   )r*   rd   r%   r+   r-   s        r0   remove_approvegroup_approvesz'CmfApprove.remove_approvegroup_approves   s<    $$))C)H 	G#GNLLN	r2   c                    g }| j                  d|||j                  |      }|j                  dk(  rR|j                  }|sd}t	        |      D ]4  }| j                  d|||j                  d|      }|j                  |       6 |j                  d|j                  j                  |      D ]5  }| j                  d|||j                  |d|	      }|j                  |       7 |j                  d
|j                  j                  |      D ]  }| j                  d|||j                  |d|	      }|j                  |       |j                  d
|j                  j                  |      D ]5  }| j                  d|||j                  |d|	      }|j                  |       7  t        |t        j                        s| j                  |       |S )Nr@   )r"   r%   r>   r?   r@   custom   r   standart)r"   r%   r>   r?   rA   r@   	approversr"   r%   r>   r?   r@   rA   r#   rM   master)rJ   r9   required_signsmin_approversranger)   get_all_approversrU   ra   rN   r   r'   r1   )	r*   rd   r%   r>   rc   r-   min_apprir#   s	            r0   r]   z'CmfApprove.create_approvegroup_approves   s     //_47<G;>::>D	 0 2   H,++H8_ 177X<?DOCF::GQFL 8 : !''01 00ckk>O>OQTU 		-H338;@K?BzzBHCM=E 4 6G ##G,		- 001CS[[EVEVX[\ 	5H338;@K?BzzBHCK=E 4 6G ##G, #445GIZIZ\_` 	5!;;038C7:zz:@;C5= < .G %++G4	5	50 #v~~.%%&67r2   c                 2     | j                   ||g|i | y rL   )rg   )r*   r%   r>   argskwargss        r0   start_approve_processz CmfApprove.start_approve_process   s      	S+???r2   c                 &    | j                  |       y rL   )r;   )r*   r%   ry   rz   s       r0   cancel_approve_processz!CmfApprove.cancel_approve_process  s    !!#&r2   c                 v    | j                  g d       | j                  | j                  | j                         y )N)r%   
obj.statuszobj.project)rY   calc_statusr%   r>   )selfs    r0   _calc_statuszCmfApprove._calc_status  s+    =>4#3#34r2   c                 r   t         j                  j                  |||j                  ddg      }|j                  dk(  ry| j	                  ||       t         j                  j                  |||j                  ddg      }|j
                  }|dk(  r|j                          |dk(  r|j                          yy)	u   
        Рассчитывает агрегаты и, если надо, двигает статусы объекта по БП
        rC   r9   )r%   r>   r?   r"   r   ri   NrH   approvedrejected)r   r	   r!   r9   calc_aggreg_resultrH   _approve_approved_approve_rejected)r*   r%   r>   full_approveaggreg
app_results         r0   r   zCmfApprove.calc_status	  s     ((,,zzz - 
 (*sK0""&& ' 

 &&
*$!!#*$!!# %r2   c           	      \   |j                   j                  g d       |j                   j                  sy t        j                  j                  ||j                   |dg d      }t        j                  j                  ||j                   |d      }|D cg c]1  }|j                  dk(  s|j                   |j                  dk(  s0|3 }}|D cg c]#  }|j                  dk(  s|j                  d	k(  s"|% c}D ]*  }	|	j                  |_        d
|_         |j                          , d}
|j                   j                  D ]  }| j                  |||      }t        j                  j                  ||j                   j                  |d|dg      }|r@||_        |d	k7  rd}
|j                  r|j                  dk7  rd
|_         |j                          |dk(  sd|_        d
|_         |j                           y  |
rd	|_        d
|_         nd|_        |j                          y c c}w c c}w )N)	ro   need_approverM   r[   zapprove_groups.approverszapprove_groups.master_approverszapprove_groups.min_approverszapprove_groups.required_signsz(approve_groups.is_all_approvers_requiredr   )rA   rH   r@   r"   r%   r?   r>   r"   r   rC   )r%   r?   r>   r"   rV   r   r   ri   Tr@   r%   )r%   r?   r>   r"   r@   r   F
in_approve)r9   rY   r   r   r	   r7   r!   rA   rH   r"   r(   r[   get_approve_group_statusra   )r*   r%   r>   ry   rz   r+   aggreg_fullafull_master_approver-   all_approvedr@   approve_group_statusaggreg_groups                 r0   r   zCmfApprove.calc_aggreg_result%  s:   

  L 	M zz&&$$))ccjjVapx  BC)  D ''++

Xcrx+y*2  PQa6F6F6V[\[g[g[sxy  yG  yG  IO  yOq  P  P#6sa!,,*:TXYXdXdhrXrs 	G%,%7%7K"!)K	  ZZ66 	M#&#?#?xY\#] !,,00SSZZEUEUcn>M]j9> 1 AL *>'':5#(L**|/F/F,/V*2L'!!##z1)3&%-"  "'	* %/K"!)K%1K"E Pss$   H$+H$8H$H$#H)6H)c                    | j                  g d       t        j                  j                  | j                  | j
                  | j                  ddg      }| j                  s.| j                  j                  dk(  rt        j                  | _        | j                  t        j                  k7  rt        dd       |d	k(  r| j                  d
k7  rt        dd       |dk(  r| j                  d
k(  rt        dd       d| _        t        j                  j!                         | _        || _        || _        | j)                          | j+                          | S )u  
        Аппрувит текущего пользователя
        :params:
        approve_group - Аппрув группа, которой принадлежит аппрув. Один чел может аппрувить за разные группы.
        text - Комментарий пользователя при утверждении/отклонении
        )	r%   r   zobj.workflowzobj.approve_grouprA   r>   r#   zapprove_group.required_signsr?   rC   r9   r   rl   uV   Ошибка! Попытка согласовать чужое утверждение!T)abortr   rq   u   Резолюция Согласовано за всех доступна только для мастер-утвержденияacceptedui   Резолюция Согласовано недоступна для мастер-утвержденияri   )rY   r   r	   r!   r%   r?   r>   r#   r@   rr   r_   current_user	cmf_alertrA   r9   datetimenowapproved_atrH   r   r(   r   )r   rH   r   rz   r   s        r0   _approve_onezCmfApprove._approve_oneU  s>    	  o  	p''++T__bfbrbr  BH  RZ  Q[+  \}}!3!3!B!Bh!NNNDM==ANN*nvz{
 #(;(;x(G  Y  ae  f#(;(;x(G  B  JN  O#,,002"			 	r2   c                    |rddg}ndg}|D ]d  }ddd|gdd|gg dg d	d
d|j                   gdd|gdd|gg}t        j                  j                  |g d      }|dk(  r(|j	                  d|j
                  j                  |      }n>|dk(  r(|j	                  d|j
                  j                  |      }n| j                  |      }|D ]!  }	|	d   |vsd|	_         |	j                          # g }
|D ]R  }||D cg c]  }|j                   c}vs | j                  d|||j                   |||      }	|
j                  |	       T t        |t        j                        rT| j                  |
       g yc c}w )u   
        Вызывается при изменении реквизитов аппрув-группы или мастер-аппруверов статуса
        Перезаполняет аппрувы
        rn   rq   rV   ANDr@   r=   r%   )r"   r=   r   )r#   r   Nr?   rA   r>   )r#   rH   rA   r9   r>   r6   ro   rM   r#   ri   r   rp   N)r9   r   r	   r7   ru   rU   ra   rS   r(   r#   rJ   r)   rN   r'   r1   )r*   rd   r%   r>   approver_levelsrA   filtexisting_approvescurrent_approvesr-   rc   r#   re   s                r0   update_approveszCmfApprove.update_approvesy  s    )84O-.O- (	<NOT6:D#&4,!44%t^<"D+68D !' 1 1 6 6d ?D !7 !E +#)#;#;KIZIZ\_#` 8+#)#;#;<NPSP[P[PaPacf#g #&#C#CC#H , #z*.>>%-GNLLN#
  ", 
5>O#PdDMM#PP!;;@CHSGJzzJPKYEM < >G %++G4
5 c6>>2))*:;Q(	<8 $Qs   8E6
c                 .   |D cg c]$  }|j                   dk(  s|j                  |k(  s#|& }}|D cg c]2  }|j                  dk(  s|j                  dk(  s|j                  dk(  s1|4 c}D ]  }|j                  c S  |D cg c]$  }|j                  |k(  s|j                  dk(  s#|& c}ry|D cg c]=  }|j                  |k(  s|j                  dk(  s|j                  dk(  s2|j                  ? }}|j                  j
                  7|j                  dk(  rd}n1|j                  dk(  r"t        |j                        }n|j                  }|j                  j
                  rt        |      }t        |      k\  ryyc c}w c c}w c c}w c c}w )	ui  
        Получает статус аппрув-группы, исходя из списка собранных подписей
        :param app_gr: Аппрувгруппа
        :param approves: Все подписи объекта
        :param obj: Объект аппрува
        :rtype: str
        :return:
            approved - Утверждено (Все необходимые подписи собраны)
            rejected - Отклонено
            in_approve- В процессе утверждения
            None - Утверждение не требуется
        rq   r   r   r   rl   rm   fixedr   )
rA   r@   rH   r#   rs   ra   rr   lenro   is_all_approvers_required)	r*   rd   r+   r%   r   master_approvesr-   approved_approversrs   s	            r0   r   z#CmfApprove.get_approve_group_status  s    '/i!2B2BH2LQRQ`Q`bhQh1ii#2  Naallj6PTUT`T`dnTnrsr~r~  CM  sM  N 	&G%%%	&  \!1??f#<Q[A[A\2:  XQaooQW>W]^]i]imw]w{|  |H  |H  LV  |Vajj  X  X %%-$$0 !&&'1 #F$4$4 5"00M ++11MM !"m37 j N ] Xs>   FFF2F'FFF)F5F
F)Fc                    | j                   r-t        j                  | j                   j                        dk(  ry | j                  dk7  ry | j
                  sy | j                  s| j
                  j                  sy d| j                   j                   }t        j                  j                  | j                   | j
                  |||       y )NCmfDocumentr   u&   Требуется утвердить )r%   r   r   msgr   )r%   cmfutilget_class_name_by_idrW   r"   r#   is_new
is_changedr   r   	CmfNotifyplace_notify)r   messages     r0   _place_notifyzCmfApprove._place_notify  s    8844TXX[[B]R(}}{{4==#;#;:488==/J%%== 	& 	r2   c                 *    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    w*,/YYYr2   c                 B    | j                          t        |   |i |S rL   )r   r   r(   )r   ry   rz   r   s      r0   r(   zCmfApprove.save  s#    w|T,V,,r2   c                    t         j                  |dg      }t        |t        j                        r|j                  |      }|j                  }nd}|}t        j                  j                  |      }g }g }	|j                  d      d   }
|
dk(  rt        j                  j                  |      }|j                  |j                  d      }||g}|D ]^  }t        j                  dd
|||j                  d||d	d|d
|}|j                          |j!                  |       |	j!                  |       ` n|
dk(  rt        j"                  j                  |      }d
|||j                  dd	d|d|}t        j                  j$                  di |ddgiD cg c]  }|j&                   }}|j(                  j+                         D ]]  }|j,                  |vst        j                  di |||d}|j                          |j!                  |       |	j!                  |       _ t        |t        j.                        r0|	r.|j0                  j3                  |	       |j                  d       y	| j5                  |       y	c c}w )u  
        Добавляет либо один аппрув, если пришла персона, либо аппрувы всех членов группы персон или еще там какого орг.юнита
        :param obj_id: Объект, который аппрувим:
        :param approver_id: Персона или группа персон\подразделение итп:
        :param approve_group_id:   Аппрувгруппа
        r9   r   r   )rW   :rO   T)all_nested_personsNr   rF   rn   )
r"   r%   r>   r?   r9   r#   r   rH   rA   r@   CmfPersonGroup)r"   r%   r>   r?   r9   rH   rA   r@   r   approver_id)r#   r   rD   r   )r   get_obj_by_idrN   r   r   get_in_approvedoc_versionCmfApproveGroupr!   splitrO   extract_var_objr   r	   r9   r(   r)   r   r7   r   rP   
all_nestedrW   r'   rX   r\   r1   )r*   r%   r#   r@   r>   rz   r   versionrc   ro   appr_prefixmembersmemberr-   _filter_kwargselobj_approver_idss                    r0   r
   zCmfApprove.add_approver  s    ##C
#;c6--.'',F((GGF..22m2D	 nnS)!,+%''++x+8H ))(--D)QG#*! ) ++ 
6038?7:zz395;397;;E:G
6 /5
6  ''0  ()  ,,,,00H0=H (&!jj "",!.
 
N $$))SNSM?S #%    %//::< / ;;&66$//c.c8\bcGLLN$++G4$$X./ c6>>*y$$Y/HHtH$%%&67# s   Jc                    | j                  ddg       t        j                  | j                        }|t        j
                  j                  k(  rt        j
                  j                  | j                  d      }|rY| j                  |j                  j                  v r7|j                  j                  | j                         |j                  d       t        | 8  |i | y )Nobj_idr#   )rX   )rW   r   TrD   )rY   r   r   r   r   r'   __name__r!   r#   rX   ra   remover(   r   r^   )r   ry   rz   r*   r/   r   s        r0   r^   zCmfApprove.deleteM  s    (J/0**4;;7&..)))>>%%=O%PD););)A)AA""))$--8		D	)''r2   )r   NNNrn   NN)r   rL   )r   
__module____qualname____doc__r   r	   api_methodsclassmethodr1   r;   rJ   rS   rg   rj   r]   r{   r}   r   r   r   r   r   r   r   r   r(   r
   r^   __classcell__)r   s   @r0   r	   r	      s    ((448
 
K
 < <<   4<048<7;;E59:># #J 	 	 :% :%x   ?  ? B @ @ ' '5 $ $6 - -^"H 4< 4<l + +Z.Z-
 M8 M8^	( 	(r2   r	   )cmfr   cmf.includer   r   r	   r   r2   r0   <module>r      s%        O	('' O	(r2   