U
    rPf                    @   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                       sX
  e Zd ZdZdddddddd	d
ddddddddddddgZddgZ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?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(dHdIdJdKdLdMdNdOdPddQZ)ejjejj*dRdSdTdUdVdWdXdYZ+ejjejjdZdd)Z,ejjejjd[d=Z-ejjejjd\d=Z.ejjejjd]d=Z/ejjejjd^d=Z0ejjejj*d_d`dadbdcdddedfdYZ1ejjejjdgddhZ2ejjejj"ddidjddddkZ3ejjejjdldd2dmdndodpdqgdrZ4ejjejj"didsdtddugddvZ5ejjejjdwdxdddyZ6ejjejj"dzdd{Z7ejjejj*d|d}d~ddddddddZ8ejjejjddd@dddZ9ejej:dddddZ;G dd dejj"Z<ejjejj=ddddZ> fddZ?e@dd ZAdqddZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdr fdd	ZUeVdsddZWeVdt fdd	ZXeVdu fdd	ZYeVdv fddĄ	ZZe@ddƄ Z[e[j\ddƄ Z[ddȜddʄZ]dd̄ Z^dd΄ Z_ddЄ Z`dd҄ ZaddԄ Zb fddքZc fdd؄Zdddڄ Zedd܄ Zfddބ Zgdd Zhdd Zidd Zj fddZk fddZl fddZm fddZn fddZodd Zpdd Zqdd ZrdddesdddZtdd Zudd Zvdd Zwdd  Zxdd Zyddd fdd
Zz fddZ{ fd	d
Z| fddZ} fddZ~eVdd fdd
ZeVdd fdd
Zdd ZddddeeedddZe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dwd*d+Zd,d- Zejjejjd.d/d/dd0Zd1d2 Zd3d4 Z fd5d6Zd7d8 Z fd9d:Z fd;d<Zd=d> Zdxd?d@ZdydAdBZ fdCdDZ fdEdFZddGedH fdIdJZ fdKdLZeeedMdNdOZdPdQ ZeVdRdS Z fdTdUZeVdzdVdWZeVd{edYdZd[Zd\d] Zed^d_ Zd`da Zeedbdcddde Zd|dgdhZeVdidj ZeVddddddkdldmdnZeVd} fdodp	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	-priorityz-orderno)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"   5   s
    z%CmfActiveEntity.logic_type._set_value)__name__
__module____qualname__r"   __classcell__r,   r,   r*   r-   
logic_type4   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"   D   s    z!CmfActiveEntity.status._set_valuec                    sB   t |tr6| jr6| jj r6| jjj|dd }r6|S t |S )NF)r7   raise_error)
isinstancestrr#   workflowr&   get_default_statusr!   cast)r)   r$   r   r*   r,   r-   r>   I   s    zCmfActiveEntity.status.cast)
r.   r/   r0   captionnullableoptions_list_params	log_levelr"   r>   r1   r,   r,   r*   r-   r   =   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   t   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widgetrG   rA   u   Вложенияr   )r?   rL   rT   u   Ждем ответаu   Приоритетu   Минимальныйu   Низкийu   Обычныйu   Высокийu   Критичныйu   Блокирующий)r5   r            0)r?   choicesdefaultr@   u   Оценка12345)r]   r^   r_   r`   ra   )r?   r[   u   Будильникu   Крайний срок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CmfActiveEntityFilterCmfDocumentCmfTaskZCmfComponent)r?   r@   rL   u   Сделаноu!   Значение чекбоксаr8   )rU   r?   rJ   ZvirtualZrequired_fieldsrC   u   Вид деятельностиCmfActivity)r?   rF   r@   rG   u!   Задача просрочена)r?   rC   u   Кеш: Тип статусаu   Открытu   В работеu+   Подтверждение закрытияu   Закрыто)OPENIN_PROGRESS	IN_REVIEWCLOSEDalways)r?   r[   	load_moderC   rH   rD   u!   Настройка статусаZCmfStatusOpt)r?   rF   rT   rC   rD   u   кэш полейZlazy)r?   rC   rm   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\   rt   r,   r,   r,   r-   approved   s
   ru   u   ПодписчикиZCmfFollower)r?   rT   rF   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|  krd}| j	j
|  krd}| 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   r5   r   TFri   rW   r   )r!   _get_field_log_levelr   
is_changedr   r   rq   rr   
get_ownerscmf_modified_byr$   r8   r   )r)   
field_nameargskwargsrB   Zsilent_owner_changesr*   r,   r-   rv     s6    	
z$CmfActiveEntity._get_field_log_levelc                 C   s   | j jS r6   )notify_valuer)   r,   r,   r-   _notifyO  s    zCmfActiveEntity._notifyrh   c                 O   s   | j  |}|| _| S r6   )r<   r&   r=   r   )r)   r7   r{   r|   r   r,   r,   r-   set_default_statusS  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)   r{   r|   rJ   r,   r,   r-   _delete_commentsX  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)   r{   r|   attachr,   r,   r-   _delete_attachments\  s    z#CmfActiveEntity._delete_attachmentsc                 K   s   | j }| j|d|ddd}t|dr>|jjr>d|kr>|d= | D ]\}}||jkrFt||| qFd|_	| |_
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   
        Создание задачи по шаблону
        Tis_dummyN)r   copy_allr   listsFZtzZ	only_data)r   r   gethasattrr   r$   itemsr   setattris_templatecloned_fromr   rw   saver   Zis_not_nullr   cmf_created_atdatetimenowtimezoneutc)r)   r|   Znew_obj_namer#   attrr$   Zdeadline_deltar,   r,   r-   create_from_template`  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   rw   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   rw   r:   r$   r
   r%   r&   Zparent_logic_prefixr   r,   r,   r-   _calc_parent_logic_prefix  s    z)CmfActiveEntity._calc_parent_logic_prefixc                 C   sb   | j js8| j js8| j j| jks8| j j| jks8| jjs8d S | j rR| jj| j d| _ n| j | _ d S )N)r   )r   rw   is_nullr7   r8   r<   r=   r   r,   r,   r-   _calc_status  s    zCmfActiveEntity._calc_statusc                 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)rj   rk   ri   rj   rk   )r   rw   r7   r8   status_modified_atset_nowoldnew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 | js"| j  |   d S r6   )r   r   r   _cacl_next_periodr   r,   r,   r-   _calc_periodic  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   )r)   Zcur_dateZ
