U
    Ohq                     @   s>   d dl mZ d dlT ddlmZ d dlZG dd dejZdS )    fields)*   )cmf_approveNc                       s  e Zd ZdZejjddg Zedd Zedd Z	ed.ddZ
edd Zedd Zedd Zed/ddZedd Zedd Zdd Zed0ddZedd Zd1d d!Zed"d# Zed$d% Zd&d' Z fd(d)Zed*d+ Z fd,d-Z  ZS )2
CmfApproveu   
        Модель для утверждения объектов в системе.
        Утверждает объекта его конкретную cmf_version
    add_approverZapprove_onec                 C   s   g }t jjddd}|D ]}|jdkr|jr|j|krt|j|jd|jj |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dddggd}|st j	f |}|
  ||j qd S )Nztask.doc_need_approve:defaultT)codeZcache_inmemorypersonu(   Необходимо утвердить u   Утвердите: <a href="z">z</a>)responsibleparentname
logic_typetextr   =r   r   r   r   cache_status_type!=CLOSEDfilter)modelsZCmfLogicTypegetapprove_typeapproverdictobjr   ZhrefCmfTasksaveappend)clsapprovesZexisting_approversr   approveparamstask r$   (./modules/settings/models/cmf_approve.py_create_approve_tasks   s.    
z CmfApprove._create_approve_tasksc                 C   sN   t jjdd|gdddgdddggdgd	}|D ]}|jd|_|  q.d S )
Nr   r   Zlogic_prefixztask.doc_need_approver   r   r   workflowr   r   )r   r   listr'   Zget_default_statusstatusr   )r   r   Ztasksr#   r$   r$   r%   _delete_approve_tasks5   s    z CmfApprove._delete_approve_tasksr
   Nstandartc              	   C   s   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|d	gd
}	|	sjt j|||||||d}	|dkr|	jst jj|dd}
|
rd|
_|
jdd d|	_d|	_d |	_d|	_|	  |	S )Nr   ==r   obj_version
obj_statusapprove_groupr   approver_levelis_cur_approver(   )r   r   r.   r/   r0   r   r1   fullT)r   r2   FZ	only_dataopen )r   r   r   r2   r   r*   
resolutionr   )r   r   r   r.   r/   r1   r   r0   r   r!   Zold_cur_approver$   r$   r%   _create_or_update_approveC   s4    
   	z$CmfApprove._create_or_update_approvec                 C   sH   g }|j jD ]6}t|tjr(|| q|j D ]}|| q2q|S N)r*   master_approvers
isinstancer   	CmfPersonr   
rg_membersload)r   r   resr   r
   r$   r$   r%   _get_status_master_approversi   s    z'CmfApprove._get_status_master_approversc                 C   sp  | ddddddddd	g	 g }| jd
|||jd}| |D ]\}t|tjrh| jd|||jd|d}n(|j D ]}| jd|||jd|d}qr|	| q>|jj
D ]}|| ||| qt|tjs| | |r:dd|gdd|gdddgdddd |D gg}tjj|dD ]"}	|	  td|	jj  qt|drldd |D }
|
r`|
|_|jdd d S )Nr   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_membersr3   )r   r   r.   r/   r
   grand_master)r   r   r.   r/   r1   r   r   r   r.   r   idzNOT INc                 S   s   g | ]}|j d kr|jqS r
   )r   rC   .0apprr$   r$   r%   
<listcomp>   s     
 z/CmfApprove._create_approves.<locals>.<listcomp>r   u   Удалили аппрув approvers_forc                 S   s$   g | ]}|j d kr|jr|jjqS rD   )r   r   value)rF   r!   r$   r$   r%   rH      s     
  Tr4   )load_fieldsr8   r*   r@   r;   r   r<   Zdefault_membersr>   r   approve_groupsextendcreate_approvegroup_approvesr   r&   r   r)   deletegdebugrC   rJ   hasattrrI   r   )r   r   r.   created_approvesr!   r   r
   app_grr   rG   Znew_approversr$   r$   r%   _create_approvesu   s`      
zCmfApprove._create_approvesc                 C   s,   t jj||d}|D ]}d|_|  qd S )N)r0   r   closed)r   r   r)   r*   r   )r   rT   r   r    r!   r$   r$   r%   remove_approvegroup_approves   s    z'CmfApprove.remove_approvegroup_approvesr   c           	      C   s2  g }| j d|||j|d}|jdkrb|j}|s2d}t|D ]&}| j d|||jd|d}|| q:|d|jj|D ](}| j d|||j|d|d	}|| qt|d
|jj|D ]d}| j d|||j|d|d	}|| |d
|jj|D ](}| j d|||j|d|d	}|| qqt	|t
js.| | |S )Nr0   )r   r   r.   r/   r0   custom   r
   r,   )r   r   r.   r/   r1   r0   	approversr   r   r.   r/   r0   r1   r   r:   master)r8   r*   required_signsmin_approversranger   get_all_approversrA   rJ   r;   r   r   r&   )	r   rT   r   r.   rS   r!   Zmin_apprir   r$   r$   r%   rN      sj    


