U
    juica                     @   s   d dl m Z mZmZmZ d dlmZ d dlZd dlT d dlm	Z	 e dddZ
G d	d
 d
ejjZejdd  ejdd  ejdd  dS )    )datetimetime	timedeltatimezone)PathN)*)
is_weekendtc                 C   s$   | j ddd| jdt| jd d S )Nr   )secondZmicrosecondminutehour   Zhours)replacer   r   r   r	    r   0./modules/staff_control/models/cmf_person_var.py
round_hour
   s    r   c                       s  e Zd ZdZedd ZedYddZeedddd	Zed
d Z	dd Z
dd Zedd Zdd Zedd ZeddddZdd Zedd Zedd Zed d! Zed"d# Zed$d% Zd&d' ZdZd(d)Zd[d*d+Zd\d,d-Zd]d.d/Zed0d1 Zed2d3 Zed4d5 Zed6d7 Zd8d9 Z d^d;d<Z!e"d=d> Z#d?d@ Z$dAdB Z%dCdD Z&dEdF Z'dGdH Z(dIdJ Z)dKdL Z*dMdN Z+dOdP Z,dQdR Z-dSdT Z. fdUdVZ/ fdWdXZ0  Z1S )_CmfPersonVarTc                 O   s   | j ||S N)ping)clsargskwargsr   r   r   public_ping   s    zCmfPersonVar.public_pingNc                 C   sN   |sg }| ddddg tjs(td| jtjj|d}|sJ| tjd}|S )Nperson.on_vacationbrowser_timezonelast_ping_atZcmf_modified_byz'get_or_create g.current_person == False)	person_idfields)person)extendgcurrent_person
ValueErrorgetid)r   r   cr   r   r   get_or_create   s    zCmfPersonVar.get_or_create)phonetextreturnc                 C   sd   |  dg |  }|s td|js2| d n.| jjsBtjj	sN| d nt
j||d  dS )u>  
        Враппер для отправки СМС с проверкой настроек контроля сотрудников.
        TODO: расширить настройки отправки СМС под каждый случай и проверять их в вызывающей функции
        person.no_staff_controlu   Баг: нет настроек контроля сотрудников в БД, должны были создаться выше.uj   В настройках контроля сотрудников выключена отправка СМСuP   В настройках отключен контроль сотрудников)r)   r*   N)load_fieldsget_settingsAssertionErrorsend_smslogr    no_staff_controlr"   Zglobal_settingsZstaff_control_enabledmodelsZCmfSMSsend)selfr)   r*   settingsr   r   r   r0   )   s    zCmfPersonVar.send_smsc                 O   s   t j|d}tdtjjj| |dp2t	 }| j
t	t|dg d}|jjs`|jdkrfd|_|jjj|_|j  |j|d |S )Nnowr   r   online_statusr   offlineZonline)dateutilparserparser%   printr"   r#   Zloginvaluelistr(   setr8   is_nullZtzinfoZ_offsetsecondsr   r   set_nowsave)r   r   r   Zbrowser_nowr   r'   r   r   r   r   :   s    
zCmfPersonVar.pingc                 C   sx   t  r| d dS | dg | js4| d dS | jjrJ| d dS | jjr`| d dS | jst| d dS dS )	N   Сегодня выходнойFzperson.*u   Не выставлен person"   Больше не работает   В отпускеu(   Не выставлен browser_timezoneT)r   r1   r-   r    does_not_workon_vacationr   r5   r   r   r   _should_processI   s"    




zCmfPersonVar._should_processc                 C   s\   |sdS t  r| d dS |jr0| d dS |jrD| d dS |jrX| d dS dS )NFrF   uC   Отключен контроль работы сотрудникаrG   rH   T)r   r1   r2   rI   rJ   )r5   r    r   r   r   _should_process_by_personb   s    



