U
    YdMg                      @   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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   | j | jkrtddd | jjdkrJ| ddddg |  rJtd	dd t j||}| jjdkr| j	sr| j
jr| j jjr| j jjrttjj| j jgd
did |S )NuV   Внимание! Нельзя связывать задачу саму с собой!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   Невозможно связать суммарную задачу с одной из ее подзадач.actioncreate)argskwargs)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_jobmodelsr   sort_task_by_order_relationsid)selfr	   r
   res	__class__ ,./modules/task/models/cmf_relation_option.pyr      s     zCmfRelationOption.saveT   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_dater.   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   r,   )r   Zrelatedtr   r   r   r   M   s&    z,CmfRelationOption.has_parent_child_relationsc                    s   t   dg S )Nr   )r   save_preload_fieldsr   r   r   r   r1   e   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   r-   Zcheck_project_role_accessr   r2   r   r   r   check_edit_permh   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 r3   r5   r2   r   r   r   check_delete_permp   s
    z#CmfRelationOption.check_delete_permupdatec              	   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_notifyr8   Zin_tasks)ZinitiatorSessionTabIdZinitiatorCurrentPersonr   ZinitiatorActionZinitiatorObjIdZinitiatorObjChangedFieldsu   initiatorСomponentId	projectIdzproject_notify-r:   )ZroomZevent_personsZ	out_tasks)r   gZsession_tab_idr   parentr,   
class_nameZcurrent_personr   Zcomponent_idZcmf_emit_eventr   )r   Zinitiator_actionZeventr   r   r   r9   w   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deletedr?   r@   r   r   r   _do_event_deleted   s    z#CmfRelationOption._do_event_deleted)NNr   )r8   )__name__
__module____qualname____doc__r   staticmethodZcmf_deferred_jobr   boolr   r1   r6   r7   r9   rA   rB   __classcell__r   r   r   r   r      s   +
!r   N)Zcmf.includeZmodules.task.fieldsr   r   r   r   r   r   <module>   s   