U
    r;dժ                    @   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S )    N)copyfields)person)desc)func)relativedelta)*zLST-filter_is_nonec                       s	  e Zd ZdZdddddddd	d
ddddddddddddgZddgZejjj	j
d Z
G dd dejjj	jZG dd dejjZejjejjddddZejjejjd dddd!Zejjejjd"dddd!Zejjejjd#dddd!Zejjejjd$dddd!Zejjejjd%d&dd'Zejjejjd(dd)Zejjejjd*dddd+d,Zejjejjd-d.gdd/ZG d0d dejjZejjejjd1d2d3d4d.d5gddd6d7d8d9gd:Z ejjejjd;d2d3d4d.d5gddd6d7d8d9gd:Z!ejjejj"d<d=Z#ejjejjdd>d?d@d?dAdBgdCZ$ejjejj%dDdEgddFZ&ejjejjdGd.gdd/Z'ejjejj(dHdIdJdKdLdMdNdOddPZ)ejjejj*dQdRdSdTdUdVdWdXZ+ejjejjdYdd)Z,ejjejjdZd=Z-ejjejjd[d=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_d`dadbdcdddedXZ1ejjejjdfddgZ2ejjejj"ddhdiddddjZ3ejjejjdkdd2dldmdndodpgdqZ4ejjejj"dhdrdsddtgdduZ5ejjejjdvdwddxZ6ejjejj"dyddzZ7ejjejj*d{d|d}d~dd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d]ddZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTd^ fdd	ZUeVd_ddZWeVd` fdd	ZXeVda fdd	ZYeVdb 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Zndd Zodd Zpdd Zqdd Zrdd ZsdddetdddZudd Zvdd Zwdd Zxdd d fdd
Zy fddZz 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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dcd'd(Zd)d* Zejjejjd+d,d,dd-Zd.d/ Zd0d1 Z fd2d3Zd4d5 Z fd6d7Z fd8d9Zd:d; Zd<d= Zddd>d?Z fd@dAZ fdBdCZd dDedE fdFdGZeee~dHdIdJZdKdL ZeVdMdN Z fdOdPZeVdedQdRZeVdfedTdUdVZdWdX ZedYdZ Zd[d\ Z  ZS (g  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                    s8   t  | | jr4| jr4| jr4| jjdd | j_d S )N:r   )super
_set_valueinstancevaluer   	partitionlogic_prefixselfr$   	__class__ $./common/models/cmf_active_entity.pyr"   5   s    z%CmfActiveEntity.logic_type._set_value)__name__
__module____qualname__r"   __classcell__r+   r+   r)   r,   
logic_type4   s   r1   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"   B   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)r6   raise_error)
isinstancestrr#   workflowloadget_default_statusr!   cast)r(   r$   r   r)   r+   r,   r>   G   s    zCmfActiveEntity.status.cast)
r-   r.   r/   captionnullableoptions_list_params	log_levelr"   r>   r0   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.   r/   r?   rL   rG   rA   Zoptions_list_query_allr+   r+   r+   r,   r   r   s
   u   Соисполнители
