U
    +cd-                     @   sR   d dl Z d dlmZ d dlT d dlT d dlmZ d dlmZ G dd dejZdS )    N)	dataclass)*)
cmf_notify)	BaseModelc                       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G dd dZed	d
 Zedd Zedd Zedd Zedd Z fddZedddZeejddddd Zeejddddd Z  Z S )	CmfNotifyZNotifyZdeskZNTFzcommon/templateszcmf/templatesloaderc                   @   s2  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 eed< 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textmsgr   priorityFstrikethrough
alarm_dateis_notify_current_personmessagenotify_typeobj_hrefobj_codeobj_parent_nameobj_link html_changed_fields
owner_nameowner_initials
notify_smsperson_phone_mobileperson_phoneperson_namemsg_from_idmsg_from_namemsg_from_codemsg_from_login)!__name__
__module____qualname____doc__r   str__annotations__r	   r
   r   r   intr   boolr   datetimer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!    r+   r+   ./models/cmf_notify.py	NotifyCtx   s2   
r-   c           	      C   s   t jj|jdddgd}|js"d S |jjp0|jj}d|j d|j	j d|j
j }|  }|rf| }| j|}|j|d}t| j|||gd	 d S )
Nnotify_emailemailloginidfields[z] (z) )ctxargs)models	CmfPersongetr   r.   r/   valuer0   r   r   r
   Z+get_default_mail_notification_template_name
_jinja_envZget_templateZrendercmf_deferred_taskprocess_email)	cls
notify_ctxobjpersonZrcpt_tosubjectZmail_templatetemplate
email_bodyr+   r+   r,   send_email_notify9   s     zCmfNotify.send_email_notifyc                 C   s   |j s
d S dtj }|j}t|dkr:|d d  d}| d|j d| |j }|jp`|j}|s|t	d|j
 d d S t| j||gd d S )Nhttps://   z...
u4   SMS уведомление пользователю u_    не отправлено, не указан номер мобильного телефона.r6   )r   configAPP_FQDNr
   lenr   r   r   r   Z	cmf_alertr   r=   process_sms)r?   r@   urlZsubjr   phoner+   r+   r,   send_sms_notifyK   s    zCmfNotify.send_sms_notifyc           	      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< |rdtj }|j|d< |j
|d< | |d  |d< t|dr|jr|jj	j|d< nd |d< |d}|rtjj|dddgd}|j|d< |jj|d< |jj|d < |j	|d!< | jf |}|S )"Nr   .Ztzmsg_fromr   r   r    r!      Уведомлениеr	   r
   r   r   r   
first_name	last_namer   r   r   rG   r   r   r   parentr   r   r   zphone_mobile.numberzphone.numberr1   r   r   r   )r*   nowtimezoneutcpopgcurrent_personr2   r;   r	   coder0   
isinstanceZCmfTypeZcurrent_userload_fieldsrT   rU   rJ   rK   hrefhasattrrV   r:   r8   r9   r   rO   ZnumberZphone_mobiler-   )	r?   rA   kwargsrR   Znotify_ownerrN   r   rB   r5   r+   r+   r,   prepare_notify_ctx[   sL    

4




zCmfNotify.prepare_notify_ctxc                 C   s  d }d}|r:| j dd|jgdd|jgdddggddgd	}|rD|j}|jrP|j}|sZ|  }||_d|_| jd
7  _|j|_|j|_|j|_|j	|_	|j
|_
|r|j|_|j|_|j|_|j|_|jsg |_|jr
t|jjdkr
|jjdd  d d |jkr
|S |j|j|j|jdtjtjd |jdt  dd}|j | |!  |r|j"|jdrt#d|j||jd|jgd |jdkr|j$st#d|j |jgd |S )NrS   obj_id==r   statusopen
unread_cntcommentsfilterr3      r   r
   )r2   r	   r]   r0   rQ   zCmfComment:)Z	cmf_ownerZcmf_created_atr
   r2   Z	log_level)r   z	notify-os)r   commentr   Zevent_persons2znotify-important-)%r:   r2   r   r	   rf   rh   r   Zpriotityr   r   r
   rd   r]   r   ui_nameZobj_ui_namer`   r   ri   rL   r;   r   r   r   r    r!   r*   rW   rX   rY   Z	isoformatZuuid1appendsaveZ	notify_oscmf_emit_eventZ	confirmed)r?   r@   rA   notifynew_namern   r+   r+   r,   create_desk_notify   sx    


zCmfNotify.create_desk_notifyc                 K   s   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}| j	|f|}| 
||}| || | | |S )u  
        obj: CmfEntity

        :param obj:
        :param msg_from:
        :param person_id: Идентификатор пользователя которому отправляется сообщение
        :param name: Наименование объекта уведомления
        :param text: Тема сообщения
        :param msg: Текст сообщения
        :param priority:
        :param strikethrough:
        :param alarm_date: Будильник для уведомлений
        :param is_notify_current_person: Можно отправить сообщение себе
        :param notify_type: Тип сообщения. Описание см в структуре NotifyCtx
        uB   Уведомления отключены g.disable_notify = FalseNr   .u   Укажите msgr   u   Укажите person_idr   rA   rV   r]   rq   r`   )r[   Zdisable_notifydebugAssertionErrorr\   r2   r:   rZ   r_   rc   rw   rF   rP   )r?   rb   rA   r@   ru   r+   r+   r,   place_notify   s     


zCmfNotify.place_notifyc                    s<   t  j|| td| j  d| jji| j gd d S )Nznotify-person-Z	notify_idro   )superemitrt   r   loadr2   r;   )selfr7   rb   	__class__r+   r,   r|     s     
zCmfNotify.emitNc                 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   re   rf   z!=closedrd   rj   )r[   r\   r2   r;   rr   listrf   rs   )r?   r   rA   Z_filterZnotifiesru   r+   r+   r,   close_open_notifies  s    
zCmfNotify.close_open_notifiesT)Z	only_onceZsystem_taskc                 O   s   t j }|j| ||d d S )N)rC   )r8   ZCmfPluginMailBoxZget_local_mailboxsend_message)Zrctp_torC   rE   r7   rb   Zmail_boxr+   r+   r,   r>     s    
zCmfNotify.process_emailc                 O   s   t j }|| | d S )N)r8   ZCmfPluginSMSGateZget_local_smsgater   )rO   r   r7   rb   Zsms_gater+   r+   r,   rM   $  s    
zCmfNotify.process_sms)NN)!r"   r#   r$   rq   Z	ui_moduleZcode_prefixZ_optionsZjinja2ZFileSystemLoaderospathjoinrJ   ZPROJECT_DIRZ_loaderZEnvironmentr<   r   r-   classmethodrF   rP   rc   rw   rz   r|   r   staticmethodZ
celery_appZtaskr>   rM   __classcell__r+   r+   r   r,   r   	   s<   %


5
J
'r   )	r*   Zdataclassesr   Zcmf.includeZ
cmf.fieldsr   Z
cmf.modelsr   r   r+   r+   r+   r,   <module>   s   