U
    xhT                    @   s   d dl Z 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d	ZG d
d dejjjZddlmZ dS )    N)copyfields)person)desc)func)relativedelta)*zLST-filter_is_nonec                       s8  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gZdZejj	j
jddddddddg 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d.ZG d/d dejj	j
jZG d0d dejj	j
jZejjejjd1d2gddd3ZG d4d dejjZejjejjd5d6d7d8d2d9gddd:d;d<d=gd>Z ejjejjd?d6d7d8d2d9gddd:d;d<d=gd>Z!ejjejj"d@d%dAZ#ejjejjddBdCdDdCd%dEdFgddG	Z$ejjejj%dHdIgddJZ&ejjejjdKd2gddLZ'ejjejj(dMdNdOdPdQdRdSdTdUd%ddVdWZ)ejjejj*dXdYdZd[d\d]d^d_Z+ejjejj,d`dadbdcZ-ejjejj.dddad%deZ/ejjejjdfddgZ0ejjejjdhddgZ1ejjejjdidjZ2ejjejjdkdjZ3ejjejjdldjZ4ejjejj*dmdndodpdqdrdsdtd_Z5ejjejjduddvZ6ejjejj"d%dwdxdd%ddydzZ7ejjejjd{dd6d|d}d~ddddgdZ8ejjejj"dwddddgd%dZ9ejjejjdddd%dZ:ejjejj"dd%d%dZ;ejjejj*dddddddyd%dddZ<ejjejjdddDd%ddZ=ejej>dd%dddZ?G dd dejj"Z@ejjejjAddddZB fddZCeDdd ZEdddZFdddZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTddĄ ZUddƄ ZVddȄ ZWddʄ ZXd fdd̄	ZYeZddd΄Z[eZd fddЄ	Z\eZd fdd҄	Z]eZd fddԄ	Z^eZd fddք	Z_eZd fdd؄	Z`eDddڄ Zaeajbddڄ Zadd݄ Zcdd߄ Zddd Zedd Zfdd Zg fddZh fddZidd Zjdd Zkdd Zldd Zmdd Zndd Zo fddZp fddZq fddZr fddZs fddZtd d Zudd Zvdd Zwdddexddd	Zyd
d Zzdd Z{dd Z|dd Z}dd Z~ddad fdd
Zdd Zdd Z fddZeZdd fdd
ZeZdd fd d!
Zd"d# ZeZ fd$d%Zd%d%ddd&eeed' fd(d)Zejjejj*d%d*d+d%d,d-d.d/d0d1Zejjejj*d%d2d+d%d,d3d4d5d6d7d1Zejjejj*d%d8d+d%d,d3d4d5d6d7d1Zejjejj*d%d9d+d%d,d3d4d5d6d7d1ZejjejjAd:d;dd<Zd=d> Zdd?d@ZdAdB ZejjejjdCdDdDd%dEZdFdG ZdHdI ZdJdK Z fdLdMZdNdO Z fdPdQZd fdRdS	ZdTdU ZejeejejdVdWgdXZeeddYdZgd[dd\dd]d^Zd_d` ZdedadbdcZddddeZddfdgZ fdhdiZ fdjdkZdadledm fdndoZ fdpdqZeeedrdsdtZdudv ZeZdwdx Z fdydzZeZdd{d|ZeZded~ddZdd Zedd Zdd Zeedddd ZdddZeZdd ZeZddd%d%d%ddddZeZeedddZeZd fdd	Zdd Zeeddgddd\deedddZÇ fddZeZeexdddZŇ  ZS (  CmfActiveEntityTcodenamestatus	cmf_ownerresponsiblepriority
alarm_datetags	executors
spectators
no_controlwaiting_formarkZtime_estimateplan_start_dateplan_end_dateperiod_intervalperiod_next_datedeadlineparentcompanyz-ordernoarchivedisable_aclmacros_page_tree_gettask_transition_runpublish_for_invitedZarchive_restoresend_sharelinkset_user_rate)CmfAttachmentc                       s   e Zd Z fddZ  ZS )zCmfActiveEntity.logic_typec                    sD   t  | | jr@| jr@| jr@| jj  | jjdd | j_d S )N:r   )super
_set_valueinstancevaluer   logic_prefixload	partitionselfr+   	__class__ $./common/models/cmf_active_entity.pyr)   A   s
    z%CmfActiveEntity.logic_type._set_value)__name__
__module____qualname__r)   __classcell__r3   r3   r1   r4   
logic_type@   s   r9   c                       s@   e Zd ZdZdZddgZd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/   r1   r3   r4   r)   Q   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)r>   raise_error)
isinstancestrr*   workflowr-   get_default_statusr(   cast)r0   r+   r   r1   r3   r4   rE   V   s    zCmfActiveEntity.status.cast)r5   r6   r7   captionnullableoptions_list_params	log_levelfullsearch_indexr)   rE   r8   r3   r3   r1   r4   r   I   s   u"   Дата смены статусаF)rF   visibleno_aclu"   Дата начала работы)rF   readonlyrK   rL   u(   Дата окончания работыu(   Дата на подтверждениеu   Дата закрытияu   КонтрагентZ
CmfCompany)rF   modellinkablerJ   c                   @   s   e Zd ZdZdS )zCmfActiveEntity.nameu   НазваниеN)r5   r6   r7   rF   r3   r3   r3   r4   r   n   s   c                   @   s   e Zd ZdZdZdZdZdS )zCmfActiveEntity.codeu   КодTN)r5   r6   r7   rF   uniqueindexrM   r3   r3   r3   r4   r   r   s   u   Постановщик	CmfPerson)rF   modelsrO   rJ   c                   @   s(   e Zd ZdZdgZdZdgZdZdZdS )zCmfActiveEntity.responsibleu   ИсполнительrR   T	parent_idN)	r5   r6   r7   rF   rS   rO   rH   Zoptions_list_query_allrJ   r3   r3   r3   r4   r      s   u   Соисполнители
CmfProjectZ
CmfOrgUnitCmfPersonGroupCmfRolezCmfProject.executorszCmfOrgUnit.tree_nodeszCmfPersonGroup.rg_memberszCmfRole.person)rF   rS   leftrO   Znested_fieldsu   Наблюдателиu!   Без подтверждения)rF   defaultu   ТэгиZCmfTagmembersactivity_idrT   )rightrF   rN   backrefwidgetrO   rH   rJ   u   Вложенияr&   )rF   rS   r]   u   Ждем ответа)rF   rS   rO   u   Приоритетu   Минимальныйu   Низкийu   Обычныйu   Высокийu   Критичныйu   Блокирующий)r<   r            0ZCmfPriority)rF   choicesrY   rG   rJ   r^   u   Оценка12345)re   rf   rg   rh   ri   )rF   rd   u!   Оценка полезностиr      )rF   minmaxu6   Количество оценок полезности)rF   rY   rG   u   Будильник)rF   rQ   u   Крайний срокu&   Плановая дата начала)rF   u.   Плановая дата завершенияu   Дата повторенияu%   Интервал повторенияu   Ежедневноu   Раз в 2 дняu   Еженедельноu   Ежемесячноu   Ежеквартальноu   Ежегодно)re   rf   7Z30Z90Z365u   Склонирован из)rF   rM   CmfBoolu   Шаблонalways)rK   ZidgetrF   rM   rY   rQ   	load_modeu!   Родительская нода	CmfFolderZCmfActiveEntityFilterCmfDocumentCmfTaskZCmfComponentZCmfAssetSchemeZCmfRegistry)rF   rG   rS   u   Сделаноu!   Значение чекбоксаr?   )r^   rF   commentZvirtualZrequired_fieldsrK   u   Вид деятельностиCmfActivity)rF   rN   rG   rO   u!   Задача просрочена)rF   rK   rY   u   Кеш: Тип статусаu   Открытu   В работеu+   Подтверждение закрытияu   Закрыто)OPENIN_PROGRESS	IN_REVIEWCLOSED)rF   rd   rp   rK   rQ   rL   u!   Настройка статусаZCmfStatusOpt)rF   rN   r]   rK   rL   u   кэш полейZlazy)rF   rK   rp   rL   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)r0   Z	msg_partsZroler3   r3   r4   	html_diff5  s    
z"CmfActiveEntity.approved.html_diffN)r5   r6   r7   rF   rQ   rG   rY   r   r3   r3   r3   r4   approved/  s
   r   u   ПодписчикиZCmfFollower)rF   r]   rN   c                    s   t  j|f||}|dkr |S |dkr4| jjr4dS |dkr@dS |dkrT| jjrTdS |dkrh| jjrhdS tjj| j	krd}| j
