B
    Yf.                 @   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jjdddg 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 )"CmfChatMessageZlike	mark_readall_relation_personsc                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 d 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idz==Zcrm_idload_from_date)filterr   r   ZInfoZ	Timestamp)tz)Zmessage_raw)r$   ZIdZ	RemoteJidZFromMeZ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utcZ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!   r2   Zmessage_dateZchannel_msgZphoneZcontactZleadr   chat_messageZ	last_sentlast_chat_messageZ	last_dealr   )r   r    whatsapp_file   s`     

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   coder6   r9   r"   r:   r;   Zresponsibler   r7   )r=   commentr)   rB   r   r   r    r<   l   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|  x2| jD ](}|js|jtjjkrqd|_|  qW | jdd dS dS )Nzchannel_messages.channelzchannel_messages.cmf_author_idzchannel_messages.message_statusr4   z==	person_id)r$   views)r   )r%   )r.   rC   r   readT)	only_dataF)load_fieldsr   CmfChatTopicUnreadMessager-   r"   gZcurrent_personrF   is_nullrC   r6   Zjsonappendr.   Znowr/   r0   Z	isoformatr   deleteZchannel_messagesr2   Zcmf_author_idr+   r   )selfkwargsZunread_messagemsgr   r   r    r   {   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_topicT)rH   )r   r6   
class_namerI   r7   groupZcache_last_comment_textrC   Zcache_last_topic_coder   Zcache_last_topic_nameZ
last_topicZcmf_modified_atZset_nowr   r@   r8   )rO   r   r   r    
_calc_chat   s    

zCmfChatMessage._calc_chatc       
      C   sv  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}x\t|D ]P\}}|d}	|	d| |jd |	jd< d|	jd	< d|	jd< |||	 qW | | _ 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)r-   r   )attrsnewpr   r   r    
set_target   s    
z.CmfChatMessage._clean_text.<locals>.set_targetNsrcwidthZheightimgrY   spanr.   ZtimeZcontrolsrC   Zaudior\   brZinsdelZfigureZ
figcaption)r7   tags
attributes)Z	callbackszhtml.parserar   rV   zchat-imgrW   rX   )F)r7   r8   rL   bleachZALLOWED_ATTRIBUTESZALLOWED_TAGSrM   Zcleanr6   r   Zlinkifyr   Zfind_all	enumerateZnew_taginsertrZ   Zprettify)
rO   r]   re   rd   ZlinkerZsoupZimagesir`   linkr   r   r    _clean_text   s@    
















zCmfChatMessage._clean_textc                s6   |    |   |   |   |   t j||S )N)rU   _calc_notify_calc_cacherl   r   superr   )rO   argsrP   )	__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)r7   r8   r   priorityZ	importantZall_place_notifyr6   )rO   rP   r   r   r    rm      s     zCmfChatMessage._calc_notifyc             C   s(   | j r$| j j| _| j j| _| j j| _d S )N)r9   ZloginZcache_cmf_author_loginrC   Zcache_cmf_author_coder   Zcache_cmf_author_name)rO   r   r   r    rn      s    

zCmfChatMessage._calc_cachec                s.   |  dg | jr| j  tt|   d S )Ndeal)rI   rs   r;   ro   r   )rO   )rq   r   r    r;      s    
zCmfChatMessage.emitc                s   t   dddg S )Nzparent.groupr9   rs   )ro   save_preload_fields)rO   )rq   r   r    rt      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   rQ   rr   )rw   r   Z
chat_topic)rr   r   rT   r   Z	CmfNotifyZplace_notifyr   r7   r6   rJ   r   )rO   rE   rP   ZctZcgr   r   r    _place_notify   s    
zCmfChatMessage._place_notifyNc             K   s   |  dg | jj S )Nr   )rI   r   Z	executorsZ
all_nested)rO   r   rP   r   r   r    r   	  s    z#CmfChatMessage.all_relation_personsF)forceTEXKOM_db_deleteskip_owner_checkc               sv   |r\x*t jj| ddD ]}d |_|jdd qW x*t jj| ddD ]}d |_|jdd qBW t j||||d|S )NT)r@   include_deleted)rH   )r?   r|   )ry   rz   r{   )	r   rR   listr@   r   r1   r?   ro   rN   )rO   ry   rz   r{   rp   rP   Ztopicr2   )rq   r   r    rN     s    zCmfChatMessage.delete)N)__name__
__module____qualname__r
   r   Zapi_methodsclassmethodrA   r<   r   rU   rl   r   rm   rn   r;   rt   rx   r   rN   __classcell__r   r   )rq   r    r      s"   S/
r   )r   r.   r   r   Zpathlibr   Zurllib.parser   rg   r   Zbs4r   Zcmf.includeZcmfr   Zcommon.models.cmf_active_entityr	   Zmodules.crm.fieldsr
   r   r   r   r   r    <module>   s   