CmfProjectZ
CmfOrgUnitCmfPersonGroupZCmfRolezCmfProject.executorszCmfOrgUnit.tree_nodeszCmfPersonGroup.rg_memberszCmfRole.person)r?   rL   leftrG   Znested_fieldsu   Наблюдателиu!   Без подтверждения)r?   u   ТэгиZCmfTagmembersactivity_idrM   )rightr?   rF   backrefwidgetrA   u   Вложенияr   )r?   rL   rT   u   Ждем ответаu   Приоритетu   Минимальныйu   Низкийu   Обычныйu   Высокийu   Критичный)r4   r         0)r?   choicesdefaultr@   u   Оценка12345)r\   r]   r^   r_   r`   )r?   rZ   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!   Значение чекбоксаr7   )rU   r?   rJ   ZvirtualZrequired_fieldsrC   u   Вид деятельностиCmfActivity)r?   rF   r@   u!   Задача просрочена)r?   rC   u   Кеш: Тип статусаu   Открытu   В работеu+   Подтверждение закрытияu   Закрыто)OPENIN_PROGRESS	IN_REVIEWCLOSEDalways)r?   rZ   	load_moderC   rH   rD   u!   Настройка статусаZCmfStatusOpt)r?   rF   rT   rC   rD   u   кэш полейZlazy)r?   rC   rl   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.   r/   r?   rH   r@   r[   rs   r+   r+   r+   r,   approved   s
   rt   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	|  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   r4   r   TFrh   rW   r   )r!   _get_field_log_levelr   
is_changedr   r   rp   rq   
get_ownerscmf_modified_byr7   r   )r(   
field_nameargskwargsrB   Zsilent_owner_changesr)   r+   r,   ru     s6    	
z$CmfActiveEntity._get_field_log_levelc                 C   s   | j jS r5   )notify_valuer(   r+   r+   r,   _notifyJ  s    zCmfActiveEntity._notifyrg   c                 O   s   | j  |}|| _| S r5   )r;   r<   r=   r   )r(   r6   rz   r{   r   r+   r+   r,   set_default_statusN  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(   rz   r{   rJ   r+   r+   r,   _delete_commentsS  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(   rz   r{   attachr+   r+   r,   _delete_attachmentsW  s    z#CmfActiveEntity._delete_attachmentsc                 K   s   | j }| j|dd}t|dr4|jjr4d|kr4|d= | D ]\}}||jkr<t||| q<d|_| |_	d|j
_|  | jr|jjr| jjrtjjtjjd| j| j  |_|jjr| jjrtjjtjjd|_|jdd |S )uC   
        Создание задачи по шаблону
        T)r   copy_alllistsFZtzZ	only_data)r   r   hasattrr   r$   itemsr   setattris_templatecloned_fromr   rv   saver   is_nullZis_not_nulldatetimenowtimezoneutcr   )r(   r{   Znew_obj_namer#   attrr$   r+   r+   r,   create_from_template[  s"    
 z$CmfActiveEntity.create_from_templatec                 C   s   d S r5   r+   r~   r+   r+   r,   _calc_wf_simple_logic  s    z%CmfActiveEntity._calc_wf_simple_logicc                 C   s>   | j js| jjs| jrdS | jjr,| jr,dS | j p6| j| _dS )u   
        Вычисляем человека от которого требуются действия по задаче
        :return:
        N)r   rv   r   r   r~   r+   r+   r,   _calc_waiting_for  s    z!CmfActiveEntity._calc_waiting_forc                 C   s   dS )u   
        Общая функция вычисления диапазона плана и будильника
        :return:
        Nr+   r~   r+   r+   r,   
_calc_plan  s    zCmfActiveEntity._calc_planc                 C   s:   | j jsd S | j r0t| j jtr0| j j | _nd | _d S r5   )r   rv   r9   r$   r
   r&   r<   Zparent_logic_prefixr~   r+   r+   r,   _calc_parent_logic_prefix  s    z)CmfActiveEntity._calc_parent_logic_prefixc                 C   sb   | j js8| j js8| j j| jks8| j j| jks8| jjs8d S | j rR| jj| j d| _ n| j | _ d S )N)r   )r   rv   r   r6   r7   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)ri   rj   rh   ri   rj   )r   rv   r6   r7   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 r5   )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   rv   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(   Z_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root_parent_id)tree_parentrv   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   rv   r   agecmf_created_atrp   rq   r   r$   r   r   r   r   rw   )r(   msgr+   r+   r,   _check_alarm_date_valid  s@    




z'CmfActiveEntity._check_alarm_date_validc                 C   sD  |  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r@| jjr@| j|_d| jj |_| jj	j|_	| jj
j|_
| jjj|_| jjj|_| jjj|_| jjj|_| 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_taskc                   @   sj   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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)r-   r.   r/   r   r   __annotations__r   boolr   r   r   r   r   sl_controllersl_controller_strr+   r+   r+   r,   SimpleLogicOptionsJ  s   
r   rN   u   Проект: u   Бизнес-процесс: )r   dataclassesZ	dataclassr   r$   r   r   r   r   r   r   r   r   r   r   r   r;   Zenable_sl_control)r(   r   optionsr+   r+   r,   _get_sl_options6  sR    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   rn   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   rv   r   r   r   r   cmfr   CmfDateTimer   r   r   r   r   r   r   rp   rq   Zsystem_personZ_place_notifyr   r   Zhrefr$   r   r   )r(   shiftr+   r+   r,   _calc_deadlinep  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   rz   r{   r+   r+   r,   _clear_notify  s    zCmfActiveEntity._clear_notifyNc              	      sL  |  dddddddg tt jf d|i|}| jrD|| j | jrV|| 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	}|| |r| j	r| j	j
jd
kr| j	jr|| j	jg t }	|D ]&}
|dks:|
j|kr |	|
 q |	S )u   
        Получение списка конечных пользователей затронутых обьектом
        zcmf_owner.user_localzwaiting_for.user_localzresponsible.user_localzspectators.user_localzexecutors.user_localzcmf_author.user_localzparent.cmf_owner.user_localr   r   rN   N)r   setr!   all_relation_personsr   addr   r   
all_nestedr   r$   r   updater   r   r   
user_localro   )r(   r   r   Zwith_parent_ownerZinherit_executorsr{   resultr   r   retur)   r+   r,   r     s8       

"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_idr2   T)Zobj_idr2   r   Zclosed_lastorder_byc                    s*   g | ]"}|j r  |j j kr|qS r+   )r   lowerr$   ).0r   searchr+   r,   
<listcomp>  s       z7CmfActiveEntity.status_options_list.<locals>.<listcomp>r   rW   )rL   ZCmfWorkflowZget_status_listget)clsobject_fieldsr   r   slicer   r{   r   r+   r   r,   status_options_list  s$    

z#CmfActiveEntity.status_options_listc                    sx   |sg }|r^t jj|dgd}d }|rD|jrD|jjjdrD|jj}|ddd|gdddggg}t j	|f||d	|S )
Nz!root_parent.security_level_schemer3   r   CmfProject:r   r   r   systemT)r   r   )
rL   re   r   root_parentr3   r$   
startswith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              	      s4  |sg }|sg }|si }|s"dg}|o.| d}|r|drtjj |ddddgd}	|	r|rd|	jrd }
|	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	 |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   T)Zchild_modelsZ
return_setr3   INr   r   roles)r   all_optionsmodels_listmodels_filtersr   r   )r   r  rL   rN   r	  r   ZRelationCacheZget_children_dictr3   r$   r   r   r   r   
setdefaultro   r!   r  r   )r   r   r  r   r   r  r  r{   rM   projectZchildren_dictZ
model_namer)   r+   r,   responsible_options_list  sZ    
   


   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}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.|r8tj|d| gd}t	|dr8|j
}	|	r^t|	|r^|ddt|	|gg}|dd| jgg}|rPd|krP|ddd|d gdddggg}|ddddgdddggg}n|d kr|si }d!d"d#g|d$< |d% nj|d&krP|o|d}|r |ddd"dgdd"|ggg}|o.|d}|rP|dd'd"dgd'd"|ggg}|d(r| j|}|std)| d*|  | ||jd#kr|jd+krdd,d-g}d}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   r   r  r   r   r   )r   r   r   r   perm_security_levelr1   r   filter_activity_id)rd   re   CmfListrd   Zstrict_document_logic_typere   Zstrict_task_logic_typer  Zstrict_list_logic_typeNscheme_wf_idrM   r   z
scheme_wf.r   	scheme_wfr3   r
  Zcmf_model_namer   rR   r   Zfilter_activityr  F)r   r   r   r   r   TrK   r  r   r  Zcf_u   Не нашел поле u    в классе ZCmfCascadeChoicer   choice_parent_idr  )r  r   r   r   r   )r  )r  r   r  r   r   rL   CmfSchemeWfcmfutilget_obj_by_idr   r  getattrro   r  r   
ValueErrorZcustomrU   r!   r  )r   r  r  r   r   r   r   r{   Zlt_field_namer  r  rM   r   rR   Zcustom_fieldr  r)   r+   r,   r    s    
         



  




   z"CmfActiveEntity.field_options_listc                 C   s
   | j dkS )Nrj   )r7   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;   Trj   Frg   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   r9   r   r$   rL   rK   rc   r   rM   r   	Exceptionr   tree_node_is_branchZcmf_archived
tree_nodesr<   r"  )r(   r  rz   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 s^tjj r^tjj | _ | j sxtjjddgd| _ | j r| j dg d S )Nr   z
activity.*Zbusinessr	   )r   r   )	r   r   r   r   rp   rq   rL   rf   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js| jjdkrXtj	| _q| j
  |  jtj| jjjd7  _n,| jjr| j s| jjr| jjrtd d | _| jr| js| jjrtd | j
  | js| jjdkr| jjrtd | j
  | j s^| jjr^| jjr^| jjjdkr^| jjjdkr^| jrT| 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| j
  d S )	Nr   )Zsecondsu   Будильник сброшен т.к. у этого бизнес-процесса в статусе будильник не заданu   Будильник установлен. Задача с крайним сроком не может быть без будильника.)rg   rj   uW   Будильник установлен тк задача уже выполняетсяrg   rj   )r   r   rv   r   r   r;   Z
next_alarmr   rp   http_client_date_hackr   r   r   r$   r   r   r   r6   r   r   r7   r   r~   r+   r+   r,   _calc_alarm_date  sX    





"
z CmfActiveEntity._calc_alarm_datec                 C   s   | j rd| _d S )NT)r   rt   r~   r+   r+   r,   _calc_approved  s    zCmfActiveEntity._calc_approvedc                 C   s   d S r5   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   r1   rv   r  r!   
_calc_coder  get_code_prefixr$   
rpartition)r(   r   r)   r+   r,   r/    s    
 zCmfActiveEntity._calc_codec                    s(   | j r| j j }|r|S tt|  S r5   )r1   Zobj_code_prefixr<   r!   r
   r0  )r(   Zcode_prefixr)   r+   r,   r0  &  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 )Nr3   r   r   textr   r   rt   r   r   Zcmf_modified_atc                 S   s   g | ]}| d dddgqS r3   r   r   loginto_jsonr   ir+   r+   r,   r   =  s     z9CmfActiveEntity.get_cache_fields_json.<locals>.<listcomp>r   c                 S   s   g | ]}| d dddgqS r3  r5  r7  r+   r+   r,   r   @  s     r   r   Zcolorr6   Z	card_namer   
cmf_authorr4  r   r   r   )	r6  r   r   r   r   r9  r   r   r   )r(   r   r+   r+   r,   get_cache_fields_json/  sB    z%CmfActiveEntity.get_cache_fields_jsonc                 C   sz   | j r| jjsd S | j jr$| j r$d S | j s<| j| | _ d S | jjrh| jjrh| jj| }|| j krhd S | j| | _ d S r5   )r1   r  rv   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 r5   )r   rv   r   r  rL   r  Zcalc_schemer~   r+   r+   r,   _calc_scheme_wfw  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 r5   )r  rv   r1   r   r;   Zcalc_workflowr~   r+   r+   r,   _calc_workflow  s    zCmfActiveEntity._calc_workflowc                 C   s   d S r5   r+   r~   r+   r+   r,   _calc_default_workflow  s    z&CmfActiveEntity._calc_default_workflowc                 C   s   d S r5   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 r5   )r!   _acl_subjects_is_changedr   rv   r   r   r   r~   r)   r+   r,   r@    s    
z(CmfActiveEntity._acl_subjects_is_changedc                    s>   t   }|| j | jr(|| j | jr:|| j |S r5   )r!   _acl_subjects_list_level_writeextendr   r   ro   r   r(   r   r)   r+   r,   rA    s    
z.CmfActiveEntity._acl_subjects_list_level_writec                    s   t   }|| j |S r5   )r!   _acl_subjects_list_level_readrB  r   rC  r)   r+   r,   rD    s    
z-CmfActiveEntity._acl_subjects_list_level_readc              +      sb   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)g* S )*Nr	   r   r   r   r;   r&   parent.cmf_ownerparent.cmf_owner_assistantszparent.activityzparent.disable_simple_permr  r9  zstatus.ordernozstatus.workflowr   r   r   cache_status_optr   Z
cmf_importrx   sharelink_hashzlogic_type.coder  r   r   r   r   r   r   r   r   r   r   r   r   r   r   ui_view_formr  r  )r!   save_preload_fieldsr~   r)   r+   r,   rJ    sX                        z#CmfActiveEntity.save_preload_fieldsc                 C   s   ddddddddd	d
dddgS )Nr   r2  r   r   r   commentsr   attachmentsr   r7   favorite_forZ
tmp_filterrI  r+   r~   r+   r+   r,   simple_perm_allow_fields  s             z(CmfActiveEntity.simple_perm_allow_fieldsc                 C   s   ddgS )NrM  rI  r+   r~   r+   r+   r,   project_perm_allow_fields  s    z)CmfActiveEntity.project_perm_allow_fieldsc              	   C   s  | j r
d S tjdrd S | jr:| jjjdkr:| jjr:d S d}| jddD ]2}|j| 	 krJ|j
dsJ|jdsJd} q~qJ| jjr| jjrd}| 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r<| jjp>d d| jrT| jjpVd d| jrl| jjpnd d	}tt dd || j| j| jh }|r|dd!|d d  7 }t"|dkr|d7 }n|d7 }n|d7 }t#j$j%|d d S )NimportrN   FT)rv   Zcache_Z_idrX   )r   r   r   r   Zchild_tasksZdepended_tasksZaffected_tasksu   Это действие над u4    разрешено только Владельцу(r.  u    ) или Исполнителю(uW   ) или Временному исполнителю(поле "Ждем ответа": )c                 S   s
   t | jS r5   )r:   r   )xr+   r+   r,   <lambda>!      z4CmfActiveEntity._check_simple_perm.<locals>.<lambda>u   , а так же z, 
   u
   , и др..)message)&r   osenvironr   r   r$   r   Zdisable_simple_permvaluesrN  r  endswithr   rv   r   r   r   r   r   Zcheck_owner_permsr   r   r   rw   rp   rq   r   r   r   r   r   sortedmaprr   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  s`    



