U
    xcc/                    @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlT d d	lmZ d d
lmZ d dlZG dd dejjjZdS )    N)copyfields)person)desc)func)relativedelta)*)CmfOrder)CmfTreeNodec                       sX  e Zd ZdZdddddddd	d
ddddddddddddgZddgZdZdZej	j
jjd ZG dd dej	j
jjZG dd dej	jZej	jej	jddddZej	jej	jd dddd!Zej	jej	jd"dddd!Zej	jej	jd#dddd!Zej	jej	jd$dddd!Zej	jej	jd%d&dd'Zej	jej	jd(dd)Zej	jej	jd*dddd+d,Zej	jej	jd-d.gdd/Zej	jej	jd0d.gdd1gdd2Z ej	jej	j!d3d4d5d6d.d7gddd8d9d:d;gd<Z"ej	jej	j!d=d4d5d6d.d7gddd8d9d:d;gd<Z#ej	jej	j$d>d?Z%ej	jej	j!dd@dAdBdAdCd1gdDZ&ej	jej	j'dEdFgddGZ(ej	jej	jdHd.gdd/Z)ej	jej	j*dIdJdKdLdMdNdOdddPZ+ej	jej	j,dIdJdQdLdMdRdOddSZ-ej	jej	j*dTdUdVdWdXdYdZd[Z.ej	jej	jd\dd)Z/ej	jej	jd]d?Z0ej	jej	j1d^d?Z2ej	jej	jd_d?Z3ej	jej	jd`d?Z4ej	jej	jdad?Z5ej	jej	j*dbdcdddedfdgdhdid[Z6ej	jej	jdjddkZ7ej	jej	j$ddldmddddnZ8ej	jej	jdodd4dpdqdrgdsZ9ej	jej	j$dldtduddvgddwZ:ej	jej	jdxdyddzZ;ej	jej	j$d{dd|Z<ej	jej	j*d}d~dddddddddZ=ej	jej	jdddBdddZ>e	je	j?dddddZ@G dd dej	j$ZA fddZBeCdd ZDd(ddZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZT fddZUdd ZVdd ZWdd ZXd) fdd	ZYeZd*ddZ[eZd+ fdd	Z\eZd, fdd	Z]eCddĄ Z^e^j_ddĄ Z^ddǄ Z`ddɄ Zadd˄ Zbdd̈́ Zcddτ Zdddф Ze fddӄZf fddՄZgddׄ Zhddل Ziddۄ Zjdd݄ Zkdd߄ Zldd Zm fddZn fddZo fddZp fddZqdd Zrdd Zsdd Ztd-ddZudi dddZvdddd fdd
Zw fddZxeZdd fdd
ZyeZdd fdd
Zzd d Z{ej	jej	j*dddddKdddddZ|ej	jej	j*dd	dddKd
dddddZ}ej	jej	j*dddddKd
dddddZ~ej	jej	j*dddddKd
dddddZd.ddZdd Zej	jej	jdddddZdd Zdd Z fddZdd Z fd d!Z fd"d#Z fd$d%Z fd&d'Z  ZS (/  CmfActiveEntityTcodenamestatus	cmf_ownerresponsiblepriority
alarm_datetags	executors
spectators
no_controlwaiting_formarktime_estimateplan_start_dateplan_end_dateperiod_intervalperiod_next_datedeadlineparentcompanyz	-priorityz-orderno)CmfAttachmentc                       s   e Zd Z fddZ  ZS )zCmfActiveEntity.logic_typec                    s8   t  | | jr4| jr4| jr4| jjdd | j_d S )N:r   )super
_set_valueinstancevaluer   	partitionlogic_prefixselfr'   	__class__ $./common/models/cmf_active_entity.pyr%   4   s    z%CmfActiveEntity.logic_type._set_value)__name__
__module____qualname__r%   __classcell__r.   r.   r,   r/   
logic_type3   s   r4   c                       s<   e Zd ZdZdZddgZdZ fddZ fdd	Z  Z	S )
zCmfActiveEntity.statusu   СтатусTworkflow_ididc                    s(   t  | | jr$| r| jpd | j_d S N)r$   r%   r&   status_typecache_status_typer*   r,   r.   r/   r%   D   s    z!CmfActiveEntity.status._set_valuec                    sB   t |tr6| jr6| jj r6| jjj|dd }r6|S t |S )NF)r9   Zraise_error)
isinstancestrr&   workflowloadget_default_statusr$   cast)r+   r'   r   r,   r.   r/   r@   I   s    zCmfActiveEntity.status.cast)
r0   r1   r2   captionnullableoptions_list_params	log_levelr%   r@   r3   r.   r.   r,   r/   r   :   s   u"   Дата смены статусаF)rA   visibleno_aclu"   Дата начала работы)rA   readonlyrE   rF   u(   Дата окончания работыu(   Дата на подтверждениеu   Дата закрытияu   КонтрагентZ
CmfCompany)rA   modellinkableu   Название)rA   indexu
   Номерu3   Код в реальном мире из жизни)rA   uniquerJ   rG   commentu   Постановщик	CmfPerson)rA   modelsrI   u   Исполнитель	parent_id)rA   rN   rI   rC   Zoptions_list_query_allu   Соисполнители
