U
    zhg"                     @   s*   d dl T d dlmZ G dd dejZdS )    )*)cmf_relation_optionc                       s   e Zd ZdZ fddZ fddZeedddgdd	d
dddZe	dddZ
 fddZdd Zdd Zd ddZdd Zdd Z  ZS )!CmfRelationOptionuN    Класс для соединения задач и типов связей c                    s   t j| dd | j| jkr(tddd | jjdkrZ| ddd	d
g | 	 rZtddd t
 j||}t j| dd | jjdkr| js| jjr| jjjr| jjjrtt jj| jjddd |S )Nupdatebefore_saveuV   Внимание! Нельзя связывать задачу саму с собой!T)abortsystem.finish:startz+in_link.parent_task.cache_branch_gantt_pathz,out_link.parent_task.cache_branch_gantt_pathz'out_link.op_gantt_task.sched_start_datez(out_link.op_gantt_task.sched_finish_dateum   Невозможно связать суммарную задачу с одной из ее подзадач.
after_savecreate)task_idaction)kwargs)modelsCmfAutomationCrudTrigger	crud_hookout_linkin_linkZ	cmf_alertrelation_typecodeload_fieldshas_parent_child_relationssupersaveZis_newconstrain_lagZ
is_changedop_gantt_tasksched_start_datesched_finish_dateZschedule_deferred_jobr   sort_task_by_order_relationsidselfargsr   res	__class__ ,./modules/task/models/cmf_relation_option.pyr      s$    zCmfRelationOption.savec                    s2   t j| dd t j||}t j| dd |S )Ndeleter   r	   )r   r   r   r   r'   r   r#   r%   r&   r'       s    zCmfRelationOption.deleteTr      uc   Вычисление плановых дат у задач от выставленной связи)Z	only_onceZshow_bg_progressbarZonly_once_argsprioritydescriptionNr   c                 C   sJ  t d|  d|  | d kr"d S |s,t }| |kr8d S ||  tjjdd| gdddgd}|sfd S |jj}|svd S tj	j
d	dd
gdd|ggdddgd}|D ]}|j}|jjr|dkr|dksqt|jjpd}	||jjkr|j}
|	r|jj}tj||
|	}
|
|j_|jjdd |d r*t  tj	j|jj||d d qd S )Nz,sort_task_by_order_relations start task_id: z	, depth: r   z==r   zop_gantt_task.sched_finish_datezproject.calendar.timezone)filterZfieldszrelation_type.coder   r   z&in_link.op_gantt_task.sched_start_datezin_link.op_gantt_task.is_manualr   r   r
   T)Zfrom_sort_order
   r(   )pathdepth)gdebugsetaddr   ZCmfTaskgetr   r   r   listr   Z	is_manualintr   valuer   projectcalendarZCmfCalendarZget_date_by_durationr   Z
cmf_commitr   r   )r   r   r-   r.   ZtaskZtask_finish_dateZfollowing_linksZfollowing_linkZfollowing_taskr   Znew_start_dater8   r%   r%   r&   r   &   sX    

z.CmfRelationOption.sort_task_by_order_relations)returnc                 C   s   d}| j jr| j j| jks0| jjr4| jj| j kr4d}|sf| j jrf| j jjD ]}|d | jjjkrJd}qJ|s| jjr| jjjD ]}|d | j jjkr|d}q||S )u   
        Проверяет, что связанные задачи не находятся друг у друга в родителях
        FTr   )r   Zparent_taskr   Zcache_branch_gantt_pathr   r6   )r    Zrelatedtr%   r%   r&   r   \   s&    z,CmfRelationOption.has_parent_child_relationsc                    s   t   dg S )Nr   )r   save_preload_fieldsr    r#   r%   r&   r;   t   s    z%CmfRelationOption.save_preload_fieldsc                 C   sV   |  ddg | jr0| jjr0| jjjd| jd | jrR| jjrR| jjjd| jd d S Nzout_link.projectzin_link.projectzPPP-TSK-LINK)objr   r   r7   Zcheck_project_role_accessr   r<   r%   r%   r&   check_edit_permw   s
    z!CmfRelationOption.check_edit_permc                 C   sV   |  ddg | jr0| jjr0| jjjd| jd | jrR| jjrR| jjjd| jd d S r=   r?   r<   r%   r%   r&   check_delete_perm   s
    z#CmfRelationOption.check_delete_permr   c              	   C   s
  |  ddg tjsd S | jr| jjr| jjjjdkrtjtjjjdgd| jjjdgtj	| jjjjd}t
d|d	  ||d	 |d	 gd
 | jr| jjr| jjjjdkrtjtjjjdgd| jjjdgtj	| jjjjd}t
d|d	  ||d	 |d	 gd
 d S )Nzout_link.parent.idzin_link.parent.idZ
CmfProjectproject_notifyr   Zin_tasks)ZinitiatorSessionTabIdZinitiatorCurrentPersonr   ZinitiatorActionZinitiatorObjIdZinitiatorObjChangedFieldsu   initiatorСomponentId	projectIdzproject_notify-rC   )ZroomZevent_personsZ	out_tasks)r   r/   Zsession_tab_idr   parentr6   
class_nameZcurrent_personr   Zcomponent_idZcmf_emit_eventr   )r    Zinitiator_actionZeventr%   r%   r&   rB      s4    

$$

z CmfRelationOption.project_notifyc                 O   s   t jj| df|| d S )Nupdatedr   ZCmfEventZdo_eventr    r!   r   r%   r%   r&   _do_event_save   s    z CmfRelationOption._do_event_savec                 O   s   t jj| df|| d S )NZdeletedrG   rH   r%   r%   r&   _do_event_deleted   s    z#CmfRelationOption._do_event_deleted)NNNr   )r   )__name__
__module____qualname____doc__r   r'   staticmethodZcmf_deferred_jobr   boolr   r;   r@   rA   rB   rI   rJ   __classcell__r%   r%   r#   r&   r      s   3
!r   N)Zcmf.includeZmodules.task.fieldsr   r   r%   r%   r%   r&   <module>   s   