| j	krd}| jdkrd}|rdS dS | jr| jtjjkrdS |d	kr| jrdS dS dS )
Nra   r   r<   r   TFrw   r`   r   )r(   _get_field_log_levelr   
is_changedr   r   r}   r~   r;   cmf_owner_idZcmf_modified_by_idr?   Zresponsible_idr   )r0   
field_nameargskwargsrI   Zsilent_owner_changesr1   r3   r4   r   E  s6    	
z$CmfActiveEntity._get_field_log_levelc                 C   s   | j jS r=   )notify_valuer0   r3   r3   r4   _notify  s    zCmfActiveEntity._notifyrv   c                 O   s   | j  |}|| _| S r=   )rC   r-   rD   r   )r0   r>   r   r   r   r3   r3   r4   set_default_status  s    z"CmfActiveEntity.set_default_statusNc                 C   s   d}d}t jjdd| gddtjjggdgd}|sHt j| |tjjd}n||_|  t jjdd| gdgd}|rt	d	d
 |D }t
|}|| }t|d}nd}t|d}|| _|| _|   | j| jdS )Ng        r   r   ==r   user_ratingfilterr   )r   r   r   c                 s   s   | ]}|j V  qd S r=   )r   ).0Zratingr3   r3   r4   	<genexpr>  s     z0CmfActiveEntity.set_user_rate.<locals>.<genexpr>ra   r`   )r   user_rating_count)rS   ZCmfUserRatinggetr}   r~   r;   r   saveslistsumlenroundr   )r0   Zrater   r   Zcurrent_user_ratingZratingsZtotal_ratingr3   r3   r4   r%     s*    &
zCmfActiveEntity.set_user_ratec                 O   s*   t jjdd| gdD ]}|j|| qd S Nr   r   )r   )rS   
CmfCommentlistdelete)r0   r   r   rt   r3   r3   r4   _delete_comments  s    z CmfActiveEntity._delete_commentsc                 O   s*   t jjdd| gdD ]}|j|| qd S r   )rS   r&   r   r   )r0   r   r   attachr3   r3   r4   _delete_attachments  s    z#CmfActiveEntity._delete_attachmentsc                 K   s  | j }|dd  }| j|d|ddd}t|drP|jjrPd|krP|d= | D ]\}}||j	krXt
||| qXd|_| |_d|j_|  | jr| jjr| jjr| j| j }n| j| j }tjjtjjd	| |_| jr| jjrtjjtjjd	|_|jdd
 |S )uC   
        Создание задачи по шаблону
        |r<   Tis_dummyN)r   copy_allr   listsFZtzZ	only_data)r   splitstripr   r   hasattrr   r+   itemsr   setattris_templatecloned_fromr   r   r   r   Zis_not_nullr   cmf_created_atdatetimenowtimezoneutc)r0   r   Znew_obj_namer*   attrr+   Zdeadline_deltar3   r3   r4   create_from_template  s*    
z$CmfActiveEntity.create_from_templatec                 C   s   d S r=   r3   r   r3   r3   r4   _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   r   r   r   r   r3   r3   r4   _calc_waiting_for  s    z!CmfActiveEntity._calc_waiting_forc                 C   s   dS )u   
        Общая функция вычисления диапазона плана и будильника
        :return:
        Nr3   r   r3   r3   r4   
_calc_plan  s    zCmfActiveEntity._calc_planc                 C   sb   | j jsd S | j r4t| j jtjr4t| jj	| _
n*| j rXt| j jtrX| j j	 | _
nd | _
d S r=   )r   r   rA   r+   rS   rU   APPget_cache_projectrT   r,   parent_logic_prefixr
   r-   r   r3   r3   r4   _calc_parent_logic_prefix  s    z)CmfActiveEntity._calc_parent_logic_prefixc                 C   s   | j js| js| jjsd S | j s@| js@| j jr@td|  dd | jjrX| j jsX|   | j rt| dr| jr| jjr| j	 | _ q| jj
| j d| _ n | jr| j	 | _ n| j
 | _ d S )NuQ   Невозможно назначить пустой статус объекту Tabortr   )r   )r   r   is_newrC   	cmf_alert
is_definedsave_preparer   r   Zget_create_statusrD   r   r3   r3   r4   _calc_status  s$    zCmfActiveEntity._calc_statusc                 C   s   | j js| jsd S | ddg | j  | jjrT| jjdkrT| jjdkrT| j	  | jdkrn| j
sn| j
  | jdkr| j
rd | _
| jdkr| js| j  | jdkr| jrd | _| jdkr| js| j  d S )Nstatus_closed_atstatus_review_at)rx   ry   ry   rx   rw   )r   r   r   load_fieldsstatus_modified_atset_nowr?   oldnewstatus_in_progress_endr   r   status_in_progress_startr   r3   r3   r4   _calc_status_timestamps1  s.    





z'CmfActiveEntity._calc_status_timestampsc                 C   s@   | j js| jjr| jrd S | j s$d S | js<| j  |   d S r=   )r   r   r   r   _cacl_next_periodr   r3   r3   r4   _calc_periodicX  s    
zCmfActiveEntity._calc_periodicc                 C   s   t j t jj}| j|krt| jjdk rbt jt| jjd}| jj| | _| j	r| j	j| | _	n<t
tt| jjd d}| jj| | _| j	r| j	j| | _	| j  d S )N   Zdays)Zmonths)r   r   r   r   r   intr   r+   	timedeltar   r   r   r   )r0   Zcur_dateZ
shift_daysZshift_monthsr3   r3   r4   r   h  s    
z!CmfActiveEntity._cacl_next_periodc                 C   s$   | j jsd S | j jr tddd d S )NuE   Задача не может быть без постановщикаTr   )r   r   is_nullr   r   r3   r3   r4   _calc_owner|  s    zCmfActiveEntity._calc_ownerc                 C   sd   dddg}| j r&ddddgdddgg}|dd| jgg}tjj|ddd	d
dgdD ]}||  qPdS )u\   
        Запуск триггеров для create или save
        :return:
        Zcache_action=r   ORcreateZ	cmf_modelZjson_filterZjson_entry_pointZjson_actionZ	func_nameZ	json_datar   N)r   
class_namerS   Z
CmfTriggerr   check)r0   _filterZtriggerr3   r3   r4   _exec_trigger  s    

  zCmfActiveEntity._exec_triggerc                 C   sH   | j jrD| j rD|  }|rD|| jkrD|ddddg || _|   d S )Nr   cmf_owner_assistantsactivity
project_id)tree_parentr   Z_node_parentr   r   r   )r0   r   r3   r3   r4   _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	 d S )
Nr   i     )Zhoursu`   Нельзя передвигать будильник дальше крайнего срока.uz    Обратитесь к постановщику для разрешения на сдвиг крайнего срока.uB    Сдвиньте крайний срок если уверены.Tr   )r   r   r   ager   r}   r~   r   r+   r   r   r   )r0   msgr3   r3   r4   _check_alarm_date_valid  s*    



z'CmfActiveEntity._check_alarm_date_validc                 C   sl  |  ddddddddd	d
dg tjG dd d}| }| jr| jjdrt| j}||_d|j	 |_
|jj|_|jj|_|jj|_|jj|_|jj|_|jj|_|jj|_|jj|_| jrH| jjrH| j|_d| jj	 |_
| jjj|_| jjj|_| jjj|_| jjj|_| jjj|_| jjj|_| jjj|_| jjj|_| jrh| jjj|_| jjj|_|S )N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_closez workflow.sl_readonly_closed_task5workflow.sl_deny_closing_task_before_closing_subtasks.   workflow.sl_сlose_task_after_closing_subtasksz7workflow.sl_deny_closing_task_before_closing_checklistsc                   @   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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sl_readonly_closed_task,sl_deny_closing_task_before_closing_subtasks%   sl_сlose_task_after_closing_subtasks.sl_deny_closing_task_before_closing_checklists)r5   r6   r7   r   r   __annotations__r   boolr   r   r   r   r   r   r   r   sl_controllersl_controller_strr3   r3   r3   r4   SimpleLogicOptions  s   
r   CmfProject:u   Проект: u   Бизнес-процесс: )r   dataclassesZ	dataclassrT   r+   
startswithr   r   r   r   r   r   r   r   r   r   r   r   r   rC   Zenable_sl_controlr   r   )r0   r   optionsprojectr3   r3   r4   _get_sl_options  sV    







zCmfActiveEntity._get_sl_optionsc                 C   s   | j jsd S | jrd S | jr| j r| jjdkr| j jr| j jtjj	 k r| 
 jpVd}| j tj|d | _| jjdkr| j  | jtjkrtjtjkr| jjr| 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 d S )Nr   r   r{   u^    сдвинул крайний срок задачи<br>
                Было:&nbsp;&nbsp;u)   <br>
                Стало:<b>&nbsp;z1<b><br>
                <a target="_blank" href="z">z</a>
                r   ra   )r   r   r   r   r   )r   r   r   r   r   r   cmfr   CmfDateTimer   r  r   r   r   r   r   r}   r~   Zsystem_person
user_localZ_place_notifyr   r   Zhrefr+   r   r   )r0   shiftr3   r3   r4   _calc_deadline  s4    4
 zCmfActiveEntity._calc_deadlinec              	      sn  |  dddddddg tt jf d|i|}| jrV|rJ| jj |d	 || j | jrz|rn| jj |d	 || j | jj|d	}d
}| j	r| j	j
jdkrt| j}|r|s|r|jj|d	}|| | jj|d	}	|r|	s|r|jj|d	}	||	 |r8|r8|jr8|r*|jj |d	 ||jg t }
|D ]&}|d
ks\|j|krB|
| qB|
S )u   
        Получение списка конечных пользователей затронутых обьектом
        cmf_owner.user_localwaiting_for.user_localresponsible.user_localzspectators.user_localzexecutors.user_localcmf_author.user_localparent.cmf_owner.user_localr   r   NrU   )r   setr(   all_relation_personsr   addr   r   
all_nestedr   r+   r   r   r   rT   updater   r   r   r  r|   )r0   r   r  Zwith_parent_ownerZinherit_executorsr   resultr   Zparent_projectr   retur1   r3   r4   r    sJ       

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orderno	object_idr:   T)obj_idr:   r   Zclosed_lastorder_byc                    s*   g | ]"}|j r  |j j kr|qS r3   )r   lowerr+   )r   r   searchr3   r4   
<listcomp>]  s       z7CmfActiveEntity.status_options_list.<locals>.<listcomp>r   r`   )rS   CmfWorkflowget_status_listr   )clsobject_fieldsr   r  slicer  r   r  r3   r  r4   status_options_listK  s$    

