U
    VcY+                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dlZd dlm	Z	 d dl
mZ d dlT d dlmZ d d	lmZ d d
lmZ G dd dejZdS )    N)copy)Path)urlparse)Linker)BeautifulSoup)*fields)CmfActiveEntity)cmf_chat_messagec                       s   e Zd Zedd Zedd Zdd Zdd Zd	d
 Z fddZ	dd Z
dd Z fddZ fddZdd ZdddZ  ZS )CmfChatMessagec                    sT   fdd}t jjdd|d gdgd}tjj|d d	 d
 tjjd}| |jk rZd S |d  t j	 d}t jjdd|d gd|_
|j
j   d	 d |_ d	 d |_ d	 d rd|_|jdd }t j|}|sHt jj|d}|s`t j||j
jd}|  |||d |jj d |d d\}	|_|  d S n|j
|_|jr`|  |  }
||
_ d	 d s||
_t j	j|jddgd}|r| j|jdgd}|j|
_n$t jj|jd}|r||
_n||
_||
j|d |jj d |d d\}	|
_|  ||
_|
  t jj   t!"d|
jj d d i t j#|
d d S )!Nc              	      s   t |}|| }tj| |d}|  tj| |}t	|j
jddd t|d}	|	t| W 5 Q R X |dkrd|j d}
nd|j d d	  d
}
||
fS )N)parentnameT)parentsexist_okzwb+Zimagez
<img src="z">z	<a href="ZFileNamez<a>)	mimetypesZguess_extensionmodelsZCmfAttachmentsaveZflaskZhelpersZ	safe_joinZ
upload_dirr   r   mkdiropenwritebase64Z	b64decodeZurl)r   	file_datar   	mime_type	file_typeZfile_extensionZreq_filenameattachZ	file_pathfZhtml_tagmessage (./modules/crm/models/cmf_chat_message.py	save_file   s    
z/CmfChatMessage.whatsapp_file.<locals>.save_fileid==Zcrm_idload_from_date)filterr	   r   ZInfoZ	TimestampZtz)Zmessage_rawr%   ZIdZ	RemoteJidZFromMesent@r   )lead_phone_name)r*   r   fileZTypetype)r   r   r   r   r   z-cmf_modified_at)	client_idmessage_statusZorder_byr   )Zchannel_message_idr	   )Zcontactszcomment-current_person_id)$r   ZCmfWhatsappgetdatetimeZfromtimestamptimezoneutcdater$   ZCmfChannelMessagechannelr   load
message_idr-   r.   splitZ	CmfPersonZget_by_phoneZCmfLeadr   valuetextZdefault_channel
is_changedZcmf_created_at
cmf_authorr"   ZCmfDealZchannel_messageZ
CmfCommentZdpZcommitsocketioemit_whatsapp_message_received)clsdatar!   r5   Zmessage_dateZchannel_msgZphoneZcontactZleadr   Zchat_messageZ	last_sentlast_chat_messageZ	last_dealr   r   r    whatsapp_file   sl      
  zCmfChatMessage.whatsapp_filec              
   C   sT   d|j jj d|jjj }td|j jjjj|jjj|jjj|j	j||d d S )Nzevent?dealPopup=z&selectObjectId=Zwhatsapp_message_received)r/   Z	author_idZauthor_nameZcomment_bodymsg_urlr,   )
r   coder9   r<   r"   r=   r>   Zresponsibler   r:   )r@   Zcommentr,   rD   r   r   r    r?   f   s    z)CmfChatMessage._whatsapp_message_receivedc                 K   s   |  dddg tjjdd| jgddtjjggd}| j dgd	 | jjrPg | _tjj	j
| jjkr| jj
tjjtjjd
 tjj	j
tjjj
d |r|  | jD ](}|js|jtjjkrqd|_|  q| jdd dS dS )Nzchannel_messages.channelzchannel_messages.cmf_author_idzchannel_messages.message_statusr7   r#   	person_idr'   viewsr   r&   )r1   rE   r   readTZ	only_dataF)load_fieldsr   CmfChatTopicUnreadMessager0   r"   gZcurrent_personrG   is_nullrE   r9   Zjsonappendr1   Znowr2   r3   Z	isoformatr   deleteZchannel_messagesr5   Zcmf_author_idr.   r   )selfkwargsZunread_messagemsgr   r   r    	mark_readu   s,    

