U
    Rd1                     @   sH   d dl T d dlmZ d dlZd dlZG dd dejZejej	 dS )    )*)cmf_calendarNc                   @   sz   e Zd Zdd Zdd Zdd Zdd Z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dS )CmfCalendarc                    s   t t fdd| j}|S )Nc                    s   | j t   kS N)weekdaystrxday ./common/models/cmf_calendar.py<lambda>
       z*CmfCalendar.get_schedule.<locals>.<lambda>)listfiltercalendar_workday)selfr   Zscheduler   r
   r   get_schedule   s    zCmfCalendar.get_schedulec                 C   sb   |   }|  }g g  }}|r0ttdd |}|rFttdd |}| |ksZ||kr^dS dS )Nc                 S   s   t | jjS r   )intr   valuer   r   r   r   r      r   z5CmfCalendar.is_exception_or_weekend.<locals>.<lambda>c                 S   s   | j jS r   )dater   r   r   r   r   r      r   TF)get_weekend_daysget_exception_holidaysr   mapr   )r   r   Zweekend_daysZexceptions_holidaysZ	_weekendsZ_exceptions_holidaysr   r   r   is_exception_or_weekend   s    
z#CmfCalendar.is_exception_or_weekendc                 C   s   | j rttdd | j S g S )Nc                 S   s
   | j dkS )NZholidayZexception_typer   r   r   r   r       r   z4CmfCalendar.get_exception_holidays.<locals>.<lambda>calendar_exceptionr   r   r   r   r   r   r      s    z"CmfCalendar.get_exception_holidaysc                 C   s   | j rttdd | j S g S )Nc                 S   s
   | j dkS )NZwork_dayr   r   r   r   r   r   &   r   z4CmfCalendar.get_exception_workdays.<locals>.<lambda>r   r   r   r   r   get_exception_workdays#   s    z"CmfCalendar.get_exception_workdaysc                 C   s   | j rttdd | j S g S )Nc                 S   s   | j  o| j S r   )	from_timeto_timer   r   r   r   r   ,   r   z.CmfCalendar.get_weekend_days.<locals>.<lambda>)r   r   r   r   r   r   r   r   )   s    zCmfCalendar.get_weekend_daysc                 C   s`   t j   j}| |d jj}| |d jj}t j j|||d}t j j|||d}||fS )Nr   )tzinfo)	datetimeZnowZ
astimezoner#   r   r!   r   r"   Zcombine)r   current_dateZtzZworkday_startZworkday_endworkday_start_timeworkday_end_timer   r   r   set_worktime_border/   s    zCmfCalendar.set_worktime_borderc              	   C   s  |  dddddddg |}d}| js*|S ||kr|jdddd	}| |sJ| |\}}||  krr|krn n||  kr|krn nq| | kr| | kr||kr||kr|t||  d
 t||  d
  7 }n||kr"||kr"|t||  d
 7 }n||krP||krP|t||  d
 7 }nj||  krh|krn n|t||  d
 7 }n4||  kr|krHn n|t||  d
 7 }q| | kr| | kr|dt||  d
  7 }q| | kr||  kr,|krJn n|t||  d
 7 }nN||krn|t||  d
 7 }n*||krH|t|| ||   d
 7 }n| | kr||  kr|krn n|dt||  d
  7 }nb||kr"|dt||  d
  t||  d
  7 }n&||kr|dt||  d
  7 }nH| | krz|dt||  d
  7 }n|t||  d
 7 }|tj	dd7 }|jdddd	}q*|S )u~   
        Вычисляет величину паузы попадающее в нерабочие интервалы
        r   r   calendar_workday.weekdaycalendar_workday.from_timecalendar_workday.to_time!calendar_exception.exception_typecalendar_exception_type.dater   )ZhourZminutesecond<   i     Zdays)
load_fieldsr   replacer   r(   r   r   total_secondsr$   	timedelta)r   startstopr%   Znon_working_timeZ	begin_dayr&   r'   r   r   r   calc_non_working_pause_duration9   sz      
 
$
$ 




z+CmfCalendar.calc_non_working_pause_durationc              	   C   s  |  dddddddg | js2t||  d S |}d	}||kr| |sx| |\}}||  krr|krn n4||  kr|krn n|t||  d 7 }qt||  d d	kr,t||  d d	k rnLt||  d d	kr|t||  d 7 }n|t||  d 7 }nLt||  d d	kr`|t||  d 7 }n|t||  d 7 }|tjd
d7 }q:|S )u   
        Вычисляет величину паузы попадающее в рабочие интервалы
        чтобы правильно скорректировать elapsed_time
        r   r   r)   r*   r+   r,   r-   r/   r   r0   r1   )r2   r   r   r4   r   r(   r$   r5   )r   pause_interval_start_timepause_interval_stop_timer%   pauser&   r'   r   r   r   calc_work_pause_duration   sB      
 
z$CmfCalendar.calc_work_pause_durationc              	   C   s^   t jjdddgdddgdddgdd| ggddd	d
dddgd}|D ]}|j  |  qBdS )u   
        Обработчик смотрит только активные циклы (не на триггерной паузе и не фуллтайм)

        Zbreached=FalseZpausedZ	stop_timeZNULLzsla_goal.calendarZsla_goalcodeZwithin_calendar_hoursr:   r9   last_time_update)r   fieldsN)modelsZCmfSDeskSlaCycler   r@   Zset_nowZsave)r   Zcyclescycler   r   r   calendar_handler   s    
 
zCmfCalendar.calendar_handlerT)Z	only_onceZsystem_taskc                  O   s4   t jjdddddddgd}|D ]}t| q d S )	Nr   r   r,   zcalendar_exception.dater)   r*   r+   )rA   )rB   r   r   rD   )_args_kwargsZ	calendarsZcalendarr   r   r   celery_hourly_hook   s    
zCmfCalendar.celery_hourly_hookc                 C   s   t | j d S r   )Zcmf_deferred_taskrG   )clsr   r   r   hourly_hook   s    zCmfCalendar.hourly_hookN)__name__
__module____qualname__r   r   r   r    r   r(   r8   r<   rD   staticmethodZ
celery_appZtaskrG   classmethodrI   r   r   r   r   r      s   
P/r   )
Zcmf.includeZcommon.fieldsr   r$   Zpytzr   ZAPPZHOOK_CRON_HOURLYappendrI   r   r   r   r   <module>   s    \