U
    Ȝhi>                     @   sB   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 )    )*)cmf_mail_handler)Path)normalize_email_addressc                       sl   e Zd Zed fdd	Z fddZ fddZdd	 Zd
d Ze	dddZ
dd Zedd Z  ZS )CmfMailHandlerNc                    st   |sg }|dkr4| dd  }r0|dd|gg}ng S |dkrZ|oJ| dd }|dd|gg}t j|f||d|S )Nmailbox_folders
mailbox_id	parent_id=obj_request_type)filterobject_fields)getsuperfield_options_list)clsZrelation_field_namer   r   kwargsr   r	   	__class__ *./modules/mail2/models/cmf_mail_handler.pyr      s    z!CmfMailHandler.field_options_listc                    s   ddddg}t   | S )Nmailboxzmailbox_folders.parentparent.servicedesk_publicparent.logic_prefix)r   save_preload_fields)selffieldsr   r   r   r      s    z"CmfMailHandler.save_preload_fieldsc                    sx   | j jr:| j D ]*}|j| jkrtd| d| j dd q| jjrj| jrj| jrj| jjdkrj| jjsjtd t j	||S )Nu   Папка u;    не принадлежит почтовому ящику Tabortproject.servicedesku   Отправитель письма будет добавлен в пользователи, но не будет добавлен в клиенты проекта.)
r   
is_changedparentr   	cmf_alertcreate_userlogic_prefixservicedesk_publicr   save)r   argsr   fr   r   r   r&      s    

zCmfMailHandler.savec                    s^   dd }ddd  fdd}d}||}|r4|}|sZ||}|D ]}||}|rD qZqD|S )	u  
        Проверяет находится ли адрес электронной почты в черном/ белом списках, либо в списке зацикленной почты
        Алгоритм сложный, одним запросом сделать малореально
        https://bcrm.carbonsoft.ru/project/Document/DOC-013203#spec-nastrojka-elektronnoj-pochty
        c                 S   sJ   |  dd }| d}g }t|D ] \}}|d||d   q$|S )N@.)split	enumerateappendjoin)emaildomainparts
subdomainsipartr   r   r   get_subdomains,   s    
z9CmfMailHandler.get_mail_list_type.<locals>.get_subdomainsNc                 S   s   i }t jj| d}t jjdd|gddgd}|D ]0}|jj|ksN|jjjdkr0|jjj||jj< q0| rp| jj}nd}|t	j
|< dS )us   
            Кэшируем списки email по проекту этого обработчика
            )r!   r!   INzparent.typer   r   whiteN)modelsZCmfEmailListlistZCmfEmailListItemnamevaluer!   typeidAPPcache_email_list)projectZemail_items_dataZemail_listsitemsZ
email_itemZ	cache_keyr   r   r   _cache_list_items:   s    
z<CmfMailHandler.get_mail_list_type.<locals>._cache_list_itemsc                    sf   j tjkr j d tjkr&   | tjj  krFtjj  |  S | tjd  krbtjd  |  S d S )N)Z
project_idr@   rA   rB   )r0   rD   r   r   r   get_list_type_from_addressR   s    

zECmfMailHandler.get_mail_list_type.<locals>.get_list_type_from_address)Nr   )r   r0   r6   rF   Z
email_listmail_list_typer3   Z	subdomainr   rE   r   get_mail_list_type%   s    
z!CmfMailHandler.get_mail_list_typec                 C   sd   |  dg tj }|j }| jj|kr:|| jj |D ] }tj	j
|d| dddd q>d S )Nzparent.cmf_owneru>   Детектирована почтовая петля. Email u    заблокирован!    )personr<   msgpriority)load_fieldsr:   ZCmfPersonGroupZadmin_groupZ
rg_membersZ
all_nestedr!   	cmf_ownerextendZ	CmfNotifyZplace_notify)r   addressZ	admin_grpZadminsrK   r   r   r   "_loop_detector_notify_responsiblesr   s    


z1CmfMailHandler._loop_detector_notify_responsibles)returnc           	      C   s   t j}| jj}d}tjj}|rbd| }||rbt|	|
 }||krbd}||krb| | || jjkr|d| d dS | |}|dkrdS |dkr|d| d dS |r|d| d	 dS dS )
u   
        Проверяет можно ли создавать заявку по письму на основе email адреса
        https://bcrm.carbonsoft.ru/project/Document/DOC-013203#spec-nastrojka-elektronnoj-pochty
        FZloop_detector_Tu(   Не принят email с адреса uf   , адрес отправителя совпадает с адресом почтового ящикаr9   Zblacku$   , email в черном спискеu8   , детектирована почтовая петля)r@   ZREDIS_DBr   loggergZglobal_settingsZemail_loop_detector_thresholdexistsintr   decoderR   r0   inforH   )	r   rQ   Zredis_dbrT   Zloop_detectedZ	thresholdZloop_keyZnum_of_mailsrG   r   r   r   address_forbidden   s2    



z CmfMailHandler.address_forbiddenc                 C   s  | ddddddddg | t|jjr0d S | jd	kr>d S d }d }| d
dg |jrl|jjrl|jj}n"|jr|jD ]}|jrx|j} qqxt	j
jddd|jgdd|jggd}|s| j}|s| jr|jj}t	j
|||ddddd}|  tt	j
j| jjj|ggd |stj}|sDt	jj|jjdgd}|rD|d }|jp`|jjd d p`d}|rtd| d|  t	j|||jd}|  n0| jjdks| jjs| js|j| jddrd d! }	dd"l m }
 t!|
