U
    Įwhi                     @   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d.ddZedd Zd/d d!Zed"d# Zed$d% Zd&d' Z fd(d)Zed*d+ Z  ZS )0
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.   r/   r   r0   fullT)r   r1   FZ	only_dataopen )r   r   r   r1   r   r)   
resolutionr   )r   r   r   r-   r.   r0   r   r/   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_membersr2   )r   r   r-   r.   r	   grand_master)r   r   r-   r.   r0   r   r   r   r-   r   idzNOT INc                 S   s   g | ]}|j d kr|jqS r	   )r   rB   .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 rC   )r   r   value)rE   r    r#   r#   r$   rG      s     
  Tr3   )load_fieldsr7   r)   r?   r:   r   r;   Zdefault_membersr=   r   approve_groupsextendcreate_approvegroup_approvesr   r%   r   r(   deletegdebugrB   rI   hasattrrH   r   )r   r   r-   created_approvesr    r   r	   app_grr   rF   Znew_approversr#   r#   r$   _create_approvesu   s`      
zCmfApprove._create_approvesc                 C   s,   t jj||d}|D ]}d|_|  qd S )N)r/   r   closed)r   r   r(   r)   r   )r   rS   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 )Nr/   )r   r   r-   r.   r/   custom   r	   r+   )r   r   r-   r.   r0   r/   	approversr   r   r-   r.   r/   r0   r   r9   master)r7   r)   required_signsmin_approversranger   get_all_approversr@   rI   r:   r   r   r%   )	r   rS   r   r-   rR   r    Zmin_apprir   r#   r#   r$   rM      sj    


z'CmfApprove.create_approvegroup_approvesc                 O   s   | j ||f|| d S r8   )rT   )r   r   r-   argskwargsr#   r#   r$   start_approve_process   s    z CmfApprove.start_approve_processc                 O   s   |  | d S r8   )r*   )r   r   ra   rb   r#   r#   r$   cancel_approve_process   s    z!CmfApprove.cancel_approve_processc                 C   s"   |  ddg | | j| j d S )Nr   
obj.status)rJ   calc_statusr   r-   )selfr#   r#   r$   _calc_status  s    zCmfApprove._calc_statusc                 C   sL   |  || tjj||ddgd}|j}|dkr8|  |dkrH|  dS )u   
        Рассчитывает агрегаты и, если надо, двигает статусы объекта по БП
        r2   r6   )r   r-   r   r   approvedrejectedN)calc_aggreg_resultr   r   r   r6   Z_approve_approvedZ_approve_rejected)r   r   r-   ZaggregZ
app_resultr#   r#   r$   rf     s    zCmfApprove.calc_statusc              
   O   sL  |j 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|_ |  qzd}	|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 )NrY   need_approver9   rK   zapprove_groups.approverszapprove_groups.master_approverszapprove_groups.min_approverszapprove_groups.required_signsr	   r0   r6   r/   r   r   r.   r-   r   r   r2   )r   r.   r-   r   c                 S   s.   g | ]&}|j d kr|jdk	r|jdkr|qS )rA   Nr2   )r0   r6   r   rE   ar#   r#   r$   rG   "  s
     
 
 
 z1CmfApprove.calc_aggreg_result.<locals>.<listcomp>c                 S   s$   g | ]}|j d ks|j dkr|qS )rj   ri   r6   rn   r#   r#   r$   rG   #  s     
 
 rU   T)r   r.   r-   r   r/   ri   F
