o
    ›¨Êhz  ã                   @   s|   d dl Z d dlmZ d dlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZ G d	d
„ d
eƒZG dd„ deƒZdS )é    N)Údatetime)Úutcé   )ÚAnymailBaseWebhookViewé   )ÚAnymailInboundMessage)ÚinboundÚtrackingÚAnymailInboundEventÚAnymailTrackingEventÚ	EventTypeÚRejectReasonc                   @   sŒ   e Zd ZdZdZeZdd„ Zej	ej
ejejejejejdœZejejejejejejejejejejejejejejejdœZdd„ Zd	S )
ÚMailjetTrackingWebhookViewz=Handler for Mailjet delivery and engagement tracking webhooksÚMailjetc                    sZ   t  |j d¡¡}z|d  W n ty   Y n ty#   |g}Y nw ‡ fdd„|D ƒS )Núutf-8r   c                    s   g | ]}ˆ   |¡‘qS © )Úesp_to_anymail_event)Ú.0Ú	esp_event©Úselfr   úJ/var/www/html/env/lib/python3.10/site-packages/anymail/webhooks/mailjet.pyÚ
<listcomp>   s    z;MailjetTrackingWebhookView.parse_events.<locals>.<listcomp>)ÚjsonÚloadsÚbodyÚdecodeÚ
IndexErrorÚKeyError)r   ÚrequestÚ
esp_eventsr   r   r   Úparse_events   s   
ÿz'MailjetTrackingWebhookView.parse_events)ÚsentÚopenÚclickÚbounceÚblockedÚspamÚunsub)zuser unknownzmailbox inactivezquota exceededÚblacklistedzspam reporterzinvalid domainzno mail hostzrelay/access deniedÚ
greylistedÚtypofixzsender blockedzcontent blockedzpolicy issueÚ
preblockedzduplicate in campaignc           	      C   s>  | j  |d tj¡}| dd ¡dkr| dd¡stj}ztj|d td�}W n tt	fy3   d }Y nw zt
|d ƒ}W n ttfyI   d }Y nw d|v rY| j |d tj¡}nd }| d	d ¡}|rf|gng }z	t |d
 ¡}W n tt	fy~   i }Y nw t|||d | dd ¡|| dd ¡||| dd ¡| dd ¡|d�S )NÚeventÚerrorr*   Úhard_bounceFÚtime)ÚtzÚ	MessageIDÚcustomcampaignÚPayloadÚemailÚ
smtp_replyÚurlÚagent)Ú
event_typeÚ	timestampÚ
message_idÚevent_idÚ	recipientÚreject_reasonÚmta_responseÚtagsÚmetadataÚ	click_urlÚ
user_agentr   )Úevent_typesÚgetr   ÚUNKNOWNÚDEFERREDr   Úfromtimestampr   r   Ú
ValueErrorÚstrÚ	TypeErrorÚreject_reasonsr   ÚOTHERr   r   r   )	r   r   r9   r:   r;   r>   Útagr@   rA   r   r   r   r   @   sJ   ÿÿÿ



ôz/MailjetTrackingWebhookView.esp_to_anymail_eventN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úesp_namer	   Úsignalr!   r   Ú	DELIVEREDÚOPENEDÚCLICKEDÚBOUNCEDÚREJECTEDÚ
COMPLAINEDÚUNSUBSCRIBEDrD   r   ÚBLOCKEDÚSPAMrM   ÚINVALIDrL   r   r   r   r   r   r      s<    øìr   c                   @   s<   e Zd ZdZdZeZdd„ Zdd„ Ze	dd„ ƒZ
d	d
„ ZdS )ÚMailjetInboundWebhookViewz/Handler for Mailjet inbound (parse API) webhookr   c                 C   s   t  |j d¡¡}|  |¡gS )Nr   )r   r   r   r   r   )r   r   r   r   r   r   r!   t   s   z&MailjetInboundWebhookView.parse_eventsc              
      s²   ˆ  ˆ  di ¡¡}‡ ‡fdd„ˆ  dg ¡D ƒ}tj|ˆ  dd ¡ˆ  dd ¡|d�}ˆ  dd ¡|_ˆ  d	d ¡|_d |_z	tˆ d
 ƒ|_W n t	t
tfyN   Y nw ttjd d ˆ |d�S )NÚHeadersc                    s(   g | ]}d |  dd¡v rˆ |ˆ ¡‘qS )Ú
AttachmentÚ
ContentRefÚ )rE   Ú_construct_mailjet_attachment)r   Úpart©r   r   r   r   r   €   s
    
þzBMailjetInboundWebhookView.esp_to_anymail_event.<locals>.<listcomp>ÚPartsz	Text-partz	Html-part)ÚheadersÚtextÚhtmlÚattachmentsÚSenderÚ	RecipientÚSpamAssassinScore)r9   r:   r<   r   Úmessage)Ú_flatten_mailjet_headersrE   r   Ú	constructÚenvelope_senderÚenvelope_recipientÚspam_detectedÚfloatÚ
spam_scorer   rK   rI   r
   r   ÚINBOUND)r   r   rh   rk   ro   r   rf   r   r   x   s2   
þ

üÿûz.MailjetInboundWebhookView.esp_to_anymail_eventc                 C   sL   g }|   ¡ D ]\}}t|tƒr|D ]	}| ||f¡ qq| ||f¡ q|S )zíConvert Mailjet's dict-of-strings-and/or-lists header format to our list-of-name-value-pairs

        {'name1': 'value', 'name2': ['value1', 'value2']}
          --> [('name1', 'value'), ('name2', 'value1'), ('name2', 'value2')]
        )ÚitemsÚ
isinstanceÚlistÚappend)rh   ÚresultÚnameÚvaluesÚvaluer   r   r   rp   �   s   
ÿz2MailjetInboundWebhookView._flatten_mailjet_headersc              	   C   sd   t ƒ }|  | di ¡¡D ]
\}}| ||¡ q||d  }t j| ¡ |d| d ¡| dd¡p/d d�S )Nr`   rb   Tz
Content-IDrc   )Úcontent_typeÚcontentÚbase64ÚfilenameÚ
content_id)r   rp   rE   Ú
add_headerÚconstruct_attachmentÚget_content_typeÚget_filename)r   re   r   Úpart_headersr}   r   Úcontent_base64r   r   r   rd   ­   s   üz7MailjetInboundWebhookView._construct_mailjet_attachmentN)rO   rP   rQ   rR   rS   r   rT   r!   r   Ústaticmethodrp   rd   r   r   r   r   r_   n   s    %
r_   )r   r   Údjango.utils.timezoner   Úbaser   r   r   Úsignalsr	   r
   r   r   r   r   r_   r   r   r   r   Ú<module>   s     c