U
    kc@                    @   s   d dl Z d dlmZ d dlZ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T d dlZG d	d
 d
ejjjZdS )    N)copyfields)person)desc)func)relativedelta)*c                       s  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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G d0d dejjZejjejj d1d2d3d4d.d5gddd6d7d8d9gd:Z!ejjejj d;d2d3d4d.d5gddd6d7d8d9gd:Z"ejjejj#d<d=Z$ejjejj dd>d?d@d?dAdBgdCZ%ejjejj&dDdEgddFZ'ejjejjdGd.gdd/Z(ejjejj)dHdIdJdKdLdMdNdOddPZ*ejjejj+dQdRdSdTdUdVdWdXZ,ejjejjdYdd)Z-ejjejjdZd=Z.ejjejj/d[d=Z0ejjejjd\d=Z1ejjejjd]d=Z2ejjejjd^d=Z3ejjejj+d_d`dadbdcdddedfdXZ4ejjejjdgddhZ5ejjejj#ddidjddddkZ6ejjejjdldd2dmdndodpgdqZ7ejjejj#didrdsddtgdduZ8ejjejjdvdwddxZ9ejjejj#dyddzZ:ejjejj+d{d|d}d~dddddddZ;ejjejjddd@dddZ<ejej=dddddZ>G dd dejj#Z?ejjejj@dddd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 ZXdd ZYd< fdd	ZZe[d=ddZ\e[d> fddÄ	Z]e[d? fddń	Z^eCddǄ Z_e_j`ddǄ Z_ddʄ Zadd̄ Zbdd΄ ZcddЄ Zddd҄ ZeddԄ Zf fddքZg fdd؄Zhddڄ Zidd܄ Zjddބ Zkdd Zldd Zmdd Zn fddZo fddZp fddZq fddZrdd Zsdd Ztdd Zudd Zvd@ddZwdi dddZxdd Zydddd fdd
Zz fd dZ{ fddZ|e[dd fdd
Z}e[dd fdd
Z~d	d
 Zejjejj+ddddddddddZejjejj+dddddddddddZejjejj+dddddddddddZejjejj+dddddddddddZdA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d0d1Zdd2ed3d4d5Zeee}d6d7d8ZdBd9d:Z  ZS (C  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#   3   s    z%CmfActiveEntity.logic_type._set_value)__name__
__module____qualname__r#   __classcell__r,   r,   r*   r-   
logic_type2   s   r2   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#   @   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)r7   Zraise_error)
isinstancestrr$   workflowloadget_default_statusr"   cast)r)   r%   r   r*   r,   r-   r>   E   s    zCmfActiveEntity.status.cast)
r.   r/   r0   captionnullableoptions_list_params	log_levelr#   r>   r1   r,   r,   r*   r-   r   9   s   u"   Дата смены статусаF)r?   visibleno_aclu"   Дата начала работы)r?   readonlyrC   rD   u(   Дата окончания работыu(   Дата на подтверждениеu   Дата закрытияu   КонтрагентZ
CmfCompany)r?   modellinkableu   Название)r?   indexu
   Номерu3   Код в реальном мире из жизни)r?   uniquerH   rE   commentu   Постановщик	CmfPerson)r?   modelsrG   c                   @   s$   e Zd ZdZdgZdZdgZdZdS )zCmfActiveEntity.responsibleu   ИсполнительrK   T	parent_idN)r.   r/   r0   r?   rL   rG   rA   Zoptions_list_query_allr,   r,   r,   r-   r   p   s
   u   Соисполнители
