U
    `g                     @   s^   d dl m Z mZmZ d dlmZ d dlmZ d dlT d dlm	Z	m
Z
mZ G dd de	jZdS )	    )datetime	timedeltatimezone)uuid1)	dataclass)*)
cmf_notifyCmfRelationCmfTypec                       s  e Zd ZdZdZdZi Zee	j
ejde	j
ejdgZeed< ejf eZejjddd	g ZeG d
d dZedd Zedd Zedd Zed<ddZedd ZeedddZeedddZed=dd Zed!d!d"edd#d$Z  fd%d&Z!ed>d'd(Z"ed?d)d*Z#ed+d, Z$e%e&d!d!d-d.d/ Z'e%e&d!d!d-d0d1 Z(ed2d3 Z)ed4d5 Z*ed6d7 Z+e%e&d!d!d8d9d:d; Z,  Z-S )@	CmfNotifyZNotifyZdeskZNTFzcommon/templateszcmf/templatesloaderclose_open_notifiesconfirm_unconfirmed_notifiesplace_notifyc                   @   s*  e Zd ZU dZdZeed< dZeed< dZeed< dZ	e
ed< dZeed	< dZeed
< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZeed< dZ dS )zCmfNotify.NotifyCtxu1  
        notify_type - тип сообщения
        возможные варианты:
        - просто сообщение (default) -- message
        - редактирование объекта -- obj_edit
        - создание объекта -- obj_create
        - удаление объекта -- obj_delete
        - добавление комментария -- comment_create
        - редактирование комментария -- comment_edit
        - удаление комментария -- comment_delete
        N	person_idnametextr   priorityFstrikethrough
alarm_datemessagenotify_typeobj_hrefobj_codeobj_parent_nameobj_link html_changed_fields
owner_nameowner_initialsperson_phone_mobileperson_phoneperson_nameperson_emailperson_loginmsg_from_idmsg_from_namemsg_from_codemsg_from_login)!__name__
__module____qualname____doc__r   str__annotations__r   r   r   intr   boolr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   comments r2   r2   ./cmf/models/cmf_notify.py	NotifyCtx   s2   
r4   c                 C   sl   |j p
|j}d|j d|j d|j }|  }|r<| }| j|}|j|d}t	| j
|||gd d S )N[] () )ctxargs)r#   r$   r   r   r   +get_default_mail_notification_template_name
_jinja_envget_templaterenderschedule_deferred_jobprocess_email)cls
notify_ctxobjrcpt_tosubjectmail_templatetemplate
email_bodyr2   r2   r3   send_email_notify_old@   s    zCmfNotify.send_email_notify_oldc                 C   s   t dd}|jp|j}t|dkr4|d d  d}| d|j d| |j }|jpZ|j}|svtd|j d d S t	| j
||gd d S )	NTZfull_url   z...
4   SMS уведомление пользователю _    не отправлено, не указан номер мобильного телефона.r9   )app_base_hrefr   msglenr   r    r!   	cmf_alertr"   r?   process_sms)rA   rB   urlsubjr   phoner2   r2   r3   send_sms_notify_oldO   s    
zCmfNotify.send_sms_notify_oldc           	      K   s  d|ks|d dkr&t jtjd|d< d|kr:|d}ntj}|jj|d< |j	j|d< |j
j|d< |jj|d< d	|d
< |rd|ks|d dkr|j	|d< d|ks|d dkrt jtjd|d< t|d tr|d j|d< |d |d< |ptj}|j	j|d< |ddg |jr |jjd nd|jr6|jjd nd |d< |rtdd}|j|d< |j
|d< | |d  |d< t|dr|jr|jj	j|d< nd |d< tj|}||d< |d |d< |d |d< |d
 |d < |d! |d"< |d# |d$< | jf |}|S )%Nr   .Ztzmsg_fromr%   r&   r'   r(      Уведомлениеr   r   rP   r   r   
first_name	last_namer   r   r   TrJ   r   r   r   parentr   r   rV   r!   phone_mobiler    r"   emailr#   loginr$   )r   nowr   utcpopgcurrent_personidvaluer   coder`   
isinstancer
   current_userload_fieldsr[   r\   rO   hrefhasattrr]   models	CmfPersonget_notify_opt_cachedr4   )	rA   rC   r   kwargsrY   Znotify_ownerrT   notify_optsr8   r2   r2   r3   prepare_notify_ctx_old]   sL    

4