z#CmfActiveEntity.status_options_listc                    s~   |d krg }|o| d}|o&| d}|dddd gdd|gggdddd gdd|gggdd| jgg}t j|f||d	|S )
Nlogic_type_idr   r   ft_logic_typesr   INft_projectsft_model)r   r   )r   r   r(   field_options_list)r  relation_field_namer   r   r   Zft_logic_type_idZft_project_idr1   r3   r4   resolution_options_listb  s    
z'CmfActiveEntity.resolution_options_listc           
         s   |sg }|sdg}|sg }|dddgg}|o4| d}| dd }	|r\|sN|	s\|dd|gg}|d |d	 t j|f||||d
|S )Nr   r,   r   zlist.releaserT   r  r   sys_typer   )r   r   r   r  )r   r|   r(   r(  )
r  r)  r   r   r   r  Zfilter_by_projectr   rT   r  r1   r3   r4   releases_options_listr  s.    

   z%CmfActiveEntity.releases_options_listc                    sh   |sg }|rNt jj|dgd}d }|r4|jr4|jj}|ddd|gdddggg}t j|f||d|S )	Nzproject.security_level_schemer;   r   r   r   r   systemT)r   r  )rS   rs   r   r  security_level_schemer(   r(  )r  r)  r   r  r   Ztaskr/  r1   r3   r4    perm_security_level_options_list  s    
z0CmfActiveEntity.perm_security_level_options_listc              	      s  |sg }|sg }|si }|sF| j |}	|	s@td| d|  |	j}|oR|d}
|
r\|
dr\tjj|
ddddd	gd
}|r\|r|jr\i }|jjstj	j
|jjd|dd}|jr|jjj|krt ||jjj< ||jjj |jjjj |jD ]0}|j|krt ||j< ||j |jj q|D ](}||g dd||g gg||< q2|dkrdddg}|dr|dg |g|d< n||d< d|kr|d t j| jjf||||||d|S )Nu   Не найдено поле     в классе rT   rU   Zproject_typer   r   filter_responsibler   r-  T)Zchild_modelsZ
return_setr;   r%  r   r  r   rR   roles)r   all_optionsmodels_listmodels_filtersr   r   )r   r   
ValueErrorrS   r   rU   r2  r   r   ZRelationCacheZget_children_dictr;   r+   r   r   r  r  r   
setdefaultr|   r(   r(  r   )r  r   r6  r   r   r5  r4  r)  r   fieldrT   r  Zchildren_dictZ	assistantZ
model_nameZresp_filterr1   r3   r4   %options_list_for_responsibility_roles  sp       





   z5CmfActiveEntity.options_list_for_responsibility_rolesc              	      s  |sg }|sg }ddh}| d}	|dks6||krT|	rT| jf ||||||d|S |dkrv| jf ||||d|S |dkr| j|f||||d|S |d	kr|sd
g}d0|}| jdkr| jdkrd}
| jdkrd}
| jdkrd}
d}|o | dd}|o| dd}|r.tjj ||
gd}n.|r\tj|d|
 gd}t	|dr\|j
}|rt||
r|ddt||
gg}|dd| jgg}|rjd|krj|dd d|d gd ddggg}n|d!kr|d" n|d#krD|o| d}|r|ddd$dgdd$|ggg}|o | d}|rj|dd%d$dgd%d$|ggg}n&|d&krj| j|f||||d|S |d'r| j |}|std(| d)|  | ||jd*kr|jd+krd}d,|kr|d, }|d,= | d-d.r|g}n|d,d|gg}t j|f|||||d/|S )1u  
        FIXME:
          потом мы сделаем эту штуку через
          глубокий поиск общую кэш-таблицу и все будет хорошо
        osv: а зачем это и так все кешируется дважды
        todo возможно надо вынести responsible status tag и тд в CmfTag и тп но не факт
        r   r   filter_by_project_participantsr   )r   r   r6  r   r  r)  r   )r   r   r   r  perm_security_levelr9   r  filter_activity_id)rr   rs   CmfListrr   Zstrict_document_logic_typers   Zstrict_task_logic_typer>  Zstrict_list_logic_typeNscheme_wf_idrT   r-  z
scheme_wf.r   	scheme_wfr;   r%  cmf_model_namer   r[   r   Zfilter_activity)r   r   r   r3  r   r   Zfilter_project
resolutioncf_u   Не нашел поле r1  TZCmfCascadeChoicechoice_parent_idr4  F)r6  r   r   r   r  )r=  )r   r:  r"  r0  r   rS   CmfSchemeWfcmfutilget_obj_by_idr   r@  getattrr|   r*  r   r   r7  customr^   r(   r(  )r  r)  r6  r   r   r   r  r   Zproject_participiants_fieldsr;  Zlt_field_namer@  r?  rT   r   r[   custom_fieldrD  r1   r3   r4   r(    s    

         



  


   

   z"CmfActiveEntity.field_options_listc                 C   s
   | j dkS )Nry   )r?   r   r3   r3   r4   _is_checkedM  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 )Nr   rC   Try   Frv   u:   Некорректное значение для поля )r   rC   r-   rD   r   ZCmfValidationError
is_checkedrF   r/   r3   r3   r4   rK  Q  s    c                 C   s   dS )u   
        Отправляем во фронт события для реалтайм обновления
        :return:
        Nr3   r   r3   r3   r4   
emit_event^  s    zCmfActiveEntity.emit_eventc                 C   s   | j r
d S d }| jrTd| jjkrT| jjdr>t| jj }n| jdg | jj }| j sd|rd|| _ | j st	j
j rt	j
j jdgd t	j
j | _ | j stjjddgdd| _ d S )	Nr   r   z
activity.*r	   r   ZbusinessT)r   r   cache_inmemory)r   r   r   rT   r+   r   r   r   r   r}   r~   r-   rS   ru   r   )r0   Zparent_activityr3   r3   r4   _calc_activitye  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s| jjjs| jjdkrtj	
 }|jdkr~|jdddd| _q|jdddd| _n&| j  |  jtj| jjjd7  _d S tjs| jjr| j s| jjr| jjrtd d | _| jr| js| jjrtd | j  | jsL| jjdkrL| jjrBtd | j  | j s| jjr| jjr| jjjd	kr| jjjd	kr| jr| j | jkr| j  | jd
kr| jr| jjdk r| j  | jjr| jjdkrtjs| j  d S )Nr   r   )hourZminutesecond)Zsecondsu   Будильник сброшен т.к. у этого бизнес-процесса в статусе будильник не заданu   Будильник установлен. Задача с крайним сроком не может быть без будильника.)rv   ry   uW   Будильник установлен тк задача уже выполняетсяrv   ry   )r   r   r   r   r   rC   Z
next_alarmr   r}   current_userZget_current_datetimerP  replacer   r   r   r+   Zimport_moder   r   r   r>   r   r   r?   r   )r0   Zcurrent_timer3   r3   r4   _calc_alarm_datex  sd    








