U
    /g5                     @   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_workweekc                       sV   e Zd Zdd Zdd Zdd Zdd Zd	d
 Z fddZdd fdd
Z	  Z
S )CmfCalendarWorkWeekc                 C   s   |  dg | | jjkS )Nzparent.default_workweek)load_fieldsparentZdefault_workweekself r	   (./common/models/cmf_calendar_workweek.pyis_default_workweek   s    z'CmfCalendarWorkWeek.is_default_workweekc                 C   s$   |   r | js| jr tddd d S )Nu   Нельзя устанавливать даты начала и окончания у рабочей недели по умолчанию.Tabort)r   period_start_dateperiod_end_date	cmf_alertr   r	   r	   r
   '_check_period_date_for_default_workweek   s    z;CmfCalendarWorkWeek._check_period_date_for_default_workweekc              	   C   s   | j js| jjsdS | j r | js,tddd | j | jkrDtddd tjj| jdd| jgdd	d
| j gdd| j ggd	d
| jgdd| jggggd}|rtd|j	 ddd dS )u   
        Проверяет пересечение диапазонов дат специальных рабочих недель
        Nu]   Установите даты начала и окончания рабочей недели.Tr   uU   Дата начала должна быть раньше даты окончания.id!=ORr   z<=r   >=)r   filteru}   Интервал этой рабочей недели перекрывает интервал рабочей неделей "u,   ". Измените диапазон дат.)
r   
is_changedr   r   modelsr   getr   r   name)r   Zworkweekr	   r	   r
   _check_period_date   s.    




z&CmfCalendarWorkWeek._check_period_datec                 C   s   |  ddddg dd tdD }| jD ]p}|jjdkr<q*|t|j d	  t|j7  < |jjd
kr|d|t|j d< q*|jjdkr*d|t|j d< q*| D ]8\}}t	| d| d|d	  t	| d| d|d  qdS )u   
        Пересчитывает дни рабочей недели (пересчет типа дня и суммы минут рабочих интервалов)
        	intervalszintervals.day_weekzintervals.interval_minuteszintervals.interval_typec                 S   s   i | ]}|d ddqS )r   default)total_minutestyper	   ).0Zweekdayr	   r	   r
   
<dictcomp>;   s      z;CmfCalendarWorkWeek._calc_workweek_days.<locals>.<dictcomp>   Nr   Zuse_set_hoursZworkr   Znot_workZweekendZdayZ_intervals_total_minutesZ_type)
r   ranger   Zday_weekvalueintZinterval_minutesZinterval_typeitemssetattr)r   ZweekdaysintervalZweekday_numZweekday_datar	   r	   r
   _calc_workweek_days4   s      
 z'CmfCalendarWorkWeek._calc_workweek_daysc                 C   s,   |  ddg | j}|  |jdd dS )um   
        Помечает календарь измененным для пересчета дней
        r   zparent.dirtyT)Z	only_dataN)r   r   Z_set_as_dirtysave)r   Zcalendarr	   r	   r
   _do_calendar_dirtyK   s    z&CmfCalendarWorkWeek._do_calendar_dirtyc                    s   | j rj| jsd| _tj }tjj| jddd gdd|ggdgdgd}|r^|j	j
tjdd }|| _|| _	|   |   | jr|   t j||S )	Nu&   Новая рабочая неделяr   r   r   z-period_end_date)r   r   ZfieldsZorder_by   )Zdays)Zis_newr   dtdateZtodayr   r   r   r   r   r$   Z	timedeltar   r   r   r   r+   superr*   )r   argskwargsZperiod_dateZ	last_week	__class__r	   r
   r*   T   s&    
zCmfCalendarWorkWeek.saveF)forcec                   s6   |s |   rtddd |   t j|d|i|S )NuP   Нельзя удалить рабочую неделю по умолчанию.Tr   r4   )r   r   r+   r/   delete)r   r4   r0   r1   r2   r	   r
   r5   r   s
    zCmfCalendarWorkWeek.delete)__name__
__module____qualname__r   r   r   r)   r+   r*   r5   __classcell__r	   r	   r2   r
   r      s   #	r   )Zdatetimer-   Zcmf.includeZcommon.fieldsr   r   r	   r	   r	   r
   <module>   s   