U
    շe%                     @   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r6 fddtdD }t|s6tddd dS )	u   
        Проверяет установку хотя бы одного дня недели для типа повторения "Еженедельно"
        
every_weekc                    s   g | ]}t  d | jqS )day_of_week)getattrvalue).0ir   r   r   
<listcomp>   s     zMCmfCalendarExclude._check_day_of_week_for_type_every_week.<locals>.<listcomp>   u   При выбранном типе повторения "Еженедельно" установите флажки рядом с днями недели, в которые должно повторяться исключение.Tr   N)repeat_typer   rangeanyr   )r   Zdays_of_weekr   r   r   &_check_day_of_week_for_type_every_week   s    z9CmfCalendarExclude._check_day_of_week_for_type_every_weekc              
   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fields	every_day   Tr   r   r   Zevery_month_dayZevery_month_week_dayZevery_year_dayZevery_year_week_dayN)r   r
   r	   r   r   choicesmodelsr   getr   r   Zperiodr   r   Z	month_dayZmonth_week_positionZmonth_day_weekZmonth)r   Zis_conflictr   repeat_type_nameexcluder   Zself_day_weekZexclude_day_weekr   r   r   _exclude_conflict   s    













z$CmfCalendarExclude._exclude_conflictc                 C   s4   |   \}}|r0|r0td|j d| ddd dS )u   
        Проверяет совпадение типа повторения и пересечение диапазонов дат исключений
        uN   Это исключение конфликтует с исключением "u3   ". Совпадает тип повторения, u   , и перекрываются интервалы. Измените диапазон дат или тип повторения.Tr   N)r)   r   name)r   r'   r(   r   r   r   _check_exclude_matchesg   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_fieldsr,   intZinterval_minutesZintervals_total_minutes)r   Ztotal_minutesintervalr   r   r   _calc_intervals_total_minutesr   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CmfCalendarExcludeIntervalr&   Zexclude_typer1   r2   )r   r/   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g | j}|  |jdd dS )um   
        Помечает календарь измененным для пересчета дней
        r   T)Z	only_dataN)r-   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   r;      s    z&CmfCalendarExclude.save_preload_fieldsc                    s   | j r`d| _d| _tj }|| _|| _|  \}}|r^|jj	tj
dd }|| _|| _q(qq(n |   |   |   |   | jr|   t j||S )Nu   Новое исключениеr"   r#   )Zdays)Zis_newr*   r   dtdatetodayr   r	   r)   r   Z	timedeltar   r   r7   r+   r
   r9   r:   r8   )r   argskwargsr@   r6   r(   Z	next_dater<   r   r   r8      s&    
zCmfCalendarExclude.saveF)forcec                   s"   |s|    t j|d|i|S )NrC   )r9   r:   delete)r   rC   rA   rB   r<   r   r   rD      s    zCmfCalendarExclude.delete)__name__
__module____qualname__r   r   r)   r+   r0   r3   r7   r9   r;   r8   rD   __classcell__r   r   r<   r   r      s   
I	 r   )Zdatetimer>   Zcmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s   