shift_daysZshift_monthsr,   r,   r-   r     s    
z!CmfActiveEntity._cacl_next_periodc                 C   s$   | j jsd S | j jr tddd d S )NuE   Задача не может быть без постановщикаTabort)r   rw   r   	cmf_alertr   r,   r,   r-   _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_datar   r   N)is_new
class_namerL   Z
CmfTriggerr   check)r)   _filterZtriggerr,   r,   r-   _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_parentrw   Z_node_parentr   load_fieldsZ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   rw   r   ager   rq   rr   r   r$   r   r   r   r   rx   )r)   msgr,   r,   r-   _check_alarm_date_valid$  s@    




z'CmfActiveEntity._check_alarm_date_validc                 C   sh  |  dddd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jj|_| jrD| jjrD| 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rd| 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_closezparent.sl_readonly_closed_task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_subtasksc                   @   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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)r.   r/   r0   r   r   __annotations__r   boolr   r   r   r   r   r   r   sl_controllersl_controller_strr,   r,   r,   r-   SimpleLogicOptionsY  s   
r   rN   u   Проект: u   Бизнес-процесс: )r   dataclassesZ	dataclassr   r$   r   r   r   r   r   r   r   r   r   r   r   r<   Zenable_sl_controlr   r   )r)   r   optionsr,   r,   r-   _get_sl_optionsC  s\    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| 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   ro   u^    сдвинул крайний срок задачи<br>
                Было:&nbsp;&nbsp;u)   <br>
                Стало:<b>&nbsp;z1<b><br>
                <a target="_blank" href="z">z</a>
                r   rX   )r   r   r   r   r   )r   rw   r   r   r   r   cmfr   CmfDateTimer   r   r   r   r   r   r   rq   rr   Zsystem_personZ_place_notifyr   r   Zhrefr$   r   r   )r)   shiftr,   r,   r-   _calc_deadline  s4    4
zCmfActiveEntity._calc_deadlinec                 O   s   t jj|| d d S )N)	person_idobj)rL   Z	CmfNotifyZclose_open_notifies)r)   r   r{   r|   r,   r,   r-   _clear_notify  s    zCmfActiveEntity._clear_notifyNc              	      sx  |  dddddddg tt jf d|i|}| jrR| jj |d	 || j | jrr| jj |d	 || j | jj|d	}|r|s| j	r| j	j
jd
kr| j	jj|d	}|| | jj|d	}|r|s| j	r| j	j
jd
kr| j	jj|d	}|| |rB| j	rB| j	j
jd
krB| j	jrB| j	jj |d	 || j	jg t }	|D ]&}
|dksf|
j|krL|	|
 qL|	S )u   
        Получение списка конечных пользователей затронутых обьектом
        zcmf_owner.user_localzwaiting_for.user_localzresponsible.user_localzspectators.user_localzexecutors.user_localzcmf_author.user_localparent.cmf_owner.user_localr   r   rN   N)r   setr!   all_relation_personsr   addr   r   
all_nestedr   r$   r   updater   r   r   
user_localrp   )r)   r   r   Zwith_parent_ownerZinherit_executorsr|   resultr   r   retur*   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orderno	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_listr   )clsobject_fieldsr   r   slicer  r|   r   r,   r   r-   status_options_list  s$    

z#CmfActiveEntity.status_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r4   r   r   r   r   systemT)r   r   )rL   rf   r   projectsecurity_level_schemer!   field_options_list)r  relation_field_namer   r   r|   Ztaskr
  r*   r,   r-    perm_security_level_options_list  s    