CmfProjectZ
CmfOrgUnitCmfPersonGroupZCmfRolezCmfProject.executorszCmfOrgUnit.tree_nodeszCmfPersonGroup.rg_memberszCmfRole.person)rA   rN   leftrI   Znested_fieldsu   Наблюдателиu!   Без подтверждения)rA   u   ТэгиZCmfTagmembersactivity_id)rightrA   rH   backrefwidgetrC   u   Вложенияr"   )rA   rN   rV   u   Ждем ответаu   Важностьu   Низкаяu   —u   В срокu   Блокирующая)/012rY   )rA   choicesdefaultrB   rE   u   Обычная)r7   r         )rA   r\   r]   rB   u   ОценкаrZ   r[   345)rZ   r[   r`   ra   rb   )rA   r\   u   Будильникu   Крайний срокu9   Планируемая длительность (мин.)u&   Плановая дата началаu.   Плановая дата завершенияu   Дата повторенияu%   Интервал повторенияu   Ежедневноu   Раз в 2 дняu   Еженедельноu   Ежемесячноu   Ежеквартальноu   Ежегодно)rZ   r[   7Z30Z90Z365u   Склонирован из)rA   rG   CmfBoolu   Шаблон)rE   rW   rA   rG   r]   rJ   u   Родитель	CmfFolderZCmfActiveEntityFilterZCmfDocument)rA   rB   rN   u   Сделаноu!   Значение чекбоксаr:   )rW   rA   rL   ZvirtualZrequired_fieldsrE   u   Вид деятельностиCmfActivity)rA   rH   rB   u!   Задача просрочена)rA   rE   u   Кеш: Тип статусаu   Открытu   В работеu+   Подтверждение закрытияu   Закрыто)openin_progress	in_reviewclosedalways)rA   r\   	load_moderE   rJ   rF   u!   Настройка статусаZCmfStatusOpt)rA   rH   rV   rE   rF   u   кэш полейZlazy)rA   rE   rl   rF   c                   @   s$   e Zd ZdZdZdZdZdd ZdS )zCmfActiveEntity.approvedu1   Согласовано руководителемTFc                 C   sV   g }| r| d n
| d tjj}|r8| |jj | tjjjpHd d|S )Nu   Согласовано.u&   Отмена согласования.  )appendgcurrent_personZprimary_roler   r'   join)r+   Z	msg_partsZroler.   r.   r/   	html_diff  s    
z"CmfActiveEntity.approved.html_diffN)r0   r1   r2   rA   rJ   rB   r]   rs   r.   r.   r.   r/   approved
  s
   rt   c                    s   t  j|f||}|dkr |S |dkr,dS |dkr@| jjr@dS |dkrT| jjrTdS tj|  krd}| j|  krxd}| j	dkrd}|rdS dS | j
r| j
tjkrdS |dkr| jrdS dS dS )	Nr_   r   r   TFrh   r^   r   )r$   _get_field_log_levelr   
is_changedr   rp   rq   
get_ownerscmf_modified_byr:   r   r   )r+   Z
field_nameargskwargsrD   Zskip_ownersr,   r.   r/   ru     s2    	
z$CmfActiveEntity._get_field_log_levelc                 C   s   | j jS r8   )notify_valuer+   r.   r.   r/   _notifyU  s    zCmfActiveEntity._notifyrg   c                 O   s   | j  |}|| _| S r8   )r=   r>   r?   r   )r+   r9   ry   rz   r   r.   r.   r/   set_default_statusY  s    z"CmfActiveEntity.set_default_statusc                 O   s*   t jjdd| gdD ]}|j|| qd S Nr    ==filter)rN   
CmfCommentlistdelete)r+   ry   rz   rL   r.   r.   r/   _delete_comments^  s    z CmfActiveEntity._delete_commentsc                 O   s*   t jjdd| gdD ]}|j|| qd S r   )rN   r"   r   r   )r+   ry   rz   Zattachr.   r.   r/   _delete_attachmentsb  s    z#CmfActiveEntity._delete_attachmentsc                 K   s   | j dgd |  }| D ]\}}||jkrt||| qd|_| |_|  | jD ]"}| }||_	|j
|_
|  qX|S )uC   
        Создание задачи по шаблону
        z***r   F)load_fieldsZcloneitemsr   setattris_templatecloned_fromsavecommentsr    cmf_created_at)r+   rz   r&   attrr'   Ztemplate_commentrL   r.   r.   r/   create_from_templatef  s    


z$CmfActiveEntity.create_from_templatec                 C   s   d S r8   r.   r}   r.   r.   r/   _calc_wf_simple_logic|  s    z%CmfActiveEntity._calc_wf_simple_logicc                 C   s>   | j js| jjs| jrdS | jjr,| jr,dS | j p6| j| _dS )u   
        Вычисляем человека от которого требуются действия по задаче
        :return:
        N)r   rv   r   r   r}   r.   r.   r/   _calc_waiting_for  s    z!CmfActiveEntity._calc_waiting_forc                 C   s   dS )u   
        Общая функция вычисления диапазона плана и будильника
        :return:
        Nr.   r}   r.   r.   r/   
