
    bEf.                     H    d dl Zd dlT d dlmZ  G d dej                  ZdS )    N)*)cmf_calendar_excludec                   h     e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
 fd	Z fd
Zdd fd
Z xZS )CmfCalendarExcludec                     | j         st          dd           | j        r/| j        j        r%| j         | j        k    rt          dd           dS dS dS dS )u   
        Проверяет установку даты начала исключения.
        Если есть дата окончания, то проверяет корректность дат начала и окончания.
        uG   Не установлена дата начала исключения.Tabortuj   Дата начала должна быть раньше даты окончания исключения.N)period_start_date	cmf_alertperiod_end_date
is_changed)selfs    './common/models/cmf_calendar_exclude.py_check_period_datesz&CmfCalendarExclude._check_period_dates   s    
 % 	m_gkllll  	PT%9%D 	P*T-AAA  C  KO  P  P  P  P  P  P	P 	P 	P 	PAA    c                 $     j         j        dv r j        r j        dk    rt          dd            j         j        dk    r? fdt	          d          D             }t          |          st          d	d           dS dS  j         j        d
k    r3 j        r j        t	          dd          vrt          dd           dS dS  j         j        dk    r- j        j        s j	        j        rt          dd           dS dS  j         j        dk    r: j
        r j        r j        t	          dd          vrt          dd           dS dS  j         j        dk    r2 j
        r j        j        s j	        j        rt          dd           dS dS dS )uu   
        Проверяет корректность ввода данных типов повторений
        )	every_day
every_weekevery_month_dayevery_month_week_dayr   u?   Укажите периодичность повторения.Tr   r   c                 @    g | ]}t          d |           j        S )day_of_week)getattrvalue).0ir   s     r   
<listcomp>zBCmfCalendarExclude._check_data_for_repeat_type.<locals>.<listcomp>   s/    UUUqGD*;*;*;<<BUUUr      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_weekis_nullmonth_week_positionmonth)r   days_of_weeks   ` r   _check_data_for_repeat_typez.CmfCalendarExclude._check_data_for_repeat_type   s    "&lll m'+{a'7'7W_cdddd!\11UUUUERSHHUUUL|$$ R E MQR R R R R RR R #'888> _T^5B<<%G%G RY]_ _ _ _ _ _ &H%G #'==="* Ld.F.N L  GKL L L L L LL L #'777J ~4> ~dnERSUWLL6X6X qx|~ ~ ~ ~ ~ ~ 7Y6X #'<<<: X!4!< X@X@` X K SWX X X X X X =<X Xr   c                    | j         j        s| j        j        r| j         r| j        r| j        sdS d}| j        j        }| j        j        |         }t          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          }|r3|dk    r/| j        dk    r|j        dk    s| j        dk    r|j        dk    rd}n|dk    rUt          d          D ]D}t          | d|           j        }t          |d|           j        }|du s|du r
||k    rd} nEn|dk    r| j        |j        k    rd}n|dk    r#| j        |j        k    r| j        |j        k    rd}na|dk    r#| j        |j        k    r| j        |j        k    rd}n8|dk    r2| j        |j        k    r"| j        |j        k    r| j        |j        k    rd}|r||fS dS )u!  
        Ищет конфликт исключений.
        При нахождении конфликта возвращает название типа повторения и объект исключения,
        с которым произошел конфликт.
        )NNFidz!=r#   =ORr
   z<=r   z>=r   )parentfilterfieldsr   r   Tr   r   r   r   r   r!   r"   )r
   r   r   r#   r   choicesmodelsr   getr2   r/   r$   r%   r   r'   r*   r(   r+   )r   is_conflictr#   repeat_type_nameexcluder   self_day_weekexclude_day_weeks           r   _exclude_conflictz$CmfCalendarExclude._exclude_conflict2   s    '2 	d6J6U 	.	373G	PTP`	:&,+3K@+//;tTW%[1,dD4JK*D$2HI
 -dD4HI*D$2FG
 5# 0 
 