z0CmfActiveEntity.perm_security_level_options_listc              	      sx  |sg }|sg }|si }|s"dg}|o.| d}|r:|dr:tjj |dddddgd	}	|	r:|rn|	jr:d }
|	jrt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	 |	jD ].}|j|
krt |
|j< |
|j |jj	 q|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   filter_responsibler   r  T)Zchild_modelsZ
return_setr4   INr   r   roles)r  all_optionsmodels_listmodels_filtersr   r   )r   
startswithrL   rN   r  r   ZRelationCacheZget_children_dictr4   r$   r   r   r   r   r   
setdefaultrp   r!   r  r   )r  r  r  r   r   r  r  r|   rM   r	  Zchildren_dictZ	assistantZ
model_namer*   r,   r-   responsible_options_list  sb       



   z(CmfActiveEntity.responsible_options_listc                    s  |sg }|sg }|dkr4| j f |||||d|S |dkrV| jf ||||d|S |dkrz| j|f||||d|S |dkr|sdg}d.|}| 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.|r8tj|d| gd}t	|dr8|j
}	|	r^t|	|r^|ddt|	|gg}|dd| jgg}|r6d|kr6|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r6|o|d}|r|ddd dgdd |ggg}|o|d}|r6|dd%d dgd%d |ggg}|d&r| j|}|slt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 )/u  
        FIXME:
          потом мы сделаем эту штуку через
          глубокий поиск общую кэш-таблицу и все будет хорошо
        osv: а зачем это и так все кешируется дважды
        todo возможно надо вынести responsible status tag и тд в CmfTag и тп но не факт
        r   )r  r   r  r   r   r   )r  r   r   r   perm_security_levelr2   r   filter_activity_id)re   rf   CmfListre   Zstrict_document_logic_typerf   Zstrict_task_logic_typer  Zstrict_list_logic_typeNscheme_wf_idrM   r  z
scheme_wf.r   	scheme_wfr4   r  cmf_model_namer   rR   r   Zfilter_activity)r   r   r   r   r   TrK   r  r   Zfilter_projectZcf_u   Не нашел поле u    в классе ZCmfCascadeChoicechoice_parent_idr  F)r  r  r   r   r   )r  )r  r  r  r   r   rL   CmfSchemeWfcmfutilget_obj_by_idr   r  getattrrp   r  r   
ValueErrorZcustomrU   r!   r  )r  r  r  r   r  r   r   r|   Zlt_field_namer  r  rM   r   rR   custom_fieldr  r*   r,   r-   r  ,  s    
         



  



   z"CmfActiveEntity.field_options_listc                 C   s
   | j dkS )Nrk   )r8   r   r,   r,   r-   _is_checked  s    zCmfActiveEntity._is_checkedc                 C   s\   |  ddg |dkr*| j d| _n.|dkrF| j d| _ntd| jj d S )Nr   r<   Trk   Frh   u:   Некорректное значение для поля )r   r<   r&   r=   r   ZCmfValidationError
is_checkedr?   r(   r,   r,   r-   r$    s    )skip_tree_movec                O   s   |s|  dddg t| jjtjr\tjjdddg| jd}|sttj| jddd	}|	  ntjjdddg| jd
}|st
d|| _d| j_| jj	dd d| _| j	dd | j  | jD ]}|j|ddi| q| S )N**zparent.tree_node_is_branchr<   sys_typer   archive)r   rM   u
   Архив)r   r   r(  )r   tree_parent_idu4   В текущем проекте нет архиваTr   r&  )r   r:   r   r$   rL   rK   rd   r   rM   r   	Exceptionr   tree_node_is_branchZcmf_archived
tree_nodesr&   r)  )r)   r&  r{   r|   r)  childr,   r,   r-   r)    s2     
 

zCmfActiveEntity.archivec                 C   s   dS )u   
        Отправляем во фронт события для реалтайм обновления
        :return:
        Nr,   r   r,   r,   r-   
emit_event  s    zCmfActiveEntity.emit_eventc                 C   s   | j r
d S d }| jr6d| jjkr6| jdg | jj }| j sF|rF|| _ | j sptjj rptjj jdgd tjj | _ | j stjj	ddgdd| _ d S )Nr   z
activity.*r	   r   ZbusinessT)r   r   cache_inmemory)
r   r   r   r   rq   rr   r&   rL   rg   r   )r)   Zparent_activityr,   r,   r-   _calc_activity  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   Будильник установлен. Задача с крайним сроком не может быть без будильника.)rh   rk   uW   Будильник установлен тк задача уже выполняетсяrh   rk   )r   r   rw   r   r   r<   Z
next_alarmr   rq   current_userZget_current_datetimer2  replacer   r   r   r$   Zimport_moder   r   r   r7   r   r   r8   r   )r)   Zcurrent_timer,   r,   r-   _calc_alarm_date  sd    