_calc_plan  s    zCmfActiveEntity._calc_planc                 C   s:   | j jsd S | j r0t| j jtr0| j j | _nd | _d S r8   )r    rv   r;   r'   r   r)   r>   Zparent_logic_prefixr}   r.   r.   r/   _calc_parent_logic_prefix  s    z)CmfActiveEntity._calc_parent_logic_prefixc                 C   sb   | j js8| j js8| j j| jks8| j j| jks8| jjs8d S | j rR| jj| j d| _ n| j | _ d S )N)r   )r   rv   is_nullr9   r:   r=   r?   r}   r.   r.   r/   _calc_status  s    zCmfActiveEntity._calc_statusc                 C   s   | j jr,| j jr,| j jr4| j jj| j jjks4| jjr| jjr| jj}| jdkrV| j	j}| j jj
 d| d| j j }tj| | dd  | jjr| jjsd}| jrd| jj }tj| | dd  d S )Nri   z: , r^   )r    textrD   u/   Ожидаем действий от Пустоu%   Ожидаем действий от )r   Zis_not_nullrv   oldnewr   r   r   r:   r   r'   r   rN   r   r   r   )r+   ZlognameZlogtextr.   r.   r/   _calc_status_log  s$    
z CmfActiveEntity._calc_status_logc                 C   s   | j js| j j| jkr| j  | j j| _| jjr| jjdkrT| jjdkrT| j  | jdkrn| j	sn| j	  | jdkrd | _
d | _| jdkr| j
  | jdkr| j  d S )N)ri   rj   rh   ri   rj   )r   rv   r9   r:   status_modified_atset_nowr   r   status_in_progress_endstatus_in_progress_startstatus_review_atstatus_closed_atr}   r.   r.   r/   _calc_status_timestamps  s$    









z'CmfActiveEntity._calc_status_timestampsc                 C   s   | j s
d S tjtjj}| jrX| jjrXtj| j	ksB| j
jjdkrL| j| _ntddd | jsh| j  | j
jr| j
jjdkr| j|k rt| j jdk r|  jtjt| j jd7  _n$| jjttt| j jd d | _| j| _q~d S )Nrj   ri   uh   Только постановщик задачи может менять 'Дата повторения'Tabort   )Zdays)Zmonths)r   datetimenowtimezoneutcr   rv   rp   rq   r   r   r   r9   r   	cmf_alertr   intr'   	timedeltar   )r+   Zcur_dater.   r.   r/   _calc_periodic  s$    


 zCmfActiveEntity._calc_periodicc                 C   s$   | j jsd S | j jr tddd d S )NuE   Задача не может быть без постановщикаTr   )r   rv   r   r   r}   r.   r.   r/   _calc_owner  s    zCmfActiveEntity._calc_ownerc                 C   s   dddg}| j r&ddddgdddgg}|dd| jgg}d}tjj|dd	d
ddgdD ]}|| rTd}qT| jr~|r~| jdd dS )u\   
        Запуск триггеров для create или save
        :return:
        Zcache_action=r   ORZcreateZ	cmf_modelFZjson_filterZjson_entry_pointZjson_actionZ	func_nameZ	json_datar   r   Texec_triggersN)is_new
class_namerN   Z
CmfTriggerr   checkrv   r   )r+   Z_filterZ	need_saveZtriggerr.   r.   r/   _exec_trigger  s    

  