"|
" # j$% & }t'|d# d#\}}d$|d%d&|d'd(}|j(j# )d)}d*|j* d+|j d,|	|j+ d-|	|j, d.| d/| d0}t	j| j|||jj ||| j-| j.d1}td2| d|  |  nt/0d3| || ||_|jdd4 |sd S d5d6 |j1|jd7gd8D }|p|}t	j2j3|dd9d7d:d;d<gd=D ]}|j4sJt5d>| d?dd@ |j4|krZq*|6 }|st/0dAdB| dC|j7 dD q*t	j2|||j|j4dE}t8|9 dF}|:| W 5 Q R X |  |;|| t<|t	jr*| jt=|> 7  _q*|j?r|jdd4 d S )GN	mail_fromcmf_created_atr<   textmail_from_name	text_htmlmail_to_jsoncc_jsonZcreate_or_commentin_reply_to.handle_objreferences.handle_objORr0   ZILIKElogin)r   TF)re   r<   r0   Zservicedesk_allowZ
user_localZemail_if_authorZemail_if_self_changes)r'   z-cmf_created_at)Zorder_byr   d   u   <Без темы>u6   Создали комментарий в задачу u    из письма )
cmf_authorr!   r]   r   zsdesk-client:default)rB   Z	role_codec                 S   s   d dd | D S )Nz, c                 s   s6   | ].}|d  r&|d   d|d  dn|d V  qdS )r<    (r0   )Nr   ).0dr   r   r   	<genexpr>   s     zICmfMailHandler.handle_new_mail.<locals>.format_json_to.<locals>.<genexpr>)r/   )Zjson_tor   r   r   format_json_to   s    z6CmfMailHandler.handle_new_mail.<locals>.format_json_to)datetime<   z(UTCz+03d:Z02dri   z%d.%m.%Y %H:%M:%SuA   <table class='mail-header'>
                <tr><th>От</th><td>rh   u5   )</td></tr>
                <tr><th>Кому</th><td>u6   </td></tr>
                <tr><th>Копия</th><td>u4   </td></tr>
                <tr><th>Дата</th><td> z(</td></tr>
                </table><br/>)r!   r<   r]   rg   rO   Z
logic_typeZrequest_typeu   Создали задачу zWCmfMailHandler.handle_new_mail(%s): Skip task creation from %s. Not allowed! subject=%s)Z	only_datac                 S   s   h | ]
}|j qS r   )ext_id)rj   
attachmentr   r   r   	<setcomp>  s    z1CmfMailHandler.handle_new_mail.<locals>.<setcomp>rr   )Zobj_idr   Zfull_path_fileurlZurl_previewZurl_preview_img)r!   r   u   DEV: Fatal. Вложение u    не имеет ext_idr   z%sz"CmfMailHandler.handle_new_mail(): (z) without rfile!!! Skip handle.)rg   r!   r<   rr   rb)@rN   rZ   r   r[   r=   handler_typeZin_reply_to
handle_objZ
referencesr:   Z	CmfPersonr   
obj_authorr#   r&   Zschedule_deferred_jobZregister_sdesk_clientr!   r?   rU   Zcurrent_userZCmfTaskZfind_related_tasksr<   r]   debugZ
CmfCommentr_   r$   r%   allow_non_project_clientsZin_project_rolern   rW   ZnowZ
astimezoneZtzinfoZ	utcoffsetZtotal_secondsdivmodr\   strftimer^   r`   ra   obj_logic_typer   ZloggingZwarningZattach_listZCmfAttachmentr;   rr   r"   Z	get_rfileZ
_file_nameopenZtmp_readonly_pathZupload_stream_fileZ_replace_attachment
isinstancestrZcreate_preview_tagr    )r   mailZcommentry   rrg   r0   ZtasksZmail_subjectrm   rn   Zutc_offset_secondsZhourZminuteZformatted_tzZ
created_dtZtext_header_tableZattachments_ext_idsZattachment_parentrs   Z	cmf_rfileZnew_attachmentZattachment_byter   r   r   handle_new_mail   s        


$	
 

  
     zCmfMailHandler.handle_new_mailc                 C   s   |j r
d S tjjdd|jgddd|jjggddd gggdddd	d
dddddddgd}|D ](}td| d|  |	|  qqZd S )Nr   r
   rd   r   r7   r   r   rB   rx   rb   rc   rz   r   r   r#   zmailbox.emailr|   r8   u&   Обрабатываем письмо u    с помощью )
ry   r:   r   r;   r!   Zmailbox_folderr?   rU   r{   r   )r   r   Zavailable_handlersZhandlerr   r   r   new_mail_handler_hookD  s6    
        
z$CmfMailHandler.new_mail_handler_hook)NN)__name__
__module____qualname__classmethodr   r   r&   rH   rR   boolrZ   r   r   __classcell__r   r   r   r   r      s   M* r   N)Zcmf.includeZmodules.mail2.fieldsr   pathlibr   Zmodules.auth.models.emailr   r   r   r   r   r   <module>   s   