"
z CmfActiveEntity._calc_alarm_datec                 C   s   | j rd| _d S )NT)r   r   r   r3   r3   r4   _calc_approved  s    zCmfActiveEntity._calc_approvedc                 C   s   d S r=   r3   r   r3   r3   r4   
_calc_name  s    zCmfActiveEntity._calc_namec                    sn   | j r| jjs| jjsd S | j s.t   d S | j rD| j drDd S |   d| j j	dd  }|| _ d S )NzA--ra   )
r   r9   r   r  r(   
_calc_coder   get_code_prefixr+   
rpartition)r0   r   r1   r3   r4   rX    s    
 zCmfActiveEntity._calc_codec                    s(   | j r| j j }|r|S tt|  S r=   )r9   Zobj_code_prefixr-   r(   r
   rY  )r0   code_prefixr1   r3   r4   rY    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 )Nr;   r   r   textr   r   r   r   r   cmf_modified_atc                 S   s   g | ]}| d dddgqS r;   r   r   loginto_jsonr   ir3   r3   r4   r    s     z9CmfActiveEntity.get_cache_fields_json.<locals>.<listcomp>r   c                 S   s   g | ]}| d dddgqS r^  r`  rb  r3   r3   r4   r    s     r   r   Zcolorr>   Z	card_namer   
cmf_authorr_  r   r   r   )	ra  r   r   r   r   rd  r   r   r   )r0   r  r3   r3   r4   get_cache_fields_json  sB    z%CmfActiveEntity.get_cache_fields_jsonc                 C   s   | j js| js| jjsd S | j r0| jr0| jr0d S | j jrB| j rBd S | j sZ| j| | _ d S | jjr| jjr| jjddg | jj| }|| j krd S | j| | _ d S )NZdefault_task_logic_typeZdefault_subtask_logic_type)r9   r   r   r@  r   Zcalc_logic_typer   r   )r0   Zold_default_logic_typer3   r3   r4   _calc_logic_type  s(    
z CmfActiveEntity._calc_logic_typec                 C   sF   | j js"| jjs"| jjs"| js"d S | jjr4| jr4d S tj| | _d S r=   )r   r   r   r@  r   rS   rE  calc_schemer   r3   r3   r4   _calc_scheme_wf8  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 r=   )r@  r   r9   r   rC   calc_workflowr   r3   r3   r4   _calc_workflowG  s    zCmfActiveEntity._calc_workflowc                 C   s   d S r=   r3   r   r3   r3   r4   _calc_default_workflowX  s    z&CmfActiveEntity._calc_default_workflowc                 C   s   d S r=   r3   r   r3   r3   r4   _calc_responsible[  s    z!CmfActiveEntity._calc_responsiblec                    s*   t   p(| jjp(| jjp(| jjp(| jjS r=   )r(   _acl_subjects_is_changedr   r   r   r   r   r   r1   r3   r4   rm  ^  s    
z(CmfActiveEntity._acl_subjects_is_changedc                    s>   t   }|| j | jr(|| j | jr:|| j |S r=   )r(   _acl_subjects_list_level_writeextendr   r   r|   r   r0   r  r1   r3   r4   rn  c  s    
z.CmfActiveEntity._acl_subjects_list_level_writec                    s   t   }|| j |S r=   )r(   _acl_subjects_list_level_readro  r   rp  r1   r3   r4   rq  m  s    
z-CmfActiveEntity._acl_subjects_list_level_readc              4      st   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&d'd(d)d*dd+d,d-d.d/d0d1d2g3 S )3Nr   r   rC   r,   zparent.cmf_ownerrL  rd  zstatus.ordernozstatus.workflowr   r   r   cache_status_optr   Z
cmf_importZcmf_modified_bysharelink_hashzlogic_type.coder@  r   rB  r   r.  r   r   r   r   r   r   r   r   r   zworkflow.save_eval_codeui_view_formr<  z,perm_security_level.access_task_fields_cacher   r   r   r   r   r   r   r]  r   r  r	  r
  r  r  )r(   save_preload_fieldsr   r1   r3   r4   ru  s  sj                      z#CmfActiveEntity.save_preload_fieldsc                    s   t   ddg S )Nrt  Ztask_filters)r(   project_perm_allow_fieldsr   r1   r3   r4   rv    s    z)CmfActiveEntity.project_perm_allow_fieldsc                 C   s  t d| jrd S tjdr"d S | jrB| jjjdkrB| jjrBd S d}| j	ddD ]2}|j| 
 krR|jdsR|jdsRd} qqR| jjr| jjrd}| js| jjr|  }|jsd}| jd	krd}|r|   d}| j	ddD ]}|jd
krd} qq|rt|  }||   tj|krd| j d| jrD| jjpFd d| jr\| jjp^d d| jrt| jjpvd 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 )NuG   Не используется! Оставлено для историиimportrU   FTr   Zcache__idra   )r   r   r   r   Zchild_tasksZdepended_tasksZaffected_tasksu   Это действие над uC    разрешено только Владельцу объекта(rW  u    ) или Исполнителю(uW   ) или Временному исполнителю(поле "Ждем ответа": )c                 S   s
   t | jS r=   rB   r   )xr3   r3   r4   <lambda>      z4CmfActiveEntity._check_simple_perm.<locals>.<lambda>u   , а так же z, 
   u
   , и др..)message)'	Exceptionr   osenvironr   r   r+   r   Zdisable_simple_permvaluesZsimple_perm_allow_fieldsr   endswithr   r   r   r   r  r   r   Zcheck_owner_permsr  r  r  Z
get_ownersr}   r~   r   r   r   r   r   sortedmapr   r   rS   CmfAccessListZcheck_admin_mode)r0   Zneed_owners_checkr9  Z
sl_optionsZneed_reluser_checkZall_relation_userr   Zothersr3   r3   r4   _check_simple_perm  sb    



V

z"CmfActiveEntity._check_simple_permc                 O   s4   |    |   |   |   |   |   d S r=   )rO  rh  rf  rj  r   rV  r0   r   r   r3   r3   r4   _save_template  s    zCmfActiveEntity._save_templatec                 C   sr   | j js4t| dr | jjr | jr4t| ds0| js4d S | jsV| jjrV| jj| jjkrVd S | j| | j j| j j	 d S )Nr   )
r   r   r   r   r   rC   r   r   Zrun_transitionr+   r   r3   r3   r4   _exec_transition  s    z CmfActiveEntity._exec_transition)comment_appendchanged_fields)r  c                O   sX   |  D ](\}}t| j|tjst| || q| jdd |rTtj|| d  d S )NT)is_task_transition_run)r\  r   )	r   
issubclassr   r   
CmfBackrefr   r   rS   r   )r0   r  r  _args_kwargskeyvalr3   r3   r4   r"   )  s    z#CmfActiveEntity.task_transition_runc                 C   s   | j r| jr| j | _ d S r=   )rt  r   ui_namer  r   r3   r3   r4   _calc_ui_view_form8  s    z"CmfActiveEntity._calc_ui_view_formc                 K   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 |   td |   td d S )N_calc_owner end_calc_parent end_calc_activity end_calc_scheme_wf end_calc_periodic end_calc_logic_type end_calc_tree_parent end_calc_perm_security_level end_calc_workflow end_calc_default_workflow end_calc_status endz_calc_status_history end_calc_status_timestamps endz_calc_plan end_calc_approved end_calc_deadline end_calc_alarm_date end_calc_wf_simple_logic end_calc_waiting_for end_check_alarm_date_valid endz_calc_name end_calc_parent_logic_prefix end_calc_sharelink_hash end_calc_ui_view_form end/_calc_perm_security_level_allowed_ids_cache end)r   r}   debugr   rO  rh  rl  r   rf  _calc_tree_parent_calc_perm_security_levelrj  rk  r   _calc_status_historyr   r   rU  r  rT  r   r   r   rV  r   _calc_sharelink_hashr  +_calc_perm_security_level_allowed_ids_cacher0   r  r3   r3   r4   recalc_fields>  sf    























zCmfActiveEntity.recalc_fieldsc                 C   s   d S r=   r3   r   r3   r3   r4   do_status_is_changed  s    z$CmfActiveEntity.do_status_is_changedc              	   C   s   | j jsd S | j jr2| j| j jkr2td| j t N | j	| | j j
| j j}|rb|d }nd }tj| | j j
| j j|d  W 5 Q R X d S )Nz1cache_status_type != status.status_type obj_id = r<   )objZfrom_statusZ	to_statusZ
transition)r   r   r?   r>   r  r;   rF  r    rC   Zcalc_transitionr   r   rS   ZCmfStatusHistoryr   )r0   Ztransitionstransr3   r3   r4   r    s     

   z$CmfActiveEntity._calc_status_historyc                 C   s   |  | }|d }|r$| |  |D ]R}|| ds<q(|| d d dkrRq(t| |}|js(t| ||| d d  q(d S )N	ui_fieldsrY   r+   Z_NONE_)_build_ui_formr   keysr   rH  r   r   )r0   ui_form_jsonr  Zconf_field_nameZ	cur_fieldr3   r3   r4   _calc_default_field  s    

z#CmfActiveEntity._calc_default_field)r  depthc             	      s  | j r|   | j r:| jdkr:| js:t j|d|i|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d	}|stj	j
ddd gdd| jjgdddggdd	}|rtd
| j d|j d| jjj d| jj dd | jjr|   | jr.| j|| t j|d|i|}td |S | jf | |   td |   td tjj| d td t j|d|i|}td tj|  |S )Nrs   r  Zstatus_fromr%  Z	status_tor   Ztrans_form_showT)r   rN  zmust_transition_run r{   r   zsuper().save endzhandle_mention_persons endz_calc_resolution end)r  zdo_calc_statistics end)r   r  r   r   r(   r   r   r   rS   ZCmfTransr   r   r;   r   r   r  r   r  r}   r  r  handle_mention_persons_calc_resolutionZCmfStatZdo_calc_statistics
CmfLicensecheck_license)r0   r  r  r   r   r  r  r1   r3   r4   r     sP    2





zCmfActiveEntity.savec                 K   s`   t   | _td| j d | jr*| js\d}| jr8d}t| drL| jrLd}t	j
| |d d S )Nzsave start (rz  r  r   r   Zbefore_save)time_CmfActiveEntity__start_tsr}   r  r;   r   r   r   r   rS   CmfAutomationCrudTrigger	crud_hook)r0   r   Zcrud_actionr3   r3   r4   before_save_hook  s    
z CmfActiveEntity.before_save_hookc                 K   s   |    td tjrF| jrF| jjrFt| jjjt	 t
  td |   td | jrd| jsd }| jjrx| jj}tj| | jrdndd | jjr|| jkr| j| _td td| j d	t | j d
 d S )Nz_exec_transition endz_exec_bzpython endz_exec_trigger endr   r  Z