zCmfActiveEntity._exec_triggerc                 C   s0   | j jr,| j r,|  | _| jjdddgd d S )Nr   cmf_owner_assistantactivityr   )tree_parentrv   Z_node_parentr    r   r}   r.   r.   r/   _calc_parent  s    
zCmfActiveEntity._calc_parentc                 C   s   | j jr| jr| j r | j jdk r| jjdks8tj| jkr| j rZ| j j| jjt	j
dd krd}| jtjkrt|d7 }n|d7 }t|dd	 | j jr| jd
krtj|  kr| j jdk rtddd	 d S )Nr   i     )Zhoursu`   Нельзя передвигать будильник дальше крайнего срока.uz    Обратитесь к постановщику для разрешения на сдвиг крайнего срока.uB    Сдвиньте крайний срок если уверены.Tr   r_   u   Нельзя сдвигать будильник блокирующей задачи вперед.Возьмите в работу или обратитесь к постановщику.)r   rv   r   ager   rp   rq   r   r'   r   r   r   r   rw   )r+   msgr.   r.   r/   _check_alarm_date_valid  s@    




z'CmfActiveEntity._check_alarm_date_validc                   s,   |  ddddg t j|d|i| d S )N
cmf_authorr   r:   r   r   )r   r$   all_place_notify)r+   r   ry   rz   r,   r.   r/   r   3  s    z CmfActiveEntity.all_place_notifyc                 C   s$  | j jr| jrd S | jrN| j rN| jjdkrN| j jrN| j jtjj	 k rN| j | _| j
tjkr| jdkr| jdk r| j| j
j| jdtjj d| j j d| j j d| j d| jj d	tjj	tjjd
dd ntddd d S | j jr | jjr | jjr | jjr | j j| jj| jj  | _ d S d S )Nr   r   r_   rn   uf    сдвинул крайний срок задачи<br>
                        Было:&nbsp;&nbsp;u1   <br>
                        Стало:<b>&nbsp;z9<b><br>
                        <a target="_blank" href="z">z</a>
                        )Ztz)	person_idr   r   r   r   u   Нельзя сдвигать крайний срок блокирующей задачи, обратитесь к постановщикуTr   )r   rv   r   r   r   r   cmfr   CmfDateTimer   r   rp   rq   r:   r   _place_notifyr6   r   r   Zhrefr'   r   r   r   r   r   r}   r.   r.   r/   _calc_deadline7  s>    4
zCmfActiveEntity._calc_deadlinec                 K   sV   | j |kr$| j | jkr$| jdkr$d S | jr:|d| jj tjjf | |d| d S )Nrj   r   )objr   )	Zcmf_author_idZcmf_owner_idr:   r   
setdefaultr'   rN   	CmfNotifyZplace_notify)r+   r   rz   r.   r.   r/   r   Y  s    
zCmfActiveEntity._place_notifyc                 O   s   t jj|| d d S )N)r   r   )rN   r   Zclose_open_notifies)r+   r   ry   rz   r.   r.   r/   _clear_notifyb  s    zCmfActiveEntity._clear_notifyNc                    s   |  ddddddg tt jf d|i|}| jrB|| j | jrT|| j | jj|d}|	|| _	| j
j|d}|	| t|S )	u   
        Получение списка конечных пользователей затронутых обьектом
        r   r   r   r   r   r   r   r   )r   setr$   all_relation_personsr   addr   r   Z
all_nestedupdater   r   )r+   r   rz   resultr   r   r,   r.   r/   r   e  s        
z$CmfActiveEntity.all_relation_personsc                    sr   |sg }|sdg}t jjf |dd |dd |d|d|} rV fdd|D }|rn||d |d	  }|S )
NordernoZ	object_idr5   T)Zobj_idr5   r   Zclosed_lastorder_byc                    s*   g | ]"}|j r  |j j kr|qS r.   )r   lowerr'   ).0r   searchr.   r/   
<listcomp>  s       z7CmfActiveEntity.status_options_list.<locals>.<listcomp>r   r^   )rN   ZCmfWorkflowZget_status_listget)clsobject_fieldsr   r   slicer   rz   retr.   r   r/   status_options_list|  s$    

z#CmfActiveEntity.status_options_listc              	      s,  |sg }|sg }|si }|s"dg}|o.| d}|r|dr|stjj |dddgd}	|	rd }
|	jr~tjj|	jjd|dd	}
|
r|	j	r|	j	jj
|
krt |
|	j	jj
< |
|	j	jj
 |	j	jjj |D ]&}||g d
d|
 |g gg||< q|dddgg}|d t j| jj
f||||||d|S )NrM   rO   rP   Zproject_typer   r   )r6   r   T)Zchild_modelsZ
return_setr6   IN
user_localr   roles)r   all_optionsmodels_listmodels_filtersr   r   )r   
startswithrN   rP   r   ZRelationCacheZget_children_dictr6   r'   r   r   r   r   r   ro   r$   field_options_listr   )r   r   r   r   r   r   r   rz   rO   projectZchildren_dictZ
model_namer,   r.   r/   responsible_options_list  sV       


   z(CmfActiveEntity.responsible_options_listc           
         sz  |sg }|sg }|dkr4| j f |||||d|S |dkrV| jf ||||d|S |dkr|shdg}d|}|dd	| jgg}|rd
|kr|ddd	|d
 gdd	dggg}|ddd	dgdd	dggg}n|dkr|si }dddg|d< |d nj|dkrZ|o|d
}|r*|dd
ddgd
d|ggg}|o8|d}	|	rZ|ddddgdd|	ggg}t j|f|||||d|S )u  
        FIXME:
          потом мы сделаем эту штуку через
          глубокий поиск общую кэш-таблицу и все будет хорошо
        osv: а зачем это и так все кешируется дважды
        todo возможно надо вынести responsible status tag и тд в CmfTag и тп но не факт
        r   )r   r   r   r   r   r   )r   r   r   r   r4   r   filter_activity_idZcmf_model_namer   rT   r   Zfilter_activityNsystemF)r   r   r   r   r   TrM   r   r   rO   r   )r   r   r   r   r   )r   )r   r   r   ro   r   r$   r   )
r   Zrelation_field_namer   r   r   r   r   rz   rT   rO   r,   r.   r/   r     s|            
   z"CmfActiveEntity.field_options_listc                 C   s
   | j dkS )Nrj   )r:   r}   r.   r.   r/   _is_checked  s    zCmfActiveEntity._is_checkedc                 C   s\   |  ddg |dkr*| j d| _n.|dkrF| j d| _ntd| jj d S )Nlistsr=   Trj   Frg   u:   Некорректное значение для поля )r   r=   r>   r?   r   ZCmfValidationError
is_checkedrA   r*   r.   r.   r/   r     s    c                 O   s   |  dddg t| jjtjrXtjjdddg| jd}|sptj| jddd	}|	  ntjjdddg| jd
}|s|t
d| jd| _|| _d| j_| jj	dd | j	dd | S )Nz**zparent.tree_node_is_branchr=   sys_typer   archive)r   rO   u
   Архив)r    r   r   )r   tree_parent_idu4   В текущем проекте нет архиваrj   TZ	only_data)r   r;   r    r'   rN   rM   re   r   rO   r   	Exceptionr=   r?   r   r   Ztree_node_is_branch)r+   ry   rz   r   r.   r.   r/   r     s*     
 zCmfActiveEntity.archivec                 C   s   dS )u   
        Отправляем во фронт события для реалтайм обновления
        :return:
        Nr.   r}   r.   r.   r/   
emit_event+  s    zCmfActiveEntity.emit_eventc                 C   s   | j r
d S | jrt| jdd nd }| j s:|r:| jj  | _ | j sRtjj rRtjj | _ | j sltjjddgd| _ | j r| j 	dg d S )Nr   Zbusinessr	   )r   r   )
r   r    getattrr>   rp   rq   rN   rf   r   r   )r+   Zparent_activityr.   r.   r/   _calc_activity2  s    

zCmfActiveEntity._calc_activityc                 C   s  | j s*| jjs*| jjs*| jjs*| jjs*d S | j s8| jjr| jjjs| jjdkrXtj	| _q| j
  |  jtj| jjjd7  _n$| jjr| j s| jjrtd d | _| jr| js| jjrtd | j
  | js| jjdkr| jjrtd | j
  | j sV| jjrV| jjrV| jjjdkrV| jjjdkrV| jrL| j | jkrV| j
  | jdkr| jr| jjdk r| j
  | jjr| jjdkr| j
  d S )	Nr   )Zsecondsu   Будильник сброшен т.к. у этого бизнес-процесса в статусе будильник не заданu   Будильник установлен. Задача с крайним сроком не может быть без будильника.)rg   rj   uW   Будильник установлен тк задача уже выполняетсяrg   rj   )r   r   rv   r   r   r=   Z
next_alarmr   rp   http_client_date_hackr   r   r   r'   r   r   r9   r   r   r:   r   r}   r.   r.   r/   _calc_alarm_date@  sX    





"
z CmfActiveEntity._calc_alarm_datec                 C   s   | j s"| jjs"| jjs"| jjs"d S | jjr4| j s4d S | jsDd| _d S t| jdrv| j s^| jjrv| jdg | jj| _| j| jj ks| jj	| jj	krt
j| jkrd| _| j r| jjr| jr| jsd| _d S )NTauto_approve)r   rt   rv   r   r    hasattrr   r   r>   r6   rp   rq   
cmf_importZ
is_definedr}   r.   r.   r/   _calc_approvedz  s.    
"
zCmfActiveEntity._calc_approvedc                 C   s   d S r8   r.   r}   r.   r.   r/   
_calc_name  s    zCmfActiveEntity._calc_namec                    s`   | j st   d S | jjs d S | j r6| j dr6d S |   d| j jdd  }|| _ d S )NzA--r_   )	r   r$   
_calc_coder4   rv   r   get_code_prefixr'   
rpartition)r+   r   r,   r.   r/   r     s    
 zCmfActiveEntity._calc_codec                    s(   | j r| j j }|r|S tt|  S r8   )r4   Zobj_code_prefixr>   r$   r   r   )r+   Zcode_prefixr,   r.   r/   r     s
    zCmfActiveEntity.get_code_prefixc                 C   s6  |  ddddddddd	d