z CmfNotify.prepare_notify_ctx_oldNr   Fr   c
              	   K   s  t jrt d dS t|d}tj|}|dkr8dS d}|t jj	krb|dkrb|d r^d}ndS |r|j
jrv|jjs|ddg d}|rd	}|sd
}| jdd|j	gdd|gdd|gdddgdddggdddgd}|st }|sd}|jr|jdkr| d|j }|jr$|jr$|r*||_d	|_| jd7  _||_||_d|_|	r^|	|_n
|j  |r|j|_|j	|_|j|_|j|_t|dr|j
r|j
jj|_ |j!|_"t|dr|j# rt$|jt%r|jj|_&nt'|j|_&nd|_|j(s
g |_(|j(rFt)|j(jdkrF|j(jdd d d |krF|S t j*j+r^t j*j+jd ndt j*j,rxt j*j,jd nd }|r|jjnd}t j*j	jt j*jjt j*jjt j*j-j|dt.j/t0j1d2 t./ 3d||dt4  |dd }|j(5| d|_6|jp||_|d! |_7|d" |_8|d# p.|d$ |_9|d% pB|d& |_:|sRd
|_|;  |d' sp|j<d(krt=d)|||j"jd*|gd+ |j<d,kr|j>st=d-| |gd+ |S ).u  
        obj: CmfEntity

        :param obj:
        :param msg_from:
        :param person: Идентификатор пользователя которому отправляется сообщение
        :param name: Наименование объекта уведомления
        :param msg: Текст сообщения
        force - форсированная отправка
        :param priority:
        :param strikethrough:
        :param alarm_date: Будильник для уведомлений
        :param force_notify_current_person: отправить сообщение себе
        :param notify_type: Тип сообщения. Описание см в структуре NotifyCtx
        B   Уведомления отключены g.disable_notify = FalseNro   TFemail_if_self_changesr]   rh   openclosedobj_id==r   status	cron_done	confirmed
