B
    f'                @   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                   sN  e Zd ZdZdddddddd	d
ddddddddddddgZdgZdZejj	j
jdddddd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d0d1Zejjejjd2d3gdd4ZG d5d dejjZ ejjejj!d6d7d8d9d3d:gddd;d<d=d>gd?Z"ejjejj!d@d7d8d9d3d:gddd;d<d=d>gd?Z#ejjejj$dAd#dBZ%ejjejj!ddCdDdEdDd#dFdGgdHZ&ejjejj'dIdJgddKZ(ejjejjdLd3gdd4Z)ejjejj*dMdNdOdPdQdRdSdTdUd#dVZ+ejjejj,dWdXdYdZd[d\d]d^Z-ejjejjd_dd.Z.ejjejjd`dd.Z/ejjejjdadbZ0ejjejjdcdbZ1ejjejjdddbZ2ejjejj,dedfdgdhdidjdkdld^Z3ejjejjdmddnZ4ejjejj$d#dodpdd#ddqZ5ejjejjdrdd7dsdtdudvdwgdxZ6ejjejj$dodydzdd{gd#d|Z7ejjejjd}d~dd#dZ8ejjejj$dd#d#dZ9ejjejj,dddddddd#dddZ:ejjejjdddEd#ddZ;ejej<dd#dddZ=G dd dejj$Z>ejjejj?ddddZ@ fddZAeBdd ZCdddZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVd fdd	ZWeXdddĄZYeXd fddƄ	ZZeXd fddȄ	Z[eXd fddʄ	Z\eXd fdd̄	Z]eBdd΄ Z^e^j_dd΄ Z^d#dМ fdd҄
Z`d#dМ fddԄ
Zaddք Zbdd؄ Zcddڄ Zddd܄ Zeddބ Zf fddZg fddZhdd Zidd Zjdd Zkdd Zldd Zmdd Zn fddZo fddZp fddZq fddZr fddZsdd Ztdd Zudd Zvdddewd ddZxdd Zydd Zzdd Z{d	d
 Z|dd Z}ddd fdd
Z~ fddZ fddZ fddZ fddZeXdd fdd
ZeXdd fdd
Zdd ZeX fd d!Zd#d#dd"eeed# f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/d0d1d2d3d-Zejjejj,d#d4d'd#d(d/d0d1d2d3d-Zejjejj,d#d5d'd#d(d/d0d1d2d3d-Zejjejj?d6d7dd8Zd9d: Zdd;d<Zd=d> Zejjejjd?d@d@d#dAZdBdC ZdDdE ZdFdG Z fdHdIZdJdK Z fdLdMZd fdNdO	ZdPdQ ZddRdSZddTdUZ fdVdWZ fdXdYZddZed[ fd\d]Z fd^d_Zeeed`dadbZdcdd ZeXdedf Z fdgdhZeXddidjZeXdedldmdnZdodp Zedqdr Zdsdt Zeedudvdwdx Zddzd{ZeXd|d} ZeXddd#d#d#d~dddZeXd fdd	Zdd ZeeddgddddeedddZ  ZS (  CmfActiveEntityTcodenamestatus	cmf_ownerresponsiblepriority
alarm_datetags	executors
spectators
no_controlwaiting_formarkZtime_estimateplan_start_dateplan_end_dateperiod_intervalperiod_next_datedeadlineparentcompanyz-ordernoarchivedisable_aclmacros_page_tree_gettask_transition_runpublish_for_invitedarchive_restore)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'   ?   s
    z%CmfActiveEntity.logic_type._set_value)__name__
__module____qualname__r'   __classcell__r/   r/   )r.   r0   
logic_type>   s   r5   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_type)r-   r)   )r.   r/   r0   r'   N   s    z!CmfActiveEntity.status._set_valuec                sB   t |tr6| jr6| jj r6| jjj|dd}|r6|S t |S )NF)r9   raise_error)
isinstancestrr(   workflowr+   get_default_statusr&   cast)r-   r)   r   )r.   r/   r0   r@   S   s
    zCmfActiveEntity.status.cast)
r1   r2   r3   captionnullableoptions_list_params	log_levelr'   r@   r4   r/   r/   )r.   r0   r   G   s   u"   Дата смены статусаF)rA   visibleno_aclu"   Дата начала работы)rA   readonlyrE   rF   u(   Дата окончания работыu(   Дата на подтверждениеu   Дата закрытияu   КонтрагентZ
CmfCompany)rA   modellinkableu   Название)rA   indexu
   Номерu3   Код в реальном мире из жизни)rA   uniquerJ   rG   commentu   Постановщик	CmfPerson)rA   modelsrI   c               @   s$   e Zd ZdZdgZdZdgZdZdS )zCmfActiveEntity.responsibleu   ИсполнительrM   T	parent_idN)r1   r2   r3   rA   rN   rI   rC   Zoptions_list_query_allr/   r/   r/   r0   r      s
   u   Соисполнители
CmfProjectZ
CmfOrgUnitCmfPersonGroupZCmfRolezCmfProject.executorszCmfOrgUnit.tree_nodeszCmfPersonGroup.rg_memberszCmfRole.person)rA   rN   leftrI   Znested_fieldsu   Наблюдателиu!   Без подтверждения)rA   defaultu   ТэгиZCmfTagmembersactivity_idrO   )rightrA   rH   backrefwidgetrI   rC   u   Вложенияr$   )rA   rN   rW   u   Ждем ответаu   Приоритетu   Минимальныйu   Низкийu   Обычныйu   Высокийu   Критичныйu   Блокирующий)r8   r            0)rA   choicesrS   rB   u   Оценка12345)r_   r`   ra   rb   rc   )rA   r^   u   Будильникu   Крайний срокu&   Плановая дата начала)rA   u.   Плановая дата завершенияu   Дата повторенияu%   Интервал повторенияu   Ежедневноu   Раз в 2 дняu   Еженедельноu   Ежемесячноu   Ежеквартальноu   Ежегодно)r_   r`   7Z30Z90Z365u   Склонирован из)rA   rG   CmfBoolu   Шаблон)rE   rX   rA   rG   rS   rJ   u!   Родительская нода	CmfFolderZCmfActiveEntityFilterCmfDocumentCmfTaskZCmfComponent)rA   rB   rN   u   Сделаноu!   Значение чекбоксаr:   )rX   rA   rL   ZvirtualZrequired_fieldsrE   u   Вид деятельностиCmfActivity)rA   rH   rB   rI   u!   Задача просрочена)rA   rE   rS   u   Кеш: Тип статусаu   Открытu   В работеu+   Подтверждение закрытияu   Закрыто)OPENIN_PROGRESS	IN_REVIEWCLOSEDalways)rA   r^   	load_moderE   rJ   rF   u!   Настройка статусаZCmfStatusOpt)rA   rH   rW   rE   rF   u   кэш полейZlazy)rA   rE   ro   rF   c               @   s$   e Zd ZdZdZdZdZdd ZdS )zCmfActiveEntity.approvedu1   Согласовано руководителемTFc             C   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/   r0   	html_diff  s    
z"CmfActiveEntity.approved.html_diffN)r1   r2   r3   rA   rJ   rB   rS   rv   r/   r/   r/   r0   approved
  s
   rw   u   ПодписчикиZCmfFollower)rA   rW   rH   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 )
