
    4Me.                     L    d dl Zd dl d dlmZ  G d dej
                        Zy)    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                  kD  rt        dd       yyyy)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   si    
 %%_gkl  T%9%9%D%D**T-A-AA  C  KO  P B &E     c                    | j                   j                  dv r| j                  r| j                  dk(  rt        dd       | j                   j                  dk(  rIt	        d      D cg c]  }t        | d|       j                   }}t        |      st        d	d       yy| j                   j                  d
k(  r3| j                  r| j                  t	        dd      vrt        dd       yy| j                   j                  dk(  r;| j                  j                  s| j                  j                  rt        dd       yy| j                   j                  dk(  r?| j                  r$| j                  r| j                  t	        dd      vrt        dd       yy| j                   j                  dk(  rG| j                  r,| j                  j                  s| j                  j                  rt        dd       yyyc c}w )uu   
        Проверяет корректность ввода данных типов повторений
        )	every_day
every_weekevery_month_dayevery_month_week_dayr   u?   Укажите периодичность повторения.Tr   r      day_of_weeku   При выбранном типе повторения "Еженедельно" установите флажки рядом с днями недели, в которые должно повторяться исключение.r          u   При выбранном типе повторения "Ежемесячно (в указанный день)" укажите день месяца от 1 до 31.r   u   При выбранном типе повторения "Ежемесячно (по позиции дня недели)" выберите день недели и его порядковый номер в месяце.every_year_dayu   При выбранном типе повторения "Ежегодно (в указанный день)" укажите день месяца от 1 до 31 и выберите месяц.every_year_week_dayu   При выбранном типе повторения "Ежегодно (по позиции дня недели месяца)" выберите месяц, день недели и его порядковый номер в месяце.N)repeat_typevalueperiodr   rangegetattrany	month_daymonth_day_weekis_nullmonth_week_positionmonth)r   idays_of_weeks      r   _check_data_for_repeat_typez.CmfCalendarExclude._check_data_for_repeat_type   s    ""&llt{{a'7W_cd!!\1LQRSHUqGDKs*;<BBULU|$ E MQR % ##'88>>T^^5B<%G RY]_ &H ##'==""**d.F.F.N.N  GKL /O ##'77JJ4>>dnnERSUWL6X qx|~ 7Y ##'<<::!4!4!<!<@X@X@`@` K SWX Aa =! Vs   ' G<c                     | j                   j                  s| j                  j                  r$| j                   r| j                  r| j                  sy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      }|r|dk(  rB| j                  dk(  r|j                  dk(  s | j                  dk7  rU|j                  dk7  rEd}nA|dk(  rUt        d      D ]F  }t        | d|       j                  }t        |d|       j                  }|du s|du s>||k(  sDd} n n|dk(  r| j                  |j                  k(  rd}n|dk(  r5| j                  |j                  k(  r| j                   |j                   k(  rd}n|dk(  r5| j                  |j                  k(  rn| j"                  |j"                  k(  rUd}nR|dk(  rM| j                  |j                  k(  r4| j                   |j                   k(  r| j"                  |j"                  k(  rd}|r||fS y)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   getr/   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2d6J6J6U6U..43G3GPTP`P`&&,,++33K@++//;;tTWW%[1,dD4J4JK*D$2H2HI
 -dD4H4HI*D$2F2FG
 5# 0 
& k)[[A%'..A*= KK1,11D"&K,q A$+DKs2C$D$J$JM'.w+aS8I'J'P'P$&$.2Bd2J -1A A&*  11>>W%6%66"&K 66,,0K0KK //73I3II"&K 00>>W%6%664::;V"&K 55,,0K0KK //73I3II JJ'--7"&K#W,,r   c                 r    | j                         \  }}|r"|rt        d|j                   d| dd       yyy)u   
        Проверяет совпадение типа повторения и пересечение диапазонов дат исключений
        uN   Это исключение конфликтует с исключением "u3   ". Совпадает тип повторения, u   , и перекрываются интервалы. Измените диапазон дат или тип повторения.Tr   N)r:   r   name)r   r6   r7   s      r   _check_exclude_matchesz)CmfCalendarExclude._check_exclude_matches{   sZ     %)$:$:$<!'fgngsgsft uJJZI[ \fgnrt !(r   c                     d}t         j                  j                  | dg      }|D ]  }|t        |j                        z  } || _        y)uq   
        Пересчитывает сумму минут интервалов рабочих часов
        r   interval_minutesr/   r1   N)r3   CmfCalendarExcludeIntervallistintr?   intervals_total_minutes)r   total_minutes	intervalsintervals       r   _calc_intervals_total_minutesz0CmfCalendarExclude._calc_intervals_total_minutes   sV     55::$PbOc:d	! 	<HS!:!:;;M	< (5$r   c                     t         j                  j                  | ddg      }|sd| _        y|j                  r|j
                  rd| _        yd| _        y)u   
        Вычисляет тип исключения в зависимости от настроек интервалов времени рабочих часов.
        	from_timeto_timer@   not_workNwork)r3   rA   r4   exclude_typerJ   rK   )r   rG   s     r   _calc_exclude_typez%CmfCalendarExclude._calc_exclude_type   s[     4488ALi@X 9 Z  *D("2"2 &D *Dr   c                     | j                   j                  sd| _         t        j                  j	                  |       \  }}|r|d   nd| _         t        |      xs d| _        y)um   
        Вычисляет дату окончания и количество повторений
        Nr   )r   r   r3   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   sY     ##..#'D !--@@F=4A}R0t.3!r   c                     | j                  ddg       | j                  }|j                          |j                  d       y)um   
        Помечает календарь измененным для пересчета дней
        r/   zparent.dirtyT)	only_dataN)load_fieldsr/   _set_as_dirtysave)r   calendars     r   _do_calendar_dirtyz%CmfCalendarExclude._do_calendar_dirty   s:     	(N34;; %r   c                 ,    dg}t         |          |z   S )Nr   )supersave_preload_fields)r   r1   	__class__s     r   rb   z&CmfCalendarExclude.save_preload_fields   s    w*,v55r   c                    | j                   rd| _        d| _        t        j                  j                         }|| _        || _        |j                  | _        |j                  | _
        |j                         | _        |j                  dz
  dz  | _        	 | j                         \  }}|r<|j                  j                  t        j                   d      z   }|| _        || _        nnAS| j#                          | j%                          | j'                          | j)                          | j*                  r| j-                          t/        | `  |i |S )Nu   Новое исключениеr   r   r   )days)is_newr<   r   dtdatetodayr
   r   r'   dayr#   weekdayr$   r&   r:   r   	timedeltar   r*   rX   r=   r   r_   ra   r]   )r   argskwargsri   rV   r7   	next_daterc   s          r   r]   zCmfCalendarExclude.save   s    ;;9DI*DGGMMOE &+D"#(D  DJ"YYDN"'--/D(-		A!';D$ !335
7 ' 7 7 = =RS@T TI-6D*+4D(  $$&,,.779'')??##%w|T,V,,r   F)forcec                J    |s| j                          t        |   |d|i|S )Nrp   )r_   ra   delete)r   rp   rm   rn   rc   s       r   rr   zCmfCalendarExclude.delete   s+    ##%w~t;5;F;;r   )__name__
__module____qualname__r   r*   r:   r=   rH   rO   rX   r_   rb   r]   rr   __classcell__)rc   s   @r   r   r      sJ    
PX<GR	t
5+ 4&6&-P #( < <r   r   )datetimerg   cmf.includecommon.fieldsr   r    r   r   <module>r{      s#      .b<-@@ b<r   