after_savez_CmfAutomationCrudTrigger endz
save end (z): z.3f)r  r}   r  configZBZPYTHON_ENABLEDrC   Zsave_eval_codeexecr+   globalslocalsr   r   r   r   r   rS   r  r  r   r;   r  r  )r0   r   Zhack_before_responsibler3   r3   r4   before_save_data_hook	  s"    



z%CmfActiveEntity.before_save_data_hookc                    s   |   | _t   d S r=   )re  cache_fieldsr(   _update_cache_fieldsr   r1   r3   r4   r  +  s    
z$CmfActiveEntity._update_cache_fields)include_templatesc                   s   |s| dd t j||S Nr   F)r8  r(   r   r  r  r   r   r1   r3   r4   r   0  s    zCmfActiveEntity.listc                   s   |s| dd t j||S r  )r8  r(   r   r  r1   r3   r4   r   6  s    zCmfActiveEntity.slistc              
   C   s~   | j | jdddddgdD ]R}t|jd0}tj||j|jd}||	  |
  W 5 Q R X ||| q|j
d	d
 dS )uD    Копирование вложений для CmfTask, CmfDocumentFurl_previewurl_preview_imgurlembedded)r  simpler   rb)r   r   r  Tr   N)Zattach_listr;   openZfull_path_filerS   r&   r   r  Zupload_filereadr   _replace_attachment)r0   r   
attachmentfileZnew_attachmentr3   r3   r4   copy_attachments<  s    


z CmfActiveEntity.copy_attachmentsc                    sF   d|j _|jdkr"|j|_d|_n|  t |}tj	
| |S )NTdummy)r9   r   r   r;   r   rX  r(   _post_copy_hookrS   r  r  )r  obj_copyr  r1   r3   r4   r  O  s    
zCmfActiveEntity._post_copy_hook)r  r   r   r   )r   r  r   c                   sr   |rd}ddddddg}dd	 | j D }	|	r6||	 | | |rHd
}t jf ||d|}
|rn| |
 |
S )u  Копирование

        Args:
            name (str): Новое имя
            copy_attachments (bool): Копировать вложения
            copy_relations (bool): Копировать связи
            copy_subtasks (bool): Копировать подзадачи

        Returns:
            CmfActiveEntity: Скопированный елемент

        Tz**zattachments.urlr   zattachments.url_previewzattachments.url_preview_imgproject.logic_prefixc                 S   s   g | ]}| d r|qS )rC  )r   )r   r9  r3   r3   r4   r  n  s     
 z(CmfActiveEntity.copy.<locals>.<listcomp>r  )r   r   )r   ro  r   r(   r   r  )r0   r   r  r   r   r   r   r   Zfields_for_loadZ	cf_fieldsr  r1   r3   r4   r   \  s&        


zCmfActiveEntity.copyu   ACL ПраваrY   u   Нетu   ACL Полныеu   ACL Только чтениеu   ACL Приватные)rY   fullrM   private)rK   rF   rY   rG   rd   u-   WEB Авторизованный доступu   Доступ запрещёнu2   Могут только просматриватьuE   Могут просматривать и комментироватьu   Полный доступ)rY   denyrM   rt   r  u#   WEB Анонимный доступu"   WEB Доступ по ссылкеu8   Персональные политики доступаCmfPermPublishPolicy)rF   rN   r]   c                 C   s2   |    |   d| _| jdd | jdd d S )NTforcer   )r   _load_perm_fieldsperm_has_acl_calc_perm_aclr   r0   Zperm_publish_policyr3   r3   r4    perm_publish_policy_changed_hook  s
    z0CmfActiveEntity.perm_publish_policy_changed_hookc                    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 )NrY   r   rz   c                 3   s   | ]}  V  qd S r=   )choice)r   _Zalphabetsecretsr3   r4   r     s     z7CmfActiveEntity._calc_sharelink_hash.<locals>.<genexpr>r   Ztree_parent_idr   rs  r;   perm_policy_sharelinkr   z#_calc_sharelink_hash child update: Tr  r   )r  r   r   rs  stringr  ascii_lettersdigitsr   ranger
   Ziter_subclassesr   r;   r+   r}   r  r  r   )r0   r  r  	model_clschildr3   r  r4   r    s"     z$CmfActiveEntity._calc_sharelink_hashc                 C   s   d| _ |   dS )u&   Метод сброса sharelink_hashN)rs  r  r   r3   r3   r4   do_erase_sharelink_hash  s    z'CmfActiveEntity.do_erase_sharelink_hashCmfStr32zShareLink hash)r^   rF   rt   rK   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rvd|_tjd| jd|gd	gd
	  n,| j dkrd|_nt
d| j  d d|_|	  dS )uG   Наполняем ACL правилами для ShareLink группыrY   Nauto)r+  r   rM   r  rt   writecommentsr+  r   access_levelsubjectsr   r  z%WARN! Unknown perm_policy_sharelink: z. Set deny policyr  )r  rS   CmfAccessRuleperm_aclrV   sharelink_groupr   r|   r  r   r}   r  )r0   Zacl_rule_sharelinkr  r3   r3   r4   _acl_scaffold_sharelink_rules  s4    
 



z-CmfActiveEntity._acl_scaffold_sharelink_rulesc                 C   s   | j jddgd | j D ]}|js$q|jdkrLtjd| j|jgdd  q|jdkrttjd| j|jgdd  q|jd	krtjd| j|jgdd  tjd| jd
g|jgdd  q|jdkrtjd| j|jgdd  qd S )Nsubjectpublish_policyr   r  r  r+  r   r   r  rM   r  rt   r  r  )r+  r   r   r   r  r  )perm_publish_policiesr-   r  r  rS   r  r  r   r  r3   r3   r4   _acl_scaffold_subjects_rules  sN    

  
  
  
   
  z,CmfActiveEntity._acl_scaffold_subjects_rulesc                 C   s8  | 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	|_	nH| j d
krd	|_	tjd| jd|gdgd
  n| j dkrd|_	nd|_	|
  tjd| jdd}tj }|j| | jdkrd	|_	nL| jd