Nr[   r   r8   r   TFrk   rZ   r   )r&   _get_field_log_levelr   
is_changedr   r   rs   rt   
get_ownerscmf_modified_byr)   r:   r   )r-   
field_nameargskwargsrD   Zsilent_owner_changes)r.   r/   r0   rx      s6    	
z$CmfActiveEntity._get_field_log_levelc             C   s   | j jS )N)ZnotifyZ_value)r-   r/   r/   r0   _notifyZ  s    zCmfActiveEntity._notifyrj   c             O   s   | j  |}|| _| S )N)r>   r+   r?   r   )r-   r9   r}   r~   r   r/   r/   r0   set_default_status^  s    z"CmfActiveEntity.set_default_statusc             O   s.   x(t jjdd| gdD ]}|j|| qW d S )Nr   z==)filter)rN   
CmfCommentlistdelete)r-   r}   r~   rL   r/   r/   r0   _delete_commentsc  s    z CmfActiveEntity._delete_commentsc             O   s.   x(t jjdd| gdD ]}|j|| qW d S )Nr   z==)r   )rN   r$   r   r   )r-   r}   r~   attachr/   r/   r0   _delete_attachmentsg  s    z#CmfActiveEntity._delete_attachmentsc             K   s   | j }| j|d|ddd}t|dr>|jjr>d|kr>|d= x*| D ]\}}||jkrHt||| qHW d|_	| |_
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)tz)	only_data)r   r   gethasattrr   r)   itemsr   setattris_templatecloned_fromr   ry   saver   Zis_not_nullr   cmf_created_atdatetimenowtimezoneutc)r-   r~   Znew_obj_namer(   attrr)   Zdeadline_deltar/   r/   r0   create_from_templatek  s(    
z$CmfActiveEntity.create_from_templatec             C   s   d S )Nr/   )r-   r/   r/   r0   _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   ry   r   r   )r-   r/   r/   r0   _calc_waiting_for  s    z!CmfActiveEntity._calc_waiting_forc             C   s   dS )u   
        Общая функция вычисления диапазона плана и будильника
        :return:
        Nr/   )r-   r/   r/   r0   
_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 )N)r   ry   r<   r)   r	   r*   r+   Zparent_logic_prefix)r-   r/   r/   r0   _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   ry   is_nullr9   r:   r>   r?   )r-   r/   r/   r0   _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)rl   rm   rk   rl   rm   )r   ry   r9   r:   status_modified_atset_nowoldnewstatus_in_progress_endstatus_in_progress_startstatus_review_atstatus_closed_at)r-   r/   r/   r0   _calc_status_timestamps  s     







z'CmfActiveEntity._calc_status_timestampsc             C   s&   | j s
d S | js"| j  |   d S )N)r   r   r   _cacl_next_period)r-   r/   r/   r0   _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   )days)Zmonths)r   r   r   r   r   intr   r)   	timedeltar   r   r   r   )r-   Zcur_dateZ
shift_daysZshift_monthsr/   r/   r0   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   ry   r   	cmf_alert)r-   r/   r/   r0   _calc_owner  s    zCmfActiveEntity._calc_ownerc             C   sh   dddg}| j r&ddddgdddgg}|dd| jgg}x,tjj|ddd	d
dgdD ]}||  qRW d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_namerN   Z
CmfTriggerr   Zcheck)r-   _filterZtriggerr/   r/   r0   _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_parentry   Z_node_parentr   load_fieldssave_prepare)r-   r   r/   r/   r0   _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    Сдвиньте крайний срок если уверены.T)r   r[   u   Нельзя сдвигать будильник блокирующей задачи вперед.Возьмите в работу или обратитесь к постановщику.)r   ry   r   ager   rs   rt   r   r)   r   r   r   r   rz   )r-   msgr/   r/   r0   _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 )Nzparent.sl_deadline_shiftzparent.sl_only_owner_approvezparent.sl_deny_no_approvez0parent.sl_allow_executor_change_nofatal_deadlinezparent.sl_task_need_approvezparent.sl_task_only_owner_closezparent.sl_readonly_closed_taskzworkflow.enable_sl_controlzworkflow.sl_deadline_shiftzworkflow.sl_only_owner_approvezworkflow.sl_deny_no_approvez2workflow.sl_allow_executor_change_nofatal_deadlinezworkflow.sl_task_need_approvez!workflow.sl_task_only_owner_closez workflow.sl_readonly_closed_taskz5workflow.sl_deny_closing_task_before_closing_subtasksu.   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)r1   r2   r3   r   r   __annotations__r   boolr   r   r   r   r   r   r   sl_controllersl_controller_strr/   r/   r/   r0   SimpleLogicOptionsb  s   
r   rP   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/   r0   _get_sl_optionsL  sX    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   rq   u^    сдвинул крайний срок задачи<br>
                Было:&nbsp;&nbsp;u)   <br>
                Стало:<b>&nbsp;z1<b><br>
                <a target="_blank" href="z">z</a>
                )r   r[   )r   r   r   r   r   )r   ry   r   r   r   r   cmfr   CmfDateTimer   r   r   r   r   r   r   rs   rt   Zsystem_personZ_place_notifyr   r   Zhrefr)   r   r   )r-   shiftr/   r/   r0   _calc_deadline  s     4
4zCmfActiveEntity._calc_deadlinec             O   s   t jj|| d d S )N)	person_idobj)rN   Z	CmfNotifyZclose_open_notifies)r-   r   r}   r~   r/   r/   r0   _clear_notify  s    zCmfActiveEntity._clear_notifyNc          	      s|  |  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 }	x.|D ]&}
|dksh|
j|krN|	|
 qNW |	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   rP   N)r   setr&   all_relation_personsr   addr   r   
all_nestedr   r)   r   updater   r   r   
user_localrr   )r-   r   r   Zwith_parent_ownerZinherit_executorsr~   resultr   r   retu)r.   r/   r0   r     s6    


"
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_idr6   T)Zobj_idr6   r   Zclosed_lastorder_byc                s*   g | ]"}|j r  |j j kr|qS r/   )r   lowerr)   ).0r   )searchr/   r0   
<listcomp>  s    z7CmfActiveEntity.status_options_list.<locals>.<listcomp>r   rZ   )rN   ZCmfWorkflowZget_status_listr   )clsobject_fieldsr   r   slicer   r~   r   r/   )r   r0   status_options_list  s     