"
z CmfActiveEntity._calc_alarm_datec                 C   s   | j rd| _d S )NT)r   ru   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                    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--rX   )
r   r2   rw   r	  r!   
_calc_coder  get_code_prefixr$   
rpartition)r)   r   r*   r,   r-   r:  0  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;  K  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   textr   r   ru   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  b  s     z9CmfActiveEntity.get_cache_fields_json.<locals>.<listcomp>r   c                 S   s   g | ]}| d dddgqS r>  r@  rB  r,   r,   r-   r  e  s     r   r   Zcolorr7   Z	card_namer   
cmf_authorr?  r   r   r   )	rA  r   r   r   r   rD  r   r   r   )r)   r   r,   r,   r-   get_cache_fields_jsonT  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   r  rw   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   rw   r   r  rL   r  Zcalc_schemer   r,   r,   r-   _calc_scheme_wf  s    zCmfActiveEntity._calc_scheme_wfc                 C   sF   | j js"| jjs"| jjs"| jr"d S | jjr4| jr4d S | j | | _d S r6   )r  rw   r2   r   r<   Zcalc_workflowr   r,   r,   r-   _calc_workflow  s    zCmfActiveEntity._calc_workflowc                 C   s   d S r6   r,   r   r,   r,   r-   _calc_default_workflow  s    z&CmfActiveEntity._calc_default_workflowc                 C   s   d S r6   r,   r   r,   r,   r-   _calc_responsible  s    z!CmfActiveEntity._calc_responsiblec                    s*   t   p(| jjp(| jjp(| jjp(| jjS r6   )r!   _acl_subjects_is_changedr   rw   r   r   r   r   r*   r,   r-   rK    s    
z(CmfActiveEntity._acl_subjects_is_changedc                    s>   t   }|| j | jr(|| j | jr:|| j |S r6   )r!   _acl_subjects_list_level_writeextendr   r   rp   r   r)   r   r*   r,   r-   rL    s    
z.CmfActiveEntity._acl_subjects_list_level_writec                    s   t   }|| j |S r6   )r!   _acl_subjects_list_level_readrM  r   rN  r*   r,   r-   rO    s    
z-CmfActiveEntity._acl_subjects_list_level_readc              -      sf   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+g, S ),Nr	   r   r   r   r<   r%   parent.cmf_ownerparent.cmf_owner_assistantszparent.activityr%  rD  zstatus.ordernozstatus.workflowr   r   r   cache_status_optr   Z
cmf_importry   sharelink_hashzlogic_type.coder  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ui_view_formr  r	  z,perm_security_level.access_task_fields_cache)r!   save_preload_fieldsr   r*   r,   r-   rU    s\                       z#CmfActiveEntity.save_preload_fieldsc                    s   t   ddg S )NrT  Ztask_filters)r!   project_perm_allow_fieldsr   r*   r,   r-   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   Не используется! Оставлено для историиimportrN   FTrw   Zcache__idrX   )r   r   r   r   Zchild_tasksZdepended_tasksZaffected_tasksu   Это действие над uC    разрешено только Владельцу объекта(r9  u    ) или Исполнителю(uW   ) или Временному исполнителю(поле "Ждем ответа": )c                 S   s
   t | jS r6   r;   r   )xr,   r,   r-   <lambda>L      z4CmfActiveEntity._check_simple_perm.<locals>.<lambda>u   , а так же z, 
   u
   , и др..)message)'r+  r   osenvironr   r   r$   r   Zdisable_simple_permvaluesZsimple_perm_allow_fieldsr  endswithr   rw   r   r   r   r   r   Zcheck_owner_permsr   r   r   rx   rq   rr   r   r   r   r   r   sortedmaprs   lenrL   CmfAccessListZcheck_admin_mode)r)   Zneed_owners_checkZfieldZ
sl_optionsZneed_reluser_checkZall_relation_userr   Zothersr,   r,   r-   _check_simple_perm  sb    



V

z"CmfActiveEntity._check_simple_permc                 O   s4   |    |   |   |   |   |   d S r6   )r1  rG  rF  rH  r   r8  r)   r{   r|   r,   r,   r-   _save_template]  s    zCmfActiveEntity._save_templatec                 C   sJ   | j jsd S | js.| jjr.| jj| jjkr.d S | j| | j j| j j d S r6   )r   rw   r   r<   r   r   Zrun_transitionr$   r   r,   r,   r-   _exec_transitionf  s
    z CmfActiveEntity._exec_transition)comment_appendchanged_fields)ro  c                O   sD   |  D ]\}}t| || q| jdd |r@tj|| d  d S )NT)is_task_transition_run)r=  r   )r   r   r   rL   r   )r)   rn  ro  _args_kwargskeyvalr,   r,   r-   task_transition_runs  s    z#CmfActiveEntity.task_transition_runc                 C   s   | j r| jr| j | _ d S r6   )rT  r   ui_namer   r   r,   r,   r-   _calc_ui_view_form  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   rq   debugr   r1  rG  rJ  r   rF  _calc_tree_parent_calc_perm_security_levelrH  rI  r   _calc_status_historyr   r   r7  r   r6  r   r   r   r8  r   _calc_sharelink_hashrw  +_calc_perm_security_level_allowed_ids_cacher)   rr  r,   r,   r-   recalc_fields  sf    























zCmfActiveEntity.recalc_fieldsc                 C   s   d S r6   r,   r   r,   r,   r-   do_status_is_changed  s    z$CmfActiveEntity.do_status_is_changedc              
   C   sV   | j jsd S t 8 tj| | j j| j j| j	| | j j| j jd
  W 5 Q R X d S )N)r   Zfrom_statusZ	to_statusZ
transition)r   rw   r  disable_aclrL   ZCmfStatusHistoryr   r   r<   Zcalc_transitionr   r   r,   r,   r-   r    s    
  z$CmfActiveEntity._calc_status_historyc                 C   s   | j r| j dddg | | }|d D ]\}|d | dsBq*|d | d dkrXq*t| |}|jr*|js*t| ||d | d  q*d S )Nui_form_schemer%   cust_field_conf_scheme	ui_fieldsr\   Z_NONE_)r	  r   _build_ui_formr   r!  r   rw   r   )r)   ui_form_jsonZconf_field_nameZ	cur_fieldr,   r,   r-   _calc_default_field  s    