&  !	'k))[A%%'.A*=*= K1,,11D1D"&K,,q  A$+D2C2C2C$D$D$JM'.w8Ia8I8I'J'J'P$&$..2Bd2J2J -1A A A&* 111>W%666"&K 666,0KKK /73III"&K 000>W%6664:;V;V"&K 555,0KKK /73III J'-77"&K 	#W,,:r   c                 ~    |                                  \  }}|r!|r!t          d|j         d| dd           dS dS dS )u   
        Проверяет совпадение типа повторения и пересечение диапазонов дат исключений
        uN   Это исключение конфликтует с исключением "u3   ". Совпадает тип повторения, u   , и перекрываются интервалы. Измените диапазон дат или тип повторения.Tr   N)r=   r   name)r   r9   r:   s      r   _check_exclude_matchesz)CmfCalendarExclude._check_exclude_matches{   s     %)$:$:$<$<!' 	t 	t ggngs g gJZg g gnrt t t t t t	t 	t 	t 	tr   c                     d}t           j                            | dg          }|D ]}|t          |j                  z  }|| _        dS )uq   
        Пересчитывает сумму минут интервалов рабочих часов
        r   interval_minutesr2   r4   N)r6   CmfCalendarExcludeIntervallistintrB   intervals_total_minutes)r   total_minutes	intervalsintervals       r   _calc_intervals_total_minutesz0CmfCalendarExclude._calc_intervals_total_minutes   s\     5::$PbOc:dd	! 	< 	<HS!:;;;MM'4$$$r   c                     t           j                            | ddg          }|s	d| _        dS |j        r|j        r	d| _        dS d| _        dS )u   
        Вычисляет тип исключения в зависимости от настроек интервалов времени рабочих часов.
        	from_timeto_timerC   not_workNwork)r6   rD   r7   exclude_typerM   rN   )r   rJ   s     r   _calc_exclude_typez%CmfCalendarExclude._calc_exclude_type   su     488ALi@X 9 Z Z  	 *DF 	+("2 	+ &D *Dr   c                     | j         j        sd| _         t          j                            |           \  }}|r|d         nd| _         t          |          pd| _        dS )um   
        Вычисляет дату окончания и количество повторений
        Nr   )r   r   r6   CmfCalendarcalc_excluded_dayslenrepeat_times)r   _excluded_dayss      r   &_calc_period_end_date_and_repeat_timesz9CmfCalendarExclude._calc_period_end_date_and_repeat_times   sg     #. 	(#'D !-@@FF=4AK}R00t..3!r   c                     |                      ddg           | j        }|                                 |                    d           dS )um   
        Помечает календарь измененным для пересчета дней
        r2   zparent.dirtyT)	only_dataN)load_fieldsr2   _set_as_dirtysave)r   calendars     r   _do_calendar_dirtyz%CmfCalendarExclude._do_calendar_dirty   sP     	(N3444;   %%%%%r   c                 P    dg}t                                                      |z   S )Nr   )supersave_preload_fields)r   r4   	__class__s     r   re   z&CmfCalendarExclude.save_preload_fields   s%    ww**,,v55r   c                    | j         rd| _        d| _        t          j                                        }|| _        || _        |j        | _        |j	        | _
        |                                | _        |j	        dz
  dz  | _        	 |                                 \  }}|r1|j        j        t          j        d          z   }|| _        || _        nnLnP|                                  |                                  |                                  |                                  | j        r|                                   t/                      j        |i |S )Nu   Новое исключениеr   r   r   T)days)is_newr?   r#   dtdatetodayr
   r   r+   dayr'   weekdayr(   r*   r=   r   	timedeltar   r-   r[   r@   r   rb   rd   r`   )r   argskwargsrl   rY   r:   	next_daterf   s          r   r`   zCmfCalendarExclude.save   sS   ;  	*9DI*DGMMOOE &+D"#(D  DJ"YDN"'--//D(-	A!';D$!3355
7  ' 7 =RS@T@T@T TI-6D*+4D(( $$&&&,,...77999'')))? 	&##%%%uww|T,V,,,r   F)forcec                f    |s|                                    t                      j        |d|i|S )Nrs   )rb   rd   delete)r   rs   rp   rq   rf   s       r   ru   zCmfCalendarExclude.delete   s=     	&##%%%uww~t;5;F;;;r   )__name__
__module____qualname__r   r-   r=   r@   rK   rR   r[   rb   re   r`   ru   __classcell__)rf   s   @r   r   r      s        
P 
P 
PX X X<G G GR	t 	t 	t
5 
5 
5+ + + 4 4 4& & &6 6 6 6 6&- &- &- &- &-P #( < < < < < < < < < < <r   r   )datetimerj   cmf.includecommon.fieldsr   r    r   r   <module>r~      sq            . . . . . .b< b< b< b< b<-@ b< b< b< b< b<r   