U
    Ii>                     @   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   Z
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?   r@   rA   )r/   rC   r   r   r   get_list_type_from_addressR   s    

zECmfMailHandler.get_mail_list_type.<locals>.get_list_type_from_address)Nr   )r   r/   r5   rE   Z
email_listmail_list_typer2   Z	subdomainr   rD   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_fieldsr9   ZCmfPersonGroupZadmin_groupZ
rg_membersZ
all_nestedr    	cmf_ownerextendZ	CmfNotifyZplace_notify)r   addressZ	admin_grpZadminsrJ   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   , адрес отправителя совпадает с адресом почтового ящикаr8   Zblacku$   , email в черном спискеu8   , детектирована почтовая петля)r?   ZREDIS_DBr   loggergZglobal_settingsZemail_loop_detector_thresholdexistsintr   decoderQ   r/   inforG   )	r   rP   Zredis_dbrS   Zloop_detectedZ	thresholdZloop_keyZnum_of_mailsrF   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rd }d }| d
dg |jrj|jjrj|jj}n"|jr|jD ]}|jrv|j} qqvt	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}|sBt	jj|jjdgd}|rB|d }d}|jpb|jjd d pbd}	|rtd| d|  t	j|||jd}|  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 |j1|jd5gd6}t	j2j3|dd7d5d8d9d:gd;D ]}|j4rB|j4d<d= |D krBq|j4s^t5d>| d?dd@ |6 }|rt	j2||j|j4dA}|r||_t7|8 dB}|9| W 5 Q R X |  |j:|| |jjjdd4 qd S )CN	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ORr/   ZILIKElogin)r   TF)rd   r;   r/   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)rA   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;    (r/   )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02drh   z%d.%m.%Y %H:%M:%SuE   <table class='mail-header'>
                    <tr><th>От</th><td>rg   u9   )</td></tr>
                    <tr><th>Кому</th><td>u:   </td></tr>
                    <tr><th>Копия</th><td>u8   </td></tr>
                    <tr><th>Дата</th><td> z,</td></tr>
                    </table><br/>)r    r;   r\   rf   rN   Z
logic_typeZrequest_typeu   Создали задачу zWCmfMailHandler.handle_new_mail(%s): Skip task creation from %s. Not allowed! subject=%s)Z	only_dataext_id)Zobj_idr   Zfull_path_fileurlZurl_previewZurl_preview_img)r    r   c                 S   s   g | ]
}|j qS r   )rq   )ri   objr   r   r   
<listcomp>#  s     z2CmfMailHandler.handle_new_mail.<locals>.<listcomp>u   DEV: Fatal. Вложение u    не имеет ext_idr   )r    r;   rq   rb);rM   rY   r   rZ   r<   handler_typeZin_reply_to
handle_objZ
referencesr9   Z	CmfPersonr   
obj_authorr"   r%   Zschedule_deferred_jobZregister_sdesk_clientr    r>   rT   Zcurrent_userZCmfTaskZfind_related_tasksr;   r\   debugZ
CmfCommentr^   r#   r$   allow_non_project_clientsZin_project_rolerm   rV   ZnowZ
astimezoneZtzinfoZ	utcoffsetZtotal_secondsdivmodr[   strftimer]   r_   r`   obj_logic_typer   ZloggingZwarningZattach_listZCmfAttachmentr:   rq   r!   Z	get_rfileopenZtmp_readonly_pathZupload_stream_fileZ_replace_attachment)r   mailZcommentrw   rrf   r/   ZtasksZ
in_commentZmail_subjectrl   rm   Zutc_offset_secondsZhourZminuteZformatted_tzZ
created_dtZtext_header_tableZall_attachmentsZ
attachmentZ	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
   rc   r   r6   r   r   rA   rv   ra   rb   rx   r}   r   r"   zmailbox.emailrz   r7   u&   Обрабатываем письмо u    с помощью )
rw   r9   r   r:   r    Zmailbox_folderr>   rT   ry   r   )r   r   Zavailable_handlersZhandlerr   r   r   new_mail_handler_hook6  s6    
        
z$CmfMailHandler.new_mail_handler_hook)NN)__name__
__module____qualname__classmethodr   r   r%   rG   rQ   boolrY   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   