krd	|_	tjd| jd|gdgd
  n| jdkr&d|_	nd|_	|
  dS )uZ   Наполняем ACL правилами для публикации документовrY   Nr  ZSETMEBUG)r+  r   r  zanonymous@evateam.ru)r_  rM   r  rt   r  r  r  r  r  )perm_policy_anonymousperm_policy_guestrS   r  r  rR   r   r   r|   r  r   rV   Zguest_group)r0   Zacl_rule_anonymousZanonymous_personZacl_rule_guestZguest_person_groupr3   r3   r4   _acl_scaffold_public_rules  s`    
  


  

z*CmfActiveEntity._acl_scaffold_public_rulesc                    s@  |    |   |   | dddg | jdkrTtjd| jtj	 gdd
  n| jdkrtt|  }|rtjd| j|dd
  tjd| jtj	 gdd
  n| jd	kr2t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   r   r   r  r  r  rM   Z	denyWriter  r  r  N)r	  r  r  r   perm_policyrS   r  r  rV   Z
user_groupr   r   r  rn  rq  r(   _acl_scaffold)r0   Zwriter_listZreader_listr1   r3   r4   r  J  sd    
 
 
  
 
   
  
 
 
zCmfActiveEntity._acl_scaffoldc                 C   s(   |  ddddddddd	d
dddg d S )Nr  r  z
perm_acl.*Zperm_inheritperm_parentperm_inherit_acl_idperm_effective_acl_idr
  r  r  r   r   r   )r   r   r3   r3   r4   r  n  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 )NrY   T)r(   _calc_perm_has_aclr  r   r  r  r   r1   r3   r4   r  v  s    
z"CmfActiveEntity._calc_perm_has_aclc                    s   |sH| j jsH| jjsH| jjsH| jjsH| jjsH| jjsH| jjsH|  sHd S | 	  | jdksn| jdksn| jdkrz| j szd| _ t
 jddS )NrY   Tr  )r  r   r  r  r   r
  r  r  rm  r  r(   r  )r0   r  r1   r3   r4   r    s8    	

zCmfActiveEntity._calc_perm_aclc                 C   s   | j jrd S | jjrB| dg t| jdrB| jj rB| jj | _ d S | jdkr| jr| jjrt	| jj
}| j s|r|jr|j| _ d S d S )Nzperm_parent.perm_security_levelr<  rs   )r<  r   r  r   r   r   r   r  r   r   r/  Zdefault_task_security_level)r0   r/  r3   r3   r4   r    s"    	

z)CmfActiveEntity._calc_perm_security_levelcommonZ	templates)loaderemailsr  u2   Отправка доступа по ссылке )Z	only_onceZonly_once_argsdescriptionZshow_bg_progressbarc           
      K   s   t j|dddgd}tdd |  }tj }tj	d}d|j
 d	}| D ]4}|j|tj|d
}	td||	 |j||	|d qRd S )Nr  rs  r   r   T)Zfull_urlzsend_sharelink.htmluD   Вам предоставлен доступ к документу "")sharelink_urlrR  r  z%s
%s)r  )rF  rG  Zapp_base_href_sharelink_hrefrS   ZCmfPluginMailBoxZget_local_mailboxr
   
_jinja_envZget_templater   Zrenderr}   rR  logginginfoZsend_message)
r  r  r  r  r  Zmail_boxZmessage_templater  emailr  r3   r3   r4   _send_sharelink_emails  s    
z&CmfActiveEntity._send_sharelink_emailsc                 C   sl   | j rh| jrF| jj}d| jkr>| j d| jddd  }qP| j}n
| j}d}d| d| d| j  S dS )	uA  
        Дубль алгоритма расчёта sharelink url из CmfPublicService фронта.
        https://crm.ts.local/share/test-troshin/DOC-011919?hash=oJFRy4g9#dokument1-2-3-4-5

        let projectCode = obj.code.str;
        let publicCode = '';
        if (obj.parent && obj.parent.value) {
          projectCode =  obj.parent.value.code.str;
          // Хак когда нет префикса в коде документа
          // DEV-1624979687
          if (! obj.code.str.includes('-')){
             publicCode = obj.code.str;
          } else {
            publicCode = `${obj.code_prefix}-${obj.code.str.split('-')[1]}`;
          }
        }
        const queryParams = {
          hash: obj.sharelink_hash ? obj.sharelink_hash.value : null
        };
        const res: TreeRouterLink = {commands: [`/share/${projectCode}/${publicCode}`],
          extras: {queryParams, fragment: obj.getFragment()}};
        this.shareLink$.next(`${cmfUrl}${this.router.createUrlTree(res.commands, res.extras).toString()}`);

        :return: sharelink url
        rW  r`   r<   rz   zshare//z?hash=N)rs  r   r   r[  r   )r0   Zproject_codeZobj_public_coder3   r3   r4   r    s    
 zCmfActiveEntity._sharelink_href)r  c                 K   sT   | j dgd | jdkr&d| _|   td|| j t| j|t| jdd d S )Nr  r   rY   rM   z&CmfActiveEntity.send_sharelink(%s, %s))r  r  )r   )	r   r  r   r  r  r;   Zschedule_deferred_jobr  rB   )r0   r  r  r3   r3   r4   r$     s    
 zCmfActiveEntity.send_sharelinkc                 C   sv  t  }ddg}|dkr*td| ddd |ds8d	S |d
krb| dddg | jrb|| j |dkr| dddg | jr|r|| jj|d n|| j |dkr| dddg | j	r|r|| j	j|d n|| j	 |dkr| dddg | j
r|| j
 |dkrF| dddg | jrF|| j |dkrx| jrxt| j}|j
rx||j
 |d kr| jrt| j}|jr||j |d!kr<| jr<t| j}t }|j
r||j
 |jr||j |jr||jj|d |j	r.||j	j|d |t | |d"krj| d#d$d%g | jrj|| j |d&kr| d'd(d)g | jr|| j |d*krt| d+r| d+d,d-g | jr|| j t| d.r| d/d0g | jD ]}|jr||j q|d1kr tjgS |d2kr8||   |d3krT|| j|d |d4krt| d5r| d6d7d8d9g t }| jjr|| jjj|d | jjr| jjD ]>}	|	jr||	jj|d |	jr||	jj|d q|t | g }
|D ]f}|jj dr@|
| j!|jj |d: |d; q
|j"rLq
t|drd|j#rdq
|
| q
|
S )<u?  
        Получение значение по шаблонным объектам.

        Возвращает список (в том числе пустой), если передан шаблонный объект
            или None, если объект не является шаблонным
        cmf_deleteddoes_not_workr  un   Зацикливание рекурсии в раскрытии var-пользователя: extract_var_obj(rz  Tr   zvar:Nzvar:responsibler   responsible.cmf_deletedresponsible.does_not_workzvar:executorsr   executors.cmf_deletedexecutors.does_not_workr   zvar:spectatorsr   spectators.cmf_deletedspectators.does_not_workz	var:ownerr   cmf_owner.cmf_deletedcmf_owner.does_not_workzvar:owner_assistantsr   z cmf_owner_assistants.cmf_deletedz"cmf_owner_assistants.does_not_workzvar:project_ownerzvar:project_owner_assistantszvar:project_usersz
var:authorrd  cmf_author.cmf_deletedcmf_author.does_not_workzvar:waiting_forr   waiting_for.cmf_deletedwaiting_for.does_not_workzvar:component_ownerdefault_ownerzdefault_owner.cmf_deletedzdefault_owner.does_not_work
componentsz$components.default_owner.cmf_deletedz&components.default_owner.does_not_workzvar:current_userzvar:followerszvar:all_related_userszvar:approversr   zstatus.master_approverszstatus.approve_groupszstatus.approve_groups.approversz&status.approve_groups.master_approversr`   )	recursionall_nested_persons)$r   r   r   r   r   r|   r   ro  r  r   r   r   r   r   r   r  r  r  rd  r   r   r.  r/  r}   rR  get_all_followersr  r   Zmaster_approversZapprove_groupsZ	approversr   r+   extract_var_objr   r!  )r0   Zobj_coder0  r1  Z	var_usersr   r  resZ	componentZagZres_var_usersZvar_userr3   r3   r4   r3    s    















zCmfActiveEntity.extract_var_objc                 C   sL  | j js|s| jjs| jjs| jjs| jjs| jjs| jjs| jjs| j	js| j
sd}| jrtj| jj}|r|D ]}| | jrtd} qqt|sd S td | js| jrd | _td d S t }t }tj| j}|jD ](}|jr^| |jj}	|	d kr,|jr||jj n||jj n2|	D ],}
|jrL||
jj n||
jj q0|jr| |j |jD ]}| | sqvtt | | t!j"r| | D ],}|jr||jj n||jj qn.|jr|| | jj n|| | jj qvqd |ksd |kr*t#ddd t$|t$|d| _td d S )NFTz1_calc_perm_security_level_allowed_ids_cache startr  uf   DEV: _calc_perm_security_level_allowed_ids_cache None должны отфильтровываться!r   )r  rM   )%r<  r   r   r   rd  r   r  r   r   r   r   Zperm_security_level_idrS   ZCmfSecurityLevelZget_cache_security_levelaccess_task_fields_cacher}   r  %perm_security_level_allowed_ids_cacher  Zsecurity_level_rulesZaccess_memberr3  r   Zaccess_readonlyr  Zaccess_member_idr+   r;   Zaccess_task_fieldsr   r  typer   Z
CmfM2MBaser   r   )r0   r  Zcustom_changedr5  rJ  Zallowed_idsZallowed_ids_readonlyr<  ZruleZextracted_membersZextracted_memberr   r  r3   r3   r4   r  r	  s    	






z;CmfActiveEntity._calc_perm_security_level_allowed_ids_cachec                    s   |    d| _t   d S )NrY   )r  r  r(   r    r  r1   r3   r4   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includerS   r&   r   Z_delete_child_object)r0   r   r  r1   r3   r4   r8  	  s     z'CmfActiveEntity._direct_children_deleter0  )returnc                   sF  |dkr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g t jf |}jD ]N}|jdkr|j|krb||j qb|dkr||j qb|j	rb||j qbj
r|j
j|d d }jjjjjjjjj jjz&t fd!d"|D }W n tk
r@   t }Y nX |S )#Nr   u@   DEV: зацикливание рекурсии get_all_followersTr   r   r(  r)  r   r,  r-  r   r"  r#  r   r&  r'  r   r$  r%  rd  r*  r+  zfollowers.personzfollowers.person.cmf_deletedzfollowers.person.does_not_workzfollowers.notify_volumezfollowers.follow_childrenr   Zoffr   r`   r9  c                    s0   g | ](}t jj d d|d
r|qS )r  F)
initial_acl_keyZobject_modelZobject_owner_idr  Zobject_parent_idr  r@   Zobject_instanceZchecking_personZperm_security_level_allowed_ids)rS   r  Zcheck_access)r   r  r   r   r;  Zobj_parent_idr6  r0   Zself_idr3   r4   r  	  s      z5CmfActiveEntity.get_all_followers.<locals>.<listcomp>)r   r   r(   r2  	followersZnotify_volumer   remover  Zfollow_childrenr   unionr  r+   rT   r   r;   r   r6  r   r  ZCmfACLNotInitializedError)r0   r0  r   r   r4  Zfollowerr=  r1   r<  r4   r2  	  sd    
              



