U
    6Ih.                     @   s:   d dl T d dlmZ d dlZd dlZG dd dejZdS )    )*)cmf_sdesk_sla_cycleNc                       s   e Zd Zejjdg ZeddddZedd Z	e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dd Zdd Zd d! Z  ZS )"CmfSDeskSlaCycle
sdesk_listN)fieldsc                O   s   |sg }dD ]}||kr| | q| j|d|i|}|rtdd |}g }t|D ]6}t|d t|jd t|jd | | qV|S t|S )N)parentslasla_goalr   c                 S   s
   | j  S N)r   Z_sdesk_check_access)c r   3./modules/servicedesk/models/cmf_sdesk_sla_cycle.py<lambda>       z-CmfSDeskSlaCycle.sdesk_list.<locals>.<lambda>read)appendlistfiltercmfutilacl_set_policyr   r	   )clsr   argskwargsZfieldresitemsobjr   r   r   r      s&    zCmfSDeskSlaCycle.sdesk_listc                 C   sl   d }t jj| ddddgdgd}|D ]B}|js6|} qht|jj}t jjdd|jg|gd	r$|} qhq$|S )
N	goal_timebqlcalendarzcalendar.timezoneZorderno)r   r   Zorder_byid=)r   )	modelsZCmfSDeskSlaGoalr   r   jsonloadsZCmfTaskexistsr   )r   taskr	   Zpossible_sla_goalspossible_sla_goalr   r   r   r   r&   '   s$       z"CmfSDeskSlaCycle.possible_sla_goalc                 C   s   t jj| d dddddgd}|D ]}t j|j| }|rh|j|krh|jrh||_d|_|j	  |
  nP|rr|jsd|_|j
dd	 n2|r|j|kr|jr|jr|jsd|_|j
dd	 td
|j d|j  q d S )Nr   r	   sla_goal.goal_timecurrent
show_cycle)r   	stop_timer   TFZ	only_datau   Цикл =  )r!   r   r   r&   r   r	   r   r)   last_time_updateset_nowsaver(   print)r%   Zcyclescycler	   r   r   r   update_cycle_goals8   s*    
    


 z#CmfSDeskSlaCycle.update_cycle_goalsc                 C   sd  t jj|d| ddddgd}|rN|jrNd|_d|_t|d |jdd	 d }|r|j	rd|_	|j
  |j  t|d |  d S t j| |}|r|jsd S t  }||_| |_||_ttjt|jjjpd
d}tj |}t j|jj|}t j|jj|}||_||_|r8||j_||j_n|j  |j  t|d |  d S )NTpausedwithin_calendar_hoursr*   next_time_update)r   r(   r   r   Fwriter+   r   Zseconds) r!   r   getr*   r(   r)   r   r   r/   r3   pause_interval_stop_timer.   r-   r&   r   r   r   r	   datetimetimezone	timedeltaintr   now
astimezoneCmfCalendarZget_sla_cycle_next_time_updateZget_sla_cycle_calendar_pausedr5   calendar_paused
start_timevalue)r   r%   r1   r	   tzr>   r5   rA   r   r   r   start_cycleS   sL    



 


zCmfSDeskSlaCycle.start_cyclec                 C   s,   | j s(d| _ | j  | j  |   d S )NT)r3   pause_interval_start_timer.   r-   r/   selfr   r   r   pause   s
    

zCmfSDeskSlaCycle.pausec                 C   sB   | j   | jr d| _| j  | j  t| d |   d S )NFr6   )r*   r.   r3   r9   r-   r   r   r/   rG   r   r   r   stop   s    


zCmfSDeskSlaCycle.stopc                    s(   ddddddddd	d
dg}t   | S )Nr   r   r'   sla_goal.calendarzsla_goal.calendar.timezoner4   rF   r9   r3   paused_timerB   )supersave_preload_fields)rH   r   	__class__r   r   rN      s    z$CmfSDeskSlaCycle.save_preload_fieldsc                    s>   |    |   |   |   |   |   t j||S r
   )_calc_paused_time_calc_elapsed_time_calc_remaining_time_calc_breach_time_calc_breached_clear_pause_intervalsrM   r/   )rH   r   r   rO   r   r   r/      s    zCmfSDeskSlaCycle.savec                 C   s   | j r| jrd| _ d| _dS )uq   
        Сброс зафиксированных интервалов паузы по триггеру
        N)rF   r9   rG   r   r   r   rV      s    z'CmfSDeskSlaCycle._clear_pause_intervalsc              	   C   sn   |  dg | jrj| jrjttjt| jjjp.dd}|  j	t
j| jj| jj|| jj|7  _	dS )ue  
        Вычисляет величину паузы по триггеру с учетом календаря
        - Пауза накопительная на протяжении всего цикла
        - Вычисляется в момент срабатывания триггера start если обе даты не пустые
        rK   r   r7   N)Zload_fieldsrF   r9   r:   r;   r<   r=   r	   r   rL   r!   r@   get_duration_minutesrC   r?   rH   rD   r   r   r   rQ      s     z"CmfSDeskSlaCycle._calc_paused_timec                 C   sd   t t jt| jjjpdd}t| jj| jj 	 d t
j| jj| jj|| jj| S )u   
        Возвращает количество минут не рабочего времени по календарю на интервале
        r   r7   <   )r:   r;   r<   r=   r	   r   r-   rC   rB   total_secondsr!   r@   rW   r?   rX   r   r   r   _calc_non_working_time   s       z'CmfSDeskSlaCycle._calc_non_working_timec                 C   sZ   t t jt| jjjpdd}| jjj| jj }t	j
| jj| jj||| _d}dS )u   
        Вычисляет дату/время нарушения цикла (цели) с учетом пауз по триггеру и календаря
        r   r7      N)r:   r;   r<   r=   r	   r   r   rC   rL   r!   r@   Zget_date_by_durationrB   r?   breach_time)rH   rD   ZdeltarJ   r   r   r   rT      s       z"CmfSDeskSlaCycle._calc_breach_timec                 C   s<   t | jj| jj  d | jj |   | _| j	  dS )u   
        Вычисляет величину истекшего времени в мин. с учетом пауз по триггеру и календаря
        rY   N)
r=   r-   rC   rB   rZ   rL   r[   elapsed_timeZelapsed_time__addon_startr.   rG   r   r   r   rR      s    z#CmfSDeskSlaCycle._calc_elapsed_timec                 C   s    | j jj| j | _| j  dS )u   
        Вычисляет величину оставшегося времени в мин. с учетом пауз по триггеру и календаря
        N)r	   r   rC   r^   Zremaining_timeZremaining_time__addon_startr.   rG   r   r   r   rS      s    z%CmfSDeskSlaCycle._calc_remaining_timec                 C   s"   | j j| j  kr| jsd| _dS )u8   
        Флаг нарушения цикла
        TN)r]   rC   r>   r3   ZbreachedrG   r   r   r   rU     s    zCmfSDeskSlaCycle._calc_breached)__name__
__module____qualname__r   r   Zapi_methodsclassmethodr   staticmethodr&   r2   rE   rI   rJ   rN   r/   rV   rQ   r[   rT   rR   rS   rU   __classcell__r   r   rO   r   r      s,   


6	
	r   )Zcmf.includeZmodules.servicedesk.fieldsr   r:   r"   r   r   r   r   r   <module>   s   