B
    bEf.                 @   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?   Укажите периодичность повторения.T)r   r   c                s   g | ]}t  d | jqS )day_of_week)getattrvalue).0i)r
   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   s0    



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r6xTtdD ]H}t| d| j}t|d| j}|dks"|dkr||krd}P qW n|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   , и перекрываются интервалы. Измените диапазон дат или тип повторения.T)r   N)r1   r   name)r
   r/   r0   r   r   r   _check_exclude_matches{   s    z)CmfCalendarExclude._check_exclude_matchesc             C   s<   d}t jj| dgd}x|D ]}|t|j7 }qW || _dS )uq   
        Пересчитывает сумму минут интервалов рабочих часов
        r   interval_minutes)r)   r+   N)r-   CmfCalendarExcludeIntervallistintr4   Zintervals_total_minutes)r
   Ztotal_minutesZ	intervals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-   r5   r.   Zexclude_typer:   r;   )r
   r8   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)Zload_fieldsr)   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   rD      s    z&CmfCalendarExclude.save_preload_fieldsc                s   | j rd| _d| _tj }|| _|| _|j| _|j	| _
| | _|j	d d | _xZ|  \}}|r|jjtjdd }|| _|| _qTP qTW n |   |   |   |   | jr|   t j||S )Nu   Новое исключениеr   r   r   )Zdays)Zis_newr2   r   dtZdatetodayr   r   r$   Zdayr!   Zweekdayr"   r#   r1   r   Z	timedeltar   r%   r@   r3   r	   rB   rC   rA   )r
   argskwargsrG   r?   r0   Z	next_date)rE   r   r   rA      s0    

zCmfCalendarExclude.saveF)forcec               s"   |s|    t j|d|i|S )NrJ   )rB   rC   delete)r
   rJ   rH   rI   )rE   r   r   rK      s    zCmfCalendarExclude.delete)__name__
__module____qualname__r   r%   r1   r3   r9   r<   r@   rB   rD   rA   rK   __classcell__r   r   )rE   r   r      s   I	(r   )ZdatetimerF   Zcmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s   