g
}dd | jD |d< dd | jD |d< d |d< | jrr| j dddddddg|d< d |d< | jr| j dddg|d< d |d< | jr| j ddddg|d< d |d< | jr| j ddddg|d< d |d< | jr
| j ddddg|d< d |d< | jr2| j ddddg|d< |S )Nr6   r   r   r   r   r   rt   r   r   Zcmf_modified_atc                 S   s   g | ]}| d dddgqS r6   r   r   loginto_jsonr   ir.   r.   r/   r     s     z9CmfActiveEntity.get_cache_fields_json.<locals>.<listcomp>r   c                 S   s   g | ]}| d dddgqS r  r  r  r.   r.   r/   r     s     r   r   Zcolorr9   Z	card_namer    r   r  r   r   r   )	r  r   r   r   r    r   r   r   r   )r+   r   r.   r.   r/   get_cache_fields_json  sB    z%CmfActiveEntity.get_cache_fields_jsonc                 C   sz   | j r| jjsd S | j jr$| j r$d S | j s<| j| | _ d S | jjrh| jjrh| jj| }|| j krhd S | j| | _ d S r8   )r4   	scheme_wfrv   Zcalc_logic_typer   )r+   Zold_default_logic_typer.   r.   r/   _calc_logic_type  s    
z CmfActiveEntity._calc_logic_typec                 C   s>   | j js| jjs| jrd S | jjr,| jr,d S tj| | _d S r8   )r    rv   r   r	  rN   ZCmfSchemeWfZcalc_schemer}   r.   r.   r/   _calc_scheme_wf  s    zCmfActiveEntity._calc_scheme_wfc                 C   sF   | j js"| jjs"| jjs"| jr"d S | jjr4| jr4d S | j | | _d S r8   )r	  rv   r4   r   r=   Zcalc_workflowr}   r.   r.   r/   _calc_workflow  s    zCmfActiveEntity._calc_workflowc                 C   s   d S r8   r.   r}   r.   r.   r/   _calc_default_workflow%  s    z&CmfActiveEntity._calc_default_workflowc                 C   s   d S r8   r.   r}   r.   r.   r/   _calc_responsible(  s    z!CmfActiveEntity._calc_responsiblec                    s*   t   p(| jjp(| jjp(| jjp(| jjS r8   )r$   _acl_subjects_is_changedr   rv   r   r   r   r}   r,   r.   r/   r  +  s    
z(CmfActiveEntity._acl_subjects_is_changedc                    s>   t   }|| j | jr(|| j | jr:|| j |S r8   )r$   _acl_subjects_list_level_writeextendr   r   ro   r   r+   r   r,   r.   r/   r  0  s    
z.CmfActiveEntity._acl_subjects_list_level_writec                    s   t   }|| j |S r8   )r$   _acl_subjects_list_level_readr  r   r  r,   r.   r/   r  :  s    
z-CmfActiveEntity._acl_subjects_list_level_readc                    s>   t   ddddddddd	d
ddddddddddddddg S )Nr	   r   r   r   r=   r)   zparent.cmf_ownerzparent.cmf_owner_assistantzparent.activityr   r   zstatus.ordernozstatus.workflowr   r   r   cache_status_optr   r   rx   sharelink_hashzlogic_type.coder	  )r$   save_preload_fieldsr}   r,   r.   r/   r  @  s4                      z#CmfActiveEntity.save_preload_fieldsc                 C   s   ddddddddd	d
dgS )Nr   r   r   r   r   r   r   attachmentsr   r:   Zfavorite_forr.   r}   r.   r.   r/   simple_perm_allow_fieldsI  s           z(CmfActiveEntity.simple_perm_allow_fieldsc              	   C   s  | j r
d S d}| jddD ]2}|j|  kr|jds|jdsd} qNq| jjrb| jjrbd}|rn| 	  d}| jddD ]}|jdkr~d} qq~|rt
|  }||   d| jkr| dd	g | jD ]"}||j |jr||j qtj|krd
| j d| jr | jjp"d d| jr8| jjp:d d| jrP| jjpRd d	}ttdd || j| j| jh }|r|dd|d d  7 }t|dkr|d7 }n|d7 }n|d7 }|d|   }| jddD ]}|d|j  }qtjj|d d S )NFT)rv   Zcache_Z_id)r   r   r   r   Zchild_tasksZdepended_tasksZaffected_tasksr   zlists.cmf_ownerzlists.cmf_owner_assistantu    Это действие над "u5   " разрешено только Владельцу(r   u    ) или Исполнителю(uW   ) или Временному исполнителю(поле "Ждем ответа": )c                 S   s
   t | jS r8   )r<   r   )xr.   r.   r/   <lambda>      z3CmfActiveEntity.check_simple_perm.<locals>.<lambda>u   , а так же r   
   u
   , и др..u    Объект: z field: )message) r   valuesr   r  r   endswithr   rv   r   Zcheck_owner_permsr   r   r   rw   r   r   r   r   r   r   rp   rq   r   r   r   sortedmaprr   lenrN   ZCmfAccessListZcheck_admin_mode)r+   Zneed_owners_checkZfieldZneed_reluser_checkZall_relation_userZlstr   Zothersr.   r.   r/   check_simple_permS  s\    




