o
    ›¨ÊhY  ã                   @   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ejejejejdœZejejej	ejejdœZdd„ Zh d	£Zd
S )ÚSendGridTrackingWebhookViewz>Handler for SendGrid delivery and engagement tracking webhooksÚSendGridc                    s$   t  |j d¡¡}‡ fdd„|D ƒS )Núutf-8c                    s   g | ]}ˆ   |¡‘qS © ©Úesp_to_anymail_event)Ú.0Ú	esp_event©Úselfr   úK/var/www/html/env/lib/python3.10/site-packages/anymail/webhooks/sendgrid.pyÚ
<listcomp>   ó    z<SendGridTrackingWebhookView.parse_events.<locals>.<listcomp>)ÚjsonÚloadsÚbodyÚdecode)r   ÚrequestÚ
esp_eventsr   r   r   Úparse_events   s   z(SendGridTrackingWebhookView.parse_events)ÚbounceÚdeferredÚ	deliveredÚdroppedÚ	processedÚclickÚopenÚ
spamreportÚunsubscribeÚgroup_unsubscribeÚgroup_resubscribe)Úinvalidzunsubscribed addressr"   ÚblockedÚexpiredc           	         s$  | j  ˆ d tj¡}ztjˆ d td�}W n ttfy"   d }Y nw ˆ d dkr@d }ˆ  dˆ  dd¡¡}| j	 | 
¡ tj¡}nˆ  dˆ  dd ¡¡}d }tˆ  ¡ ƒ| j }t|ƒd	kre‡ fd
d„|D ƒ}ni }t||ˆ  dˆ  d¡¡ˆ  dd ¡ˆ  dd ¡||ˆ  dg ¡|ˆ  dd ¡ˆ  dd ¡ˆ d�S )NÚeventÚ	timestamp)Útzr%   ÚtypeÚreasonÚ Úresponser   c                    s   i | ]}|ˆ | “qS r   r   )r   Úkey©r   r   r   Ú
<dictcomp>D   r   zDSendGridTrackingWebhookView.esp_to_anymail_event.<locals>.<dictcomp>Ú
anymail_idúsmtp-idÚsg_event_idÚemailÚcategoryÚurlÚ	useragent)Ú
event_typer1   Ú
message_idÚevent_idÚ	recipientÚreject_reasonÚmta_responseÚtagsÚmetadataÚ	click_urlÚ
user_agentr   )Úevent_typesÚgetr   ÚUNKNOWNr   Úfromtimestampr   ÚKeyErrorÚ
ValueErrorÚreject_reasonsÚlowerr   ÚOTHERÚsetÚkeysÚsendgrid_event_keysÚlenr   )	r   r   rA   r1   rF   r4   rE   Úmetadata_keysrH   r   r8   r   r   -   s<   ÿ




ôz0SendGridTrackingWebhookView.esp_to_anymail_event>   ÚipÚtlsr?   Úpoolr3   r=   r0   r4   ÚstatusÚattemptÚsend_atr>   Úcert_errr6   Ú	post_typer1   r@   r:   Ú
newsletterÚ
url_offsetr<   Úasm_group_idÚnlvx_user_idÚsg_message_idÚnlvx_campaign_idÚmarketing_campaign_idÚnlvx_campaign_split_idÚmarketing_campaign_namer;   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úesp_namer	   Úsignalr!   r   ÚBOUNCEDÚDEFERREDÚ	DELIVEREDÚREJECTEDÚQUEUEDÚCLICKEDÚOPENEDÚ
COMPLAINEDÚUNSUBSCRIBEDÚ
SUBSCRIBEDrK   r   ÚINVALIDÚBLOCKEDÚ	TIMED_OUTrQ   r   rV   r   r   r   r   r      s2    ôú	+r   c                   @   s0   e Zd ZdZdZeZdd„ Zdd„ Zdd„ Z	d	S )
ÚSendGridInboundWebhookViewz$Handler for SendGrid inbound webhookr   c                 C   s   |   |¡gS )Nr   )r   r   r   r   r   r!      s   z'SendGridInboundWebhookView.parse_eventsc              
   C   sÌ   |}d|j v r|  |¡}nd|j v rt |j d ¡}ntdƒ‚z
t |j d ¡}W n tttfy5   Y nw |d |_	|d d |_
d |_z
t|j d ƒ|_W n tttfy[   Y nw ttjd d ||d	�S )
NÚheadersr=   zOInvalid SendGrid inbound event data (missing both 'headers' and 'email' fields)ÚenvelopeÚfromÚtor   Ú
spam_score)rA   r1   rC   r   Úmessage)ÚPOSTÚmessage_from_sendgrid_parsedr   Úparse_raw_mimerO   r   r   Ú	TypeErrorrP   Úenvelope_senderÚenvelope_recipientÚspam_detectedÚfloatr‚   r
   r   ÚINBOUND)r   r   r   rƒ   r   r   r   r   r   ‚   s4   

ÿ
ÿûz/SendGridInboundWebhookView.esp_to_anymail_eventc              	      sÀ   z
t  ˆjd ¡}W n ttfy   i }Y nw z
t  ˆjd ¡‰ W n ttfy/   d}Y nw ‡ ‡fdd„tˆ  ¡ ƒD ƒ}tjˆj 	dd¡ˆj 	dd¡| 	dd	¡ˆj 	d
d¡| 	d
d	¡|d�S )z>Construct a Message from SendGrid's "default" (non-raw) fieldsÚcharsetszattachment-infoNc                    s,   g | ]}t jˆj| ˆ |  d d¡d�‘qS )z
content-idN)Ú
content_id)r   Ú'construct_attachment_from_uploaded_fileÚFILESrL   )r   Úatt_id©Úattachment_infor   r   r   r   ³   s    ýþÿzKSendGridInboundWebhookView.message_from_sendgrid_parsed.<locals>.<listcomp>r~   r5   Útextr   Úhtml)Úraw_headersr”   Útext_charsetr•   Úhtml_charsetÚattachments)
r   r   r„   rO   rP   ÚsortedrU   r   Ú	constructrL   )r   r   r�   r™   r   r’   r   r…   ¥   s*   ÿÿ
ü

úz7SendGridInboundWebhookView.message_from_sendgrid_parsedN)
rj   rk   rl   rm   rn   r   ro   r!   r   r…   r   r   r   r   r}   y   s    #r}   )r   r   Údjango.utils.timezoner   Úbaser   r   r   Úsignalsr	   r
   r   r   r   r   r}   r   r   r   r   Ú<module>   s     n