U
    r;dA.                     @   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dddd f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$   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!   r6   Zmessage_dateZchannel_msgZphoneZcontactZleadr   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   coder:   r=   r"   r>   r?   Zresponsibler   r;   )rA   Zcommentr,   rF   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_statusr8   r#   	person_idr'   viewsr   r&   )r1   rG   r   readTZ	only_dataF)load_fieldsr   CmfChatTopicUnreadMessager0   r"   gZcurrent_personrI   is_nullrG   r:   Zjsonappendr1   Znowr2   r3   Z	isoformatr   deleteZchannel_messagesr6   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 )NCmfChatTopiczgroup.cache_last_topic_codezgroup.cache_last_topic_namezgroup.last_topicTrK   )r   r:   
class_namerL   r;   groupZcache_last_comment_textrG   Zcache_last_topic_coder   Zcache_last_topic_nameZ
last_topicZcmf_modified_atZset_nowr   rD   r<   rR   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controlsrG   Zaudiora   brZinsdelZfigureZ
figcaption)r;   tags
attributes)Z	callbackszhtml.parserar   r[   zchat-imgr\   r]   )F)r;   r<   rO   bleachZALLOWED_ATTRIBUTESZALLOWED_TAGSrP   Zcleanr:   r   Zlinkifyr   Zfind_all	enumerateZnew_taginsertr_   Zprettify)
rR   rb   rk   rj   ZlinkerZsoupZimagesire   linkr   r   r    _clean_text   s@    
















zCmfChatMessage._clean_textc                    s6   |    |   |   |   |   t j||S N)rZ   _calc_notify_calc_cacherr   rU   superr   )rR   argsrS   	__class__r   r    r      s    zCmfChatMessage.savec                 K   s&   dS dS | jrd| _| | j j dS )u   
        Отправляем оповещения всем кроме автора комментария
        :param kwargs:
        :return:
        NT)r;   r<   r   priorityZ	importantZall_place_notifyr:   )rR   rS   r   r   r    rt      s     zCmfChatMessage._calc_notifyc                 C   s(   | j r$| j j| _| j j| _| j j| _d S rs   )r=   ZloginZcache_cmf_author_loginrG   Zcache_cmf_author_coder   Zcache_cmf_author_namerY   r   r   r    ru      s    

zCmfChatMessage._calc_cachec                    s.   |  dg | jr| j  tt|   d S )Ndeal)rL   r{   r?   rv   r   rY   rx   r   r    r?      s    
zCmfChatMessage.emitc                    s   t   dddg S )Nzparent.groupr=   r{   )rv   save_preload_fieldsrY   rx   r   r    r|      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	   » — «   »)objpersonr   rT   rz   )r   r   Z
chat_topic)rz   r   rX   r   Z	CmfNotifyZplace_notifyr   r;   r:   rM   r   )rR   rH   rS   ZctZcgr   r   r    _place_notify   s    zCmfChatMessage._place_notifyNc                 K   s   |  dg | jj S )Nr   )rL   r   Z	executorsZ
all_nested)rR   r	   rS   r   r   r    all_relation_persons  s    z#CmfChatMessage.all_relation_personsFforceTEXKOM_db_deleteskip_owner_checkc                   sn   |rTt jj| ddD ]}d |_|jdd qt jj| ddD ]}d |_|jdd q<t j||||d|S )NT)rD   include_deletedrK   )rC   r   r   )	r   rV   listrD   r   r5   rC   rv   rQ   )rR   r   r   r   rw   rS   Ztopicr6   rx   r   r    rQ     s    zCmfChatMessage.delete)N)__name__
__module____qualname__classmethodrE   r@   rU   rZ   rr   r   rt   ru   r?   r|   r   r   rQ   __classcell__r   r   rx   r    r      s   
R
/
r   )r   r1   r   r   pathlibr   Zurllib.parser   rm   r   Zbs4r   Zcmf.includeZcmfr	   Zcommon.models.cmf_active_entityr
   Zmodules.crm.fieldsr   r   r   r   r   r    <module>   s   