V

z!CmfActiveEntity.check_simple_permc                 O   s4   |    |   |   |   |   |   d S r8   )r   r  r
  r  r   r   )r+   ry   rz   r.   r.   r/   _save_template  s    zCmfActiveEntity._save_templatec                 C   s<   | j jsd S | jj| | j j| j j|d}|r8| jdd d S )Nis_task_transition_runFr   )r   rv   r=   Zrun_transitionr   r'   r   )r+   r(  Zhas_changesr.   r.   r/   _exec_transition  s
    z CmfActiveEntity._exec_transition)comment_appendchanged_fieldsc          	      O   sR   t jj|d}| D ]\}}t| || q| jdd |rNt j|| d  d S )N)r6   Tr'  )r   r    )rN   CmfTransr   r   r   r   r   )	r+   Ztransition_idr*  r+  ry   rz   Z
transitionkeyvalr.   r.   r/   task_transition_run  s    z#CmfActiveEntity.task_transition_runr   )r   r(  depthc             	      s"  | j jr| js|stjjdd| j jjggdd| j jgdddggd}|srtjjddd gdd| j jgdddggd}|rt	d| j d	|j d	| j jj d	| j j dd
 t
jj t_| jr| jjt_d | _| jr| j|| t j|d|i|}td |S td |   td |   td |   td |   td |   |   td |   td |   td |   td |    td | !  td | "  td | #  td | $  td | %  td | &  td | '  td | (  td | )  td | *  td  | +  td! | ,  td" t j|d|i|}td |r| j-|d# td$ t.j/r| j0r| j0j12 rt3| j0j1jt4 t5  | jd%d& | 6  td' |S )(NZstatus_fromr   Z	status_tor   Ztrans_form_showTr   zmust_transition_run rn   r   r0  zsuper().save endz
save startz_calc_owner endz_calc_parent endz_calc_activity endz_calc_scheme_wf endz_calc_periodic endz_calc_logic_type endz_calc_workflow endz_calc_default_workflow endz_calc_status endz_calc_status_timestamps endz_calc_status_log endz_calc_plan endz_calc_approved endz_calc_wf_simple_logic endz_calc_waiting_for endz_calc_deadline endz_calc_alarm_date endz_check_alarm_date_valid endz_calc_name endz_calc_parent_logic_prefix endz_calc_sharelink_hash endr'  z_exec_transition endFr   z_exec_trigger end)7r   rv   r   rN   r,  r   r   r6   r   r   r   r   r   r   rp   r   r   r'   r   r&  r$   r   debugr   r   r   r  r  r   r
  r  r  r   r   r   r   r   r   r   r   r   r   r   r   _calc_sharelink_hashr)  ZconfigZIS_BOX_VERSIONr=   Zsave_eval_coder>   execglobalslocalsr   )r+   r   r(  r0  ry   rz   Ztransr   r,   r.   r/   r     s    2


























zCmfActiveEntity.savec                    s   |   | _t   d S r8   )r  cache_fieldsr$   _update_cache_fieldsr}   r,   r.   r/   r7  1  s    
z$CmfActiveEntity._update_cache_fields)include_templatesc                   s   |s| dd t j||S Nr   F)r   r$   r   r   r8  ry   rz   r,   r.   r/   r   6  s    zCmfActiveEntity.listc                   s   |s| dd t j||S r9  )r   r$   slistr:  r,   r.   r/   r;  <  s    zCmfActiveEntity.slistc              
   C   s\   | j dgd | jD ]B}t|jd,}tj||jd}||  |	  W 5 Q R X qdS )uD    Копирование вложений для CmfTask, CmfDocumentr  r   rb)r    r   N)
