o
    ›¨Êh  ã                   @   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	 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G dd„ deƒZdS )é    N)Ú	b64decode)Údatetime)Úutcé   )ÚAnymailBaseWebhookViewé   )ÚAnymailConfigurationError)ÚAnymailInboundMessage)ÚinboundÚtrackingÚAnymailInboundEventÚAnymailTrackingEventÚ	EventTypeÚRejectReasonc                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚSparkPostBaseWebhookViewz&Base view class for SparkPost webhooksÚ	SparkPostc                    s6   t  |j d¡¡}‡ fdd„|D ƒ}‡ fdd„|D ƒS )Núutf-8c                    s   g | ]}ˆ   |¡‘qS © )Úunwrap_event)Ú.0Ú	raw_event©Úselfr   úL/var/www/html/env/lib/python3.10/site-packages/anymail/webhooks/sparkpost.pyÚ
<listcomp>   s    z9SparkPostBaseWebhookView.parse_events.<locals>.<listcomp>c                    s(   g | ]\}}}|d urˆ   |||¡‘qS ©N)Úesp_to_anymail_event)r   Úevent_classÚeventr   r   r   r   r      s
    þ)ÚjsonÚloadsÚbodyÚdecode)r   ÚrequestÚ
raw_eventsÚunwrapped_eventsr   r   r   Úparse_events   s
   
þz%SparkPostBaseWebhookView.parse_eventsc                 C   sb   |d   ¡ }z|\}|d | }W n ty+   t|ƒdkr#d }}ntd| ƒ‚Y nw |||fS )zðUnwraps SparkPost event structure, and returns event_class, event, raw_event

        raw_event is of form {'msys': {event_class: {...event...}}}

        Can return None, None, raw_event for SparkPost "ping" raw_event={'msys': {}}
        Úmsysr   Nz>Invalid SparkPost webhook event has multiple event classes: %r)ÚkeysÚ
ValueErrorÚlenÚ	TypeError)r   r   Úevent_classesr   r   r   r   r   r      s   
þý
z%SparkPostBaseWebhookView.unwrap_eventc                 C   s   t ƒ ‚r   )ÚNotImplementedError)r   r   r   r   r   r   r   r   .   s   z-SparkPostBaseWebhookView.esp_to_anymail_eventN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úesp_namer&   r   r   r   r   r   r   r      s    	r   c                   @   s  e Zd ZdZe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dœZi dej“dej“dej“dej“dej“dej“d	ej“d
ej“dej“dej“dej“dej“dej“dej“dej“dejejf“dej“ejejfejejfejejfdœ¥Zdd„ ZdS )ÚSparkPostTrackingWebhookViewzHHandler for SparkPost message, engagement, and generation event webhooks)ÚbounceÚdeliveryÚ	injectionÚspam_complaintÚout_of_bandÚpolicy_rejectionÚdelayÚclickÚopenÚgeneration_failureÚgeneration_rejectionÚlist_unsubscribeÚlink_unsubscribeÚ1Ú10Ú20Ú21Ú22Ú23Ú24Ú25Ú30Ú40Ú50Ú51Ú52Ú53Ú54Ú60Ú70)Ú80Ú90Ú100c           	      C   s:  |dkrt dƒ‚| j |d tj¡}ztjt|d ƒtd�}W n t	t
tfy-   d }Y nw z|d }|r8|gnd }W n t	yF   g }Y nw z| j |d tj¡}z|\}}W n	 tya   Y nw W n t	yn   d }Y nw t||| dd ¡| d	d ¡| d
d ¡|| dd ¡|| dd ¡p�i | dd ¡| dd ¡|d�S )NÚrelay_messagezkYou seem to have set SparkPost's *inbound* relay webhook URL to Anymail's SparkPost *tracking* webhook URL.ÚtypeÚ	timestamp)ÚtzÚcampaign_idÚbounce_classÚtransmission_idÚevent_idÚraw_rcpt_toÚ
raw_reasonÚ	rcpt_metaÚtarget_link_urlÚ
user_agent)Ú
event_typerW   Ú
message_idr\   Ú	recipientÚreject_reasonÚmta_responseÚtagsÚmetadataÚ	click_urlra   Ú	esp_event)r   Úevent_typesÚgetr   ÚUNKNOWNr   ÚfromtimestampÚintr   ÚKeyErrorr+   r)   Úreject_reasonsr   ÚOTHERr   )	r   r   r   r   rb   rW   Útagrg   re   r   r   r   r   b   sR   ÿÿÿÿ€ÿ





óz1SparkPostTrackingWebhookView.esp_to_anymail_eventN)r.   r/   r0   r1   r   Úsignalr   ÚBOUNCEDÚ	DELIVEREDÚQUEUEDÚ
COMPLAINEDÚREJECTEDÚDEFERREDÚCLICKEDÚOPENEDÚFAILEDÚUNSUBSCRIBEDrk   r   rr   ÚINVALIDÚ	TIMED_OUTÚBLOCKEDÚSPAMÚAUTORESPONDEDÚ
SUBSCRIBEDrq   r   r   r   r   r   r3   2   sr    òüûúùø	÷
öõôóòñðïîíì


ér3   c                   @   s   e Zd ZdZeZdd„ ZdS )ÚSparkPostInboundWebhookViewz+Handler for SparkPost inbound relay webhookc                 C   s�   |dkrt dƒ‚|d dkrt dj|d d�ƒ‚|d d }|d d	 r+t|ƒ d
¡}t |¡}| dd ¡|_| dd ¡|_t	t
jd d ||d�S )NrU   zkYou seem to have set SparkPost's *tracking* webhook URL to Anymail's SparkPost *inbound* relay webhook URL.ÚprotocolÚsmtpzsYou cannot use Anymail's webhooks for SparkPost '{protocol}' relay events. Anymail only handles the 'smtp' protocol)r†   ÚcontentÚemail_rfc822Úemail_rfc822_is_base64r   Úmsg_fromÚrcpt_to)rb   rW   r\   rj   Úmessage)r   Úformatr   r"   r	   Úparse_raw_mimerl   Úenvelope_senderÚenvelope_recipientr   r   ÚINBOUND)r   r   r   r   Úraw_mimer�   r   r   r   r   ”   s.   ÿÿÿ
ûz0SparkPostInboundWebhookView.esp_to_anymail_eventN)r.   r/   r0   r1   r
   rt   r   r   r   r   r   r…   �   s    r…   )r   Úbase64r   r   Údjango.utils.timezoner   Úbaser   Ú
exceptionsr   r
   r	   Úsignalsr   r   r   r   r   r   r3   r…   r   r   r   r   Ú<module>   s     %]