V

z"CmfActiveEntity._check_simple_permc                 O   s4   |    |   |   |   |   |   d S r5   )r)  r<  r;  r=  r   r-  r(   rz   r{   r+   r+   r,   _save_template2  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 r5   )r   rv   r   r;   r   r   Zrun_transitionr$   r~   r+   r+   r,   _exec_transition;  s
    z CmfActiveEntity._exec_transition)comment_appendchanged_fields)re  c                O   sD   |  D ]\}}t| || q| jdd |r@tj|| d  d S )NT)is_task_transition_run)r2  r   )r   r   r   rL   r   )r(   rd  re  _args_kwargskeyvalr+   r+   r,   task_transition_runH  s    z#CmfActiveEntity.task_transition_runc                 C   s   | j r| jr| j | _ d S r5   )rI  r   Zui_namer   r~   r+   r+   r,   _calc_ui_view_formU  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 d S )Nz_calc_owner endz_calc_parent endz_calc_activity endz_calc_scheme_wf endz_calc_periodic endz_calc_logic_type endz_calc_tree_parent endz_calc_perm_security_level endz_calc_workflow endz_calc_default_workflow endz_calc_status endz_calc_status_timestamps endz_calc_plan endz_calc_approved endz_calc_deadline endz_calc_alarm_date endz_calc_wf_simple_logic endz_calc_waiting_for endz_check_alarm_date_valid endz_calc_name endz_calc_parent_logic_prefix endz_calc_sharelink_hash endz_calc_ui_view_form end/_calc_perm_security_level_allowed_ids_cache end)r   rp   debugr   r)  r<  r?  r   r;  Z_calc_tree_parent_calc_perm_security_levelr=  r>  r   r   r   r,  r   r+  r   r   r   r-  r   _calc_sharelink_hashrl  +_calc_perm_security_level_allowed_ids_cacher(   rh  r+   r+   r,   recalc_fieldsY  sb    






















zCmfActiveEntity.recalc_fieldsc                 C   s   d S r5   r+   r~   r+   r+   r,   do_status_is_changed  s    z$CmfActiveEntity.do_status_is_changedr   )rf  depthc             	      sV  | j jr| js|stjjdd| j jjggdd| j jgdddggd}|srtjjddd gdd| j jgdddggd}|rt	d| j d	|j d	| j jj d	| j j dd
 | j jr| 
  tjj t_| jr| jjt_d | _| jr| j|| t j|d|i|}td |S | jf | |   td t j|d|i|}td |S )NZstatus_fromr
  Z	status_tor   Ztrans_form_showTr   zmust_transition_run rn   r   ru  zsuper().save endzhandle_mention_persons end)r   rv   r   rL   ZCmfTransr   r   r3   r   r   rt  r   r   r   r   rp   r*  r   r$   r   rb  r!   r   rn  rs  handle_mention_persons)r(   rf  ru  rz   r{   Ztransr   r)   r+   r,   r     sB    2



zCmfActiveEntity.savec                    sV   t   | _td| j d t jf | | jr8| jsRt	j
| | jrJdndd d S )Nzsave start (rQ  r   r   before_save)time_CmfActiveEntity__start_tsrp   rn  r3   r!   before_save_hookr   r   rL   CmfAutomationCrudTrigger	crud_hookr(   r{   r)   r+   r,   rz    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)rc  rp   rn  ZconfigZBZPYTHON_ENABLEDr;   Zsave_eval_coder<   execr$   globalslocalsr   r   r   rL   r{  r|  r!   before_save_data_hookr3   rx  ry  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   rw  r~  )rL   r{  r|  r!   r   ra  r)   r+   r,   r     s    zCmfActiveEntity.deletec                    s   |   | _t   d S r5   )r:  cache_fieldsr!   _update_cache_fieldsr~   r)   r+   r,   r    s    
z$CmfActiveEntity._update_cache_fields)include_templatesc                   s   |s| dd t j||S Nr   F)r  r!   r   r   r  rz   r{   r)   r+   r,   r   	  s    zCmfActiveEntity.listc                   s   |s| dd t j||S r  )r  r!   slistr  r)   r+   r,   r    s    zCmfActiveEntity.slistc              
   C   s\   | j dgd | jD ]B}t|jd,}tj||jd}||  |	  W 5 Q R X qdS )uD    Копирование вложений для CmfTask, CmfDocumentrL  r   rbr   r   N)