z#CmfActiveEntity.status_options_listc                s~   |d krg }|o| d}|o&| d}|dddd gdd|gggdddd gdd|gggdd| jgg}t j|f||d	|S )
Nlogic_type_idr   r   ft_logic_typesz==INft_projectsft_model)r   r   )r   r   r&   field_options_list)r   relation_field_namer   r   r~   Zft_logic_type_idZft_project_id)r.   r/   r0   resolution_options_list  s    z'CmfActiveEntity.resolution_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)r7   r   r   r   z==systemT)r   r   )rN   rh   r   projectsecurity_level_schemer&   r   )r   r   r   r   r~   Ztaskr   )r.   r/   r0    perm_security_level_options_list  s    
z0CmfActiveEntity.perm_security_level_options_listc          	      s  |sg }|sg }|si }|s"dg}|o.| d}|rB|drBtjj |dddddgd	}	|	rB|rn|	jrBd }
|	jrtjj|	jj	d|d
d}
|
rB|	j
r|	j
j	j|
krt |
|	j
j	j< |
|	j
j	j |	j
j	jj	 x8|	jD ].}|j|
krt |
|j< |
|j |jj	 qW x0|D ](}||g dd|
 |g gg||< qW |ddd
gg}|d t j| jjf||||||d|S )NrM   rO   rP   Zproject_typer   r   filter_responsibler   )r7   r   T)Zchild_modelsZ
return_setr7   r   r   z==roles)r   all_optionsmodels_listmodels_filtersr   r   )r   
startswithrN   rP   r   r   ZRelationCacheZget_children_dictr7   r)   r   r   r   r   r   
setdefaultrr   r&   r   r   )r   r   r  r   r   r   r   r~   rO   r   Zchildren_dictZ	assistantZ
model_name)r.   r/   r0   responsible_options_list  sF    



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}|rFd|krF|ddd|d gdddggg}n|dkr|d n|d kr |o|d}|r|ddd!dgdd!|ggg}|o|d}|rF|dd"d!dgd"d!|ggg}n&|d#krF| j|f||||d|S |d$r| j|}|s|t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_levelr5   r   filter_activity_id)rg   rh   CmfListrg   Zstrict_document_logic_typerh   Zstrict_task_logic_typer  Zstrict_list_logic_typeNscheme_wf_idrO   )r7   r   z
scheme_wf.)r   	scheme_wfr7   r   cmf_model_namer   rU   r   Zfilter_activity)r   r   r   r   r   z==Zfilter_project
resolutioncf_u   Не нашел поле u    в классе TZCmfCascadeChoicechoice_parent_idr   F)r  r   r   r   r   )r  )r  r   r   r   r   rN   CmfSchemeWfcmfutilget_obj_by_idr   r	  getattrrr   r   r  r   
ValueErrorZcustomrX   r&   r   )r   r   r  r   r   r   r   r~   Zlt_field_namer	  r  rO   r   rU   custom_fieldr  )r.   r/   r0   r   E  s    









z"CmfActiveEntity.field_options_listc             C   s
   | j dkS )Nrm   )r:   )r-   r/   r/   r0   _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>   Trm   Frj   u:   Некорректное значение для поля )r   r>   r+   r?   r   ZCmfValidationError
is_checkedrA   )r-   r)   r/   r/   r0   r    s    )skip_tree_movec               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 t j| f|| | j  x"| jD ]}|j|ddi| qW | S )Nz**zparent.tree_node_is_branchr>   sys_typez==r   )r   rO   u
   Архив)r   r   r  )r   tree_parent_idu4   В текущем проекте нет архиваT)r   r  )r   r<   r   r)   rN   rM   rf   r   rO   r   	Exceptionr   tree_node_is_branchr&   r   
tree_nodesr+   )r-   r  r}   r~   r   child)r.   r/   r0   r     s(    

zCmfActiveEntity.archivec               sv   |s6|  ddg | jr6| j| _d| j_| jjdd t j|| | j  x"| jD ]}|j|ddi| qVW | S )Nr   ztree_parent.tree_node_is_branchT)r   r  )	r   r   r   r  r   r&   r#   r  r+   )r-   r  r}   r~   r  )r.   r/   r0   r#     s    
zCmfActiveEntity.archive_restorec             C   s   dS )u   
        Отправляем во фронт события для реалтайм обновления
        :return:
        Nr/   )r-   r/   r/   r0   
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   rs   rt   r+   rN   ri   r   )r-   Zparent_activityr/   r/   r0   _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   Будильник установлен. Задача с крайним сроком не может быть без будильника.)rj   rm   uW   Будильник установлен тк задача уже выполняетсяrj   rm   )r   r   ry   r   r   r>   Z
next_alarmr   rs   current_userZget_current_datetimer   replacer   r   r   r)   Zimport_moder   r   r   r9   r   r   r:   r   )r-   Zcurrent_timer/   r/   r0   _calc_alarm_date
  sP    










"
z CmfActiveEntity._calc_alarm_datec             C   s   | j rd| _d S )NT)r   rw   )r-   r/   r/   r0   _calc_approvedM  s    zCmfActiveEntity._calc_approvedc             C   s   d S )Nr/   )r-   r/   r/   r0   
_calc_nameS  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--r[   )
r
   r5   ry   r   r&   
_calc_coder  get_code_prefixr)   
rpartition)r-   r
   )r.   r/   r0   r(  W  s    
 zCmfActiveEntity._calc_codec                s(   | j r| j j }|r|S tt|  S )N)r5   Zobj_code_prefixr+   r&   r	   r)  )r-   Zcode_prefix)r.   r/   r0   r)  r  s
    zCmfActiveEntity.get_code_prefixc             C   s6  |  ddddddddd	d
g
}dd | jD |d< dd | jD |d< d |d< | jrr| j dddddddg|d< d |d< | jr| j dddg|d< d |d< | jr| j ddddg|d< d |d< | jr| j ddddg|d< d |d< | jr
| j ddddg|d< d |d< | jr2| j ddddg|d< |S )Nr7   r   r
   textr   r   rw   r   r   Zcmf_modified_atc             S   s   g | ]}| d dddgqS )r7   r   r
   login)to_json)r   ir/   r/   r0   r     s    z9CmfActiveEntity.get_cache_fields_json.<locals>.<listcomp>r   c             S   s   g | ]}| d dddgqS )r7   r   r
   r,  )r-  )r   r.  r/   r/   r0   r     s    r   r   Zcolorr9   Z	card_namer   
