
    Oi\r                         d dl m Z mZmZmZ d dlmZ d dlZd dl d dlm	Z	 d dl
mZ de fdZ G d	 d
ej                  j                        Zy)    )datetimetime	timedeltatimezone)PathN)*)commit_all_ds)
is_weekendtc                 t    | j                  ddd| j                        t        | j                  dz        z   S )Nr   )secondmicrosecondminutehour   hours)replacer   r   r   )r   s    0./modules/staff_control/models/cmf_person_var.py
round_hourr      s7    99A1QQVV9Dyhh"nH      c                       e Zd ZdZej
                  j                  j                  g dz   Zed        Z	ed        Z
ed3d       Zdeded	dfd
Zed        Zd Zd Ze eddd      d               Zd Zed        Zed4d       Zd Ze eddd      d               Ze eddd      d               Zed        Zed        Zed        Zd Zd3dZd3dZ d3dZ!d3dZ"ed        Z#ed         Z$ed!        Z%ed"        Z&d# Z'd5d$Z(ed%        Z)d& Z*d' Z+d( Z,d) Z-d* Z.d+ Z/d, Z0d- Z1d. Z2d/ Z3d0 Z4 fd1Z5 fd2Z6 xZ7S )6CmfPersonVarT)update_recent_options_listupdate_recents_objget_or_createpingpublic_update_recents_objc                 &     | j                   |i |S Nr   clsargskwargss      r   public_pingzCmfPersonVar.public_ping       sxx(((r   c                 &     | j                   |i |S r    r!   r"   s      r   
sdesk_pingzCmfPersonVar.sdesk_ping!   r'   r   Nc                     |sg }|j                  g d       t        j                  st        d      | j	                  t        j                  j
                  |      }|s | t        j                        }|S )N)person.on_vacationbrowser_timezonelast_ping_atcmf_modified_byz'get_or_create g.current_person == False)	person_idfields)person)extendgcurrent_person
ValueErrorgetid)r#   r0   cs      r   r   zCmfPersonVar.get_or_create%   sb    FcdFGGGGa..11&GA1++,Ar   phonetextreturnc                 d   | j                  dg       | j                         }|sJ d       |j                  s| j                  d       y| j                  j
                  st        j                  j                  s| j                  d       yt        j                  ||      j                          y)u>  
        Враппер для отправки СМС с проверкой настроек контроля сотрудников.
        TODO: расширить настройки отправки СМС под каждый случай и проверять их в вызывающей функции
        person.no_staff_controlu   Баг: нет настроек контроля сотрудников в БД, должны были создаться выше.uj   В настройках контроля сотрудников выключена отправка СМСuP   В настройках отключен контроль сотрудников)r9   r:   N)load_fieldsget_settingssend_smslogr1   no_staff_controlr3   global_settingsstaff_control_enabledmodelsCmfSMSsend)selfr9   r:   settingss       r   r@   zCmfPersonVar.send_sms5   s    
 	345$$&	Q Q	Q  HH  B  C[[))1B1B1X1XHHghMMDM1668r   c           	      x   t         j                  j                  |j                  d            }t	        dt
        j                  j                  j                  |       |j                  d      xs g }| j                  t        t        |ddgz                     }|j                  j                  s|j                  dk(  rd|_        |j                  d       	 t        |j                   j#                  |      j%                               }|j&                  |k7  r||_        |j                  d	       |j*                  j,                  dkD  s|j*                  s+|j*                  j/                          |j                  d       |j                  j0                  s,|j&                  j0                  s|j*                  j0                  r(t        t        |            }|j3                  |       |S t	        d       |S #  t
        j)                  d