r   rL  openfull_path_filerL   r   r   upload_filereadr   )r(   r   
attachmentfileZnew_attachmentr+   r+   r,   copy_attachments  s    
z CmfActiveEntity.copy_attachments)r  r   )r   r  r   c             
   O   s   ddl }|rd}| dddddg |  }||_d|j_|  |jdd	 |r| jD ]N}t	|j
d
,}	tj||jd}
|
|	  |
  W 5 Q R X |||
 qX|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_imgr   r  r  )urllibr   Zcloner   r1   rv   r/  r   rL  r  r  rL   r   r  r  _replace_attachmentr   )r(   r   r  r   rz   r{   r  Zobj_copyr   f
new_attachr+   r+   r,   r     s,    
 
zCmfActiveEntity.copyu   Права доступаr[   u   —u   Полныеu   Только чтениеu   Приватные)r[   fullrE   private)rC   r?   r[   r@   rZ   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   rm   c                 3   s   | ]}  V  qd S r5   )choice)r   _Zalphabetsecretsr+   r,   	<genexpr>  s     z7CmfActiveEntity._calc_sharelink_hash.<locals>.<genexpr>r   r#  r   rH  r3   perm_policy_sharelinkr   z#_calc_sharelink_hash child update: Tforcer   )r  rv   r   rH  stringr  Zascii_lettersdigitsrr   ranger
   Ziter_subclassesr   r3   r$   rp   rn  rp  r   )r(   r  r  Z	model_clsr'  r+   r  r,   rp  y  s"     z$CmfActiveEntity._calc_sharelink_hashc                 C   s   d| _ |   dS )u&   Метод сброса sharelink_hashN)rH  rp  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   writerK  r!  r   access_levelsubjectsr   r  z%WARN! Unknown perm_policy_sharelink: z. Set deny policyr  )r  rL   CmfAccessRuleperm_aclrO   sharelink_groupr  ro   r  r   rp   rn  )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)r4  rE   r  rJ   r  rK  r  r  r  )perm_policy_anonymousperm_policy_guestrL   r  r  rK   r   r  ro   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   rA  rD  r!   _acl_scaffold)r(   Zwriter_listZreader_listr)   r+   r,   r    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!   _calc_perm_has_aclr  rv   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  rv   r  r  r   r  r  r  r@  r!   _calc_perm_aclr~   r)   r+   r,   r  +  s2    	
zCmfActiveEntity._calc_perm_aclc                 C   s   | j jr4| jr0| jjjdr0| jjd| dd d S | jjrj| 	dg t
| jdrj| jj rj| jj | _ d S | jdkr| jr| jjr| jjjdr| 	dg | j s| jjr| jjjr| jjj| _ d S d S )	Nr  zPPP-TSK-SET-SECURITYT)r   r8   zperm_parent.perm_security_levelr  re   z=root_parent.security_level_scheme.default_task_security_level)r  rv   r  r   r   r$   r  Zcheck_project_role_accessr  r   r   r   r  Zdefault_task_security_levelr~   r+   r+   r,   ro  A  s,    	

