U
    =hH>                     @   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  |  t|jjrd S | jdkrd }d }|ddg |jrP|jjrP|jj}n"|jrr|jD ]}|jr\|j} qrq\t	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 |stj}|s"t	jj|jjdgd}|r"|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'| d(}t	j| j|	||jj ||| j-| j.d)}td*| d|  |  nt/0d+| ||	 ||_|jd	d, |sd S |j1|jd-gd.}t	j2j3|d/d0d-d1d2d3gd4D ]}|j4r"|j4d5d6 |D kr"q|j4s>t5d7| d8d	d9 |6 }|rt	j2||j|j4d:}|rl||_t7|8 d;}|9| W 5 Q R X |  |j:|| |jjjd	d, qd S )<NZcreate_or_commentin_reply_to.handle_objreferences.handle_objORr/   ZILIKElogin)r   TF)r]   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    textr   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02drb   z%d.%m.%Y %H:%M:%SuE   <table class='mail-header'>
                    <tr><th>От</th><td>ra   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`   r_   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   r;   Zfull_path_fileurlZurl_previewZurl_preview_img)r    r   c                 S   s   g | ]
}|j qS r   )rk   )rc   objr   r   r   
<listcomp>!  s     z2CmfMailHandler.handle_new_mail.<locals>.<listcomp>u   DEV: Fatal. Вложение u    не имеет ext_idr   )r    r;   rk   rb);rY   r   Z	mail_fromr<   handler_typerM   Z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
CmfCommentZ	text_htmlr#   r$   allow_non_project_clientsZin_project_rolerg   rV   ZnowZ
astimezoneZtzinfoZ	utcoffsetZtotal_secondsdivmodZcmf_created_atstrftimeZmail_from_nameZmail_to_jsonZcc_jsonobj_logic_typer   ZloggingZwarningZattach_listZCmfAttachmentr:   rk   r!   Z	get_rfileopenZtmp_readonly_pathZupload_stream_fileZ_replace_attachment)r   mailZcommentrq   rr_   r/   ZtasksZ
in_commentZmail_subjectrf   rg   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
   r\   r   r6   r   r   rA   rp   rZ   r[   rr   rw   r   r"   zmailbox.emailrt   r7   u&   Обрабатываем письмо u    с помощью )
rq   r9   r   r:   r    Zmailbox_folderr>   rT   rs   r{   )r   ry   Zavailable_handlersZhandlerr   r   r   new_mail_handler_hook4  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   