r   r  rg   Zfull_path_filerN   r"   r   Zupload_filereadr   )r+   r    
attachmentfileZnew_attachmentr.   r.   r/   copy_attachmentsB  s    
z CmfActiveEntity.copy_attachmentsu   Права доступаr]   u   Полныеu   Только чтениеu   Приватный)r]   fullrG   private)rE   rA   r]   rB   r\   u-   WEB Авторизованный доступu   Доступ запрещёнu2   Могут только просматриватьuE   Могут просматривать и комментироватьu   Полный доступ)r]   denyrG   rL   rA  u#   WEB Анонимный доступu"   WEB Доступ по ссылкеc                    s   | j js|sd S | j jdkr$|s$d S | jsfdd l}dd l|j|j  d fddt	dD | _t
 D ]Z}|jdd| jjgd	dd ggd
dd	gdD ],}td|  |jdd |jdd qqnd S )Nr]   r   rm   c                 3   s   | ]}  V  qd S r8   )choice)r   _Zalphabetsecretsr.   r/   	<genexpr>  s     z7CmfActiveEntity._calc_sharelink_hash.<locals>.<genexpr>r   r   r   r  r6   perm_policy_sharelinkr   z#_calc_sharelink_hash child update: Tforcer   )rI  rv   r   r  stringrG  Zascii_lettersdigitsrr   ranger   Ziter_subclassesr   r6   r'   rp   r1  r2  r   )r+   rK  rL  Z	model_clsZchildr.   rF  r/   r2  x  s"     z$CmfActiveEntity._calc_sharelink_hashc                 C   s   d| _ |   dS )u&   Метод сброса sharelink_hashN)r  r2  r}   r.   r.   r/   do_erase_sharelink_hash  s    z'CmfActiveEntity.do_erase_sharelink_hashCmfStr32zShareLink hash)rW   rA   rL   rE   c                 C   s   | j dkrdS tjd| jd}tj }|j| | j dkrFd|_n>| j dkrXd|_n,| j dkrjd|_nt	
d	| j  d
 d|_|  dS )uG   Наполняем ACL правилами для ShareLink группыr]   Nauto)r   r    rG   r=  rL   rA  z%WARN! Unknown perm_policy_sharelink: z. Set deny policyrC  )rI  rN   CmfAccessRuleperm_aclrQ   sharelink_groupsubjectsro   access_levelrp   r1  r   )r+   Zacl_rule_sharelinkrT  r.   r.   r/   _acl_scaffold_sharelink_rules  s&    
 