cmf_authorr,  r   r   r   )	r-  r   r   r   r   r/  r   r   r   )r-   r   r/   r/   r0   get_cache_fields_json{  s@    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 )N)r5   r	  ry   Zcalc_logic_typer   )r-   Zold_default_logic_typer/   r/   r0   _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 )N)r   ry   r   r	  rN   r  Zcalc_scheme)r-   r/   r/   r0   _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 )N)r	  ry   r5   r   r>   Zcalc_workflow)r-   r/   r/   r0   _calc_workflow  s    zCmfActiveEntity._calc_workflowc             C   s   d S )Nr/   )r-   r/   r/   r0   _calc_default_workflow  s    z&CmfActiveEntity._calc_default_workflowc             C   s   d S )Nr/   )r-   r/   r/   r0   _calc_responsible  s    z!CmfActiveEntity._calc_responsiblec                s*   t   p(| jjp(| jjp(| jjp(| jjS )N)r&   _acl_subjects_is_changedr   ry   r   r   r   )r-   )r.   r/   r0   r6    s    
z(CmfActiveEntity._acl_subjects_is_changedc                s>   t   }|| j | jr(|| j | jr:|| j |S )N)r&   _acl_subjects_list_level_writeextendr   r   rr   r   )r-   r   )r.   r/   r0   r7    s    
z.CmfActiveEntity._acl_subjects_list_level_writec                s   t   }|| j |S )N)r&   _acl_subjects_list_level_readr8  r   )r-   r   )r.   r/   r0   r9    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*   zparent.cmf_ownerzparent.cmf_owner_assistantszparent.activityr  r/  zstatus.ordernozstatus.workflowr   r   r   cache_status_optr   Z
cmf_importr{   sharelink_hashzlogic_type.coder	  r   zparent.sl_deadline_shiftzparent.sl_only_owner_approvezparent.sl_deny_no_approvez0parent.sl_allow_executor_change_nofatal_deadlinezparent.sl_task_need_approvezparent.sl_task_only_owner_closezworkflow.enable_sl_controlzworkflow.sl_deadline_shiftzworkflow.sl_only_owner_approvezworkflow.sl_deny_no_approvez2workflow.sl_allow_executor_change_nofatal_deadlinezworkflow.sl_task_need_approvez!workflow.sl_task_only_owner_closez5workflow.sl_deny_closing_task_before_closing_subtasksu.   workflow.sl_сlose_task_after_closing_subtasksui_view_formr  r   z,perm_security_level.access_task_fields_cache)r&   save_preload_fields)r-   )r.   r/   r0   r=    s4    
z#CmfActiveEntity.save_preload_fieldsc                s   t   ddg S )Nr<  Ztask_filters)r&   project_perm_allow_fields)r-   )r.   r/   r0   r>  %  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}x@| j	ddD ]0}|j| 
 krT|jdsT|jdsTd}P qTW | jjr| jjrd}| js| jjr|  }|jsd}| jd	krd}|r|   d}x$| j	ddD ]}|jd