z'CmfApprove.create_approvegroup_approvesc                 O   s   | j ||f|| d S r9   )rU   )r   r   r.   argskwargsr$   r$   r%   start_approve_process   s    z CmfApprove.start_approve_processc                 O   s   |  | d S r9   )r+   )r   r   rb   rc   r$   r$   r%   cancel_approve_process   s    z!CmfApprove.cancel_approve_processc                 C   s$   |  dddg | | j| j d S )Nr   
obj.statuszobj.project)rK   calc_statusr   r.   )selfr$   r$   r%   _calc_status  s    zCmfApprove._calc_statusc                 C   sx   t jj|||jddgd}|jdkr(dS | || t jj|||jddgd}|j}|dkrd|  |dkrt|  dS )	u   
        Рассчитывает агрегаты и, если надо, двигает статусы объекта по БП
        r3   r*   )r   r.   r/   r   r   rV   Nr7   approvedrejected)r   r   r   r*   calc_aggreg_resultr7   Z_approve_approvedZ_approve_rejected)r   r   r.   Zfull_approveZaggregZ
app_resultr$   r$   r%   rg     s,       
   zCmfApprove.calc_statusc                 O   sP  |j ddddddddd	g	 |j js*d S tjj||j |d
ddddgd}tjj||j |dd}dd |D }dd |D D ]}|j|_d|_ |  q|d}	|j j	D ]}
| 
|
||}tjj||j j|d|
d}|r||_|dkrd}	|jr|jdkrd|_ |  |dkrd|_d|_ |   d S q|	r>d|_d|_ nd|_|  d S )NrZ   need_approver:   rL   zapprove_groups.approverszapprove_groups.master_approverszapprove_groups.min_approverszapprove_groups.required_signsz(approve_groups.is_all_approvers_requiredr
   r1   r7   r0   r   r   r/   r.   r   r   r3   )r   r/   r.   r   c                 S   s.   g | ]&}|j d kr|jdk	r|jdkr|qS )rB   Nr3   )r1   r7   r   rF   ar$   r$   r%   rH   /  s
     
 
 
 z1CmfApprove.calc_aggreg_result.<locals>.<listcomp>c                 S   s$   g | ]}|j d ks|j dkr|qS )rk   rj   r7   ro   r$   r$   r%   rH   0  s     
 
 rV   T)r   r/   r.   r   r0   rj   F
in_approverk   )r*   rK   rm   r   r   r)   r   r7   r   rL   get_approve_group_statusrJ   )r   r   r.   rb   rc   r    aggreg_fullZfull_master_approver!   Zall_approvedr0   Zapprove_group_statusZaggreg_groupr$   r$   r%   rl   #  sN       
 zCmfApprove.calc_aggreg_resultc                 K   s   |  ddddddddd	g	 tjj| j| j| jd
dgd}|rT|jdkrTtddd | j	sn| j
jdkrntj| _	| j	tjkrtddd |dkr| jdkrtddd |dkr| jdkrtddd d| _tj | _|| _|| _|   |   | S )u  
        Аппрувит текущего пользователя
        :params:
        approve_group - Аппрув группа, которой принадлежит аппрув. Один чел может аппрувить за разные группы.
        text - Комментарий пользователя при утверждении/отклонении
        r   rf   zobj.workflowzobj.approve_groupr1   r.   r   zapprove_group.required_signsr/   r3   r*   rn   rV   uo   Нельзя переголосовать по завершенному процессу утвержденияT)abortrX   uV   Ошибка! Попытка согласовать чужое утверждение!rj   r\   u   Резолюция Согласовано за всех доступна только для мастер-утвержденияacceptedui   Резолюция Согласовано недоступна для мастер-утверждения)rK   r   r   r   r   r/   r.   r*   Z	cmf_alertr   r0   r]   rP   Zcurrent_userr1   datetimeZnowZapproved_atr7   r   r   ri   )rh   r7   r   rc   rt   r$   r$   r%   _approve_oneR  s&    zCmfApprove._approve_onec                 C   s>  |rddg}ndg}|D ]}ddd|gdd|gddd	gd
ddgdd|j gdd|gdd|gg}tjj|d
ddddgd}|dkr|d|jj|}n&|dkr|d|jj|}n
| |}|D ]}	|	d
 |krd|	_ |	  qg }
|D ]:}|dd |D kr| j	d	|||j |||d}	|

