U
    n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                       sl   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	 fddZ
 fddZ fddZ  ZS )CmfCalendarExcludec                 C   s   | j stddd dS )ub   
        Проверяет установку даты начала исключения
        uG   Не установлена дата начала исключения.TabortN)period_start_date	cmf_alertself r   './common/models/cmf_calendar_exclude.py_check_period_start_date   s    z+CmfCalendarExclude._check_period_start_datec                    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>   uE  Необходимо установить хотя бы один день недели. При установленном типе повторения "Еженедельно" установите флажки рядом с днями недели, в которые должно повторяться исключение.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|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r,tdD ]L}t| d| j}t|d| j}|dks|dkr||krd} qqn|dkrJ| j|jkrd}n|dkrv| 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}|rtd|j d| ddd dS )u   
        Проверяет совпадение типа повторения и пересечение диапазонов дат исключений
        NFr   =ORr   z<=period_end_datez>=r   )parentfilterfieldsZ	every_day   Tr   r   r   Zevery_month_dayZevery_month_week_dayZevery_year_dayZevery_year_week_dayuN   Это исключение конфликтует с исключением "u3   ". Совпадает тип повторения, u   , и перекрываются интервалы. Измените диапазон дат или тип повторения.r   )r   
is_changedr   r   r   choicesmodelsr   getr   Zperiodr   r   Z	month_dayZmonth_week_positionZmonth_day_weekZmonthr   name)r
   Zalertr   Zrepeat_type_nameZexcluder   Zself_day_weekZexclude_day_weekr   r   r   _check_exclude_matches   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)Zload_fieldsr'   intZinterval_minutesZintervals_total_minutes)r
   Ztotal_minutes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#   ZCmfCalendarExcludeIntervalr$   Zexclude_typer+   r,   )r
   r)   r   r   r   _calc_exclude_typel   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   | j }d|_|  dS )um   
        Помечает календарь измененным для пересчета дней
        TN)r   Z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   r5      s    z&CmfCalendarExclude.save_preload_fieldsc                    s\   | j rd| _tj | _|   |   |   | 	  | 
  | jrN|   t j||S )Nu   Новое исключение)Zis_newr%   dtdateZtodayr   r   r   r-   r1   r&   r!   r3   r4   r2   r
   argskwargsr6   r   r   r2      s    zCmfCalendarExclude.savec                    s   |    t j||S )N)r3   r4   deleter:   r6   r   r   r=      s    zCmfCalendarExclude.delete)__name__
__module____qualname__r   r   r&   r*   r-   r1   r3   r5   r2   r=   __classcell__r   r   r6   r   r      s   Fr   )Zdatetimer8   Zcmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s   