krd}P qW |rt|  }||   tj|krd| j d| jrH| jjpJd d| jr`| jjpbd d| jrx| jjpzd 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   Не используется! Оставлено для историиimportrP   FT)ry   Zcache__idr[   )r   r   r   r   Zchild_tasksZdepended_tasksZaffected_tasksu   Это действие над uC    разрешено только Владельцу объекта(r'  u    ) или Исполнителю(uW   ) или Временному исполнителю(поле "Ждем ответа": )c             S   s
   t | jS )N)r=   r   )xr/   r/   r0   <lambda>s      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   ry   r   r   r   r   r   Zcheck_owner_permsr   r   r   rz   rs   rt   r
   r   r   r   r   sortedmapru   lenrN   CmfAccessListZcheck_admin_mode)r-   Zneed_owners_checkfieldZ
sl_optionsZneed_reluser_checkZall_relation_userr   Zothersr/   r/   r0   _check_simple_perm-  sZ    

V

z"CmfActiveEntity._check_simple_permc             O   s4   |    |   |   |   |   |   d S )N)r  r2  r1  r3  r   r&  )r-   r}   r~   r/   r/   r0   _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 )N)r   ry   r   r>   r   r   Zrun_transitionr)   )r-   r/   r/   r0   _exec_transition  s
    z CmfActiveEntity._exec_transition)comment_appendchanged_fields)rU  c            O   s\   x4|  D ](\}}t| j|tjs
t| || q
W | jdd |rXtj|| d  d S )NT)is_task_transition_run)r+  r   )	r   
issubclassr   r   
CmfBackrefr   r   rN   r   )r-   rT  rU  Z_args_kwargskeyvalr/   r/   r0   r!     s    z#CmfActiveEntity.task_transition_runc             C   s   | j r| jr| j | _ d S )N)r<  r   ui_namer   )r-   r/   r/   r0   _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 )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_history 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 endz/_calc_perm_security_level_allowed_ids_cache end)r   rs   debugr   r  r2  r5  r   r1  _calc_tree_parent_calc_perm_security_levelr3  r4  r   _calc_status_historyr   r   r%  r   r$  r   r   r   r&  r   _calc_sharelink_hashr]  +_calc_perm_security_level_allowed_ids_cache)r-   rY  r/   r/   r0   recalc_fields  sf    























zCmfActiveEntity.recalc_fieldsc             C   s   d S )Nr/   )r-   r/   r/   r0   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 d Q R X d S )N)r   Zfrom_statusZ	to_statusZ
transition)r   ry   r  r   rN   ZCmfStatusHistoryr   r   r>   Zcalc_transitionr   )r-   r/   r/   r0   ra     s    
z$CmfActiveEntity._calc_status_historyc             C   s   | j r| j dddg | | }xp|d D ]d}|d | dsDq,|d | d d dkr^q,t| |}|jr,|js,t| ||d | d d  q,W d S )Nui_form_schemer*   cust_field_conf_scheme	ui_fieldsrS   r)   Z_NONE_)r   r   _build_ui_formr   r  r   ry   r   )r-   ui_form_jsonZconf_field_nameZ	cur_fieldr/   r/   r0   _calc_default_field	  s    

z#CmfActiveEntity._calc_default_fieldr   )rV  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 )Nrh   rl  Zstatus_fromr   Z	status_tor   Ztrans_form_showT)r   r  zmust_transition_run rq   )r   zsuper().save endzhandle_mention_persons end)r   )r   rk  r   r   r&   r   r   ry   rN   ZCmfTransr   r   r7   r   r   re  r   rR  rs   r^  rd  handle_mention_persons_calc_resolutionZCmfStatZdo_calc_statistics)r-   rV  rl  r}   r~   Ztransr   )r.   r/   r0   r     sB    

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 (rA  r   r   r   before_save)time_CmfActiveEntity__start_tsrs   r^  r7   r&   before_save_hookr   r   r   r   rN   CmfAutomationCrudTrigger	crud_hook)r-   r~   Zcrud_action)r.   r/   r0   rr  X  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)rS  rs   r^  ZconfigZBZPYTHON_ENABLEDr>   Zsave_eval_coder+   execr)   globalslocalsr   r   r   rN   rs  rt  r&   before_save_data_hookr7   rp  rq  )r-   r~   )r.   r/   r0   ry  h  s    



z%CmfActiveEntity.before_save_data_hookc                s2   t j| dd t j|| t j| dd d S )Nr   ro  ru  )rN   rs  rt  r&   r   )r-   r}   r~   )r.   r/   r0   r     s    zCmfActiveEntity.deletec                s   |   | _t   d S )N)r0  cache_fieldsr&   _update_cache_fields)r-   )r.   r/   r0   r{    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/   r0   r     s    zCmfActiveEntity.listc               s   |s| dd t j||S )Nr   F)r  r&   slist)r   r|  r}   r~   )r.   r/   r0   r}    s    zCmfActiveEntity.slistc          
   C   s|   | j dddgd xX| jD ]N}t|jd,}tj||jd}||  |	  W dQ R X |
|| qW |j	dd	 dS )
uD    Копирование вложений для CmfTask, CmfDocumentzattachments.url_previewzattachments.url_preview_imgzattachments.url)r   rb)r   r   NT)r   )r   attachmentsopenZfull_path_filerN   r$   r   Zupload_filereadr   _replace_attachment)r-   r   
attachmentfileZnew_attachmentr/   r/   r0   copy_attachments  s    z CmfActiveEntity.copy_attachmentsc                s0   d|j _|jdkr|j|_n|  t |S )NTdummy)r5   ry   r
   r7   r(  r&   _post_copy_hook)r   obj_copy)r.   r/   r0   r    s
    

zCmfActiveEntity._post_copy_hook)r  r   r   )r   r  r   c               st   |rd}dddddg}dd | j D }|r4|| | | d	}	|rJd
}	t jf |	|d|}
|rp| |
 |
S )u  Копирование

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

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

        Tz**zattachments.urlr   zattachments.url_previewzattachments.url_preview_imgc             S   s   g | ]}| d r|qS )r  )r  )r   rP  r/   r/   r0   r     s    z(CmfActiveEntity.copy.<locals>.<listcomp>Nr  )r
   r   )r   r8  r   r&   r   r  )r-   r   r  r   r   r}   r~   Zfields_for_loadZ	cf_fieldsr
   r  )r.   r/   r0   r     s    


zCmfActiveEntity.copyu   ACL ПраваrS   u   Нетu   ACL Полныеu   ACL Только чтениеu   ACL Приватные)rS   fullrG   private)rE   rA   rS   rB   r^   u-   WEB Авторизованный доступu   Доступ запрещёнu2   Могут только просматриватьuE   Могут просматривать и комментироватьu   Полный доступ)rS   denyrG   rL   r  u#   WEB Анонимный доступu"   WEB Доступ по ссылкеu8   Персональные политики доступаCmfPermPublishPolicy)rA   rH   rW   c             C   s2   |    |   d| _| jdd | jdd d S )NT)force)r   )r   _load_perm_fieldsperm_has_acl_calc_perm_aclr   )r-   perm_publish_policyr/   r/   r0    perm_publish_policy_changed_hook   s
    z0CmfActiveEntity.perm_publish_policy_changed_hookc                s   | j js|sd S | j jdkr$|s$d S | jsfdd l}dd l|j|j  d fddt	dD | _xjt
 D ]^}xX|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 qW qpW d S )NrS   r   rp   c             3   s   | ]}  V  qd S )N)choice)r   _)alphabetsecretsr/   r0   	<genexpr>  s    z7CmfActiveEntity._calc_sharelink_hash.<locals>.<genexpr>r   r  r   r;  r7   perm_policy_sharelink)r   r   z#_calc_sharelink_hash child update: T)r  )r   )r  ry   r   r;  stringr  Zascii_lettersdigitsru   ranger	   Ziter_subclassesr   r7   r)   rs   r^  rb  r   )r-   r  r  	model_clsr  r/   )r  r  r0   rb    s      z$CmfActiveEntity._calc_sharelink_hashc             C   s   d| _ |   dS )u&   Метод сброса sharelink_hashN)r;  rb  )r-   r/   r/   r0   do_erase_sharelink_hash  s    z'CmfActiveEntity.do_erase_sharelink_hashCmfStr32zShareLink hash)rX   rA   rL   rE   c             C   s   | j dkrdS tjd| jd}tj }|j| | j dkrFd|_n\| j dk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 группыrS   Nauto)r  r   rG   r  rL   writecomments)r  r   access_levelsubjectsr   r  z%WARN! Unknown perm_policy_sharelink: z. Set deny policyr  )r  rN   CmfAccessRuleperm_aclrQ   sharelink_groupr  rr   r  r   rs   r^  )r-   Zacl_rule_sharelinkr  r/   r/   r0   _acl_scaffold_sharelink_rules,  s,    




z-CmfActiveEntity._acl_scaffold_sharelink_rulesc             C   s   | j jddgd x| j D ]}|js&q|jdkrNtjd| j|jgdd  q|jdkrvtjd| j|jgdd  q|jd	krtjd| j|jgdd  tjd| jd
g|jgdd  q|jdkrtjd| j|jgdd  qW d S )Nsubjectpublish_policy)r   r  r  )r  r   r  r  rG   r  rL   r  r  )r  r   r   r  r  r  )perm_publish_policiesr+   r  r  rN   r  r  r   )r-   r  r/   r/   r0   _acl_scaffold_subjects_rulesJ  s.    




z,CmfActiveEntity._acl_scaffold_subjects_rulesc             C   s8  | j dkr| jdkrdS tjd| jdd}tjjdd}|j| | j dkrVd	|_	nH| j d
krd	|_	tjd| jd|gdgd
  n| j dkrd|_	nd|_	|
  tjd| jdd}tj }|j| | jdkrd	|_	nL| jd
krd	|_	tjd| jd|gdgd
  n| jdkr&d|_	nd|_	|
  dS )uZ   Наполняем ACL правилами для публикации документовrS   Nr  ZSETMEBUG)r  r   r  zanonymous@evateam.ru)r,  rG   r  rL   r  r  )r  r   r  r  r   r  r  )perm_policy_anonymousperm_policy_guestrN   r  r  rM   r   r  rr   r  r   rQ   Zguest_group)r-   Zacl_rule_anonymousZanonymous_personZacl_rule_guestZguest_person_groupr/   r/   r0   _acl_scaffold_public_rulesc  sN    






z*CmfActiveEntity._acl_scaffold_public_rulesc                s<  |    |   |   | dg | jdkrPtjd| jtj	 gdd
  n| jdkrtt|  }|rtjd| j|dd
  tjd| jtj	 gdd
  n| jdk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  rG   Z	denyWriter  r  r  N)r  r  r  r   perm_policyrN   r  r  rQ   Z
user_groupr   r   r   r7  r9  r&   _acl_scaffold)r-   Zwriter_listZreader_list)r.   r/   r0   r    s@    

zCmfActiveEntity._acl_scaffoldc             C   s"   |  ddddddddd	d
g
 d S )Nr  r  z
perm_acl.*Zperm_inheritperm_parentperm_inherit_acl_idperm_effective_acl_idr  r  r  )r   )r-   r/   r/   r0   r    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 )NrS   T)r&   _calc_perm_has_aclr  ry   r  r  )r-   )r.   r/   r0   r    s    
z"CmfActiveEntity._calc_perm_has_aclc                s   |sH| j jsH| jjsH| jjsH| jjsH| jjsH| jjsH| jjsH|  sHd S | jdksf| jdksf| jdkrr| j srd| _ t	 j
ddS )NrS   T)r  )r  ry   r  r  r   r  r  r  r6  r&   r  )r-   r  )r.   r/   r0   r    s     


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  rh   z9project.security_level_scheme.default_task_security_level)	r  ry   r  r   r   r   r   r   Zdefault_task_security_level)r-   r/   r/   r0   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rTt| d5r| d5d6d7g | jr|| j t| d8rT| d9d:d;g x$| jD ]}|jr6||j q6W |d<krftjgS |d=kr~||   |d>kr|| j|d |d?krLt| d@rL| dAdBdCdDg t }| jjr|| jjj|d | jjr>xJ| jjD ]>}|jr||jj|d |jr||jj|d qW |t | g }	xn|D ]f}
|
jjdr|	| j |
jj|dE |dF qV|
j!rqVt|
dr|
j"rqV|	|
 qVW |	S )Gu?  
        Получение значение по шаблонным объектам.

        Возвращает список (в том числе пустой), если передан шаблонный объект
            или None, если объект не является шаблонным
        cmf_deleteddoes_not_workrE  un   Зацикливание рекурсии в раскрытии var-пользователя: extract_var_obj(rA  T)r   zvar:Nzvar:responsibler   zresponsible.cmf_deletedzresponsible.does_not_workzvar:executorsr   zexecutors.cmf_deletedzexecutors.does_not_work)r   zvar:spectatorsr   zspectators.cmf_deletedzspectators.does_not_workz	var:ownerr   zcmf_owner.cmf_deletedzcmf_owner.does_not_workzvar:owner_assistantsr   z cmf_owner_assistants.cmf_deletedz"cmf_owner_assistants.does_not_workzvar:project_ownerzparent.cmf_ownerzparent.cmf_owner.cmf_deletedzparent.cmf_owner.does_not_workzparent.cmf_owner.user_localzvar:project_owner_assistantszparent.cmf_owner_assistantsz'parent.cmf_owner_assistants.cmf_deletedz)parent.cmf_owner_assistants.does_not_workzvar:project_userszparent.executorszparent.spectatorsrP   z
var:authorr/  zcmf_author.cmf_deletedzcmf_author.does_not_workzvar:waiting_forr   zwaiting_for.cmf_deletedz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_approversrZ   )	recursionall_nested_persons)#r   r   r  r   r   rr   r   r8  r   r   r   r   r   r)   r   r   r   r   r/  r   r   r  r  rs   r"  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/   r0   r  
  s    






















zCmfActiveEntity.extract_var_objc             C   s^  | j js|s| jjs| jjs| jjs| jjs| jjs| jjs| jjs| j	js| j
sd}| j r| j jrx| j jD ]}| | jrnd}qnW |sd S td | j s| jrd | _td d S t }t }| ddddd	g xB| j jD ]4}|jrf| |jj}|d kr0|jr ||jj n||jj n6x4|D ],}|jrR||jj n||jj q6W |jr| |j x|jD ]}	| |	 sqtt| |	 tjrxh| |	 D ],}
|jr||
jj n||
jj qW n.|jr || |	 jj n|| |	 jj qW qW d |ks0d |kr<td
dd t |t |d| _td d S )NFTz1_calc_perm_security_level_allowed_ids_cache startz/_calc_perm_security_level_allowed_ids_cache endz;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  rG   )!r  ry   r   r   r/  r   r   r   r   r   r   Zaccess_task_fields_cachers   r^  %perm_security_level_allowed_ids_cacher   r   Zsecurity_level_rulesZaccess_memberr  r
   Zaccess_readonlyr   Zaccess_member_idr)   r7   Zaccess_task_fieldsrW  typer   Z
CmfM2MBaser   r   )r-   r  Zcustom_changedr  Zallowed_idsZallowed_ids_readonlyZruleZextracted_membersZextracted_memberr|   r   r/   r/   r0   rc    sx    





z;CmfActiveEntity._calc_perm_security_level_allowed_ids_cachec                s   |    d| _t   d S )NrS   )r  r  r&   r   )r-   rY  )r.   r/   r0   r     s    zCmfActiveEntity.disable_aclc                sF   t  jf | x2tjjjjdgdd| gdD ]}| j|f| q,W d S )Nr   r   r   )r   r   )r&   _direct_children_deleter   ZincluderN   r$   r   Z_delete_child_object)r-   r~   r  )r.   r/   r0   r    s    "z'CmfActiveEntity._direct_children_delete)r  )returnc               sJ  |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 |}xXjD ]N}|jdkr|j|krd||j qd|dkr||j qd|j	rd||j qdW j
r|j
j|d d }jjjjjjjjj jjy&t fd!d"|D }W n tk
rD   t }Y nX |S )#Nr   u@   DEV: зацикливание рекурсии get_all_followersT)r   r   zcmf_owner.cmf_deletedzcmf_owner.does_not_workr   zwaiting_for.cmf_deletedzwaiting_for.does_not_workr   zresponsible.cmf_deletedzresponsible.does_not_workr   zspectators.cmf_deletedzspectators.does_not_workr   zexecutors.cmf_deletedzexecutors.does_not_workr/  zcmf_author.cmf_deletedzcmf_author.does_not_workzfollowers.personzfollowers.person.cmf_deletedzfollowers.person.does_not_workzfollowers.notify_volumezfollowers.follow_childrenr   Zoffr   rZ   )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  r;   Zobject_instanceZchecking_personZperm_security_level_allowed_ids)rN   rO  Zcheck_access)r   r   )r   cmf_owner_idr  obj_parent_idr  r-   self_idr/   r0   r   	  s    z5CmfActiveEntity.get_all_followers.<locals>.<listcomp>)r   r   r&   r  	followersZnotify_volumer   remover   Zfollow_childrenr   unionr  r)   rO   r  r7   r   r  r   r   ZCmfACLNotInitializedError)r-   r  r}   r~   r  Zfollowerr  )r.   )r   r  r  r  r  r-   r  r0   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_typerj   Zobj_tagsrq   c             S   s   g | ]}t |jpd qS )rp   )r=   r   )r   tr/   r/   r0   r   	  s    z5CmfActiveEntity.full_search_index.<locals>.<listcomp>)r   Zfull_search_fieldsr  r5   r
   r)   r   r:   ru   r   r&   full_search_index)r-   r~   )r.   r/   r0   r  	  s    z!CmfActiveEntity.full_search_index)r+  r  c             C   sJ   t | d}g }x4|dd D ]"}t|jd }|r || q W |S )NZlxmlc             S   s
   |  dS )Nzdata-mention-type)Zhas_attr)tagr/   r/   r0   rC   	  rD  z,CmfActiveEntity.parse_text.<locals>.<lambda>zdata-object-id)bs4ZBeautifulSoupZfind_allr  r  Zattrsrr   )r+  bsr   r  r   r/   r/   r0   
parse_text	  s    zCmfActiveEntity.parse_textc             C   s~   | j jsd S t }t }| j jr2t| | j j}| j jrLt| | j j}x,|| D ] }|jdkrVtjj	| d|d qVW d S )N)rQ   rM   Zmention)Zevent_person)
r+  ry   r   r   r  r   r   rN   CmfEventdo_event)r-   Zobjs_oldZobjs_newr   r/   r/   r0   rm  &	  s    
z&CmfActiveEntity.handle_mention_personsc                s   dddg}| j |kr tddd ddd	d
ddg}dddddddddddddg}t| j j|dd |D d tjr jtjjkrt	d  dtj  tddd fd d!|D d	 rd	 
| fd"d!|D d	< S )#Nrg   rP   rf   ue   Попытка выполнить public_parent_ui_get к недозволенному объектуT)r   r   r
   public_html_schemeZdocument_header_textZdocument_footer_textZtree_text_overflowZheader_background_colorZheader_text_colorZcontent_background_colorZcontent_text_colorZfooter_background_colorZfooter_text_colorZsidebar_background_colorZsidebar_text_colorZfooter_textZ	custom_jsZ
custom_cssZheader_htmlZfooter_htmlc             S   s   g | ]}d | qS )zparent.r/   )r   fr/   r/   r0   r   C	  s    z8CmfActiveEntity.public_parent_ui_get.<locals>.<listcomp>)r7   r   uX   В public_get share api попытались запросить чужой объект z != u8   Нет прав public_get (ошибка доступа)c                s   i | ]}t  j||qS r/   )r  r   )r   r  )r  r/   r0   
<dictcomp>L	  s    z8CmfActiveEntity.public_parent_ui_get.<locals>.<dictcomp>c                s   i | ]}t  d  ||qS )r  )r  )r   r  )r   r/   r0   r  P	  s    )r   r   r  Zget_model_by_namer   rs   Zsharelink_access_requestr7   Zsharelink_access_objr^  r   )r   Zchild_idZallowed_objectsZallowed_fieldsZscheme_fieldsr/   )r  r   r0   public_parent_ui_get5	  s&    

 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 )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_approved endz_calc_deadline endz_calc_alarm_date endz_calc_wf_simple_logic endz_calc_waiting_for endz_check_alarm_date_valid endz_calc_parent_logic_prefix endz_calc_sharelink_hash endz_calc_ui_view_form endz/_calc_perm_security_level_allowed_ids_cache end)r   rs   r^  r   r  r2  r5  r   r1  r_  r`  r3  r4  r   r   r%  r   r$  r   r   r   r   rb  r]  rc  r&   _save_import)r-   r}   r~   )r.   r/   r0   r  U	  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 x8|jD ].}	t|	drl|	jd k	rlqR|	jdkrR||	 qRW |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  )rg   rf   r   )rZ  reverse)