|	 qt|tjs| |
 qdS )u   
        Вызывается при изменении реквизитов аппрув-группы или мастер-аппруверов статуса
        Перезаполняет аппрувы
        r,   r\   rB   ZANDr0   r-   r   r   r
   r   r   Nr/   r1   r.   r7   r*   r(   rZ   r:   rV   c                 S   s   g | ]
}|j qS r$   )r   rE   r$   r$   r%   rH     s     z.CmfApprove.update_approves.<locals>.<listcomp>r[   )r*   r   r   r)   r`   rA   rJ   r@   r   r8   r   r;   r   r&   )r   rT   r   r.   Zapprover_levelsr1   ZfiltZexisting_approvesZcurrent_approvesr!   rS   r   r$   r$   r%   update_approvesx  sL    





zCmfApprove.update_approvesc                    s    fdd|D }dd |D D ]}|j   S  fdd|D rDdS  fdd|D } jjdkr jdkrrd	}q jd
krt j}n j} jjrt|}t||krdS dS dS )ui  
        Получает статус аппрув-группы, исходя из списка собранных подписей
        :param app_gr: Аппрувгруппа
        :param approves: Все подписи объекта
        :param obj: Объект аппрува
        :rtype: str
        :return:
            approved - Утверждено (Все необходимые подписи собраны)
            rejected - Отклонено
            in_approve- В процессе утверждения
            None - Утверждение не требуется
        c                    s$   g | ]}|j d kr|j kr|qS )r\   )r1   r0   ro   rT   r$   r%   rH     s     
 
 z7CmfApprove.get_approve_group_status.<locals>.<listcomp>c                 S   s.   g | ]&}|j d ks&|j dks&|j dkr|qS )rk   rv   rj   rq   ro   r$   r$   r%   rH     s
     
 
 
 c                    s$   g | ]}|j  kr|jd kr|qS )rk   )r0   r7   ro   rz   r$   r%   rH     s     
 
 rk   c                    s0   g | ](}|j  kr|jd ks&|jdkr|jqS )rv   rj   )r0   r7   r   ro   rz   r$   r%   rH     s
     
 
 
 NrX   rY   Zfixedrj   rr   )r7   r^   rJ   r]   lenrZ   Zis_all_approvers_required)r   rT   r    r   Zmaster_approvesr!   Zapproved_approversr^   r$   rz   r%   rs     s$    


z#CmfApprove.get_approve_group_statusc                 C   sf   |  dddg | jdkrd S | js(d S | js:| jjs:d S d| jj }tjj	| j| j|||d d S )Nr   r   r   r
   u&   Требуется утвердить )r   r
   r   msgr   )
rK   r   r   Zis_newZ
is_changedr   r   r   Z	CmfNotifyZplace_notify)rh   messager$   r$   r%   _place_notify  s    
zCmfApprove._place_notifyc                    s   |    t j||S r9   )r~   superr   )rh   rb   rc   	__class__r$   r%   r     s    zCmfApprove.savec                 K   s  t j|dgd}t|tjr.||}|j}nd}|}tjj|d}g }g }	|	dd }
|
dkrtj
j|d}|j|jdd}|d	kr|g}|D ]H}tjf d
|||jd||d	d|d
|}|  || |	| qn|
dkrtjj|d}d
|||jdd	d|d|}dd tjjf |ddgiD }|j D ]D}|j|kr>tjf |||d}|  || |	| q>t|tjr|	r|j|	 |jdd n
| | d	S )u  
        Добавляет либо один аппрув, если пришла персона, либо аппрувы всех членов группы персон или еще там какого орг.юнита
        :param obj_id: Объект, который аппрувим:
        :param approver_id: Персона или группа персон\подразделение итп:
        :param approve_group_id:   Аппрувгруппа
        r*   r   r   )rC   :r<   T)Zall_nested_personsNr
   r5   r,   )
r   r   r.   r/   r*   r   r   r7   r1   r0   CmfPersonGroup)r   r   r.   r/   r*   r7   r1   r0   c                 S   s   g | ]
}|j qS r$   )approver_id)rF   elr$   r$   r%   rH   4  s    z+CmfApprove.add_approver.<locals>.<listcomp>r   r   )r   r   r4   )cmfutilZget_obj_by_idr;   r   ZCmfDocumentZget_in_approveZdoc_versionZCmfApproveGroupr   splitr<   Zextract_var_objr	   r   r*   r   r   r   r)   r=   Z
all_nestedrC   r   rI   rM   r&   )r   r   r   r0   r.   rc   r   versionrS   rZ   Zappr_prefixmembersmemberr!   Z_filter_kwargsZobj_approver_idsr$   r$   r%   r     st    



	
zCmfApprove.add_approverc                    sv   |  ddg t| j}|tjjkrdtjj| jdd}|rd| j|j	j
krd|j	| j |jdd t j|| d S )Nobj_idr   )rI   )rC   r   Tr4   )rK   r   Zget_class_name_by_idr   r   r   __name__r   r   rI   rJ   remover   r   rO   )rh   rb   rc   r   r#   r   r$   r%   rO   G  s    zCmfApprove.delete)r
   NNNr,   NN)r   )r   )N)r   
__module____qualname____doc__r   r   Zapi_methodsclassmethodr&   r+   r8   r@   rU   rW   rN   rd   re   ri   rg   rl   rx   ry   rs   r~   r   r   rO   __classcell__r$   r$   r   r%   r      sZ   	

       %

;
A


.
&
6
-
Or   )Zcmfr   Zcmf.includer   rw   r   r$   r$   r$   r%   <module>   s   