z#CmfActiveEntity._calc_default_fieldr   )rp  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jj| d t j|d|i|}td |S )Nrf   r  Zstatus_fromr  Z	status_tor   Ztrans_form_showT)r   r0  zmust_transition_run ro   r   zsuper().save endzhandle_mention_persons end)r   )r   r  r   r   r!   r   r   rw   rL   ZCmfTransr   r   r4   r   r   r  r   rl  rq   r  r  handle_mention_personsZCmfStatZdo_calc_statistics)r)   rp  r  r{   r|   Ztransr   r*   r,   r-   r     sH    2



zCmfActiveEntity.savec                    sn   t   | _td| j d t jf | | jr8| jsjd}| jrFd}t	| drZ| j
rZd}tj| |d d S )Nzsave start (rZ  r   r   r   before_save)time_CmfActiveEntity__start_tsrq   r  r4   r!   before_save_hookr   r   r   r   rL   CmfAutomationCrudTrigger	crud_hook)r)   r|   Zcrud_actionr*   r,   r-   r  +  s    
z CmfActiveEntity.before_save_hookc                    s   |    td tjrJ| jrJ| jj rJt| jjj	t
 t  td |   td | jrh| jstj| | jrzdndd td t jf | td| j d	t | j d
 d S )Nz_exec_transition endz_exec_bzpython endz_exec_trigger endr   r   
after_savez_CmfAutomationCrudTrigger endz
save end (z): z.3f)rm  rq   r  ZconfigZBZPYTHON_ENABLEDr<   Zsave_eval_coder&   execr$   globalslocalsr   r   r   rL   r  r  r!   before_save_data_hookr4   r  r  r)   r|   r*   r,   r-   r  ;  s    



z%CmfActiveEntity.before_save_data_hookc                    s2   t j| dd t j|| t j| dd d S )Nr   r  r  )rL   r  r  r!   r   rk  r*   r,   r-   r   S  s    zCmfActiveEntity.deletec                    s   |   | _t   d S r6   )rE  cache_fieldsr!   _update_cache_fieldsr   r*   r,   r-   r  X  s    
z$CmfActiveEntity._update_cache_fields)include_templatesc                   s   |s| dd t j||S Nr   F)r  r!   r   r  r  r{   r|   r*   r,   r-   r   ]  s    zCmfActiveEntity.listc                   s   |s| dd t j||S r  )r  r!   slistr  r*   r,   r-   r  c  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, CmfDocumentattachmentsr   rbr   r   N)
r   r  openfull_path_filerL   r   r   upload_filereadr   )r)   r   
attachmentfileZnew_attachmentr,   r,   r-   copy_attachmentsi  s    
z CmfActiveEntity.copy_attachments)r  r   r   )r   r  r   c             
   O   s  ddl }|rd}| dddddg d}|r0d	}| j|d
}	||	_d|	j_|rX|	j|	_n|	  |		  |	
  |	  |	  |	  |	jdd |r| jD ]N}
t|
jd,}tj|	|
jd}||  |  W 5 Q R X |	|
| q|	jdd d|	_|	S )u  Копирование

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

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

        r   NTr'  zattachments.urlr   zattachments.url_previewzattachments.url_preview_imgZdummy)r   r   r  r  )urllibr   Zcloner   r2   rw   r4   r   r:  Z_calc_perm_parentZ_calc_perm_inherit_acl_id_calc_perm_has_acl_calc_perm_aclZ_calc_perm_effective_aclr   r  r  r  rL   r   r  r  _replace_attachmentr   )r)   r   r  r   r   r{   r|   r  r   Zobj_copyr   f
new_attachr,   r,   r-   r   r  s@    
 

zCmfActiveEntity.copyu   ACL Праваr\   u   Нетu   ACL Полныеu   ACL Только чтениеu   ACL Приватные)r\   fullrE   private)rC   r?   r\   r@   r[   u-   WEB Авторизованный доступu   Доступ запрещёнu2   Могут только просматриватьuE   Могут просматривать и комментироватьu   Полный доступ)r\   denyrE   rJ   r  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   rn   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   rS  r4   perm_policy_sharelinkr   z#_calc_sharelink_hash child update: Tforcer   )r  rw   r   rS  stringr  Zascii_lettersdigitsrs   ranger
   Ziter_subclassesr   r4   r$   rq   r  r  r   )r)   r  r  	model_clsr.  r,   r  r-   r    s"     z$CmfActiveEntity._calc_sharelink_hashc                 C   s   d| _ |   dS )u&   Метод сброса sharelink_hashN)rS  r  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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 группыr\   Nauto)r(  r   rE   r  rJ   writecommentsr(  r   access_levelsubjectsr  r  z%WARN! Unknown perm_policy_sharelink: z. Set deny policyr  )r  rL   CmfAccessRuleperm_aclrO   sharelink_groupr  rp   r  r   rq   r  )r)   Zacl_rule_sharelinkr  r,   r,   r-   _acl_scaffold_sharelink_rules  s4    
 