z)CmfActiveEntity._calc_perm_security_levelc                 C   s  | dsdS |dkr,| j r(| jgS g S |dkrH| j rD| jS g S |dkrd| j r`| jS g S |dkr| j r~| jgS g S |dkr| j r| jS g S |dkr| d	g | jr| jjr| jjgS g S |d
kr| dg | jr| jjr| jjS g S |dkr| d	dddg | jr| jj	j
dkrt }| jjrN|| jj | jjrf|| jj | jjr|| jj  | jjr|| jj  t|S g S |dkr| j r| jgS g S |dkr| j r| jgS g S |dkr^t| dr| j r| jgS t| drZ| dg g }| jD ]}|jr:||j q:|S g S |dkrptjgS |dkr|  S |dkr|  S dS )u?  
        Получение значение по шаблонным объектам.

        Возвращает список (в том числе пустой), если передан шаблонный объект
            или None, если объект не является шаблонным
        zvar:Nzvar:responsiblezvar:executorszvar:spectatorsz	var:ownerzvar:owner_assistantszvar:project_ownerrE  zvar:project_owner_assistantsrF  zvar:project_userszparent.executorszparent.spectatorsrN   z
var:authorzvar:waiting_forzvar:component_ownerdefault_owner
componentszcomponent.default_ownerzvar:current_userzvar:followerszvar:all_related_users)r  r   r<   r   r   r   r   r   r   r$   r   r   r   r   r   r   r9  r   r   r  r  ro   rp   Zcurrent_userget_all_followersr   )r(   Zobj_coderesZcomponent_ownersZ	componentr+   r+   r,   extract_var_objf  s    







 










zCmfActiveEntity.extract_var_objc           	      C   s  | j js8|s8| jjs8| jjs8| jjs8| jjs8| jjs8d S td | j sb| j	rTd | _	td d S t
 }t
 }| dddddg | j jD ] }|jr| |jj}|d kr|jr||jj n||jj n.|D ](}|jr||jj q||jj q|jr| |j |jD ]}| | s,qtt| | tjrz| | D ],}|jrf||jj n||jj qJn.|jr|| | jj n|| | jj qqd |ksd |krtdd	d
 t|t|d| _	td d S )Nz1_calc_perm_security_level_allowed_ids_cache startrm  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root_parent.cmf_ownerz root_parent.cmf_owner_assistantsuf   DEV: _calc_perm_security_level_allowed_ids_cache None должны отфильтровываться!Tr   )r  rE   )r  rv   r   r   r9  r   r  rp   rn  %perm_security_level_allowed_ids_cacher   r   Zsecurity_level_rulesZaccess_memberr  r   Zaccess_readonlyr   Zaccess_member_idr$   r3   Zaccess_task_fields
issubclasstyper   Z
CmfM2MBaser   r   )	r(   r  Zallowed_idsZallowed_ids_readonlyZruleZextracted_membersZextracted_memberry   r   r+   r+   r,   rq    sv    	



z;CmfActiveEntity._calc_perm_security_level_allowed_ids_cachec                    s   |    d| _t   d S )Nr[   )r  r  r!   disable_aclrr  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	recursion)returnc                   s*  |dkrt ddd ddddd	d
ddddg
 t jf |}jD ]N}|jdkrl|j|krF||j qF|dkr||j qF|j	rF||j qF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   r9  zfollowers.personz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  r8   Zobject_instanceZchecking_personZperm_security_level_allowed_ids)rL   r_  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  r3   r   r  r   r   ZCmfACLNotInitializedError)r(   r  rz   r{   r  Zfollowerr  r)   r  r,   r    sJ          



z!CmfActiveEntity.get_all_followers)r2  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,   rS  7  rT  z,CmfActiveEntity.parse_text.<locals>.<lambda>zdata-object-id)bs4ZBeautifulSoupZfind_allr  r  Zattrsro   )r2  bsr   r  r   r+   r+   r,   
parse_text3  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)
r2  rv   r   r   r  r   r   rL   CmfEventdo_event)r(   Zobjs_oldZobjs_newr   r+   r+   r,   rv  =  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 )!Nrd   rN   rc   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   Z  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>c  s      z8CmfActiveEntity.public_parent_ui_get.<locals>.<dictcomp>c                    s   i | ]}|t  d  |qS )r  )r  r  )r   r+   r,   r  g  s      )r   r   r  Zget_model_by_namer   rp   Zsharelink_access_requestr3   Zsharelink_access_objrn  r   )r   Zchild_idZallowed_objectsZallowed_fieldsZscheme_fieldsr+   )r'  r   r,   public_parent_ui_getL  s0    

     z$CmfActiveEntity.public_parent_ui_getc                    s(   t jj t_|   t j|| d S r5   )	r   r   r   r   rp   r*  rs  r!   _save_importra  r)   r+   r,   r  l  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)Zsimpler   r!  )rd   rc   r   )ri  reverse)
operatorr  ro   r  r  r&  r   r!  r   sort)
r   node_idr  sort_byinclude_contentr  	node_listr   r   noder+   r+   r,   _macros_page_tree_node_listv  s,      


z+CmfActiveEntity._macros_page_tree_node_listrW   )ru  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  ru  r  r  r  )r  r%  macros_page_tree_getr3   r&  )r   r  ru  r  r  r  r  r  r+   r+   r,   r    s    
  
z$CmfActiveEntity.macros_page_tree_getc                 C   s   |  | jj||| _d S r5   )_replace_attach_urlr2  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  replacer3   r$   ZurlZquoteZurl_previewZurl_preview_img)r2  r   r  r  r+   r+   r,   r    s(    
z#CmfActiveEntity._replace_attach_urlc                 O   s  | j r tjj| df|| nt| dr6| jjr6| jjr | jdkrn| jjdkrntjj| df|| n| 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|| nT| jdkr| jdkr| jjdkrtjj| df|| ntjj| d	f|| ntjj| d	f|| t| d
rb| j	jrbtjj| df|| | j
jrtjj| df|| t| dr| jjrtjj| df|| tjj| df|| d S )NZcreatedr   rj   closedZreopenedrh   Zwork_startedZwork_stoppedZchanged_statusr   assignedZmovedresult_textZresolvedupdated)r   rL   r  r  r   r   rv   r7   r   r   r   r  ra  r+   r+   r,   _do_event_save  s.    


zCmfActiveEntity._do_event_save)rg   )NTTF)NNNNN)NN)NNNNNF)NNNNN)F)F)FNF)NrW   FNF)r-   r.   r/   ZabstractZfields_orderZorderingcommonr   cmf_active_entityr
   Zessential_child_modelsr1   r   Z	CmfStatusr   ZFieldr   r   r   r   r   r   ZCmfRelationr   Z	CmfStr256r   ZCmfStr64r   ZCmfGenericRelationr   r   ZCmfGenericM2Mr   r   rb   r   r   ZCmfGenericBackrefrL  r   ZCmfChoiceIntr   Z	CmfChoicer   r   r   r   r   r   r   r   r   r   r  r   Z
is_penaltyr7   rG  ZCmfObjectJsonr  rt   Z
CmfBackrefr  ru   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(  r)  r+  r,  r-  r/  r0  r:  r;  r<  r=  r>  r?  r@  rA  rD  rJ  rN  rO  r`  rb  rc  dictrk  rl  rs  rt  r   rz  r  r   r  r   r  r  r:   r   r   r  r  r  r  rp  r  r  rH  r  r  r  r  r  r  ro  r  rq  r  r  r   r  staticmethodr  rv  r  r  r  r   r  r  r  r  r0   r+   r+   r)   r,   r
      s                     


              	     
 9
2

	:  (         /        k

#:	-

T	K3	"4    	   
   
   
9$%QF"+	
r
   )r   rx  r   r   r  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
   r+   r+   r+   r,   <module>   s   