|j                           d|_        |j                  d	       Y xY w)Nnowzping updater0   online_statusr-   )r0   offlineonliner,   uK   Не удалось обработать таймзону браузера r   i  zping update skip 7*60)dateutilparserparser6   printr3   r4   loginvaluer   listsetrL   is_nullappendinttzinfo	utcoffsettotal_secondsr,   debugr-   ageset_now
is_changedsave)r#   r$   r%   browser_nowr0   r8   browser_now_timezones          r   r   zCmfPersonVar.pingF   s   oo++FJJu,=>mQ--3399;GH%+ T#f7X.X*Y%Z[??""aoo&B&AOMM/*		.#&{'9'9'C'CK'P'^'^'`#a !!%99%9"01 >>&annNN""$MM.)??%%););)F)F!..JcJc#f+&FFF&F!  )*	.GGabmbtbtauvw!"AMM,-s   AG: :<H9c                 x   t               r| j                  d       y| j                  dg       | j                  s| j                  d       y| j                  j                  r| j                  d       y| j                  j
                  r| j                  d       y| j                  s| j                  d       yy)	N   Сегодня выходнойFperson.*u   Не выставлен person"   Больше не работает   В отпускеu(   Не выставлен browser_timezoneT)r
   rA   r>   r1   does_not_workon_vacationr,   rH   s    r   _should_processzCmfPersonVar._should_processh   s    <HH67*&{{HH56;;$$HH9:;;""HH() $$HH?@r   c                     |syt               r| j                  d       y|j                  r| j                  d       y|j                  r| j                  d       y|j                  r| j                  d       yy)NFre   uC   Отключен контроль работы сотрудникаrg   rh   T)r
   rA   rB   ri   rj   )rH   r1   s     r   _should_process_by_personz&CmfPersonVar._should_process_by_person   sk    <HH67""HHZ[HH9:HH()r   z@hourly)	only_once
system_jobschedulec                     t        d       d} 	 t        j                  j                  g dg d| | dz   g      }| dz  } |sy |D ]  }	 |j	                           t                V# t
        $ r t        j                  d|        Y Dw xY w)Nu4   Проверка открытых браузеровr   )r,   r-   person.phone_mobileperson.phoner=   person.does_not_workr+   rL   )r-   !=N  )r0   filterslice    Ошибка обработки )	rR   rE   r   rU   check_browser_open	Exceptionlogging	exceptionr	   )ipersonsr8   s      r   all_check_browser_openz#CmfPersonVar.all_check_browser_open   s     	DE))..) 2NVWYZ[^Y^U_	 / aG
 HA NN((*N
 O  ! N%%(H&LMNs   A%%!B	B	c                 n   d| j                   g}| j                  r_| j                  j                  dg       || j                  j                  j                  | j                  j
                  j                  gz  }|j                         D cg c]  \  }}| d|  }}}t        g |||  y c c}}w )Nu'   Контроль сотрудниковphone_mobile=)	coder1   r>   namerT   r   numberitemsrR   )rH   r$   r%   prefixkv