unread_cntr1   
cron_forcefilterfieldsrZ   r   u
    + еще    r   r   )rf   r   rh   r`   ZinitialsrX   z%H:%MzCmfComment:)Z	cmf_ownerZcmf_created_atZcmf_created_at_formattedmsg_type_textr   rf   parent_name	log_level
notify_smsZnotify_emailr^   rV   r_   r`   Z	notify_os1z	notify-os)r   commentr   Zevent_persons2znotify-important-)?rd   disable_notifydebugcmfutilZget_obj_id_by_anyrn   ro   rp   re   rf   r]   
is_definedrh   rk   getr   r}   r   r~   rz   Zpriotityr   r   r   Zset_nowr   rx   r   ui_nameZobj_ui_namerm   rg   r   rl   r   loadri   r	   Zobj_status_namer-   r1   rQ   rj   r[   r\   r`   r   ra   r   rb   Z	isoformatstrftimer   appendr{   person_notify_smsperson_notify_emailr!   r#   saver   cmf_emit_eventr|   )rA   rP   personr   r   rC   force_notify_current_personforcer   r   rq   r   rr   Zdesk_notifynotifyZfilter_statusr   r   r   r2   r2   r3   r      s    

	



zCmfNotify.place_notifyc           	      K   s0  t jrt d dS d|kr(|d dk	s0tdd|krD|d dk	sLtd|d t jjkrj|dsjdS d	|kr|d	}|d
dddg nd}|d}t	j
j|dddgd}|st d|  dS |dg }t	j||}| j||f|}|dkrdS | ||}|r,| || | | |S )u  
        obj: CmfEntity

        :param obj:
        :param msg_from:
        :param person_id: Идентификатор пользователя которому отправляется сообщение
        :param recipient_opt: Опции получателя для проверки разрешения получать уведомления пользователем
        :param name: Наименование объекта уведомления
        :param text: Тема сообщения
        :param msg: Текст сообщения
        :param priority:
        :param strikethrough:
        :param alarm_date: Будильник для уведомлений
        :param force_notify_current_person: отправить сообщение себе
        :param notify_type: Тип сообщения. Описание см в структуре NotifyCtx
        rt   NrP   .u   Укажите msgr   u   Укажите person_idr   rC   r]   rh   r   rl   r   zphone_mobile.numberzphone.numberrf   r   u   В метод place_notify пришел отсутствующий или удаленный пользователь person_id=recipient_opt)rd   r   r   AssertionErrorre   rf   r   rc   rk   rn   ro   ZCmfPersonNotifyOptZcheck_permission_notify_eventZprepare_notify_ctxZcreate_desk_notifysend_email_notifysend_sms_notify)	rA   rq   rC   r   r   r   Znotify_allowedrB   r   r2   r2   r3   stol_place_notify<  s8    




zCmfNotify.stol_place_notify)event_type_codec                 C   s  t  }t|drL|jdkrL|jr,|jdsL| D ]}dh||jj< q4|S |j}|jdkrd|jj}t|dsrd}tj	
||j d| }|stj	
|d| }|sdS g }|d D ].}|j|d	d
}	|	dkr||t  || d q|	D ]}
tj|
jj}|dkrq|
js(||
 ||
jjt  d}|dkrX|d rXd	}nx|dkrr|d rrd	}n^|dkr|d rd	}nD|dkr|d rd	}n*|dkr|d rd	}||
jj d |r||
jj d qq|rbtjjdd}tjj|j|dgd}|D ]H}t|tjjr2|j}|jj|kr|r||d kr||jj= q|d r|jdkr||d  |d D ]}|| sqtt|| tjjr|| D ]*}||jjt  ||jj d qn,||| jjt  ||| jj d q|D ]n}|drDtd| dd t j!r"tjj|d gd!}|r"|j"r"|j"jdr"td"| dd q"|S )#uY   
        Рассчитываем набор юзеров и их галочек
        logic_prefixZ
CmfProjectzCmfProject:r_   N.z
AllModels.Znotify_membersT)Zall_nested_personsFz
var:authorZemail_if_authorz	var:ownerZemail_if_owner)zvar:responsiblezvar:executorsZemail_if_responsiblezvar:spectatorsZemail_if_spectatorzvar:current_userru   rj   sdesk-client:default)rh   members)	parent_idZproject_role_idr   Znotify_custom_fieldCmfTaskzvar:zDEV: Var user in notify! )abortrh   r   z DEV: Var user person in notify! )#dictrm   
class_namer   
startswithZall_relation_personsrf   rg   rn   ZCmfProjectNotifySchemeZget_notify_rule_data_cachedZextract_var_obj
setdefaultsetaddro   rp   
user_localr   ZCmfProjectRoler   ZCmfProjectRoleAssignr]   ri   cmfr   ZCmfRelationBaserk   
issubclasstypeZ
CmfM2MBaserR   configDEBUGrh   )rA   rC   r   Z
recipientsuZtmp_parent_idZ	rule_dataZnon_local_personsZuser_idZ	var_usersZvar_userrr   r_   Z	proj_roleZproj_role_assignuser
field_nameir2   r2   r3   get_notify_membersu  s    



  

"
zCmfNotify.get_notify_membersc                 C   s	  t |tjr|dkrXd|jj d}d|jj d}d}d|||jdd|||jdgS |dkrd|jj d}d|jj d}d	}d|||jdd|||jdgS t |tjr|jjrd
}d}d||dgS |j	jrd}d}d||dgS |j
jr|dkr6d|j d}d}d}d|||j
jdd||dgS |dkr|j
r|d|j d}d}d}d|||j
jdd||dgS |j
jrd|j d}d}d}d|||j
jdd||dgS |dkrd}d}d||dgS |dkrd}d}d||dgS |dkrd}d}d||dgS |d krNd!}|d"|j  7 }d#}d||dgS |d$kr|jd%krz|jd%krzd&}d'}nDd(}|jj|jj }	|d)|	 7 }|jj|jj }
|d*|
 7 }d+}d||dgS |d,krd-}|d"|jj d.|jjr|jjnd/ 7 }d0}d||dgS |d1krR|jrRd2}|d"|j  7 }d3}d||dgS |d4krd5}|d"|jj d.|jjr|jjnd/ 7 }d6}d||dgS |d7kr|jrd8}|d9|j 7 }d:}d||dgS |d;krd<}|d9|j 7 }d=}d||dgS |d>kr$d?}d@}d||dgS |dAkrL|jrLdB}dC}d||dgS |dDkrldE}dF}d||dgS |dGkrdH}|jjr|dI|jjj 7 }|jr|dJ|jj 7 }dK}d||dgS |dLkrg }|jjr`dM}|jr|jj}dM}|jr|jj}dN| }||kr&|dO| 7 }|dP7 }|jjrJ|d9|jj 7 }dQ}|dR||d |jjrt|jt|jj }|rdSdTdU |D }dN| dP}|jjr|d9|jj 7 }dV}|dR||d |S |dWkrdX}dRdY|dgS |dZkr.d[}|jjrt|jj}d\}dR||dgS |d]krdd^}|jjrRt|jj}d_}dR||dgS |d`krda}|jjrt|jj}db}dR||dgS |dckrdd}|jjrt|jj}de}dR||dgS |dfkr|jjr|jr|jjj|jjkrg S |jdgkr"d\}dRdh|dgS dM}|jr6|jj}di|jj dj| dP}|jjrh|d9|jj 7 }|jjr|jrdk|jjj dl|jj dm}ndn}dR||dgS |dokrdp| }dq}dR||dgS |drkrds}dt}dR||dgS |dukrdv| dw}dx}dR||dgS |dykr8dz}d{}dR||dgS |d|krd}}d~}|jjD ]$}||jjkrR|d|j 7 }qR|jjD ]$}||jjkr|d|j 7 }qdR||dgS dddddg}|dk	rg g g d}|j ddD ]j\}}|j!sq|j|jk	r
q||k	rq|"|}|dk 	r0q| }|r|| | qg }d}|d 	r~|dd"|d |d |dR 	r|dRd"|dR |d |d 	r|dd"|d |d |S | }dRd| d|j |dgS )u  
        Логика:
        - по спец. событиям типа assigned, придет и assigned и updated, поэтому поля спец.событий
            дополнительно нужно отфильтровывать в updated
        Zcreatedu6   Установлена связь с задачей «   »u/   установил связь с задачей   )r   r   message_titler]   Zdeletedu.   Удалена связь с задачей «u)   удалил связь с задачейu7   Изменена плановая дата началаu5   изменил плановую дату начала)r   r   r   u?   Изменена плановая дата завершенияu=   изменил плановую дату завершенияu$   Создана подзадача «u   Созданаu   создал подзадачуupdatedu(   Добавлена подзадача «u   Добавленаu!   добавил подзадачуu$   Удалена подзадача «u   Удаленаu   удалил подзадачуZrestoredu   Восстановленоu   восстановилu   Удаленоu   удалилu   Созданоu   создалZ	publishedu9   Выпущены изменения в документеz<br>u!   выпустил документZshareddefaultu[   Отменен публичный доступ к документу в интернете.u9   отменил публикацию в интернетеui   Документ опубликован для публичного доступа в интернете.u   <br>Анонимные: u"   <br>Авторизованные: u,   опубликовал в интернетеZcomment_createdu$   Комментарий создан.: r   u%   написал комментарийZcomment_updatedu&   Комментарий изменен.u%   изменил комментарийZcomment_deletedu#   Комментарий удаленu#   удалил комментарийZattachment_createdu#   Добавлено вложение u   добавил вложениеZattachment_deletedu   Удалено вложениеu   удалил вложениеZworklog_createdu+   Сделана запись о работеu)   сделал запись о работеZworklog_updatedu&   Журнал работ измененu&   изменил журнал работZworklog_deletedu$   Журнал работ удаленu$   удалил журнал работZmovedu   Перемещеноu    из проекта u    в проект u1   переместил в другой проектassignedu   Не установленu%   Задача назначена на u   , ожидает r   u'   назначил исполнителяr   z, c                 S   s   g | ]}t |jqS r2   )r-   r   ).0er2   r2   r3   
<listcomp>  s     z5CmfNotify._prepare_notify_message.<locals>.<listcomp>u-   назначил соисполнителейZresolvedu   добавил решениеu1   В задаче добавлено решениеrw   u   Задача завершенаu   завершил задачуZwork_startedu   Работа начатаu   начал работуZwork_stoppedu#   Работа остановленаu%   приостановил работуZreopenedu#   Задача переоткрытаu!   переоткрыл задачуchanged_statusZCLOSEDu   Задача закрытаu!   Статус изменен на u   , ожидаем u   изменил статус c "u   " на ""u   изменил статусZapprove_startedu.   Ожидается подтверждение u+   запустил подтверждениеZapprove_rejectedu6   Пользователь отклонил запросu   отклонил запросZapprove_success_fullu   Утверждение u    завершеноu)   утверждение завершеноZapprove_success_oneu:   Пользователь подтвердил запросu!   подтвердил запросZspectators_changedu'   изменены наблюдателиu4   Изменен состав наблюдателейu   <br>добавлен: u   <br>удален: responsiblerz   ZviewsZresult_textr]   )r   r   r   T)
is_changedr   u   изменилu   Пришло событие u    по объекту )#ri   rn   CmfRelationOptionin_linkr   Zout_linkr   Zplan_start_dater   Zplan_end_dateZparent_taskrg   oldr   	html_diffZperm_policy_anonymousZperm_policy_guestchoicesZcaptionnewr]   r   waiting_forrz   r   	executorsr   joinr-   rh   Zcache_status_typeZ
spectatorsitemsr   Z_get_field_log_level)rA   rC   r   Zin_msgZout_msgr   rP   Zparent_task_msgZtask_msgZ	anonymousZguestresr   r   Znew_executorsr   Z	spectatorZskip_field_namesZtmp_listr   Z	field_objr   r   r2   r2   r3   _prepare_notify_message  s   














*
*





















&













z!CmfNotify._prepare_notify_messagec              
   C   s  |j j}|jj}|jj}|jj}|j}tjj|d}	z&tj	j
|||||dd|	dsXW dS W nP tk
rp   Y dS  tk
r }
 z|
jd |krW Y 
dS  W 5 d}
~
X Y nX |jdkr|jrtjj|j|	dsdS |r|jdkr|jrtjj|j|	dsdS d	S )
u   
        Проверяет, что у получателя notify есть доступ к объекту
        Доп. проверяются права у private-комментариев
        )rf   readF)initial_acl_keyZobject_modelZobject_owner_idZ	object_idZobject_parent_idZaccess_levelZraise_errorchecking_personr   N
CmfComment)Zcheck_for_userT)Zperm_effective_acl_idrg   r   cmf_owner_idrf   r   rn   ro   r   ZCmfAccessListZcheck_accessZCmfACLNotInitializedErrorZCmfACLNotFoundErrorr:   Zprivater   Zcheck_visibility)rA   rC   	member_idobj_commentr   Zobj_parent_idr   Zself_idr   r   r   r2   r2   r3   _check_perm_for_notify"  s>       

z CmfNotify._check_perm_for_notifyT)r   auditc                O   s:  |j r
d S |sd S |sd S |js$d S tjr.d S d}|dkr>d}d }d }	|jdkr|}|jj}t|drt|j	 rtd S |j
dkrd S |jdkr|}|jj}|jdkr|}	|jj}|jd	kr|jsd S |jd
kr|}	|jj}|jdkr|}	|jj}|r| ||}
n |	r| |	|}
n| ||}
|jdkrl|sl|
D ]2}|d|}tj||d |d djdd q8|svd S |
D ]}|d dkrqz| ||}tjj d|d  d|j }|rz| D ]h\}}| j|||dsqtjj 6 tjj||||d |d d|krdnd|d W 5 Q R X qȐqzd S )NF)r   r   Tr   is_dummyr   ZCmfAttachmentZCmfTimeTrackerHistoryro   ZCmfGanttTaskr   )r   ZCmfDocumentr]   r   r   )r]   r   r   )r   )r   r   r   r   )r   rj   )rC   r   r   rP   r   r   r   )Zdisable_auditZsmart_notifyrd   r   r   r]   rg   rm   r   r   r   r   Ztaskr   r   r   rn   r   r   r   re   r   verbose_namer   r   r   utilr   Zdisable_aclr   r   )rA   rC   r   r   r   r:   rq   r   r   Zdependent_objZmsg_listZmsg_datar]   r   r   r   Z	email_setr2   r2   r3   smart_all_place_notifyL  s    







z CmfNotify.smart_all_place_notifyc                    s<   t  j|| td| j  d| jji| j gd d S )Nznotify-person-Z	notify_idr   )superemitr   r   r   rf   rg   )selfr:   rq   	__class__r2   r3   r     s     
zCmfNotify.emitc                 C   sd   |st jjj}dd|gdddgg}|r8|dd|jg | j|dgd}|D ]}d|_|  qLd S )Nr   ry   rz   z!=rw   rx   r   )rd   re   rf   rg   r   listrz   r   )rA   r   rC   Z_filternotifiesr   r2   r2   r3   r     s    
zCmfNotify.close_open_notifiesc                 C   sD   |st jj}| jdd|gdddggd}|D ]}d|_|  q,d S )Nr   ry   r|   False)r   T)rd   re   rf   r   r|   r   )rA   r   r   r   r2   r2   r3   r     s    z&CmfNotify.confirm_unconfirmed_notifiesc                 C   s   |j dkr|j  }n&|j dkr,|g}ntd|j   d S |D ]H}tj|jj	}|d ksD|d sjqDtj
j|||jd|j  d qDd S )NZCmfPersonGroupro   z,DEV: handle_mention_event unknown obj type: Zemail_if_mentionsu   Вас упомянули в )rC   r   r   rP   )r   Z
rg_membersr   Z
all_nestedrR   rn   ro   rp   rf   rg   r   r   r   r   lower)rA   rC   Zevent_personZpersonsr   rr   r2   r2   r3   handle_mention_event  s     

zCmfNotify.handle_mention_event)	only_once
system_jobc                 O   s   t j }|j| ||d d S )NrE   )rn   CmfPluginMailBoxget_local_mailboxsend_message)Zrctp_torE   rH   r:   rq   mail_boxr2   r2   r3   r@     s    
zCmfNotify.process_emailc                 O   s   t j }|| | d S )N)rn   CmfPluginSMSGateget_local_smsgater   )rV   r   r:   rq   sms_gater2   r2   r3   rS     s    
zCmfNotify.process_smsc                 C   s\   t jj|jdgd}|rV|jrV|jdrV|j|jddsVd|j	 d|j
 d|j S |jS )	Nr   r   ztask.sdr   )ZprojectZ	role_code/z/?obj=:)rn   ro   r   r   r   r   r   Zin_project_roler]   	ui_moduler   rh   r   )rA   r   rC   r   r2   r2   r3   _calc_notify_obj_link  s    zCmfNotify._calc_notify_obj_linkc           
      C   s   |j s
d S |j j}d|j d|j d|j }|  }|rB| }| j||d}tdd | |_| j	
|}|j|d}tj }	|	j|||d d S )	Nr5   r6   r7   )r   rC   TrJ   )r   r   )r#   rg   r   r   r   r;   r   rO   r   r<   r=   r>   rn   r   r   r   )
rA   r   rC   rD   rE   rF   rl   rG   rH   r   r2   r2   r3   r     s    
zCmfNotify.send_email_notifyc                 C   sf   |j std|j d d S tdd |j }|j}| d| }|j j}tj	 }|
|| d S )NrM   rN   TrJ   rL   )r!   rR   r   rO   r   r   rg   rn   r   r   r   )rA   r   rC   rT   rU   r   rV   r   r2   r2   r3   r     s    
zCmfNotify.send_sms_notifyz	@minutely)r   r   Zschedulec               
   O   s  t jjddgdddgdddggd}d	d
 |D }t jjdddgdddt tdd gdddgdd|gggdgdgd}|sqtd|j d|  d }|j	rt
j|j	ddgd}|jrz td t j|| d|_W n4 tk
r } ztd|  W 5 d }~X Y nX |jrrz td t j|| d|_W n4 tk
rp } ztd|  W 5 d }~X Y nX d|_|  |j  q2d S )Nz--rx   r{   ry   Fr~   T)r   r   c                 S   s   h | ]
}|j qS r2   )rx   )r   rC   r2   r2   r3   	<setcomp>1  s     z1CmfNotify.celery_minutely_hook.<locals>.<setcomp>ORZcmf_modified_at<   )ZminutesINr   )r   r   Zorder_byuB   Обработка отправки уведомлений для r   r   )Zinclude_deletedr   u   Отправляем СМСz"models.CmfNotify.send_sms_notify: u   Отправляем emailz$models.CmfNotify.send_email_notify: )rn   r   Zslistr   r   ra   r   printrf   rx   r   Zget_obj_by_idr   r   Zsms_done	ExceptionZloggingZ	exceptionr   r   Z
email_doner{   r   ZdpZcommit)r:   rq   Zforce_objectsZforce_object_idsr   rC   r   r2   r2   r3   celery_minutely_hook*  sL     
"
"zCmfNotify.celery_minutely_hook)Nr   NFFr   N)N)NN)N).r)   r*   r+   r   r   Zcode_prefixZ_optionsZjinja2ZFileSystemLoaderospathr   r   ZPROJECT_DIRZ_loaderZEnvironmentr<   r   r   Zapi_methodsr   r4   classmethodrI   rW   rs   r   r   r-   r   r   r   r   r   r   r   r   staticmethodZcmf_deferred_jobr@   rS   r   r   r   r  __classcell__r2   r2   r   r3   r   	   s   &


5          )
8k  B)f





r   N)r   r   r   Zuuidr   Zdataclassesr   Zcmf.includeZ
cmf.fieldsr   r	   r
   r   r2   r2   r2   r3   <module>   s
   