U
    ge#                     @   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 fddZeedd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gddi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actioncreate)args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selfr   r   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.deletec                    s2   t j| dd t j||}t j| dd |S r&   r(   r   r"   r$   r%   r'   &   s    T   uc   Вычисление плановых дат у задач от выставленной связи)Z	only_onceZshow_bg_progressbarprioritydescriptionNr   c                 C   s  |s
t  }| |krd S ||  tjjdd| gdddgd}|jj}|sLd S tjjdddgd	d|ggd
ddgd}|D ]}|j	}|jj
r|dkrv|dksqvt|jjpd}	||jjkrv|j}
|	r|jj}tj||
|	}
|
|j_|jjdd |d rt  tjj|jj||d d qvd S )Nr   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)setaddr   ZCmfTaskgetr   r   r   listr   Z	is_manualintr   valuer   projectcalendarZCmfCalendarZget_date_by_durationr   Z
cmf_commitr   r   )Ztask_idr
   r.   r/   ZtaskZtask_finish_dateZfollowing_linksZfollowing_linkZfollowing_taskr   Znew_start_dater7   r$   r$   r%   r   ,   sN    
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   r5   )r    Zrelatedtr$   r$   r%   r   Z   s&    z,CmfRelationOption.has_parent_child_relationsc                    s   t   dg S )Nr   )r   save_preload_fieldsr    r"   r$   r%   r:   r   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   r6   Zcheck_project_role_accessr   r;   r$   r$   r%   check_edit_permu   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-rB   )ZroomZevent_personsZ	out_tasks)r   gZsession_tab_idr   parentr5   
class_nameZcurrent_personr   Zcomponent_idZcmf_emit_eventr   )r    Zinitiator_actionZeventr$   r$   r%   rA      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)NNr   )r   )__name__
__module____qualname____doc__r   r'   staticmethodZcmf_deferred_jobr   boolr   r:   r?   r@   rA   rI   rJ   __classcell__r$   r$   r"   r%   r      s    +
!r   N)Zcmf.includeZmodules.task.fieldsr   r   r$   r$   r$   r%   <module>   s   