operatorr  rr   r  r  r  r   r  r   sort)
r   node_idr  sort_byinclude_contentr  	node_listr   r   noder/   r/   r0   _macros_page_tree_node_list	  s$    

z+CmfActiveEntity._macros_page_tree_node_listrZ   )rl  c             C   sR   | j ||||d}|d8 }|dkrNx*|D ]"}|jr(| j|j||||d|_q(W |S )N)r  r  r  rZ   r   )r  rl  r  r  r  )r  r  r    r7   r  )r   r  rl  r  r  r  r  r  r/   r/   r0   r    	  s    

z$CmfActiveEntity.macros_page_tree_getc             C   s   |  | jj||| _d S )N)_replace_attach_urlr+  r)   )r-   r   
new_attachr/   r/   r0   r  	  s    z#CmfActiveEntity._replace_attachmentc             C   s4  ddl m} | d k	r0| |jj|jj} |jj| krL| |jj|jj} n,||jj| krx| ||jj|jj} |jr|jj| kr| |jj|jj} n2|jr||jj| kr| ||jj|jj} |jr|jj| kr| |jj|jj} n6|jr0||jj| kr0| ||jj|jj} | S )Nr   )parse)	Zurllibr  r#  r7   r)   ZurlZquoteZurl_previewZurl_preview_img)r+  r   r  r  r/   r/   r0   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_statusrm   closedZreopenedrk   Zwork_startedZwork_stoppedr   r   assignedZmovedresult_textZresolvedr  r  Zsharedupdated)r   rN   r  r  r   r   ry   r:   r   r   r   r   r  r  r  )r-   r}   r~   r/   r/   r0   _do_event_save	  s2    

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 }xRt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sR|jj||j
j d< |jjsp|jj||j
j d< |jjsN|jj||j
j d< qNW g }x&| D ]}	||j|	|d qW || |  t d d S )NzI====================================custom_field_sync_update_models STARTr   )CmfCustomClassCmfCustomFieldr
  )r  r   )r   )r   rA   
