U
    $-d                      @   sv   d dl T d dlmZ d dlZG dd dejZG dd dejZG dd	 d	ejZG d
d dejZej	
ej dS )    )*)cmf_sdesk_slaNc                       s   e Zd Z fddZ  ZS )CmfSDeskSlac           	         s   |  dg | jjd| jd tjj| d}|rB|D ]}|  q4tjj| d}|rf|D ]}|  qXtjj| d}|r|D ]}|  q|t	 j||S )NparentzPPP-PR-ADMIN)obj)sla)r   )
Zload_fieldsr   Zcheck_project_role_accessmodelsCmfSDeskSlaCyclelistdeleteCmfSDeskSlaGoalCmfSDeskSlaTriggersuper)	selfargskwargsZ
sla_cyclesZ	sla_cycleZ	sla_goalssla_goalZsla_triggersZsla_trigger	__class__ -./modules/servicedesk/models/cmf_sdesk_sla.pyr      s    


zCmfSDeskSla.delete)__name__
__module____qualname__r   __classcell__r   r   r   r   r      s   r   c                       s(   e Zd Z fddZ fddZ  ZS )r   c                    s   dg}t   | S )Ncalendarr   save_preload_fieldsr   fieldsr   r   r   r      s    z#CmfSDeskSlaGoal.save_preload_fieldsc                    s$   | j stjjdd| _ t j||S )Nzfulltime:default)code)r   r   ZCmfCalendargetr   saver   r   r   r   r   r   r"   #   s    zCmfSDeskSlaGoal.save)r   r   r   r   r"   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZedddZdS )r   Nc                 C   sv  g }|j jrF|j jr4|j jr(|d qF|d n|j jrF|d |jsT|jjr^|d |jjrp|d |r|j|j	ks|jj
s|d n
|d |sd S tjjdd	|jgd
d|ggddd
dgd}|D ]}|jdkr|jsq|jj|jjkrq|jdkrtj|j| |jdkrFtjj|d |jd}|rF|  |jdkrtjj|d |jd}|r|  qd S )Nzassignee-changedzassignee-clearedzassignee-setzissue-createdzstatus-type-changedzcomment-by-reporterzcomment-for-reporterzparent.parent=trigger_conditionINr   trigger_typez"trigger_condition_status_code.code)filterr   startpause)r   	stop_timer   stop)ZresponsibleZ
is_changedoldnewappendZis_newr   Zcache_status_typeZ	cmf_ownerZ
cmf_authorZ
user_localr   r   r
   r%   Ztrigger_condition_status_coder    statusr'   r	   start_cycler!   r*   r,   )clstaskZcommentZ	triggeredZpossible_triggersZtriggercycler   r   r   task_changed_hook*   sP    







z$CmfSDeskSlaTrigger.task_changed_hook)N)r   r   r   classmethodr5   r   r   r   r   r   )   s   r   c                       s   e Zd ZeddddZedd Zdd Zd	d
 Z fddZ	 fddZ
dd Zdd Zdd Zdd Zeejddddd Zedd Z  ZS )r	   N)r   c                O   sH   |sg }d|kr| d | j|d|i|}|r@tdd |}t|S )Nr   r   c                 S   s
   | j  S N)r   Z_sdesk_check_access)cr   r   r   <lambda>l       z-CmfSDeskSlaCycle.sdesk_list.<locals>.<lambda>)r/   r
   r(   )r2   r   r   r   resr   r   r   
sdesk_listb   s    
zCmfSDeskSlaCycle.sdesk_listc                 C   s   t jj|d | dgd}|r2|jr.d|_|  d S d }t jj| ddgdgd}|D ]6}|jsd|} qt jjdd	|j	g|jgd
rR|} qqR|r|j
sd S t  }||_| |_||_|j  |  d S )Npaused)r   r+   r   r   F	goal_timebqlZorderno)r   r   Zorder_byidr$   r(   )r   r	   r!   r=   r"   r   r
   r?   ZCmfTaskr@   r>   r   r   r   
start_timeset_now)r   r3   r4   r   Zpossible_sla_goalsZpossible_sla_goalr   r   r   r1   q   s.    

zCmfSDeskSlaCycle.start_cyclec                 C   s   d| _ |   d S NT)r=   r"   r   r   r   r   r*      s    zCmfSDeskSlaCycle.pausec                 C   s   | j   |   d S r7   )r+   rC   r"   rE   r   r   r   r,      s    
zCmfSDeskSlaCycle.stopc                    s   dddg}t   | S )Nr   r   zsla_goal.goal_timer   r   r   r   r   r      s
    z$CmfSDeskSlaCycle.save_preload_fieldsc                    s.   |    |   |   |   t j||S r7   )_calc_breach_time_calc_elapsed_time_calc_remaining_time_calc_breachedr   r"   r#   r   r   r   r"      s
    zCmfSDeskSlaCycle.savec                 C   s    | j jtj| jjjd | _d S )N)Zminutes)rB   valuedatetimeZ	timedeltar   r>   breach_timerE   r   r   r   rF      s    z"CmfSDeskSlaCycle._calc_breach_timec                 C   s.   t | j | jj  d | _| j  d S N<   )intrB   nowrJ   total_secondsZelapsed_timeZelapsed_time__addon_startrC   rE   r   r   r   rG      s     z#CmfSDeskSlaCycle._calc_elapsed_timec                 C   s.   t | jj| j   d | _| j  d S rM   )rO   rL   rJ   rP   rQ   Zremaining_timeZremaining_time__addon_startrC   rE   r   r   r   rH      s     z%CmfSDeskSlaCycle._calc_remaining_timec                 C   s   | j j| j  krd| _d S rD   )rL   rJ   rP   breachedrE   r   r   r   rI      s    zCmfSDeskSlaCycle._calc_breachedT)Z	only_onceZsystem_taskc                  O   s@   t jjdddgdddgdddgddd	ggd
D ]}|  q.d S )NrR   r$   Falser=   Zwithin_calendar_hoursTruerL   <zNOW()rA   )r   r	   r
   r"   )_args_kwargsr4   r   r   r   celery_hourly_hook   s    z#CmfSDeskSlaCycle.celery_hourly_hookc                 C   s   t | j d S r7   )Zcmf_deferred_taskrX   )r2   r   r   r   hourly_hook   s    zCmfSDeskSlaCycle.hourly_hook)r   r   r   r6   r<   staticmethodr1   r*   r,   r   r"   rF   rG   rH   rI   Z
celery_appr3   rX   rY   r   r   r   r   r   r	   a   s"   
r	   )Zcmf.includeZmodules.servicedesk.fieldsr   rK   r   r   r   r	   ZAPPZHOOK_CRON_HOURLYr/   rY   r   r   r   r   <module>   s   8s