
    6i/                     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          }|r|dk    r| j        dk    r|j        dk    rd}n~| j        dk    rt|j        dk    rit          j                            |           \  }}t          j                            |          \  }}t          |pg           t          |pg           z  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$   CmfCalendarcalc_excluded_dayssetr%   r   r'   r*   r(   r+   )r   is_conflictr#   repeat_type_nameexclude_	self_daysexclude_daysr   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));!##!(;(;"&KK[A%%'.A*=*=#)#5#H#H#N#NLAy&,&8&K&KG&T&TOA|9?++c,2D".E.EE +&*,,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)rC   r   name)r   r<   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intrH   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_timerI   not_workNwork)r6   rJ   r7   exclude_typerS   rT   )r   rP   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   r8   r9   lenrepeat_times)r   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   rh   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_newrE   r#   dtdatetodayr
   r   r+   dayr'   weekdayr(   r*   rC   r   	timedeltar   r-   r^   rF   r   re   rg   rc   )r   argskwargsro   r>   r=   	next_dateri   s          r   rc   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 )Nrv   )re   rg   delete)r   rv   rs   rt   ri   s       r   rx   zCmfCalendarExclude.delete   s=     	&##%%%uww~t;5;F;;;r   )__name__
__module____qualname__r   r-   rC   rF   rQ   rX   r^   re   rh   rc   rx   __classcell__)ri   s   @r   r   r      s        
P 
P 
PX X X<K K KZ	t 	t 	t
5 
5 
5+ + + 4 4 4& & &6 6 6 6 6&- &- &- &- &-P #( < < < < < < < < < < <r   r   )datetimerm   cmf.includecommon.fieldsr   r    r   r   <module>r      sq            . . . . . .f< f< f< f< f<-@ f< f< f< f< f<r   