field_typeZM2MTrV   rR   placeholderrL   rS   rE   rG   rN   rH   r^   )rH   zG====================================custom_field_sync_update_models END)rs   r^  Zcmf.models.base_modelr  r  varsrN   dictZCmfCustFieldr   r   r)   rA   r  rK  rV   r  rL   rS   rE   Zfield_readonlyr   rH   r^   rJ  rr   Z	from_dictZmerge_fieldsZreload_models_and_fields)
datar~   r  r  r  Zcustom_classrh  Z
cust_fieldZcustom_fieldsZcustom_field_datar/   r/   r0   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 )	NrP   project_notifyT)ry   )ZinitiatorSessionTabIdZinitiatorCurrentPersonactionZinitiatorActionZinitiatorObjIdZinitiatorObjChangedFieldsu   initiatorСomponentId	projectIdzproject_notify-r  )ZroomZevent_persons)
rs   Zsession_tab_idr   r)   r   rt   r7   keysZcomponent_idZcmf_emit_event)r-   Zinitiator_actionZeventr/   r/   r0   r  '
  s    
zCmfActiveEntity.project_notifyc             C   s   dS )u   
        Экран по умолчанию если нет никаких правил и схем экранов

        Returns:
            CmfUiForm: системный экран по умолчанию
        Nr/   )r-   r/   r/   r0   _get_default_ui_form9
  s    z$CmfActiveEntity._get_default_ui_formZinline_save)tmp_objr   create_forminclude_deletedis_public_formui_form_modec         	   O   s  | d| j }	|}
