U
    Įwh;                     @   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g}t   | S )Nmailboxzmailbox_folders.parent)r   save_preload_fields)selffieldsr   r   r   r      s    z"CmfMailHandler.save_preload_fieldsc                    sH   | j jr:| j D ]*}|j| jkrtd| d| j dd qt j||S )Nu   Папка u;    не принадлежит почтовому ящику Tabort)r   Z
is_changedparentr   	cmf_alertr   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_items6   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_idr9   r:   r;   )r)   r=   r   r   r   get_list_type_from_addressN   s    

zECmfMailHandler.get_mail_list_type.<locals>.get_list_type_from_address)Nr   )r   r)   r/   r?   Z
email_listmail_list_typer,   Z	subdomainr   r>   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    заблокирован!    )personr5   msgpriority)load_fieldsr3   ZCmfPersonGroupZadmin_groupZ
rg_membersZ
all_nestedr   	cmf_ownerextendZ	CmfNotifyZplace_notify)r   addressZ	admin_grpZadminsrD   r   r   r   "_loop_detector_notify_responsiblesn   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   , адрес отправителя совпадает с адресом почтового ящикаr2   Zblacku$   , email в черном спискеu8   , детектирована почтовая петля)r9   ZREDIS_DBr   loggergZglobal_settingsZemail_loop_detector_thresholdexistsintr   decoderK   r)   inforA   )	r   rJ   Zredis_dbrM   Zloop_detectedZ	thresholdZloop_keyZnum_of_mailsr@   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	}n| j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-.d*| ||	 ||_|jd	d+ |sd S |j/|jd,gd-}t	j0j1|d.d/d,d0d1d2gd3D ]}|j2r|j2d4d5 |D krq|j2s(t3d6| d7d	d8 |4 }|rt	j0||j|j2d9}|rV||_t5|6 d:}|7| W 5 Q R X |  |j8|| |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)rW   r5   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   textzsdesk-client:default)r;   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 )r5    (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02dr\   z%d.%m.%Y %H:%M:%SuE   <table class='mail-header'>
                    <tr><th>От</th><td>r[   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   r5   rZ   rY   rH   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   r5   Zfull_path_fileurlZurl_previewZurl_preview_img)r   r   c                 S   s   g | ]
}|j qS r   )re   )r]   objr   r   r   
<listcomp>  s     z2CmfMailHandler.handle_new_mail.<locals>.<listcomp>u   DEV: Fatal. Вложение u    не имеет ext_idr   )r   r5   re   rb)9rS   r   Z	mail_fromr6   handler_typerG   Zin_reply_to
handle_objZ
referencesr3   Z	CmfPersonr   
obj_authorcreate_userr   Zschedule_deferred_jobZregister_sdesk_clientr   r8   rN   Zcurrent_userZCmfTaskZfind_related_tasksr5   rZ   debugZ
CmfCommentZ	text_htmlZservicedesk_publicZin_project_rolera   rP   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CmfAttachmentr4   re   r   Z	get_rfileopenZtmp_readonly_pathZupload_stream_fileZ_replace_attachment)r   mailZcommentrk   rrY   r)   ZtasksZ
in_commentZmail_subjectr`   ra   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g
d}|D ](}td| d|  |	|  qqVd S )Nr   r
   rV   r   r0   zparent.servicedesk_publicr;   rj   rT   rU   rl   rq   r   rm   zmailbox.emailr1   u&   Обрабатываем письмо u    с помощью )
rk   r3   r   r4   r   Zmailbox_folderr8   rN   rn   ru   )r   rs   Zavailable_handlersZhandlerr   r   r   new_mail_handler_hook,  s2    
       
z$CmfMailHandler.new_mail_handler_hook)NN)__name__
__module____qualname__classmethodr   r   r   rA   rK   boolrS   ru   rv   __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   