z-CmfActiveEntity._acl_scaffold_sharelink_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 правилами для публикации документовr\   Nr  ZSETMEBUG)r(  r   r  zanonymous@evateam.ru)r?  rE   r  rJ   r  r  r  r  r  )perm_policy_anonymousperm_policy_guestrL   r  r  rK   r   r  rp   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   s`    
  


  

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   r  r  )r(  r   r  r  rE   Z	denyWriter  r  r  N)r  r  r   perm_policyrL   r  r  rO   Z
user_groupr   r   r   rL  rO  r!   _acl_scaffold)r)   Zwriter_listZreader_listr*   r,   r-   r  Y  sb    
 
 
  
 
   
  
 
 
zCmfActiveEntity._acl_scaffoldc                 C   s"   |  ddddddddd	d
g
 d S )Nr  perm_has_aclz
perm_acl.*Zperm_inheritperm_parentperm_inherit_acl_idperm_effective_acl_idr  r  r  )r   r   r,   r,   r-   _load_perm_fields}  s          z!CmfActiveEntity._load_perm_fieldsc                    s@   t    | jjs| jjsd S |   | jr<| jdkr<d| _d S )Nr\   T)r!   r  r  rw   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\   Tr  )r  rw   r  r  r   r  r  r  rK  r!   r  r   r*   r,   r-   r    s2    	
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r| dg | j s| jjr| jjjr| jjj| _ d S d S )Nzperm_parent.perm_security_levelr  rf   z9project.security_level_scheme.default_task_security_level)	r  rw   r  r   r   r   r	  r
  Zdefault_task_security_levelr   r,   r,   r-   r    s"    	

z)CmfActiveEntity._calc_perm_security_levelc              
   C   s  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r| d d!d"d#g | jr| jj
r|| jj
 |d$kr| d%d&d'g | jr| jjr|| jj |d(kr|| d d!d"d%d&d'd)d*g | jr|| jjjd+kr|t }| jj
r|| jj
 | jjr.|| jj | jjrN|| jjj|d | jj	rn|| jj	j|d |t | |d,kr| d-d.d/g | jr|| j |d0kr| d1d2d3g | jr|| j |d4krPt| d5r| d5d6d7g | jr|| j t| d8rP| d9d:d;g | jD ]}|jr4||j q4|d<krbtjgS |d=krz||   |d>kr|| j|d |d?krDt| d@rD| dAdBdCdDg t }| jjr|| jjj|d | jjr6| 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|dE |dF qL|
j!rqLt|
dr|
j"rqL|	|
 qL|	S )Gu?  
        Получение значение по шаблонным объектам.

        Возвращает список (в том числе пустой), если передан шаблонный объект
            или 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_ownerrP  zparent.cmf_owner.cmf_deletedzparent.cmf_owner.does_not_workr   zvar:project_owner_assistantsrQ  z'parent.cmf_owner_assistants.cmf_deletedz)parent.cmf_owner_assistants.does_not_workzvar:project_userszparent.executorszparent.spectatorsrN   z
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component.default_ownerz#component.default_owner.cmf_deletedz%component.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_approversrW   )	recursionall_nested_persons)#r   r   r  r   r   rp   r   rM  r   r   r   r   r   r$   r   r   r   r   rD  r   r   r  r  rq   r4  get_all_followersr   r   Zmaster_approversZapprove_groupsZ	approversr   extract_var_objr  r  )r)   Zobj_coder  r  Z	var_usersr   resZ	componentZagZres_var_usersZvar_userr,   r,   r-   r    s    



 

  













zCmfActiveEntity.extract_var_objc                 C   sB  | 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sd}| j rz| j j
rz| j j
D ]}| | jrfd}qf|sd S td | j s| jrd | _td d S t }t }| ddddd	g | j jD ](}|jrT| |jj}|d kr"|jr||jj n||jj n2|D ],}|jrB||jj n||jj q&|jr| |j |jD ]}	| |	 s~qltt| |	 tjr| |	 D ],}
|jr||
jj n||
jj qn.|jr|| |	 jj n|| |	 jj qlqd |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  z;perm_security_level.security_level_rules.access_member.codez;perm_security_level.security_level_rules.access_task_fieldsz8perm_security_level.security_level_rules.access_readonlyzproject.cmf_ownerzproject.cmf_owner_assistantsuf   DEV: _calc_perm_security_level_allowed_ids_cache None должны отфильтровываться!r   )r  rE   ) r  rw   r   r   rD  r   r	  r   r   r   Zaccess_task_fields_cacherq   r  %perm_security_level_allowed_ids_cacher   r   Zsecurity_level_rulesZaccess_memberr  r   Zaccess_readonlyr   Zaccess_member_idr$   r4   Zaccess_task_fields
issubclasstyper   Z
CmfM2MBaser   r   )r)   r  Zcustom_changedr#  Zallowed_idsZallowed_ids_readonlyZruleZextracted_membersZextracted_memberrz   r   r,   r,   r-   r  @  s    	






z;CmfActiveEntity._calc_perm_security_level_allowed_ids_cachec                    s   |    d| _t   d S )Nr\   )r  r  r!   r  r  r*   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)   r|   r  r*   r,   r-   r    s     z'CmfActiveEntity._direct_children_deleter  )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   rW   r   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  r9   Zobject_instanceZchecking_personZperm_security_level_allowed_ids)rL   ri  Zcheck_access)r   r   r   cmf_owner_idr  Zobj_parent_idr  r)   Zself_idr,   r-   r    s      z5CmfActiveEntity.get_all_followers.<locals>.<listcomp>)r   r   r!   r  	followersZnotify_volumer   remover   Zfollow_childrenr   unionr  r$   rM   r  r4   r   r  r   r   ZCmfACLNotInitializedError)r)   r  r{   r|   r  Zfollowerr  r*   r  r-   r    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|krzddd | j	D |d< t
 jf |S )	NZobj_logic_type_codeZobj_activity_codeZobj_status_typerh   Zobj_tagsro   c                 S   s   g | ]}t |jpd qS )rn   r[  )r   tr,   r,   r-   r    s     z5CmfActiveEntity.full_search_index.<locals>.<listcomp>)r   Zfull_search_fieldsr  r2   r   r$   r   r8   rs   r   r!   full_search_indexr  r*   r,   r-   r	    s    z!CmfActiveEntity.full_search_index)r=  r  c                 C   sF   t | d}g }|dd D ]"}t|jd }|r|| q|S )NZlxmlc                 S   s
   |  dS )Nzdata-mention-type)Zhas_attr)tagr,   r,   r-   r]    r^  z,CmfActiveEntity.parse_text.<locals>.<lambda>zdata-object-id)bs4ZBeautifulSoupZfind_allr  r   Zattrsrp   )r=  bsr   r
  r   r,   r,   r-   
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)rO   rK   Zmention)Zevent_person)
r=  rw   r   r   r  r   r   rL   CmfEventdo_event)r)   Zobjs_oldZobjs_newr   r,   r,   r-   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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 )!Nre   rN   rd   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_cssc                 S   s   g | ]}d | qS )zparent.r,   r   r  r,   r,   r-   r    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 r,   )r!  r   r  )r.  r,   r-   
<dictcomp>	  s      z8CmfActiveEntity.public_parent_ui_get.<locals>.<dictcomp>c                    s   i | ]}|t  d  |qS )r  )r!  r  )r   r,   r-   r  	  s      )r   r   r  Zget_model_by_namer   rq   Zsharelink_access_requestr4   Zsharelink_access_objr  r   )r  Zchild_idZallowed_objectsZallowed_fieldsZscheme_fieldsr,   )r.  r   r-   public_parent_ui_get  s0    

     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 )Nrx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r   rq   r  r   r1  rG  rJ  r   rF  r  r  rH  rI  r   r   r7  r   r6  r   r   r   r   r  rw  r  r!   _save_importrk  r*   r,   r-   r  	  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   )
attrgetterr-  z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)simpler   r(  )re   rd   r   )rs  reverse)
operatorr  rp   r  r   r-  r   r(  r   sort)
r  node_idr  sort_byinclude_contentr  	node_listr   r   noder,   r,   r-   _macros_page_tree_node_listX	  s,      


z+CmfActiveEntity._macros_page_tree_node_listrW   )r  c                 C   sN   | j ||||d}|d8 }|dkrJ|D ]"}|jr&| j|j||||d|_q&|S )N)r  r  r  rW   r   )r  r  r  r  r  )r  r,  macros_page_tree_getr4   r-  )r  r  r  r  r  r  r  r  r,   r,   r-   r   t	  s    
  
z$CmfActiveEntity.macros_page_tree_getc                 C   s   |  | jj||| _d S r6   )_replace_attach_urlr=  r$   )r)   r   r  r,   r,   r-   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)	r  r"  r5  r4   r$   ZurlZquoteZurl_previewZurl_preview_img)r=  r   r  r"  r,   r,   r-   r!  	  s(    
z#CmfActiveEntity._replace_attach_urlc                 O   s  | j r tjj| df|| nt| dr| jjrtjj| df|| | jjr| 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r| jdkr| jjdkrtjj| d	f|| t| d
r2| j	jsHt| dr^| j
jr^tjj| df|| | jjr~tjj| df|| t| dr| jjrtjj| df|| t| drt| dr| jjs| jjrtjj| df|| tjj| df|| d S )NZcreatedr   Zchanged_statusrk   closedZreopenedri   Zwork_startedZwork_stoppedr   r   assignedZmovedresult_textZresolvedr  r  Zsharedupdated)r   rL   r  r  r   r   rw   r8   r   r   r   r   r%  r  r  rk  r,   r,   r-   _do_event_save	  s@    


zCmfActiveEntity._do_event_savezBaseModel:custom_field_sync)Zchannelc           
      K   s  t d ddlm}m} tt| d  }||d}t }tjj	dgdD ]<}t|j
jd||j
j< |jj||j
j d	< |jj||j
j d
< ||j
j d
 dr|jrd||j
j d< nd||j
j d< |jj||j
j d< |jj||j
j d< |jj||j
j d< |jj||j
j d< |jj||j
j d< |jjsN|jj||j
j d< |jjsl|jj||j
j d< |jjsJ|jj||j
j d< qJg }| D ]}	||j|	|d q|| |  t d d S )NzI====================================custom_field_sync_update_models STARTr   )CmfCustomClassCmfCustomFieldr  )r  r	   r   )r   r?   
field_typeZM2MTrS   rP   placeholderrJ   r\   rC   rE   rL   rF   r[   )rF   zG====================================custom_field_sync_update_models END)rq   r  Zcmf.models.base_modelr(  r)  varsrL   dictZCmfCustFieldr   r   r$   r?   r*  re  rS   r+  rJ   r\   rC   Zfield_readonlyr   rF   r[   rd  rp   Z	from_dictZmerge_fieldsZreload_models_and_fields)
datar|   r(  r)  r  Zcustom_classr  Z
cust_fieldZcustom_fieldsZcustom_field_datar,   r,   r-   custom_field_sync_update_models	  s<    




z/CmfActiveEntity.custom_field_sync_update_modelsr   c              	   C   sz   t jr| jr| jjjdksd S t jt jjjdg|| jj| jddt j| jjjd}t	d|d  ||d |d gd d S )	NrN   project_notifyTrX  )ZinitiatorSessionTabIdZinitiatorCurrentPersonactionZinitiatorActionZinitiatorObjIdZinitiatorObjChangedFieldsu   initiatorСomponentId	projectIdzproject_notify-r2  )ZroomZevent_persons)
rq   Zsession_tab_idr   r$   r   rr   r4   keysZcomponent_idZcmf_emit_event)r)   Zinitiator_actionZeventr,   r,   r-   r0  	  s"    

zCmfActiveEntity.project_notifyc                 C   s   dS )u   
        Экран по умолчанию если нет никаких правил и схем экранов

        Returns:
            CmfUiForm: системный экран по умолчанию
        Nr,   r   r,   r,   r-   _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 |r| dg }|D ]}|| dg  q| 	|}|D ]8}|t
jkrt
j| |d t
jkrt
j|d  q| j||d|
d|}|r|jr<d|j |_||_|d |_|d |_||_|jsttdrtjj||d d}|S )ux   
        fields - список мета-правил для указания какие поля грузить
        rT  r2   r   zproject.ui_form_schemezproject.cust_field_conf_schemezproject.logic_prefixr  r   T)r   r7  )r5  tmp_is_public_formtmp_ui_view_formr6  Zbutton_saver   r	  r%   ui_group_fieldsr   rY  r  )full_fields_loadZmapperr7  zDELETED r   r   CmfAutomationUiForm)Zcmf_ui_form)r   rv  r   sgetr  r  r   r   r   Z_build_load_planrq   Zapi_hack_fieldsr  Z_getr   r  Zui_form_nameZui_form_coder9  r   rL   r>  Zui_get_hook)r  r5  r   r6  r7  r8  r9  r{   r|   r;  Ztmp_include_deletedr  Z
fields_setgroupsZ
group_datar=  Z_field_namer   r,   r,   r-   ui_get	  s\      
 






zCmfActiveEntity.ui_getc                    sx  d }|r|j rtt|j }|sJ|r<|r<|jr<|sF| j }ddg}d }|r~d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
j	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r|j} q,q|r q<q|sJ|  }d }t|jj	}d}|rt|jj	}|jrt|jj	}t|j
j	}|r|r|r|j	tjkr|jr|tj|j	 krtj|j	 | }||kr||| kr||| | kr|| | | }|st|rft }|j|d< |j|d< |j	|d< tj|j	|d< tj|j	|d< |rt|rttj||||\}|d< |D ]8}||d krt |d |< |d | ||  qtj|j	st tj|j	< tj|j	 |st tj|j	 |< tj|j	 | }||kr4t ||< ||| krPt || |< ||| | |< |S nt j|dS |S )Nr   r\   r   crud_choicer  r   r   r  Zlogic_typesr   r   r8  rT  r  ztarget.ui_form_jsonT)r   r   r0  Noner   r   rY  r<  r  Zcust_field_config)r5  )r   ZAPPZget_cache_projectr;   r  rv  r   r   r2   r4   r   rp   rL   ZCmfUiFormSchemeRuler  rB  targetr4  r  Zcache_cust_field_config_schemer-  r   r   Z	CmfUiFormr<  Zui_fields_jsonZCmfCustFieldConfSchemer   r   r!   r  )r  r5  r:  r;  r6  Zui_formZtmp_projectZcrud_choice_orderZcrud_choice_filterr   Zui_form_scheme_rule_listrB  Zui_form_scheme_ruler  Zlogic_type_idZ	scheme_idZproject_logic_typerR   Zconf_scheme_cacher  Zui_field_namer*   r,   r-   r  2
  s    





*




zCmfActiveEntity._build_ui_form)rh   )NTTF)NNNNN)NN)NNNNNF)NNNNN)F)r   F)F)FNF)NrW   FNF)r   )FNFN)r.   r/   r0   ZabstractZfields_orderZordering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   rc   r   r   ZCmfGenericBackrefr  r   ZCmfChoiceIntr   Z	CmfChoicer   r   r   r   r   r   r   r   r   r   r%  r   Z
is_penaltyr8   rR  ZCmfObjectJsonr  ru   Z
CmfBackrefr  rv   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr  r  r  r  r$  setterr)  r/  r1  r6  r7  r8  r:  r;  rE  rF  rG  rH  rI  rJ  rK  rL  rO  rU  rV  rj  rl  rm  r-  ru  rw  r  r  r  r  r   r  r  r   r  r   r  r  r;   r   r   r  r  r  r  r  r  r  rS  r  r  r  r  r  r  r  r  r  r  r  r   r  r	  staticmethodr  r  r  r  r  r   r   r  r!  r'  Zon_server_eventr/  r0  r4  rA  r  r1   r,   r,   r*   r-   r
      s0  	                   


      	         	     
 :
:

	C  +         3        k

#C	-
(W	N
	@	$D    	   
   
   
9$!zP"0	H#	  3      r
   rX   )deploy_jobs)r   r  r   r   r  r   r   modulesr   Z
sqlalchemyr   Zsqlalchemy.sqlr   Zdateutil.relativedeltar   Zcmf.includeZcommon.fields.cmf_active_entityrE  Znot_in_any_listsrF  r
   rn   rK  r  r,   r,   r,   r-   <module>   sF                        