U
    [Se.                     @   s2   d dl Zd dlT d dlmZ G dd dejZdS )    N)*)cmf_calendar_excludec                       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
 fddZ fddZdd fdd
Z  ZS )CmfCalendarExcludec                 C   s<   | j stddd | jr8| jjr8| j | jkr8tddd dS )u   
        Проверяет установку даты начала исключения.
        Если есть дата окончания, то проверяет корректность дат начала и окончания.
        uG   Не установлена дата начала исключения.Tabortuj   Дата начала должна быть раньше даты окончания исключения.N)period_start_date	cmf_alertperiod_end_date
is_changedself r   './common/models/cmf_calendar_exclude.py_check_period_dates   s    
z&CmfCalendarExclude._check_period_datesc                    s*   j jdkr jr jdkr(tddd  j jdkr` fddtd	D }t|s^td
dd nƈ j jdkr jr jtddkrtddd n j jdkr jjs j	jrtddd nl j jdkr j
r jr jtddkrtddd n6 j jdkr& j
r jjs j	jr&tddd dS )uu   
        Проверяет корректность ввода данных типов повторений
        )	every_day
every_weekevery_month_dayevery_month_week_dayr   u?   Укажите периодичность повторения.Tr   r   c                    s   g | ]}t  d | jqS )day_of_week)getattrvalue).0ir   r   r   
<listcomp>   s     zBCmfCalendarExclude._check_data_for_repeat_type.<locals>.<listcomp>   u   При выбранном типе повторения "Еженедельно" установите флажки рядом с днями недели, в которые должно повторяться исключение.r          u   При выбранном типе повторения "Ежемесячно (в указанный день)" укажите день месяца от 1 до 31.r   u   При выбранном типе повторения "Ежемесячно (по позиции дня недели)" выберите день недели и его порядковый номер в месяце.every_year_dayu   При выбранном типе повторения "Ежегодно (в указанный день)" укажите день месяца от 1 до 31 и выберите месяц.every_year_week_dayu   При выбранном типе повторения "Ежегодно (по позиции дня недели месяца)" выберите месяц, день недели и его порядковый номер в месяце.N)repeat_typer   periodr   rangeany	month_daymonth_day_weekZis_nullmonth_week_positionmonth)r   Zdays_of_weekr   r   r   _check_data_for_repeat_type   s@    z.CmfCalendarExclude._check_data_for_repeat_typec              
   C   s  | j js| jjr"| j r"| jr"| js&dS d}| jj}| jj| }tjj| j	dd| j
gdd|gddd	| j gd
d| j ggdd	| jgd
d| jggggdgd}|r|dkr| jdkr|jdks| jdkr|jdkrd}n|dkr6tdD ]L}t| d| j}t|d| j}|dks |dkr||krd} qqn|dkrT| j|jkrd}n|dkr| j|jkr| j|jkrd}nd|dkr| j|jkr| j|jkrd}n8|dkr| j|jkr| j|jkr| j|jkrd}|r||fS dS dS )u!  
        Ищет конфликт исключений.
        При нахождении конфликта возвращает название типа повторения и объект исключения,
        с которым произошел конфликт.
        )NNFidz!=r   =ORr   z<=r	   z>=r   )parentfilterfieldsr   r   Tr   r   r   r   r   r   r   N)r   r
   r	   r   r   choicesmodelsr   getr+   r(   r    r!   r   r#   r%   r$   r&   )r   Zis_conflictr   repeat_type_nameexcluder   Zself_day_weekZexclude_day_weekr   r   r   _exclude_conflict2   s    













z$CmfCalendarExclude._exclude_conflictc                 C   s4   |   \}}|r0|r0td|j d| ddd dS )u   
        Проверяет совпадение типа повторения и пересечение диапазонов дат исключений
        uN   Это исключение конфликтует с исключением "u3   ". Совпадает тип повторения, u   , и перекрываются интервалы. Измените диапазон дат или тип повторения.Tr   N)r3   r   name)r   r1   r2   r   r   r   _check_exclude_matches{   s
    z)CmfCalendarExclude._check_exclude_matchesc                 C   s6   |  ddg d}| jD ]}|t|j7 }q|| _dS )uq   
        Пересчитывает сумму минут интервалов рабочих часов
        	intervalszintervals.interval_minutesr   N)load_fieldsr6   intZinterval_minutesZintervals_total_minutes)r   Ztotal_minutesintervalr   r   r   _calc_intervals_total_minutes   s
    
z0CmfCalendarExclude._calc_intervals_total_minutesc                 C   s@   t jj| ddgd}|s"d| _dS |jr6|jr6d| _nd| _dS )u   
        Вычисляет тип исключения в зависимости от настроек интервалов времени рабочих часов.
        	from_timeto_time)r+   r-   Znot_workNZwork)r/   ZCmfCalendarExcludeIntervalr0   Zexclude_typer;   r<   )r   r9   r   r   r   _calc_exclude_type   s    z%CmfCalendarExclude._calc_exclude_typec                 C   sB   | j jsd| _ tj| \}}|r*|d nd| _ t|p:d| _dS )um   
        Вычисляет дату окончания и количество повторений
        Nr   )r	   r
   r/   ZCmfCalendarZcalc_excluded_dayslenZrepeat_times)r   _Zexcluded_daysr   r   r   &_calc_period_end_date_and_repeat_times   s
    z9CmfCalendarExclude._calc_period_end_date_and_repeat_timesc                 C   s,   |  ddg | j}|  |jdd dS )um   
        Помечает календарь измененным для пересчета дней
        r+   zparent.dirtyT)Z	only_dataN)r7   r+   Z_set_as_dirtysave)r   Zcalendarr   r   r   _do_calendar_dirty   s    z%CmfCalendarExclude._do_calendar_dirtyc                    s   dg}t   | S )Nr   )supersave_preload_fields)r   r-   	__class__r   r   rE      s    z&CmfCalendarExclude.save_preload_fieldsc                    s   | j rd| _d| _tj }|| _|| _|j| _|j	| _
| | _|j	d d | _|  \}}|r|jjtjdd }|| _|| _qRqqRn |   |   |   |   | jr|   t j||S )Nu   Новое исключениеr   r   r   )Zdays)Zis_newr4   r   dtdatetodayr   r	   r&   Zdayr#   Zweekdayr$   r%   r3   r   Z	timedeltar   r'   rA   r5   r
   rC   rD   rB   )r   argskwargsrJ   r@   r2   Z	next_daterF   r   r   rB      s.    

zCmfCalendarExclude.saveF)forcec                   s"   |s|    t j|d|i|S )NrM   )rC   rD   delete)r   rM   rK   rL   rF   r   r   rN      s    zCmfCalendarExclude.delete)__name__
__module____qualname__r   r'   r3   r5   r:   r=   rA   rC   rE   rB   rN   __classcell__r   r   rF   r   r      s   I	(r   )ZdatetimerH   Zcmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s   