z-CmfActiveEntity._acl_scaffold_sharelink_rulesc                 C   s   | j dkr| jdkrdS tjd| jdd}tjjdd}|j| | j dkrVd	|_	n*| j d
krhd	|_	n| j dkrzd	|_	nd|_	|
  tjd| jdd}tj }|j| | jdkrd	|_	n*| jd
krd	|_	n| jdkrd|_	nd|_	|
  dS )uZ   Наполняем ACL правилами для публикации документовr]   NrQ  ZSETMEBUG)r   r    rV  zanonymous@evateam.ru)r  rG   r=  rL   rA  rC  write)perm_policy_anonymousperm_policy_guestrN   rR  rS  rM   r   rU  ro   rV  r   rQ   Zguest_group)r+   Zacl_rule_anonymousZanonymous_personZacl_rule_guestZguest_person_groupr.   r.   r/   _acl_scaffold_public_rules  sD    
  


  



z*CmfActiveEntity._acl_scaffold_public_rulesc                    s&  |    |   | jdkr<tjd| jtj gdd  n| jdkrt	t
|  }|rrtjd| j|dd  tjd| jtj gdd  n| jdkrt	t
|  }|rtjd| j|dd  t	t
|  }|rtjd| j|dd  tjd| jtj gdd  t   d	S )
u   Наполним свой acl автоматическими правилами в зависимости от политикиrA  rQ  )r   r    rU  rV  rG   Z	denyWriterB  r=  rC  N)r[  rW  perm_policyrN   rR  rS  rQ   Z
user_groupr   r   r   r  r  r$   _acl_scaffold)r+   Zwriter_listZreader_listr,   r.   r/   r]    s`    
 
 
  
 
   
  
 
 
zCmfActiveEntity._acl_scaffoldc              	   C   s   |  dddddddg d S )Nr\  perm_has_aclz
perm_acl.*Zperm_inheritZperm_parentperm_inherit_acl_idZperm_effective_acl_id)r   r}   r.   r.   r/   _load_perm_fields  s       z!CmfActiveEntity._load_perm_fieldsc                    s@   t    | jjs| jjsd S |   | jr<| jdkr<d| _d S )Nr]   T)r$   _calc_perm_has_aclr^  rv   r\  r`  r}   r,   r.   r/   ra    s    
z"CmfActiveEntity._calc_perm_has_aclc                    s|   | j jsD| jjsD| jjsD| jjsD| jjsD| jjsD| jjsD|  sDd S | jdksb| jdksb| jdkrn| j snd| _ t	 j
ddS )Nr]   TrJ  )r^  rv   r_  r\  r   rY  rZ  rI  r  r$   _calc_perm_aclr}   r,   r.   r/   rb    s2    	
zCmfActiveEntity._calc_perm_aclc                    s   |    d| _t   d S )Nr]   )r`  r\  r$   disable_acl)r+   _kwargsr,   r.   r/   rc  /  s    zCmfActiveEntity.disable_aclc                    sB   t  jf | tjjjjdgdd| gdD ]}| j|f| q*d S )Nr	   r    r   )r   r   )r$   _direct_children_deleter   ZincluderN   r"   r   Z_delete_child_object)r+   rz   r>  r,   r.   r/   re  4  s     z'CmfActiveEntity._direct_children_delete)rg   )N)NNNNN)NNNNNF)NNNNN)F)F)r0   r1   r2   ZabstractZfields_orderZorderingZaudit_fieldsZmenu_tree_show_objcommonr   cmf_active_entityr   Zessential_child_modelsr4   r   Z	CmfStatusr   ZFieldr   r   r   r   r   r   ZCmfRelationr!   Z	CmfStr256r   ZCmfStr64r   ZCmfGenericRelationr   r   ZCmfGenericM2Mr   r   rd   r   r   ZCmfGenericBackrefr  r   Z	CmfChoiceZpriority_oldZCmfChoiceIntr   r   r   r   ZCmfIntr   r   r   r   r   r   r   r   r   r   Z
is_penaltyr:   r  ZCmfObjectJsonr6  rt   ru   propertyr~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r   r   setterr   r   r   r   r   r   r   r   r  r
  r  r  r  r  r  r  r  r  r  r%  r&  r)  r/  r   r7  r   r;  r@  r\  rZ  rY  rI  r2  rO  rP  r  rW  r[  r]  r`  ra  rb  rc  re  r3   r.   r.   r,   r/   r      s                     
	

               
	     
 7

"	         .        ;

: 	-
	
G	z    	   
   
   
,"r   )r   r   r   r   modulesr   Z
sqlalchemyr   Zsqlalchemy.sqlr   Zdateutil.relativedeltar   Zcmf.includeZcommon.models.cmf_orderr
   Zcommon.models.cmf_tree_noder   Zcommon.fields.cmf_active_entityrf  rg  r   r.   r.   r.   r/   <module>   s   