CmfProjectZ
CmfOrgUnitCmfPersonGroupZCmfRolezCmfProject.executorszCmfOrgUnit.tree_nodeszCmfPersonGroup.rg_memberszCmfRole.person)r?   rL   leftrG   Znested_fieldsu   Наблюдателиu!   Без подтверждения)r?   u   ТэгиZCmfTagmembersactivity_idrM   )rightr?   rF   backrefwidgetrA   u   Вложенияr    )r?   rL   rT   u   Ждем ответаu   Приоритетu   Минимальныйu   Низкийu   Обычныйu   Высокийu   Критичный)r5   r         0)r?   choicesdefaultr@   u   Оценка12345)r\   r]   r^   r_   r`   )r?   rZ   u   Будильникu   Крайний срокu9   Планируемая длительность (мин.)u&   Плановая дата началаu.   Плановая дата завершенияu   Дата повторенияu%   Интервал повторенияu   Ежедневноu   Раз в 2 дняu   Еженедельноu   Ежемесячноu   Ежеквартальноu   Ежегодно)r\   r]   7Z30Z90Z365u   Склонирован из)r?   rE   CmfBoolu   Шаблон)rC   rU   r?   rE   r[   rH   u!   Родительская нода	CmfFolderZCmfActiveEntityFilterZCmfDocumentZCmfTask)r?   r@   rL   u   Сделаноu!   Значение чекбоксаr8   )rU   r?   rJ   ZvirtualZrequired_fieldsrC   u   Вид деятельностиCmfActivity)r?   rF   r@   u!   Задача просрочена)r?   rC   u   Кеш: Тип статусаu   Открытu   В работеu+   Подтверждение закрытияu   Закрыто)OPENIN_PROGRESS	IN_REVIEWCLOSEDalways)r?   rZ   	load_moderC   rH   rD   u!   Настройка статусаZCmfStatusOpt)r?   rF   rT   rC   rD   u   кэш полейZlazy)r?   rC   rj   rD   c                   @   s$   e Zd ZdZdZdZdZdd ZdS )zCmfActiveEntity.approvedu1   Согласовано руководителемTFc                 C   sZ   g }| r| d n
| d tjj }|r<| |jj | tjjjpLd d|S )Nu   Согласовано.u&   Отмена согласования.  )appendgcurrent_personZprimary_roler<   r   r%   join)r)   Z	msg_partsZroler,   r,   r-   	html_diff  s    
z"CmfActiveEntity.approved.html_diffN)r.   r/   r0   r?   rH   r@   r[   rq   r,   r,   r,   r-   approved   s
   rr   u   ПодписчикиZCmfFollower)r?   rT   rF   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 )	NrX   r   r   TFrf   rW   r   )r"   _get_field_log_levelr   
is_changedr   rn   ro   
get_ownerscmf_modified_byr8   r   r   )r)   
field_nameargskwargsrB   Zskip_ownersr*   r,   r-   rs     s2    	
z$CmfActiveEntity._get_field_log_levelc                 C   s   | j jS r6   )notify_valuer)   r,   r,   r-   _notifyI  s    zCmfActiveEntity._notifyre   c                 O   s   | j  |}|| _| S r6   )r;   r<   r=   r   )r)   r7   rx   ry   r   r,   r,   r-   set_default_statusM  s    z"CmfActiveEntity.set_default_statusc                 O   s*   t jjdd| gdD ]}|j|| qd S Nr   ==filter)rL   
CmfCommentlistdelete)r)   rx   ry   rJ   r,   r,   r-   _delete_commentsR  s    z CmfActiveEntity._delete_commentsc                 O   s*   t jjdd| gdD ]}|j|| qd S r   )rL   r    r   r   )r)   rx   ry   Zattachr,   r,   r-   _delete_attachmentsV  s    z#CmfActiveEntity._delete_attachmentsc           	      K   s   g }| j  D ]}||j qd|kr6|ddg | j|d |  }| D ]\}}||j krRt||| qRd|_	| |_
|  | jD ]2}|jdkrq| }||_|j |_|  q|S )uC   
        Создание задачи по шаблону
        commentszcomments.textzcomments.log_levelr   Fr   )r   valuesrm   
class_nameextendload_fieldsZcloneitemssetattris_templatecloned_fromsaver   rB   r   cmf_created_atr<   )	r)   ry   Zpreload_fieldsfieldr$   attrr%   Ztemplate_commentrJ   r,   r,   r-   create_from_templateZ  s*    



z$CmfActiveEntity.create_from_templatec                 C   s   d S r6   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   rt   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 r6   )r   rt   r9   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   rt   is_nullr7   r8   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
}|sfd}| j jj d| d| }| j|dddd | jjr| jjsd	}| jrd
| jj }| j|dddd d S )Nrg   u"   Задача ожидает Васz: , rW   Tr   )rB   rz   rw   u/   Ожидаем действий от Пустоu%   Ожидаем действий от r   )r   Zis_not_nullrt   oldnewr   r   r   r8   r   textr%   Z_audit_add_comment_and_notifyr   )r)   ZlognameZstatus_textZ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)rg   rh   rf   rg   rh   )r   rt   r7   r8   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rh   rg   uh   Только постановщик задачи может менять 'Дата повторения'Tabort   )Zdays)Zmonths)r   datetimenowtimezoneutcr   rt   rn   ro   r   r   r   r7   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   rt   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   ORcreateZ	cmf_modelFZjson_filterZjson_entry_pointZjson_actionZ	func_nameZ	json_datar   r   Texec_triggersN)is_newr   rL   Z
CmfTriggerr   checkrt   r   )r)   Z_filterZ	need_saveZtriggerr,   r,   r-   _exec_trigger  s    

  

zCmfActiveEntity._exec_triggerc                 C   sJ   | j jrF| j rF|  }|rF|| jkrF|dddddg || _|   d S )Nr   cmf_owner_assistantsactivityr   Zroot_parent)tree_parentrt   Z_node_parentr   r   Zsave_prepare)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   rX   u   Нельзя сдвигать будильник блокирующей задачи вперед.Возьмите в работу или обратитесь к постановщику.)r   rt   r   ager   rn   ro   r   r%   r   r   r   r   ru   )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   r8   r   r   )r   r"   all_place_notify)r)   r   rx   ry   r*   r,   r-   r   ?  s    z CmfActiveEntity.all_place_notifyc                 C   s(  |  ddddddddd	d
dddg tjG dd d}| }| jr| jjjdkr| j|_d| jj |_| jj	j|_	| jj
j|_
| jjj|_| jjj|_| jjj|_| jjj|_| jr$| jjr$| j|_d| jj |_| jj	j|_	| jj
j|_
| jjj|_| jjj|_| jjj|_| jjj|_|S )Nparent.sl_deadline_shiftparent.sl_only_owner_approveparent.sl_deny_no_approve0parent.sl_allow_executor_change_nofatal_deadlineparent.sl_task_need_approveparent.sl_task_only_owner_closeworkflow.enable_sl_controlworkflow.sl_deadline_shiftworkflow.sl_only_owner_approveworkflow.sl_deny_no_approve2workflow.sl_allow_executor_change_nofatal_deadlineworkflow.sl_task_need_approve!workflow.sl_task_only_owner_closec                   @   s^   e Zd ZU dZeed< dZeed< dZeed< dZ	eed< dZ
eed< dZeed< dZdZdS )z;CmfActiveEntity._get_sl_options.<locals>.SimpleLogicOptionsNsl_deadline_shiftsl_only_owner_approvesl_deny_no_approve)sl_allow_executor_change_nofatal_deadlinesl_task_need_approvesl_task_only_owner_close)r.   r/   r0   r   r   __annotations__r   boolr   r   r   r   sl_controllersl_controller_strr,   r,   r,   r-   SimpleLogicOptionsV  s   
r   rN   u   Проект: u   Бизнес-процесс: )r   dataclassesZ	dataclassr   r%   r   r   r   r   r   r   r   r   r   r   r;   Zenable_sl_control)r)   r   optionsr,   r,   r-   _get_sl_optionsD  sJ    zCmfActiveEntity._get_sl_optionsc                 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s~tddd | 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   ut   Нельзя сдвигать крайний срок задачи, обратитесь к постановщикуTr   rX   rl   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   Нельзя сдвигать крайний срок блокирующей задачи, обратитесь к постановщику)r   rt   r   r   r   r   cmfr   CmfDateTimer   r   rn   ro   r8   r   r   r   r   _place_notifyr4   r   r   Zhrefr%   r   r   r   r   )r)   Z
sl_optionsr,   r,   r-   _calc_deadliney  sD    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 )Nrh   r   )objr   )	Zcmf_author_idZcmf_owner_idr8   r   
setdefaultr%   rL   	CmfNotifyplace_notify)r)   r   ry   r,   r,   r-   r     s    
zCmfActiveEntity._place_notifyc                 O   s   t jj|| d d S )N)r   r   )rL   r   Zclose_open_notifies)r)   r   rx   ry   r,   r,   r-   _clear_notify  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   
all_nestedupdater   r   )r)   r   ry   resultr   r   r*   r,   r-   r     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_idr3   T)Zobj_idr3   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   rW   )rL   ZCmfWorkflowZget_status_listget)clsobject_fieldsr   r   slicer   ry   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 )NrK   rM   rN   Zproject_typer   r   )r4   r   T)Zchild_modelsZ
return_setr4   IN
user_localr   roles)r   all_optionsmodels_listmodels_filtersr   r   )r   
startswithrL   rN   r   ZRelationCacheZget_children_dictr4   r%   r   r   r   r   r   rm   r"   field_options_listr   )r   r   r  r   r   r  r  ry   rM   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   r2   r   filter_activity_idZcmf_model_namer   rR   r   Zfilter_activityNsystemF)r   r   r   r  r   TrK   r  r   rM   r  )r  r   r   r   r   )r
  )r	  r   r   rm   r   r"   r  )
r   Zrelation_field_namer  r   r   r   r   ry   rR   rM   r*   r,   r-   r    s|            
   z"CmfActiveEntity.field_options_listc                 C   s
   | j dkS )Nrh   )r8   r|   r,   r,   r-   _is_checkedC  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 )NZlistsr;   Trh   Fre   u:   Некорректное значение для поля )r   r;   r<   r=   r   ZCmfValidationError
is_checkedr?   r(   r,   r,   r-   r  G  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   rM   u
   Архив)r   r   r  )r   tree_parent_idu4   В текущем проекте нет архиваrh   TZ	only_data)r   r9   r   r%   rL   rK   rc   r   rM   r   	Exceptionr;   r=   r   r   Ztree_node_is_branch)r)   rx   ry   r  r,   r,   r-   r  T  s*     
 zCmfActiveEntity.archivec                 C   s   dS )u   
        Отправляем во фронт события для реалтайм обновления
        :return:
        Nr,   r|   r,   r,   r-   
emit_eventp  s    zCmfActiveEntity.emit_eventc                 C   s   | j r
d S d }| jr6d| jjkr6| jdg | jj }| j sF|rF|| _ | j s^tjj r^tjj | _ | j sxtjjddgd| _ | j r| j dg d S )Nr   z
activity.*Zbusinessr	   )r   r   )	r   r   r   r   rn   ro   rL   rd   r   )r)   Zparent_activityr,   r,   r-   _calc_activityw  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   Будильник установлен. Задача с крайним сроком не может быть без будильника.)re   rh   uW   Будильник установлен тк задача уже выполняетсяre   rh   )r   r   rt   r   r   r;   Z
next_alarmr   rn   http_client_date_hackr   r   r   r%   r   r   r7   r   r   r8   r   r|   r,   r,   r-   _calc_alarm_date  sX    





"
z CmfActiveEntity._calc_alarm_datec                 C   s   | j rd| _d S )NT)r   rr   r|   r,   r,   r-   _calc_approved  s    zCmfActiveEntity._calc_approvedc                 C   s   d S r6   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--rX   )	r   r"   
_calc_coder2   rt   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 r6   )r2   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 )Nr4   r   r   r   r   r   rr   r   r   Zcmf_modified_atc                 S   s   g | ]}| d dddgqS r4   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colorr7   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 r6   )r2   	scheme_wfrt   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 r6   )r   rt   r   r$  rL   ZCmfSchemeWfZcalc_schemer|   r,   r,   r-   _calc_scheme_wf4  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 r6   )r$  rt   r2   r   r;   Zcalc_workflowr|   r,   r,   r-   _calc_workflowB  s    zCmfActiveEntity._calc_workflowc                 C   s   d S r6   r,   r|   r,   r,   r-   _calc_default_workflowS  s    z&CmfActiveEntity._calc_default_workflowc                 C   s   d S r6   r,   r|   r,   r,   r-   _calc_responsibleV  s    z!CmfActiveEntity._calc_responsiblec                    s*   t   p(| jjp(| jjp(| jjp(| jjS r6   )r"   _acl_subjects_is_changedr   rt   r   r   r   r|   r*   r,   r-   r*  Y  s    
z(CmfActiveEntity._acl_subjects_is_changedc                    s>   t   }|| j | jr(|| j | jr:|| j |S r6   )r"   _acl_subjects_list_level_writer   r   r   rm   r   r)   r   r*   r,   r-   r+  ^  s    
z.CmfActiveEntity._acl_subjects_list_level_writec                    s   t   }|| j |S r6   )r"   _acl_subjects_list_level_readr   r   r,  r*   r,   r-   r-  h  s    
z-CmfActiveEntity._acl_subjects_list_level_readc              '      sZ   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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_assistantszparent.activityzparent.disable_simple_permr  r   zstatus.ordernozstatus.workflowr   r   r   cache_status_optr   Z
cmf_importrv   sharelink_hashzlogic_type.coder$  r   r   r   r   r   r   r   r   r   r   r   r   r   )r"   save_preload_fieldsr|   r*   r,   r-   r0  n  sP                       z#CmfActiveEntity.save_preload_fieldsc                 C   s   ddddddddd	d
dddgS )Nr   r   r   r   r   r   r   attachmentsr   r8   favorite_forZ
tmp_filterui_view_formr,   r|   r,   r,   r-   simple_perm_allow_fields  s             z(CmfActiveEntity.simple_perm_allow_fieldsc                 C   s   ddgS )Nr2  r3  r,   r|   r,   r,   r-   project_perm_allow_fields  s    z)CmfActiveEntity.project_perm_allow_fieldsc              	   C   s  | j r
d S tjdrd S | jr:| jjjdkr:| jjr:d S d}| jddD ]2}|j| 	 krJ|j
dsJ|jdsJd} q~qJ| jjr| jjrd}|r|   d}| jddD ]}|jdkrd} qq|rt|  }||   tj|krd	| j d
| jr| jjpd d| jr&| jjp(d d| jr>| jjp@d 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 }tjj |d d S )NimportrN   FT)rt   Zcache_Z_id)r   r   r   r   Zchild_tasksZdepended_tasksZaffected_tasksu    Это действие над "u5   " разрешено только Владельцу(r  u    ) или Исполнителю(uW   ) или Временному исполнителю(поле "Ждем ответа": )c                 S   s
   t | jS r6   )r:   r   )xr,   r,   r-   <lambda>      z4CmfActiveEntity._check_simple_perm.<locals>.<lambda>u   , а так же r   
   u
   , и др..)message)!r   osenvironr   r   r%   r   Zdisable_simple_permr   r4  r  endswithr   rt   r   Zcheck_owner_permsr   r   r   ru   rn   ro   r   r   r   r   sortedmaprp   lenrL   ZCmfAccessListZcheck_admin_mode)r)   Zneed_owners_checkr   Zneed_reluser_checkZall_relation_userr   Zothersr,   r,   r-   _check_simple_perm  sT    


V

z"CmfActiveEntity._check_simple_permc                 O   s4   |    |   |   |   |   |   d S r6   )r  r&  r%  r'  r   r  r)   rx   ry   r,   r,   r-   _save_template  s    zCmfActiveEntity._save_templatec                 C   s`   | j jsd S | js.| jjr.| jj| jjkr.d S | jj| | j j| j j|d}|r\| jd|d d S )Nis_task_transition_runF)r   rH  )	r   rt   r   r;   r   r   Zrun_transitionr%   r   )r)   rH  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)r4   TrG  )r   r   )rL   CmfTransr   r   r   r   r   )	r)   Ztransition_idrJ  rK  rx   ry   Z
transitionkeyvalr,   r,   r-   task_transition_run  s    z#CmfActiveEntity.task_transition_runc                 C   s   | j r| jr| j | _ d S r6   )r3  r   Zui_namer   r|   r,   r,   r-   _calc_ui_view_form  s    z"CmfActiveEntity._calc_ui_view_formr   )r   rH  depthc          
   	      s  d}| j rd}|r"tj| |d | 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
}|st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d& | 0  td' | 1  td( t j|d|i|}td |r| j2|d) td* t3j4rd| j5rd| j5j67 rdt8| j5j6jt9 t:  | jd+d, | ;  td- tj| |d.}	|	r| jd	d/ td0 |S )1Nr   r   before_saveZstatus_fromr   Z	status_tor   Ztrans_form_showTr   zmust_transition_run rl   r   rQ  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_tree_parent 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 endz_calc_ui_view_form endzhandle_mention_persons endrG  z_exec_transition endFr   z_exec_trigger end
after_saver  z_CmfAutomationCrudTrigger end)<r   rL   CmfAutomationCrudTrigger	crud_hookr   rt   rL  r   r   r4   r   r   r   r   r   r   rn   r  r   r%   r   rF  r"   r   debugr   r   r  r&  r)  r   r%  Z_calc_tree_parentr'  r(  r   r   r   r   r  r   r   r   r  r   r  r   _calc_sharelink_hashrP  handle_mention_personsrI  ZconfigZBZPYTHON_ENABLEDr;   Zsave_eval_coder<   execglobalslocalsr   )
r)   r   rH  rQ  rx   ry   Zcrud_actionZtransr   Zhas_chandesr*   r,   r-   r     s    2






