z!CmfActiveEntity.get_all_followersc                    s   |  | j |d| jr"| jjjp$d  |d| jr>| jjjp@d  |d| jjpTd |d| jj d|krd	dd	 | j
D |d< t jf |S )
NZobj_logic_type_codeZobj_activity_codeZobj_status_typerv   Zobj_user_ratingZobj_tagsr{   c                 S   s   g | ]}t |jpd qS )rz   r{  )r   tr3   r3   r4   r  
  s     z5CmfActiveEntity.full_search_index.<locals>.<listcomp>)r   Zfull_search_preload_fieldsr8  r9   r   r+   r   r?   r   r   r   r(   full_search_index)r0   r   r1   r3   r4   rA  	  s    z!CmfActiveEntity.full_search_index)r\  r:  c                 C   s~   t jdt jd}t jdt jd}|| r4|| s8g S t| d}g }|dd D ]"}t|j	d }|rV|
| qV|S )Ndata-mention-type)flagszdata-object-idZlxmlc                 S   s
   |  dS )NrB  )Zhas_attr)tagr3   r3   r4   r}  
  r~  z,CmfActiveEntity.parse_text.<locals>.<lambda>)recompileIr  bs4ZBeautifulSoupZfind_allrF  rG  Zattrsr|   )r\  Zre1Zre2bsr  rD  r  r3   r3   r4   
parse_text
  s    zCmfActiveEntity.parse_textc                 C   sz   | j jsd S t }t }| j jr2t| | j j}| j jrLt| | j j}|| D ] }|jdkrTtjj	| d|d qTd S )N)rV   rR   rW   Zmention)Zevent_person)
r\  r   r  r   rJ  r   r   rS   CmfEventdo_event)r0   Zobjs_oldZobjs_newr  r3   r3   r4   r  
  s    
z&CmfActiveEntity.handle_mention_personsc                    s   dddg}| j |kr tddd ddd	d
ddg}dddddddddddddg}t| j j|dd |D d tjr jtjjkrt	d  dtj  tddd fd d!|D d	 rd	 
| fd"d!|D d	< S )#Nrr   rU   rq   ue   Попытка выполнить public_parent_ui_get к недозволенному объектуTr   r   r   public_html_schemeZdocument_header_textZdocument_footer_textZtree_text_overflowZheader_background_colorZheader_text_colorZcontent_background_colorZcontent_text_colorZfooter_background_colorZfooter_text_colorZsidebar_background_colorZsidebar_text_colorZfooter_textZ	custom_jsZ
custom_cssZheader_htmlZfooter_htmlc                 S   s   g | ]}d | qS )zparent.r3   r   fr3   r3   r4   r  7
  s     z8CmfActiveEntity.public_parent_ui_get.<locals>.<listcomp>r-  uX   В public_get share api попытались запросить чужой объект z != u8   Нет прав public_get (ошибка доступа)c                    s   i | ]}|t  j|qS r3   )rH  r   rN  )r  r3   r4   
<dictcomp>@
  s      z8CmfActiveEntity.public_parent_ui_get.<locals>.<dictcomp>c                    s   i | ]}|t  d  |qS )rM  )rH  rN  )r  r3   r4   rP  D
  s      )r   r   rF  Zget_model_by_namer   r}   Zsharelink_access_requestr;   Zsharelink_access_objr  r   )r  Zchild_idZallowed_objectsZallowed_fieldsZscheme_fieldsr3   )r  r  r4   public_parent_ui_get)
  s4    

       z$CmfActiveEntity.public_parent_ui_getc                    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 S )Nr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r   r}   r  r   rO  rh  rl  r   rf  r  r  rj  rk  r   r   rU  r  rT  r   r   r   r   r  r  r  r(   _save_importr  r1   r3   r4   rR  I
  s\    





















zCmfActiveEntity._save_importc           
      C   s   ddl m} g }ddddddg}|r.|d	 tj|d
|d}|d krJ|S |jD ].}	t|	drj|	jd k	rjqP|	jdkrP||	 qP|j	||pd|d |S )Nr   )
attrgetter
tree_nodesztree_nodes.tree_node_is_branchztree_nodes.ordernoztree_nodes.cmf_created_atztree_nodes.cmf_modified_atztree_nodes.sys_typeztree_nodes.textT)r  r   r+  )rr   rq   r  )r  reverse)
operatorrS  r|   rF  rG  rT  r   r+  r   sort)
r  node_idrU  sort_byinclude_contentrS  	node_listr   r  noder3   r3   r4   _macros_page_tree_node_list
  s,      


z+CmfActiveEntity._macros_page_tree_node_listr`   )r  c                 C   sN   | j ||||d}|d8 }|dkrJ|D ]"}|jr&| j|j||||d|_q&|S )N)rU  rY  rZ  r`   r   )rX  r  rU  rY  rZ  )r]  Ztree_node_is_branchr!   r;   rT  )r  rX  r  rU  rY  rZ  r[  r\  r3   r3   r4   r!   
  s    
  
z$CmfActiveEntity.macros_page_tree_getc                 C   s   |  | jj||| _d S r=   )_replace_attach_urlr\  r+   )r0   r   
new_attachr3   r3   r4   r  
  s    z#CmfActiveEntity._replace_attachmentc                 C   s4  ddl m} | d k	r0| |jj|jj} |jj| krL| |jj|jj} n,||jj| krx| ||jj|jj} |jr|jj| kr| |jj|jj} n2|jr||jj| kr| ||jj|jj} |jr|jj| kr| |jj|jj} n6|jr0||jj| kr0| ||jj|jj} | S )Nr   )parse)	Zurllibr`  rS  r;   r+   r  quoter  r  )r\  r   r_  r`  r3   r3   r4   r^  
  s(    
z#CmfActiveEntity._replace_attach_urlc                 O   s  | j r| jjg|d< | jr4tjj| df|| nt| dr0| jj	r0tjj| df|| | j
j	r0| j
dkr| j
jdkrtjj| df|| n| j
dkr| j
jdkrtjj| df|| nj| j
dkr| j
jdkrtjj| d	f|| n<| j
dkr0| j
dkr0| j
jdkr0tjj| d
f|| t| drF| jj	s\t| drr| jj	rrtjj| df|| | jj	rtjj| df|| t| dr| jj	rtjj| df|| t| dr t| dr | jj	s| jj	r tjj| df|| tjj| df|| d S )NZfilter_membersZcreatedr   Zchanged_statusry   closedZreopenedrw   Zwork_startedZwork_stoppedr   r   assignedZmovedresult_textZresolvedr
  r  Zsharedupdated)r   r   r+   r   rS   rK  rL  r   r   r   r?   r   r   r   r   rd  r
  r  r  r3   r3   r4   _do_event_save
  sD    


zCmfActiveEntity._do_event_savezBaseModel:custom_field_sync)Zchannelc                 K   s   dd l }td|  d|   ddlm} tt| d  }td| d   ||d}td |  td	|   d S )
Nr   zN====================================custom_field_sync_update_models START PID=z data=)CmfCustomClassrA  uS   custom_field_sync_update_models: создаем CmfCustomClass для модели )r  uL   custom_field_sync_update_models: вызываем reload_models_and_fields()zL====================================custom_field_sync_update_models END PID=)	r  r}   r  getpidZcmf.models.base_modelrg  varsrS   Zreload_models_and_fields)datar   r  rg  r  Zcustom_classr3   r3   r4   custom_field_sync_update_models
  s    

z/CmfActiveEntity.custom_field_sync_update_modelsr  c              	   C   sx   t jr| jr| jjdsd S t jt jjjdg|| jj| jddt j| jjd}t	d|d  ||d |d gd d S )	Nr   project_notifyTrx  )ZinitiatorSessionTabIdZinitiatorCurrentPersonactionZinitiatorActionZinitiatorObjIdZinitiatorObjChangedFieldsu   initiatorСomponentId	projectIdzproject_notify-rn  )ZroomZevent_persons)
r}   Zsession_tab_idrT   r+   r   r~   r;   r  Zcomponent_idZcmf_emit_event)r0   Zinitiator_actionZeventr3   r3   r4   rl    s"    