zCmfChatMessage.mark_readc                 C   s   | j r| j jjdkrd S | j jdddg | j| j j_| j j| j j_| j j	| j j_
| j | j j_| j jj  | j jjdd | | j _| j jjr| j   d S )NZCmfChatTopiczgroup.cache_last_topic_codezgroup.cache_last_topic_namezgroup.last_topicTrI   )r   r9   
class_namerJ   r:   groupZcache_last_comment_textrE   Zcache_last_topic_coder   Zcache_last_topic_nameZ
last_topicZcmf_modified_atZset_nowr   rB   r;   rP   r   r   r    
_calc_chat   s    

zCmfChatMessage._calc_chatc           
      C   sr  ddd}| j jr| j jrdS tj}dddg|d< d	g|d
< dg|d< dddg|d< tj}|d |d |d |d |d |d |d |d |d |d
 tj| j jtj|d| _ t	|gd}|
| j j| _ t| j jd}|d}t|D ]P\}}|d}	|	d| |jd |	jd< d|	jd	< d|	jd< |||	 q| | _ dS ) u   
        Защита от инжектов которые могу прилететь из внешних систем
        :return:
        Fc                 S   s.   |  ds| S t| d }d| d< d| d< | S )N)Nhref_blank)NtargetZexternal)Nclass)r0   r   )attrsnewpr   r   r    
set_target   s    
z.CmfChatMessage._clean_text.<locals>.set_targetNsrcwidthZheightimgr[   spanr1   timeZcontrolsrE   Zaudior^   brZinsdelZfigureZ
figcaption)r:   tags
attributes)Z	callbackszhtml.parserar   rX   zchat-imgrY   rZ   )F)r:   r;   rM   bleachZALLOWED_ATTRIBUTESZALLOWED_TAGSrN   Zcleanr9   r   Zlinkifyr   Zfind_all	enumerateZnew_taginsertr\   Zprettify)
rP   r_   rh   rg   ZlinkerZsoupZimagesirb   linkr   r   r    _clean_text   s@    
















zCmfChatMessage._clean_textc                    s6   |    |   |   |   |   t j||S N)rW   _calc_notify_calc_cachero   rS   superr   )rP   argsrQ   	__class__r   r    r      s    zCmfChatMessage.savec                 K   s6   | j r| j jr| jsdS | jr$d| _| | j j dS )u   
        Отправляем оповещения всем кроме автора комментария
        :param kwargs:
        :return:
        NT)r:   r;   r   priorityZ	importantZall_place_notifyr9   )rP   rQ   r   r   r    rq      s
    zCmfChatMessage._calc_notifyc                 C   s(   | j r$| j j| _| j j| _| j j| _d S rp   )r<   ZloginZcache_cmf_author_loginrE   Zcache_cmf_author_coder   Zcache_cmf_author_namerV   r   r   r    rr      s    

zCmfChatMessage._calc_cachec                    s.   |  dg | jr| j  tt|   d S )Ndeal)rJ   rx   r>   rs   r   rV   ru   r   r    r>      s    
zCmfChatMessage.emitc                    s   t   dddg S )Nzparent.groupr<   rx   )rs   save_preload_fieldsrV   ru   r   r    ry      s    z"CmfChatMessage.save_preload_fieldsc                 K   s\   | j rB| j}|j}tjj| j|d|j d|j d| jj| j d tj	|| | jd
  d S )Nu%   Важное сообщение в «u	   » — «   »)objrF   r   rR   rw   )Zpersonr   Z
chat_topic)rw   r   rU   r   Z	CmfNotifyZplace_notifyr   r:   r9   rK   r   )rP   rF   rQ   ZctZcgr   r   r    _place_notify   s    zCmfChatMessage._place_notifyNc                 K   s   |  dg | jj S )Nr   )rJ   r   Z	executorsZ
all_nested)rP   r	   rQ   r   r   r    all_relation_persons  s    z#CmfChatMessage.all_relation_persons)N)__name__
__module____qualname__classmethodrC   r?   rS   rW   ro   r   rq   rr   r>   ry   r|   r}   __classcell__r   r   ru   r    r      s   
R
/r   )r   r1   r   r   pathlibr   Zurllib.parser   rj   r   Zbs4r   Zcmf.includeZcmfr	   Zcommon.models.cmf_active_entityr
   Zmodules.crm.fieldsr   r   r   r   r   r    <module>   s   