|s>| j|dddddddgd	d
|}|rL|jrLd	}
| j|||	|d}|rfd}t|prddg}|d |d |d |d |d |r| dg }x|D ]}|| dg  qW | 	|}xB|D ]:}|t
jkrt
j| |d t
jkrt
j|d  qW | j||d|
d|}|r|jrZd|j |_||_|d |_|d |_||_|jsttdrtjj||d d}|S )ux   
        fields - список мета-правил для указания какие поля грузить
        r<  r5   r   zproject.ui_form_schemezproject.cust_field_conf_schemezproject.logic_prefixr  r   T)r   r  )r  tmp_is_public_formtmp_ui_view_formr  Zbutton_saver   r   r*   r	  ui_group_fieldsr   r@  r  )full_fields_loadZmapperr  zDELETED r   r
   CmfAutomationUiForm)Zcmf_ui_form)r   r\  r   sgetr  ri  r   r   r   Z_build_load_planrs   Zapi_hack_fieldsr  Z_getr   rj  Zui_form_nameZui_form_coder  r   rN   r  Zui_get_hook)r   r  r   r  r  r  r  r}   r~   r  Ztmp_include_deletedrj  Z
fields_setgroupsZ
group_datar  Z_field_namer   r/   r/   r0   ui_getC
  sP    











zCmfActiveEntity.ui_getc                s  d }|j dkr tt|j}n|r:|jr:tt|j}|sh|rZ|rZ|jrZ|sb| j }ddg}d }|rddddddggddd gg}dddd g}d	d| j gdd
d|j	jggd
dd ggddd|j
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}
x:|D ]2}x"|
D ]}|j|kr.|j}P q.W |r$P q$W |sh|  }d }t|j	j}d}|rt|j	j}|jrt|jj}t|j
j}|r6t|j}|r6|r6|tjkr6|jr6|tj| kr6tj| | }||kr6||| kr6||| | kr6|| | | }|s|rt }|j|d< |j|d< |j|d< tj|j|d< tj|j|d< |r|rtj||||\}|d< x@|D ]8}||d krt |d |< |d | ||  qW t|j}tj|st tj|< tj| |s8t tj| |< tj| | }||krZt ||< ||| krvt || |< ||| | |< |S nt j|dS |S )NrP   r   rS   r   crud_choicer   r   z==r
  Zlogic_typesr   r   r  r<  rf  ztarget.ui_form_jsonT)r   r   r  Noner   r
   r@  r  rh  Zcust_field_config)r  )r   ZAPPZget_cache_projectr=   r7   r   rf  r\  r   r5   r   rr   rN   ZCmfUiFormSchemeRuler}  r  targetr  rg  Zcache_cust_field_config_schemer  r   r
   Z	CmfUiFormZget_ui_group_fieldsZui_fields_jsonZCmfCustFieldConfSchemer   r   r&   ri  )r   r  r  r  r  Zui_formZtmp_projectZcrud_choice_orderZcrud_choice_filterr   Zui_form_scheme_rule_listr  Zui_form_scheme_rulerj  r   Z	scheme_idZproject_logic_typerU   Z
ui_form_idZconf_scheme_cacherh  Zui_field_name)r.   r/   r0   ri  y
  s    









*






zCmfActiveEntity._build_ui_formc             C   s   | j jr| j jdkr| jsdddd ggdd| jgggdddd ggdd| jgggdddd ggdd| jgggddd	gg}ddddg}tjj	||dgd
}|r|j
r|| _qtjj	d	d| _nd | _d S )Nrm   r   r   r   r   r   
is_defaultr   T)r   r   r   )r   )r:   ry   r   r  r5   r   r   rN   ZCmfResolutionr   r  )r-   r   r   r  r/   r/   r0   rn  
  s    
z CmfActiveEntity._calc_resolutionr   u2   Регистрация для публикации)Z	only_onceZonly_once_argsdescriptionZshow_bg_progressbar)r   publish_specc       
      K   s   t d| | dd |D }tjj||d t| }x`|D ]X}|d }|d }tjj|d}	|	st d| t	d	| d
 q<tj
||	|d  q<W dS )u  
        Зарегистрировать недостающих пользователей из publish_spec и опубликовать для них объект object_id
        :param object_id: id объекта для публикации
        :param publish_spec: [{email: str, publish_policy: str}, ...]
        :param guest: только гостевой доступ
        :param _kwargs:
        :return:
        uZ   publish_for_invited(): Выполняем публикацию объекта %s для %sc             S   s   g | ]}|d  qS )emailr/   )r   specr/   r/   r0   r     s    z7CmfActiveEntity.publish_for_invited.<locals>.<listcomp>)guestr	  r  )r	  zUpublish_for_invited(): Person for email %s is absent, publish policy is not created, uB   Не удалось пригласить пользователя u;   , публикация для него не создана.)r   r  r  N)ZlogginginforN   rM   Zregister_personsr  r  r   Zwarningr   r  r   )
r   r  r  rY  Zemailsr   r
  r	  r  r   r/   r/   r0   r"   
  s    

z#CmfActiveEntity.publish_for_invited)rj   )NTTF)NNNNN)NN)NN)NNNNNF)NNNNN)F)N)r   F)F)FNF)NrZ   FNF)r   )FNFN)NNT)r1   r2   r3   ZabstractZfields_orderZorderingZ	api_allowcommonr   cmf_active_entityr	   Zapi_methodsZessential_child_modelsr5   r   Z	CmfStatusr   ZFieldr   r   r   r   r   r   ZCmfRelationr   Z	CmfStr256r   ZCmfStr64r
   ZCmfGenericRelationr   r   ZCmfGenericM2Mr   r   re   r   r   ZCmfGenericBackrefr  r   ZCmfChoiceIntr   Z	CmfChoicer   r   r   r   r   r   r   r   r   r   r  r   Z
is_penaltyr:   r:  ZCmfObjectJsonrz  rw   rX  r  rx   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   r  setterr   r#   r  r  r$  r%  r&  r(  r)  r0  r1  r2  r3  r4  r5  r6  r7  r9  r=  r>  rQ  rR  rS  r  r!   r]  rd  re  ra  rk  r   rr  ry  r   r{  r   r}  r  r  r=   r   r   r  r  r  r  r  r  rb  r  r  r;  r  r  r  r  r  r  r  r`  r  rc  r   r  r   r  r  staticmethodr  rm  r  r  r  r   r    r  r  r  Zon_server_eventr  r  r  r  ri  rn  Zcmf_deferred_jobr"   r4   r/   r/   )r.   r0   r	      sz  
	
::

	C  * 1i"C	-
(W	N	B
(%

9$!zQ"0	 H$
4kr	   r[   )deploy_jobs)r   rp  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	   rp   r  r  r/   r/   r/   r0   <module>   sH                         