zCmfActiveEntity.project_notifyc                 C   s   dS )u   
        Экран по умолчанию если нет никаких правил и схем экранов

        Returns:
            CmfUiForm: системный экран по умолчанию
        Nr3   r   r3   r3   r4   _get_default_ui_form  s    z$CmfActiveEntity._get_default_ui_formZinline_save)tmp_objr   create_forminclude_deletedis_public_formui_form_modec             	   O   s  | d| j }	|}
|s>| j|dddddddgd	d
|}|rL|jrLd	}
| j|||	|d}|rfd}t|prddg}|d |d |d |d |d |r| dg }|D ]&}| D ]}t	|t
r|| qq| |}|D ]:}|tjkrtj| |d tjkrtj|d  q| j||d|
d|}|r|jrbd|j |_||_|d |_|d |_||_|jsttdrtjj||d d}|S )ux   
        fields - список мета-правил для указания какие поля грузить
        rt  r9   r   zproject.ui_form_schemezproject.cust_field_conf_schemer  r   r   T)r   rr  )rp  tmp_is_public_formtmp_ui_view_formrq  Zbutton_saver   r  r,   r@  ui_group_fieldsry  r  )full_fields_loadZmapperrr  zDELETED r   r   CmfAutomationUiForm)Zcmf_ui_form)r   r  r  sgetr   r  r  r  r  rA   r   r  Z_build_load_planr}   Zapi_hack_fieldsr>  Z_getr   r  Zui_form_nameZui_form_codert  r   rS   ry  Zui_get_hook)r  rp  r   rq  rr  rs  rt  r   r   rv  Ztmp_include_deletedr  Z
fields_setgroupsZ
group_datar  rx  Z_field_namer  r3   r3   r4   ui_get#  sd      
 








zCmfActiveEntity.ui_get)
ui_form_idr:  c           	      C   s   ddl m} || jd }tj|}|D ]}d}t |D ]t}|d |d kr:d}|d D ]N}|dsjqZd|kr|d | qZd	|kr|d	 | qZ|d
 | qZ qq:|s*|| q*|S )Nr   )deepcopyrw  Fr   Tr   rC  Zcol2Zcol1)r   r~  ui_formrS   	CmfUiFormZget_ui_group_fieldsr   r|   )	r  r}  r~  r4  rI  groupfoundZ	cur_groupr   r3   r3   r4   _get_ui_group_fields\  s(    
z$CmfActiveEntity._get_ui_group_fieldsc                    s  d }|j dkr tt|j}n|r:|jr:tt|j}|sr|rd|rd|jrd|sb| j }ddg}d }|rddddddggddd gg}dddd g}d	d| j gdd
d|j	jggd
dd ggddd|j
r|j
jnd gddd ggdd|gdd|gdd|jjgg}	|r|	| tjjddd
g|	dd}
|D ]6}|
D ]}|j|kr4|j} qTq4|r, qdq,|sr|  }d }t|j	j}d}|rt|j	j}|jrt|jj}|jot|j}tj}|rFt|j}|rF|rF||krF|jrF||| krF|| | }||krF||| krF||| | krF|| | | }|s|rt }|j|d< |j|d< |j|d< | j|d|d< tj|j|d< |r|rtj||||\}|d< |D ]8}||d krt |d |< |d | ||  qt|j}||st ||< || |s:t || |< || | }||krZt ||< ||| krvt || |< ||| | |< |S nt j|dS |S )NrU   r  rY   r   crud_choicer%  r   r   rA  Zlogic_typesr   r   rs  rt  ui_form_schemeztarget.ui_form_jsonT)r   r   rN  Noner   r   ry  )r}  rw  r  Zcust_field_config)rp  ) r   r   r   rB   r;   r   r  r  r  r9   r   r|   rS   ZCmfUiFormSchemeRuler   r  targetro  Zcust_field_conf_schemer[   cache_cust_field_config_schemedictr   r   r  r  Zui_fields_jsonZCmfCustFieldConfSchemer  r   r(   r  )r  rp  ru  rv  rq  r  Ztmp_projectZcrud_choice_orderZcrud_choice_filterr   Zui_form_scheme_rule_listr  Zui_form_scheme_ruler  r#  Z	scheme_idZproject_logic_typer[   r  r}  Zconf_scheme_cacher  Zui_field_namer1   r3   r4   r  z  s    







*






zCmfActiveEntity._build_ui_formc                 C   s   | j jr| j jdkr| jsdddd gdd| jgggdddd gdd| jgggdddd gdd| jgggddd	gg}ddddg}tjj	||dgd
}|r|j
r|| _qtjj	d	d| _nd | _d S )Nry   r   r$  r   r%  r&  r'  
is_defaultT)r   r   r  )r.  )r?   r   r   rB  r9   r   r   rS   ZCmfResolutionr   r  )r0   r   r   r4  r3   r3   r4   r    s    
z CmfActiveEntity._calc_resolutionr  u2   Регистрация для публикации)r  publish_specc           
      K   s   t d| | dd |D }tjj||d t| }|D ]X}|d }|d }tjj|d}	|	s~t d| t	d	| d
 q:tj
||	|d  q:dS )u  
        Зарегистрировать недостающих пользователей из publish_spec и опубликовать для них объект object_id
        :param object_id: id объекта для публикации
        :param publish_spec: [{email: str, publish_policy: str}, ...]
        :param guest: только гостевой доступ
        :param _kwargs:
        :return:
        uZ   publish_for_invited(): Выполняем публикацию объекта %s для %sc                 S   s   g | ]}|d  qS r  r3   )r   specr3   r3   r4   r    s     z7CmfActiveEntity.publish_for_invited.<locals>.<listcomp>)guestr  r  r  zUpublish_for_invited(): Person for email %s is absent, publish policy is not created, uB   Не удалось пригласить пользователя u;   , публикация для него не создана.)r   r  r  N)r  r  rS   rR   Zregister_personsrF  rG  r   Zwarningr   r  r   )
r  r  r  r  r  r  r  r  r  r   r3   r3   r4   r#     s     
 z#CmfActiveEntity.publish_for_invitedc                    s   t  j||}| |_|S r=   )r(   cloner   )r0   r   r   r4  r1   r3   r4   r    s    zCmfActiveEntity.clone)	subgroupsr:  c                 C   sj   |D ]`}| |d |d |d |d d}t j||d< |d ||d< t jj|d jjd|d< q|S )	Nr   r#  r[   )r  r   r9   r   r@  rC   )r:   Zstatus_list)rS   rE  rg  ri  r  r  r;   r+   )r  r  Zsubgrouprp  r3   r3   r4   group_changes_statuses#  s    z&CmfActiveEntity.group_changes_statuses)rv   )N)NTTF)NNNNN)NN)NNNNN)NN)NNNNNFN)NNNNN)F)N)NN)N)r   F)F)FNF)Nr`   FNF)r  )FNFN)NNT)r5   r6   r7   ZabstractZfields_orderZorderingZ	api_allowr  r   cmf_active_entityr
   Zapi_methodsZessential_child_modelsr9   r  Z	CmfStatusr   ZFieldr  r   r   r   r   r   ZCmfRelationr   r   r   ZCmfGenericRelationr   r   ZCmfGenericM2Mr   r   rn   r   r   ZCmfGenericBackrefZattachmentsr   ZCmfChoiceIntr   Z	CmfChoicer   Z
CmfNumericr   ZCmfIntr   r   r   r   r   r   r   r   r   r   rL  r   Z
is_penaltyr?   rr  ZCmfObjectJsonr  r   r  r=  r   propertyr   r   r%   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  classmethodr"  r*  r,  r0  r:  r(  rK  setterrM  rO  rT  rU  rV  rX  rY  re  rf  rh  rj  rk  rl  rm  rn  rq  ru  rv  r  r  r  r  r"   r  r  r  r  r  r   r  r  r  r   r   r  r  rB   r   r   r  r  r
  r  r  r  r  r  r  rs  r  r	  r  r  r  r  r  r  Zjinja2ZEnvironmentZFileSystemLoaderr  pathr   r  ZPROJECT_DIRr  staticmethodZcmf_deferred_jobr  r  r$   r3  r  r    r8  r  r2  rA  rJ  r  rQ  rR  r]  r   r!   r  r^  rf  Zon_server_eventrk  rl  ro  r|  r  r  r  r#   r  r  r8   r3   r3   r1   r4   r
      s  
	                   	

          	      
 ;
='	I! 3             D        q

C	-"
;W	NF"*%    	   
   
   
9$! 
 &	uQ 0H!	  8      o  r
   ra   )deploy_jobs)r   r  r   r   rH  r  r   modulesr   Z
sqlalchemyr   Zsqlalchemy.sqlr   Zdateutil.relativedeltar   Zcmf.includeZcommon.fields.cmf_active_entityr  Znot_in_any_listsr  r
   rz   r  r  r3   r3   r3   r4   <module>   sL                           2