z&CmfPersonVar._should_process_by_personc              	   C   s`   t d | jdddddddd	gd
D ]6}z|  W q$ tk
rX   td|  Y q$X q$d S )Nu4   Проверка открытых браузеровr   r   person.phone_mobileperson.phoner,   person.does_not_workr   r8   r9       Ошибка обработки )r>   r@   check_browser_open	Exceptionlogging	exception)r   r'   r   r   r   all_check_browser_openx   s          
z#CmfPersonVar.all_check_browser_openc                 O   sZ   d| j g}| jr6| jdg || jjj| jjjg7 }dd | D }t|||  d S )Nu'   Контроль сотрудниковphone_mobilec                 S   s   g | ]\}}| d | qS )=r   ).0kvr   r   r   
<listcomp>   s     z$CmfPersonVar.log.<locals>.<listcomp>)	coder    r-   namer?   rW   numberitemsr>   )r5   r   r   prefixZ
kwargs_fmtr   r   r   r1      s    
zCmfPersonVar.logc                 C   sD   t | }t|dr|jS td}d}| r8|  }||_|jS )NZ
__org_namezcustom/org_name )typehasattrZ_CmfPersonVar__org_namer   existsZ	read_textstrip)r5   r   Zorg_name_pathorg_namer   r   r   rg      s    
zCmfPersonVar.org_namezmodels.CmfStaffControlSettings)r+   c                 C   s   t ddstj t_tjS )Nr"   staff_control_settings)rd   r3   ZCmfStaffControlSettingsr(   r"   rh   rK   r   r   r   r.      s    
zCmfPersonVar.get_settingsc                 C   s  |   sd S | j }|  }t||jj| j}t||j	j| j}|t
dd8 }|| j  k oh|k n  }|s| d| d| j d|  d S | jj| j}| j|  }|dk }| jd| j| jj|||d |r| d d S | jjs| jd	kr
d	| _|   | jjj}	|	s(| d
 d S | jjdkrP| d| jj d d S d}
| jrn|
dtj d7 }
| d | |	|
 | j  |   d S )N   r   u    не рабочее время: z < i  rR   )r7   r   ping_tzseconds_since_last_pingis_ping_recentub   Пользователь недавно присылал данные в рабочее времяr:   uD   У пользователя не установлен телефон)
      u   Не нашли на рабочем месте, но не уведомляем, т.к. не 10 или 14 часов (сейчас )u   ЦРМ не может найти Вас на рабочем месте. Проверьте, что запущен браузер. (ue   Уведомляю пользователя о том что нужно открыть браузер)rL   r7   dater.   r   ZcombineZwork_start_atr?   py_browser_timezoneZwork_end_atr   r1   r   
astimezoneZtotal_secondsr8   rB   rE   r    rW   r_   closest_hourr   rg   ZconfigZAPP_FQDNr0   Zlast_sms_atrD   )r5   Ztoday_tzr6   Z
work_startZwork_endZis_working_timerj   rk   rl   rW   r*   r   r   r   rR      sj    
    	




zCmfPersonVar.check_browser_openc                 O   sn   t d | jdddddddd	d
ddddgdD ]:}z|j|| W q. tk
rf   td|  Y q.X q.d S )Nu:   Проверка задач с крайним срокомr   zperson.emailrO   rN   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,   rP   vacation_startvacation_endr   r9   rQ   )r>   r@   check_tasks_deadline_wraprS   rT   rU   )r   r   r   Zscr   r   r   all_check_tasks_deadline   s*          

z%CmfPersonVar.all_check_tasks_deadlinec              
   C   s   t d tjjdddgdddgdd	t  gd
dt  ggdD ]}|  |  qFt d tjjdddgdddgdddt  gddd gd
dt  gd
dd gggdD ]$}t |j	 d |  |  qd S )Nu:   Выставляем ушедших отпускниковZ
user_local==TrJ   rX   Fru   z<=rv   z>=filteru>   Выставляем пришедших отпускниковOR><z Not on vacation)
r>   r3   Z	CmfPersonr@   r   Zutcnowrq   Z_calc_vacationrE   r^   )r   pr   r   r   all_check_person   s,    
zCmfPersonVar.all_check_personc                 C   s   t t| jjdS )N)rC   )r   r   r   r?   rK   r   r   r   rr     s    z CmfPersonVar.py_browser_timezonec                 C   s   t jtjd| jS )N)Ztz)r   r7   r   Zutcrs   rr   rK   r   r   r   r7     s    zCmfPersonVar.nowc                 C   s
   t | jS r   )r   r7   rK   r   r   r   rt   "  s    zCmfPersonVar.closest_hourc                 O   s   |   sd S | j}|jdd}|jdd}|jdd}||krb| d | j|d | j|d nn||kr| d | j|d | j|d nB||kr| d | j|d | j	|d n| d	| d
|  d S )Nrn   )r         u-   12 часов для пользователяr7   u-   13 часов для пользователяu-   16 часов для пользователяuF   Не время для уведомлений по дедлайнам  )
rL   rt   r   r1   )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)r5   r   r   rt   Zhour_notify_responsibleZhour_notify_ownerZhour_notify_supervisorr   r   r   rw   &  s&    


z&CmfPersonVar.check_tasks_deadline_wrapc                 C   sN   |s
| j }tjjdd| jjgdd|gdddggdd	d
dddddddddgdS )Nwaiting_for_idry   deadliner~   cache_status_type!=closedcmf_owner.phonezcmf_owner.phone_mobilezcmf_owner.no_staff_controlzcmf_owner.does_not_workzcmf_owner.on_vacationr^   
alarm_datestatusactivity_id	parent_idlistsr{   r   )r7   r3   CmfTaskr@   r    r&   r5   r7   r   r   r   get_overdue_deadline_tasksI  s*            z'CmfPersonVar.get_overdue_deadline_tasksc              
   C   sf   |s
| j }tjjdd| jjgddd|tdd gdd|tdd ggd	dd
ggddddddddgdS )Nr   ry   r|   Zstatus_modified_atr~      ZdaysZcmf_modified_atr   Z	in_reviewzresponsible.phonezresponsible.namer   r   r   r   r   r   r   r7   r3   r   r@   r    r&   r   r   r   r   r   get_overdue_in_review_tasks[  s(    
      z(CmfPersonVar.get_overdue_in_review_tasksc                 C   st   |s
| j }tjjdd| jjgddd gdddgdd|td	d
 gddd gddd|gdd|gggddddddddgdS )Nr   ry   r   r   r   opencmf_created_atr~   r   )Zminutesresponsible_idr|   r   r   r^   r   r   r   r   r   r   r   r   r   r   get_open_deadline_taskso  s.          z$CmfPersonVar.get_open_deadline_tasksc              
   C   s   |s
| j }tjjddd| jjgdd| jjggd}tjjdddd	 |D gd
ddgdddd gddd ggdd|tdd gdddggddddddddgd}|S )Nr|   Zcmf_owner_idry   Zcmf_owner_assistant_idrz   r   INc                 S   s   g | ]
}|j qS r   )r&   )rY   Zprojectr   r   r   r\     s     z7CmfPersonVar.get_not_approved_tasks.<locals>.<listcomp>ZapprovedFr   r   r   r~   r   r   r   r   r   r   r^   r   r   r   r   r   )r7   r3   Z
CmfProjectr@   r    r&   r   r   )r5   r7   Zprojectstasksr   r   r   get_not_approved_tasks  s.          z#CmfPersonVar.get_not_approved_tasksc                 C   s   |   sg S |  S r   )rL   r   rK   r   r   r   _overdue_deadline_tasks  s    z$CmfPersonVar._overdue_deadline_tasksc                 C   s$   |   sg S | jjdk rg S |  S N   )rL   r7   r   r   rK   r   r   r   _overdue_in_review_tasks  s
    z%CmfPersonVar._overdue_in_review_tasksc                 C   s$   |   sg S | jjdk rg S |  S r   )rL   r7   r   r   rK   r   r   r   _open_deadline_tasks  s
    z!CmfPersonVar._open_deadline_tasksc                 C   s$   |   sg S | jjdk rg S |  S r   )rL   r7   r   r   rK   r   r   r   _not_approved_tasks  s
    z CmfPersonVar._not_approved_tasksc                 C   s<   | j jj}|s| d d S |jj}|s6| d d S |j S )Nu-   Не указана основная рольuK   Не указан непосредственный руководитель)r    Zprimary_roler?   r1   
supervisor)r5   ZprZsupervisor_roler   r   r   get_supervisor  s    


zCmfPersonVar.get_supervisor   Дедлайнc                 C   sP   | d| j jj dt| d}dt| d }||d jjd | d 7 }|S )Nu    у rp   z)

      r   z...)r    r^   r?   len)r5   r   ra   sms_textmlr   r   r   get_smart_sms_text  s     zCmfPersonVar.get_smart_sms_textc                 C   s:   i }| D ],}|j jj}||kr&g ||< || | q|S r   )	cmf_ownerr&   r?   append)r   restaskrZ   r   r   r   tasks_group_by_cmf_owner  s    
z%CmfPersonVar.tasks_group_by_cmf_ownerc                 C   sd   | j |d}|s| d d S dt| d}| jrD|d| j 7 }| d | | jjj| d S )Nr   A   Нет открытых задач с крайним срокомu2   У вас есть открытые задачи (uH    шт). Нужно взять в работу или перенести.    Подробности в u@   Уведомляю о своих открытых задачах)r   r1   r   rg   r0   r    rW   r_   r5   r7   r   r   r   r   r   r     s    

z3CmfPersonVar.notify_responsible_open_deadline_tasksc                 C   sv   | j |d}|s| d d S | |}| D ]@}|d j}| j|dd}| d|j d | |jj	| q0d S )Nr   r   r   ,   Задачи не взяты в работуra       Уведомляю овнера u<    об открытых задачах исполнителя)
r   r1   r   valuesr   r   r^   r0   rW   r_   r5   r7   r   Ztasks_by_ownerownerr   r   r   r   r     s    


z-CmfPersonVar.notify_owner_open_deadline_tasksc                 C   sn   | j |d}|s| d d S |  }|s8| d d S | j|dd}| d|j d | |jj| d S )Nr   r   B   Нет непосредственного руководителяr   r   ,   Уведомляю руководителя u>    об открытых задачах подчиненного)r   r1   r   r   r^   r0   rW   r_   )r5   r7   r   r   r   r   r   r   r     s    

z2CmfPersonVar.notify_supervisor_open_deadline_tasksc                 C   sd   | j |d}|s| d d S dt| d}| jrD|d| j 7 }| d | | jjj| d S )Nr   I   Нет просроченных задач с крайним срокомu:   У вас есть просроченные задачи (u:    шт). Нужно решить или перенести.r   uH   Уведомляю о своих просроченных задачах)r   r1   r   rg   r0   r    rW   r_   r   r   r   r   r     s    

z6CmfPersonVar.notify_responsible_overdue_deadline_tasksc                 C   s   | j |d}|s| d d S | |}| D ]L}|d j}| |sN d S | |}| d|j d | |j	j
| q0d S )Nr   r   r   r   uB    о просроченных задачах исполнителя)r   r1   r   r   r   rM   r   r^   r0   rW   r_   r   r   r   r   r   +  s    




z0CmfPersonVar.notify_owner_overdue_deadline_tasksc                 C   s   | j |d}|s| d d S |  }|s8| d d S | |sFd S d}|D ]"}|j}|d| d|j d7 }qN| |}tjj	|j
||dd	 | d
|j d | |jj| d S )Nr   r   r   rb   z
<p>
<a target="_blank" href="z">z
</a>
</p>
   )r   r^   msgpriorityr   uD    о просроченных задачах подчиненного)r   r1   r   rM   hrefr^   r   r3   Z	CmfNotifyZplace_notifyr&   r0   rW   r_   )r5   r7   r   r   r   r   r   r   r   r   r   r   A  s:    



z5CmfPersonVar.notify_supervisor_overdue_deadline_tasksc                 C   sh   | j jr,| dg td| j | jgd | jjrdtd| j | jj| jj| jj d| jgd d S )Nr   zevent-person-var-favorites-)Zevent_personszevent-person-var-online_status-)r&   r^   )Z	favorites
is_changedr-   Zcmf_emit_eventr   r8   r?   choicesrK   r   r   r   emith  s    zCmfPersonVar.emitc                 O   s   |  | j | d S r   )_set_recentZrecents_objloadr5   recentsr   r   r   r   r   update_recents_objr  s    zCmfPersonVar.update_recents_objc                 O   s   d S r   r   r   r   r   r   public_update_recents_obju  s    z&CmfPersonVar.public_update_recents_objc                 O   s   |  | j | d S r   )r   Zrecents_opt_listr   r   r   r   r   update_recent_options_listz  s    z'CmfPersonVar.update_recent_options_listc              
      s  |s||_ |   d S t  g  fdd}zt|s@t|rtdkrNqt|rt|r|d d |d d kr|| q||j  q0t|r|| q0t|r0||j  q0W n@ tk
r } z"td| d| d|  g W 5 d }~X Y nX |_ |   d S )Nc                    s2   |  d}|d  kr. |d  | d S )Nr   Z	object_id)popaddr   )r@   objZobjs_idsr   r   r   
_push_from  s    
z,CmfPersonVar._set_recent.<locals>._push_fromd   r   r   zupdate_recent: 
)r?   rE   rA   r   KeyErrorZ	cmf_alert)r5   Zfieldr   r   er   r   r   r   }  s0    

zCmfPersonVar._set_recentc                    s   t   ddg S )Nr    r   )supersave_preload_fieldsrK   	__class__r   r   r     s    z CmfPersonVar.save_preload_fieldsc                    s   | j jr| j | _t jf |S r   )r    r   r   r   rE   )r5   r   r   r   r   rE     s    zCmfPersonVar.save)N)N)N)N)N)r   )2__name__
__module____qualname__Zno_cacheclassmethodr   r(   strr0   r   rL   rM   rV   r1   propertyrg   r.   rR   rx   r   rr   r7   rt   rw   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   rE   __classcell__r   r   r   r   r      st   



I




#





	
	
	

'
"r   c                   C   s
   t j S r   )r3   r   rV   r   r   r   r   <lambda>      r   c                   C   s
   t j S r   )r3   r   rx   r   r   r   r   r     r   c                   C   s
   t j S r   )r3   r   r   r   r   r   r   r     r   )r   r   r   r   pathlibr   r;   Zcmf.includeZcommon.weekendsr   r   Zcmfr3   Z	CmfEntityr   ZAPPZHOOK_CRON_HOURLYr   r   r   r   r   <module>   s        