kwargs_fmts          r   rA   zCmfPersonVar.log   s    ;TYYG;;KK##^$45t{{''--t{{/G/G/N/NOOF-3\\^<TQ1QCj<
<*v**z* =s   B1c                     t        |       }t        |d      r|j                  S t        d      }d}|j	                         r|j                         j                         }||_        |j                  S )N
__org_namezcustom/org_name )typehasattr_CmfPersonVar__org_namer   exists	read_textstrip)rH   r#   org_name_pathorg_names       r   r   zCmfPersonVar.org_name   sc    4j3%>>!./!$..0668H!~~r   c                     t        dd      s't        j                  j                         t        _        t        j
                  S )Nr3   staff_control_settings)r   rE   CmfStaffControlSettingsr   r3   r   rk   s    r   r?   zCmfPersonVar.get_settings   s0    s45'-'E'E'S'S'UA$'''r   c                    | j                         sy | j                  j                         }| j                         }t	        j
                  ||j                  j                  | j                        }t	        j
                  ||j                  j                  | j                        }|t        d      z  }|| j                  cxk  xr |k  nc }|s%| j                  d| d| j                   d|        y | j                  rR| j                  j                  j                  | j                        }| j                  |z
  j                         }|dk  }nd }d }d}| j                  d| j                  | j                  j                  |||       |r| j                  d	       y | j                  j                   s| j                  d
k7  rd
| _        | j#                          | j$                  j&                  j(                  }	|	s| j                  d       y | j*                  j,                  dvr*| j                  d| j*                  j,                   d       y d}
| j.                  r|
dt0        j2                   dz  }
| j                  d       | j5                  |	|
       | j6                  j9                          | j#                          y )N   r   u    не рабочее время: z < i  Fr{   )rK   r-   ping_tzseconds_since_last_pingis_ping_recentub   Пользователь недавно присылал данные в рабочее времяrM   uD   У пользователя не установлен телефон)
      u   Не нашли на рабочем месте, но не уведомляем, т.к. не 10 или 14 часов (сейчас )u   ЦРМ не может найти Вас на рабочем месте. Проверьте, что запущен браузер. (ue   Уведомляю пользователя о том что нужно открыть браузер)rl   rK   dater?   r   combinework_start_atrT   py_browser_timezonework_end_atr   rA   r-   
astimezoner\   rL   rW   ra   r1   r   r   closest_hourr   r   configAPP_FQDNr@   last_sms_atr_   )rH   today_tzrI   
work_startwork_endis_working_timer   r   r   r   r:   s              r   r{   zCmfPersonVar.check_browser_open   st   ##%88==?$$&%%h,,22D4L4L

 ##h**00$2J2J

 	IA&&$txx:(: HH7
|3txxjPST\S]^_''--889Q9QRG'+xx''9&H&H&J#4w>NG&*#"N **00$;) 	 	
 HHyz%%););y)H!*DIIK{{//66HH[\!!1HH""&"3"3"8"8!9< I 	
 ==b)++DxylD)  "		r   c                  >   t        d       t               rt        d       y d} 	 t        j                  j	                  g d| | dz   g      }| dz  } |sy |D ]  }	 |j                           t                S# t        $ r t        j                  d|        Y Dw xY w)Nu:   Проверка задач с крайним срокомu   Выходнойr   )r,   zperson.emailrt   rs   z+person.primary_role.supervisor.phone_mobilez6person.primary_role.supervisor.person.no_staff_controlz3person.primary_role.supervisor.person.does_not_workz1person.primary_role.supervisor.person.on_vacationr=   ru   vacation_startvacation_endr+   rf   rw   )r0   ry   rz   )
rR   r
   rE   r   rU   check_tasks_deadline_wrapr|   r}   r~   
cmf_commit)r   person_var_listscs      r   all_check_tasks_deadlinez%CmfPersonVar.all_check_tasks_deadline  s     	JK<$%$1166	 QsU 7 
%O HA"% OO002O L+ & ! O%%(H&MNOs   A88!BBc                     t        d       t        j                  j                  g dg dddt	        j
                         j                         gddt	        j
                         j                         gg      D ]"  } | j                          | j                          $ t        d	       t        j                  j                  g dg d
dddt	        j
                         j                         gg dddt	        j
                         j                         gg dgg      D ]:  } t        | j                   d       | j                          | j                          < y )Nu:   Выставляем ушедших отпускников)
user_local==T)rj   r   Fr   z<=r   z>=rx   u>   Выставляем пришедших отпускников)rj   r   TOR>)r   r   N<)r   r   Nz Not on vacation)
rR   rE   	CmfPersonrU   r   utcnowr   _calc_vacationra   r   )ps    r   all_check_personzCmfPersonVar.all_check_person7  s.    	JK!!&&&'tX__%6%;%;%=>T8??#4#9#9#;<	/>& 
 	A FFH	 	NO!!&&..)30A0F0F0HI6'hoo.?.D.D.FG467 ' 	8 	A QVVH,-.FFH	r   c                     | j                   r)t        t        | j                   j                              S t	        j
                         j                         j                  S )N)seconds)r,   r   r   rT   r   rK   r   rZ   rk   s    r   r   z CmfPersonVar.py_browser_timezoneS  sD       Id.C.C.I.IJKK||~((*111r   c                 |    t        j                  t        j                        j	                  | j
                        S )N)tz)r   rK   r   utcr   r   rk   s    r   rK   zCmfPersonVar.now[  s(     ||x||,778P8PQQr   c                 ,    t        | j                        S r    )r   rK   rk   s    r   r   zCmfPersonVar.closest_hour`  s    $((##r   c                 n   | j                   j                          | j                         sy | j                  }|j	                  d      }|j	                  d      }|j	                  d      }||k(  r6| j                  d       | j                  |       | j                  |       y ||k(  r6| j                  d       | j                  |       | j                  |       y ||k(  r6| j                  d       | j                  |       | j                  |       y | j                  d	| d
|        y )Nr   )r         u-   12 часов для пользователяrK   u-   13 часов для пользователяu-   16 часов для пользователяuF   Не время для уведомлений по дедлайнам  )r1   calc_staff_control_blockedrl   r   r   rA   )notify_responsible_overdue_deadline_tasks&notify_responsible_open_deadline_tasks#notify_owner_overdue_deadline_tasks notify_owner_open_deadline_tasks(notify_supervisor_overdue_deadline_tasks%notify_supervisor_open_deadline_tasks)rH   r$   r%   r   hour_notify_responsiblehour_notify_ownerhour_notify_supervisors          r   r   z&CmfPersonVar.check_tasks_deadline_wrapd  sM   ..0 ##%((
 #/"6"6B"6"?(00b09!-!5!52!5!>22HHDE::?V:W77<S7T..HHDE449P4Q116M1N 33HHDE 99>U9V66;R6S HH]^j]kkl  nE  mF  G  Hr   c                 ~   |s| j                   }t        j                  j                  dd| j                  j
                  gdd|gg dgg d      }|r| j                  j                  }|j                  s"|j                  j                          ||_	        n:|j                  j                          |j                  j                  |k7  r||_	        |j                  r|j                  d	       |S | j                  j                  r6| j                  j                  }d |_        g |_	        |j                  d	       |S )
Nwaiting_for_idr   deadliner   cache_status_typerv   CLOSED)cmf_owner.phonezcmf_owner.phone_mobilezcmf_owner.no_staff_controlzcmf_owner.does_not_workzcmf_owner.on_vacationr   
alarm_dater   statusactivity_id	parent_idlistsrx   r0   T)	only_data)rK   rE   CmfTaskrU   r1   r7   rT   staff_control_blocked_dater_   staff_control_blocked_tasksloadr`   ra   )rH   rK   resr1   s       r   get_overdue_deadline_tasksz'CmfPersonVar.get_overdue_deadline_tasks  s   ((Cnn!!!48S#&5
 " 
  [[&&F441199;5822277955;;sB9<F6  d+ 
 [[33[[&&F04F-13F.KK$K'
r   c                     |s| j                   }t        j                  j                  dd| j                  j
                  gddd|t        d      z
  gdd|t        d      z
  ggg d	gg d
      S )Nr   r   r   status_modified_atr      dayscmf_modified_at)r   r   	IN_REVIEW)zresponsible.phonezresponsible.namer   r   r   r   r   r   r   rK   rE   r   rU   r1   r7   r   rH   rK   s     r   get_overdue_in_review_tasksz(CmfPersonVar.get_overdue_in_review_tasks  s{    ((C~~""!48)3iQ6G0GH&S9!3D-DE
 9 # 
 	
r   c                     |s| j                   }t        j                  j                  dd| j                  j
                  gg dg ddd|t        d      z
  gg d	d
dd|gdd|gggg d      S )Nr   r   )r   rv   N)r   r   OPENcmf_created_atr   r   )minutes)responsible_idrv   Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   s     r   get_open_deadline_tasksz$CmfPersonVar.get_open_deadline_tasks  s    ((C~~""!48(3!3i.C(CD.!3,c* # 
 	
r   c                    |s| j                   }t        j                  j                  ddd| j                  j
                  gdd| j                  j
                  ggg      }t        j                  j                  dd|D cg c]  }|j
                   c}gg ddg d	g d
gdd|t        d      z
  gg dgg d      }|S c c}w )Nr   cmf_owner_idr   cmf_owner_assistantsINr   r   )approvedr   F)r   r   N)r   r   Nr   r   r   r   r   r   r   )rK   rE   
CmfProjectrU   r1   r7   r   r   )rH   rK   projectsprojecttaskss        r   get_not_approved_tasksz#CmfPersonVar.get_not_approved_tasks  s    ((C$$))>4@CY[_bfbmbmbpbpaqBrs * u ##dx$HGWZZ$HI)13QR!3iQ.?(?@5 $ 
  %Is    Cc                 F    | j                         sg S | j                         S r    )rl   r   rk   s    r   _overdue_deadline_tasksz$CmfPersonVar._overdue_deadline_tasks  s"    ##%I..00r   c                 |    | j                         sg S | j                  j                  dk  rg S | j                         S N   )rl   rK   r   r   rk   s    r   _overdue_in_review_tasksz%CmfPersonVar._overdue_in_review_tasks  s7    ##%I88==2I//11r   c                 |    | j                         sg S | j                  j                  dk  rg S | j                         S r  )rl   rK   r   r   rk   s    r   _open_deadline_tasksz!CmfPersonVar._open_deadline_tasks  s7    ##%I88==2I++--r   c                 |    | j                         sg S | j                  j                  dk  rg S | j                         S r  )rl   rK   r   r	  rk   s    r   _not_approved_tasksz CmfPersonVar._not_approved_tasks  s7    ##%I88==2I**,,r   c                     | j                   j                  j                  }|s| j                  d       y |j                  j                  }|s| j                  d       y |j                   S )Nu-   Не указана основная рольuK   Не указан непосредственный руководитель)r1   primary_rolerT   rA   
supervisor)rH   prsupervisor_roles      r   get_supervisorzCmfPersonVar.get_supervisor  sX    [[%%++HHDE----HHbc%%%r   c                     | d| j                   j                  j                   dt        |       d}dt        |      z
  dz
  }||d   j                  j                  d | dz   z  }|S )Nu    у r   z)

      r   z...)r1   r   rT   len)rH   r  r   sms_textmls        r   get_smart_sms_textzCmfPersonVar.get_smart_sms_text&  sk    XT$++"2"2"8"8!9CJ<uM3x= 1$E!HMM'',u44r   c                     i }| D ]?  }|j                   j                  j                  }||vrg ||<   ||   j                  |       A |S r    )	cmf_ownerr7   rT   rX   )r  r   taskr   s       r   tasks_group_by_cmf_ownerz%CmfPersonVar.tasks_group_by_cmf_owner.  sR    ! 	 D!!''A|AFMM$		  
r   c                 ,   | j                  |      }|s| j                  d       y dt        |       d}| j                  r|d| j                   z  }| j                  d       | j	                  | j
                  j                  j                  |       y )Nr   A   Нет открытых задач с крайним срокомu2   У вас есть открытые задачи (uH    шт). Нужно взять в работу или перенести.    Подробности в u@   Уведомляю о своих открытых задачах)r   rA   r  r   r@   r1   r   r   rH   rK   r  r  s       r   r   z3CmfPersonVar.notify_responsible_open_deadline_tasks:  s    ,,,5HHXY AU MP Q 	
 ==5dmm_EEHSTdkk..55x@r   c                    | j                  |      }|s| j                  d       y | j                  |      }|j                         D ]  }|d   j                  }|j
                  j                          | j                  |d      }| j                  d|j                   d       | j                  |j
                  j                  |        y )Nr   r&  r   ,   Задачи не взяты в работуr       Уведомляю овнера u<    об открытых задачах исполнителя)r   rA   r$  valuesr"  r   r   r   r   r@   r   rH   rK   r  tasks_by_ownerownerr  s         r   r   z-CmfPersonVar.notify_owner_open_deadline_tasksL  s    ,,,5HHXY66u=#**, 	?E&+Ah&8&8E##%..u=k.lHHH7

|C  A  BMM%,,33X>	?r   c                 |   | j                  |      }|s| j                  d       y | j                         }|s| j                  d       y |j                  j	                          | j                  |d      }| j                  d|j                   d       | j                  |j                  j                  |       y )Nr   r&  B   Нет непосредственного руководителяr*  r+  ,   Уведомляю руководителя u>    об открытых задачах подчиненного)	r   rA   r  r   r   r   r   r@   r   )rH   rK   r  r  r  s        r   r   z2CmfPersonVar.notify_supervisor_open_deadline_tasks_  s    ,,,5HHXY((*
HHYZ$$&**59g*h::??:K  LJ  K	
 	j--44h?r   c                 ,   | j                  |      }|s| j                  d       y dt        |       d}| j                  r|d| j                   z  }| j                  d       | j	                  | j
                  j                  j                  |       y )Nr   I   Нет просроченных задач с крайним срокомu:   У вас есть просроченные задачи (u:    шт). Нужно решить или перенести.r'  uH   Уведомляю о своих просроченных задачах)r   rA   r  r   r@   r1   r   r   r(  s       r   r   z6CmfPersonVar.notify_responsible_overdue_deadline_tasksu  s    //C/8HH`a IU UB C 	
 ==5dmm_EEH[\dkk..55x@r   c                    | j                  |      }|s| j                  d       y | j                  |      }|j                         D ]  }|d   j                  }| j                  |      s y |j                  j                          | j                  |      }| j                  d|j                   d       | j                  |j                  j                  |        y )Nr   r5  r   r,  uB    о просроченных задачах исполнителя)r   rA   r$  r-  r"  rn   r   r   r   r   r@   r   r.  s         r   r   z0CmfPersonVar.notify_owner_overdue_deadline_tasks  s    //C/8HH`a66u=#**, 	?E&+Ah&8&8E11%8##%..u5HHH25::,  ?A  B MM%,,33X>	?r   c                 8   | j                  |      }|s| j                  d       y | j                         }|s| j                  d       y | j                  |      sy d}|D ]$  }|j                  }|d| d|j
                   dz  }& |j                  j                          | j                  |      }t        j                  j                  |||d	       | j                  d
|j
                   d       | j                  |j                  j                  |       y )Nr   r5  r2  r   z
<p>
<a target="_blank" href="z">z
</a>
</p>
   )r1   r   msgpriorityr3  uD    о просроченных задачах подчиненного)r   rA   r  rn   hrefr   r   r   r   rE   	CmfNotifyplace_notifyr@   r   )rH   rK   r  r  r9  r#  r;  r  s           r   r   z5CmfPersonVar.notify_supervisor_overdue_deadline_tasks  s+   //C/8HH`a((*
HHYZ--j9 	D99D r$)) - C	 	$$&**51%%	 	& 	
 	::??:K  LP  Q	
 	j--44h?r   c                    | j                   j                  r7| j                  dg       t        d| j                   | j                  g       | j
                  j                  rit        d| j                   | j
                  j                  | j
                  j                  | j
                  j                     d| j                  g       y y )Nr/   zevent-person-var-favorites-)event_personszevent-person-var-online_status-)r7   r   )	favoritesr`   r>   cmf_emit_eventr/   rL   rT   choicesrk   s    r   emitzCmfPersonVar.emit  s    >>$$k]+88HIZ^ZhZhYij ((<T^^<LMVZVhVhVnVnX\XjXjXrXrsw  tF  tF  tL  tL  YMPN*...)9; )r   c                 X    | j                  | j                  j                         |       y r    )_set_recentrecents_objr   rH   recentsr$   r%   s       r   r   zCmfPersonVar.update_recents_obj  s!    ))..0':r   c                      y r     rG  s       r   r   z&CmfPersonVar.public_update_recents_obj  s     r   c                 X    | j                  | j                  j                         |       y r    )rE  recents_opt_listr   rG  s       r   r   z'CmfPersonVar.update_recent_options_list  s!    ..335w?r   c           	      J   |s||_         | j                          y t               g fd}	 t        |      st        |      rt              dk\  rnt        |      r8t        |      r-|d   d   |d   d   kD  r	 ||       nD ||j                          n1t        |      r	 ||       nt        |      r ||j                          t        |      rt        |      r|_         | j                          y # t        $ r }t        d| d| d|        g Y d }~<d }~ww xY w)Nc                     | j                  d      }|d   vr&j                  |d          j                  |       y y )Nr   	object_id)popaddrX   )rU   objobjs_idsr   s     r   
_push_fromz,CmfPersonVar._set_recent.<locals>._push_from  s>    ((1+C;x/S-.

3 0r   d   r   r   zupdate_recent: 
)rT   ra   rV   r  KeyError	cmf_alert)rH   fieldrH  rT  erS  r   s        @@r   rE  zCmfPersonVar._set_recent  s    !EKIIK5	 
	g,#e*s8s?w<CJqz&)E!HV,<<"7+"5;;/'lw'Zu{{+ g,#e*  			  	s"WIRw?@C	s   B$C9 C9 9	D"DD"c                 *    t         |          ddgz   S )Nr1   r"  )supersave_preload_fields)rH   	__class__s    r   r]  z CmfPersonVar.save_preload_fields  s    w*,+/FFFr   c                 p    | j                   j                  r| j                   | _        t        |   di |S )NrJ  )r1   r`   r"  r\  ra   )rH   r%   r^  s     r   ra   zCmfPersonVar.save  s-    ;;!!![[DNw|%f%%r   r    )r;   zmodels.CmfStaffControlSettings)u   Дедлайн)8__name__
__module____qualname__TEXKOM_no_cachecmfrE   	CmfEntityapi_methodsclassmethodr&   r)   r   strr@   r   rl   rn   staticmethodcmf_deferred_jobr   rA   propertyr   r?   r{   r   r   r   rK   r   r   r   r   r   r	  r  r  r  r  r  r   r$  r   r   r   r   r   r   rC  r   r   r   rE  r]  ra   __classcell__)r^  s   @r   r   r      sX   O**&&22 6
 
K ) ) ) )  9c 9 9 9"  B2, 	J K (+    ( (
JX 	J K : 	J K 4 2 2 R R $ $%HN&P
(
2, 1 1 2 2 . . - -	& 	 	A$?&@,A$?0&@P;;
@BG& &r   r   )r   r   r   r   pathlibr   rO   cmf.includecmf.data_providers.baser	   common.weekendsr
   r   rd  rE   re  r   rJ  r   r   <module>rq     s>    8 8    1 &( v&3::'' v&r   