in_approverj   )r)   rJ   rl   r   r   r(   r   r6   r   rK   get_approve_group_statusrI   )r   r   r-   ra   rb   r   aggreg_fullZfull_master_approver    Zall_approvedr/   Zapprove_group_statusZaggreg_groupr#   r#   r$   rk     sL       
 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   re   zobj.workflowzobj.approve_groupr0   r-   r   zapprove_group.required_signsr.   r2   r)   rm   rU   uo   Нельзя переголосовать по завершенному процессу утвержденияT)abortrW   uV   Ошибка! Попытка согласовать чужое утверждение!ri   r[   u   Резолюция Согласовано за всех доступна только для мастер-утвержденияacceptedui   Резолюция Согласовано недоступна для мастер-утверждения)rJ   r   r   r   r   r.   r-   r)   Z	cmf_alertr   r/   r\   rO   Zcurrent_userr0   datetimeZnowZapproved_atr6   r   r   rh   )rg   r6   r   rb   rs   r#   r#   r$   _approve_oneE  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[   rA   ZANDr/   r,   r   r   r	   r   r   Nr.   r0   r-   r6   r)   r'   rY   r9   rU   c                 S   s   g | ]
}|j qS r#   )r   rD   r#   r#   r$   rG     s     z.CmfApprove.update_approves.<locals>.<listcomp>rZ   )r)   r   r   r(   r_   r@   rI   r?   r   r7   r   r:   r   r%   )r   rS   r   r-   Zapprover_levelsr0   ZfiltZexisting_approvesZcurrent_approvesr    rR   r   r#   r#   r$   update_approvesk  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}t||krdS dS dS )u<  
        Получает статус аппрув-группы, исходя из списка собранных подписей
        :param app_gr:   Аппрувгруппа
        :param approves: Все подписи объекта:
        :rtype: str
        :return:
            approved - Утверждено (Все необходимые подписи собраны)
            rejected - Отклонено
            in_approve- В процессе утверждения
            None - Утверждение не требуется
        c                    s$   g | ]}|j d kr|j kr|qS )r[   )r0   r/   rn   rS   r#   r$   rG     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 )rj   ru   ri   rp   rn   r#   r#   r$   rG     s
     
 
 
 c                    s$   g | ]}|j  kr|jd kr|qS )rj   )r/   r6   rn   ry   r#   r$   rG     s     
 
 rj   c                    s0   g | ](}|j  kr|jd ks&|jdkr|jqS )ru   ri   )r/   r6   r   rn   ry   r#   r$   rG     s
     
 
 
 NrW   rX   Zfixedri   rq   )r6   r]   rI   r\   lenrY   )r   rS   r   Zmaster_approvesr    Zapproved_approversr]   r#   ry   r$   rr     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   )
rJ   r   r   Zis_newZ
is_changedr   r   r   Z	CmfNotifyZplace_notify)rg   messager#   r#   r$   _place_notify  s    
zCmfApprove._place_notifyc                    s   |    t j||S r8   )r}   superr   )rg   ra   rb   	__class__r#   r$   r     s    zCmfApprove.savec           
      K   s  t jj|d}|dg ||}t jj|d}g }|dd }|dkrt jj|d}t jf d||j	|j
d||dd	|d

|}	|	  ||	 nb|dkrt jj|d}|j D ]@}t jf d||j	|j
d||dd	|d

|}	|	  ||	 qt|t js| | dS )u  
        Добавляет либо один аппрув, если пришла персона, либо аппрувы всех членов группы персон или еще там какого орг.юнита
        :param obj_id: Объект, который аппрувим:
        :param approver_id: Персона или группа персон\подразделение итп:
        :param approve_group_id:   Аппрувгруппа
        )rB   r)   :r   r;   r	   r4   Nr+   )
r   r   r-   r.   r)   r   r   r6   r0   r/   CmfPersonGroup)r   ZCmfDocumentr   rJ   Zget_in_approveZCmfApproveGroupsplitr;   r   Zdoc_versionr)   r   r   r   r<   Z
all_nestedr:   r   r%   )
r   r   r   r/   r-   rb   Zdoc_histrR   Zappr_prefixr    r#   r#   r$   r     sV    


zCmfApprove.add_approver)r	   NNNr+   NN)r   )r   )N)__name__
__module____qualname____doc__r   r   Zapi_methodsclassmethodr%   r*   r7   r?   rT   rV   rM   rc   rd   rh   rf   rk   rw   rx   rr   r}   r   r   __classcell__r#   r#   r   r$   r      sX   	

       %

;
A


-
&
6
(r   )Zcmfr   Zcmf.includer   rv   r   r#   r#   r#   r$   <module>   s   