zCmfActiveEntity.savec                    s2   t j| dd t j|| t j| dd d S )Nr   rR  rS  )rL   rT  rU  r"   r   rE  r*   r,   r-   r     s    zCmfActiveEntity.deletec                    s   |   | _t   d S r6   )r#  cache_fieldsr"   _update_cache_fieldsr|   r*   r,   r-   r]    s    
z$CmfActiveEntity._update_cache_fields)include_templatesc                   s   |s| dd t j||S Nr   F)r   r"   r   r   r^  rx   ry   r*   r,   r-   r     s    zCmfActiveEntity.listc                   s   |s| dd t j||S r_  )r   r"   slistr`  r*   r,   r-   ra    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, CmfDocumentr1  r   rb)r   r   N)
r   r1  openZfull_path_filerL   r    r   Zupload_filereadr   )r)   r   
attachmentfileZnew_attachmentr,   r,   r-   copy_attachments  s    
z CmfActiveEntity.copy_attachmentsu   Права доступаr[   u   —u   Полныеu   Только чтениеu   Приватные)r[   fullrE   private)rC   r?   r[   r@   rZ   u-   WEB Авторизованный доступu   Доступ запрещёнu2   Могут только просматриватьuE   Могут просматривать и комментироватьu   Полный доступ)r[   denyrE   rJ   rh  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   rk   c                 3   s   | ]}  V  qd S r6   )choice)r   _Zalphabetsecretsr,   r-   	<genexpr>  s     z7CmfActiveEntity._calc_sharelink_hash.<locals>.<genexpr>r   r  r   r/  r4   perm_policy_sharelinkr   z#_calc_sharelink_hash child update: Tforcer  )rp  rt   r   r/  stringrn  Zascii_lettersdigitsrp   ranger
   Ziter_subclassesr   r4   r%   rn   rV  rW  r   )r)   rr  rs  Z	model_clsZchildr,   rm  r-   rW    s"     z$CmfActiveEntity._calc_sharelink_hashc                 C   s   d| _ |   dS )u&   Метод сброса sharelink_hashN)r/  rW  r|   r,   r,   r-   do_erase_sharelink_hash  s    z'CmfActiveEntity.do_erase_sharelink_hashCmfStr32zShareLink hash)rU   r?   rJ   rC   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   rE   rd  rJ   rh  z%WARN! Unknown perm_policy_sharelink: z. Set deny policyrj  )rp  rL   CmfAccessRuleperm_aclrO   sharelink_groupsubjectsrm   access_levelrn   rV  r   )r)   Zacl_rule_sharelinkr{  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[   Nrx  ZSETMEBUG)r  r   r}  zanonymous@evateam.ru)r  rE   rd  rJ   rh  rj  write)perm_policy_anonymousperm_policy_guestrL   ry  rz  rK   r   r|  rm   r}  r   rO   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                    s4  |    |   | dg | jdkrHtjd| jtj gdd	  n| jdkrt
t|  }|r~t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|  }|rtjd| j|dd	  tjd| jtj gd	d	  t   d
S )u   Наполним свой acl автоматическими правилами в зависимости от политикиr   rh  rx  )r  r   r|  r}  rE   Z	denyWriteri  rd  rj  N)r  r~  r   perm_policyrL   ry  rz  rO   Z
user_groupr   r   r   r+  r-  r"   _acl_scaffold)r)   Zwriter_listZreader_listr*   r,   r-   r  N  sb    
 
 
  
 
   
  
 
 
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_fieldsr  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  rt   r  r  r|   r*   r,   r-   r  }  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[   Trq  )r  rt   r  r  r   r  r  rp  r*  r"   _calc_perm_aclr|   r*   r,   r-   r    s2    	
zCmfActiveEntity._calc_perm_aclc                    s   |    d| _t   d S )Nr[   )r  r  r"   disable_acl)r)   _kwargsr*   r,   r-   r    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includerL   r    r   Z_delete_child_object)r)   ry   re  r*   r,   r-   r    s     z'CmfActiveEntity._direct_children_delete	recursion)returnc                O   s   |dkrt ddd t|  }| ddddg | jD ]N}|jd	kr^|j|kr8||j q8|d
krt||j q8|j	r8||j q8| j
r|| j
j|d d |S )Nr   u@   DEV: зацикливание рекурсии get_all_followersTr   zfollowers.personzfollowers.notify_volumezfollowers.follow_childrenr   Zoffr   rW   r  )r   r   r   r   	followersZnotify_volumer   remover   Zfollow_childrenr   unionget_all_followers)r)   r  rx   ry   resZfollowerr,   r,   r-   r    s     


z!CmfActiveEntity.get_all_followers)r   r  c                 C   s>   t | d}g }|dd D ]}|t|jd  q|S )NZlxmlc                 S   s
   |  dS )Nzdata-mention-type)Zhas_attr)tagr,   r,   r-   r9    r:  z,CmfActiveEntity.parse_text.<locals>.<lambda>zdata-object-id)bs4ZBeautifulSoupZfind_allrm   ZcmfutilZget_obj_by_idZattrs)r   bsr   r  r,   r,   r-   
parse_text  s
    zCmfActiveEntity.parse_textc           	   	   C   s   d}d}|r.|j jr|j j}|j jrZ|j j}n,| j js:d S | j jrJ| j j}| j jrZ| j j}t| |}t| |}| j }|| D ]r}|jdkr|j	
  D ]&}tjj| |jj| jd| dd qq|jdkrtjj| |jj| jd| dd qd S )Nrk   rO   u   Вас упомянули в rW   )r   r   r   r   r   rK   )r   r   r   rt   r   r  Zverbose_namer   r   Z
rg_membersr<   r   rL   r   r   r4   r%   r   )	r)   rJ   Ztext_oldZtext_newZobjs_oldZobjs_newZobj_namer   r   r,   r,   r-   rX    sD    




z&CmfActiveEntity.handle_mention_persons)re   )N)NNNNN)NNNNNF)NNNNN)F)F)N)r.   r/   r0   ZabstractZfields_orderZorderingZaudit_fieldscommonr   cmf_active_entityr
   Zessential_child_modelsr2   r   Z	CmfStatusr   ZFieldr   r   r   r   r   r   ZCmfRelationr   Z	CmfStr256r   ZCmfStr64r   ZCmfGenericRelationr   r   ZCmfGenericM2Mr   r   rb   r   r   ZCmfGenericBackrefr1  r   ZCmfChoiceIntr   Z	CmfChoicer   r   r   ZCmfIntr   r   r   r   r   r   r   r   r  r   Z
is_penaltyr8   r.  ZCmfObjectJsonr\  rr   Z
CmfBackrefr  rs   propertyr}   r~   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-  r0  r4  r5  rD  rF  rI  rO  rP  r   r   r]  r   ra  rg  r  r  r  rp  rW  rv  rw  r/  r~  r  r  r  r  r  r  r  r   r  staticmethodr:   r  rX  r1   r,   r,   r*   r-   r
      s                     


               	     
 7
$
	5%	         .        ;

:	-

L	     	   
   
   
+$r
   )r   r   r   r  r   r   modulesr   Z
sqlalchemyr   Zsqlalchemy.sqlr   Zdateutil.relativedeltar   Zcmf.includeZcommon.fields.cmf_active_entityr  r  r
   r,   r,   r,   r-   <module>   s   