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m	Z	 G dd	„ d	eƒZ
G d
d„ de	ƒZdS )é    Né   )ÚAnymailRequestsAPIError)ÚAnymailRecipientStatus)Úget_anymail_settingé   )ÚAnymailRequestsBackendÚRequestsPayloadc                       sH   e Zd ZdZdZ‡ fdd„Zdd„ Z‡ fdd„Zd	d
„ Zdd„ Z	‡  Z
S )ÚEmailBackendz$
    Postmark API Email Backend
    ÚPostmarkc                    sV   | j }td||dd�| _td||dd�}| d¡s|d7 }tt| ƒj|fi |¤Ž dS )	z!Init options from Django settingsÚserver_tokenT)Úesp_nameÚkwargsÚ
allow_bareÚapi_urlzhttps://api.postmarkapp.com/)r   r   Údefaultú/N)r   r   r   ÚendswithÚsuperr	   Ú__init__)Úselfr   r   r   ©Ú	__class__© úK/var/www/html/env/lib/python3.10/site-packages/anymail/backends/postmark.pyr      s   ÿ
zEmailBackend.__init__c                 C   s   t ||| ƒS ©N)ÚPostmarkPayload)r   ÚmessageÚdefaultsr   r   r   Úbuild_message_payload   ó   z"EmailBackend.build_message_payloadc                    s&   |j dkrtt| ƒ |||¡ d S d S )Ni¦  )Ústatus_coder   r	   Úraise_for_status)r   ÚresponseÚpayloadr   r   r   r   r!      s   
ÿzEmailBackend.raise_for_statusc              
      sÌ   |   |||¡}z
|d }|d }W n ttfy#   td|||| d�‚w | dd ¡‰g ‰|dkr?d|v r<t|||| d�‚d‰ n|d	krFd
‰ n|dkrRd‰ |  |¡‰nt|||| d�‚‡ ‡‡fdd„|jD ƒS )NÚ	ErrorCodeÚMessagez$Invalid Postmark API response format)Úemail_messager#   r"   ÚbackendÚ	MessageIDi,  z'From' addressÚinvalidi–  Úrejectedr   Úsentc                    s.   i | ]}|j tˆ|j  ¡ ˆv rd nˆ d�“qS )r*   )Ú
message_idÚstatus)Ú	addr_specr   Úlower)Ú.0Ú	recipient©Údefault_statusr,   Úrejected_emailsr   r   Ú
<dictcomp>E   s    ûýÿz7EmailBackend.parse_recipient_status.<locals>.<dictcomp>)Údeserialize_json_responseÚKeyErrorÚ	TypeErrorr   ÚgetÚparse_inactive_recipientsÚall_recipients)r   r"   r#   r   Úparsed_responseÚ
error_codeÚmsgr   r2   r   Úparse_recipient_status#   s:   þÿÿÿúz#EmailBackend.parse_recipient_statusc                 C   s2   t  d|¡}|r| d¡}dd„ | d¡D ƒS g S )z˜Return a list of 'inactive' email addresses from a Postmark "OK" response

        :param str msg: the "Message" from the Postmark API response
        z2inactive addresses:\s*(.*)\.\s*Inactive recipientsr   c                 S   s   g | ]}|  ¡  ¡ ‘qS r   )Ústripr/   ©r0   Úemailr   r   r   Ú
<listcomp>Z   s    z:EmailBackend.parse_inactive_recipients.<locals>.<listcomp>ú,)ÚreÚsearchÚgroupÚsplit)r   r>   ÚmatchÚemailsr   r   r   r:   N   s
   	
z&EmailBackend.parse_inactive_recipients)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r!   r?   r:   Ú__classcell__r   r   r   r   r	   
   s    
+r	   c                       s¸   e Zd Z‡ fdd„Zdd„ Z‡ fdd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Z‡  ZS ))r   c                    sB   dddœ}|j | _ g | _tt| ƒj|||g|¢R d|i|¤Ž d S )Nzapplication/json)zContent-TypeÚAcceptÚheaders)r   r;   r   r   r   )r   r   r   r'   Úargsr   rQ   r   r   r   r   a   s   þ*zPostmarkPayload.__init__c                 C   s   d| j v s
d| j v rdS dS )NÚ
TemplateIdÚTemplateModelzemail/withTemplate/rB   ©Údata©r   r   r   r   Úget_api_endpointk   s   z PostmarkPayload.get_api_endpointc                    s"   t t| ƒ |¡}| j|d d< |S )NrQ   zX-Postmark-Server-Token)r   r   Úget_request_paramsr   )r   r   Úparamsr   r   r   rY   r   s   z"PostmarkPayload.get_request_paramsc                 C   s   |   | j¡S r   )Úserialize_jsonrV   rW   r   r   r   Úserialize_dataw   r   zPostmarkPayload.serialize_datac                 C   s
   i | _ d S r   rU   rW   r   r   r   Úinit_payload~   s   
zPostmarkPayload.init_payloadc                 C   s   d  dd„ |D ƒ¡| jd< d S )Nú, c                 S   ó   g | ]}|j ‘qS r   ©ÚaddressrA   r   r   r   rC   „   ó    z7PostmarkPayload.set_from_email_list.<locals>.<listcomp>ÚFrom©ÚjoinrV   )r   rJ   r   r   r   Úset_from_email_list�   s   z#PostmarkPayload.set_from_email_listc                 C   sH   |dv sJ ‚|r"|  ¡ }d dd„ |D ƒ¡| j|< |  j|7  _d S d S )N)ÚtoÚccÚbccr^   c                 S   r_   r   r`   rA   r   r   r   rC   Š   rb   z2PostmarkPayload.set_recipients.<locals>.<listcomp>)Ú
capitalizere   rV   r;   )r   Úrecipient_typerJ   Úfieldr   r   r   Úset_recipients†   s   ýzPostmarkPayload.set_recipientsc                 C   ó   || j d< d S )NÚSubjectrU   )r   Úsubjectr   r   r   Úset_subject�   ó   zPostmarkPayload.set_subjectc                 C   s*   |rd  dd„ |D ƒ¡}|| jd< d S d S )Nr^   c                 S   r_   r   r`   rA   r   r   r   rC   ’   rb   z0PostmarkPayload.set_reply_to.<locals>.<listcomp>ÚReplyTord   )r   rJ   Úreply_tor   r   r   Úset_reply_to�   s   þzPostmarkPayload.set_reply_toc                 C   s   dd„ |  ¡ D ƒ| jd< d S )Nc                 S   s   g | ]	\}}||d œ‘qS ))ÚNameÚValuer   )r0   ÚkeyÚvaluer   r   r   rC   –   s    ÿÿz5PostmarkPayload.set_extra_headers.<locals>.<listcomp>ÚHeaders)ÚitemsrV   )r   rQ   r   r   r   Úset_extra_headers•   s   þz!PostmarkPayload.set_extra_headersc                 C   rn   )NÚTextBodyrU   ©r   Úbodyr   r   r   Úset_text_body›   rr   zPostmarkPayload.set_text_bodyc                 C   s"   d| j v r
|  d¡ || j d< d S )NÚHtmlBodyzmultiple html parts)rV   Úunsupported_featurer~   r   r   r   Úset_html_bodyž   s   

zPostmarkPayload.set_html_bodyc                 C   s.   |j pd|j|jdœ}|jrd|j |d< |S )z/Returns Postmark attachment dict for attachmentÚ )rv   ÚContentÚContentTypezcid:%sÚ	ContentID)ÚnameÚ
b64contentÚmimetypeÚinlineÚcid)r   Ú
attachmentÚattr   r   r   Úmake_attachment¤   s   ýzPostmarkPayload.make_attachmentc                    s$   |r‡ fdd„|D ƒˆ j d< d S d S )Nc                    s   g | ]}ˆ   |¡‘qS r   )r�   )r0   r�   rW   r   r   rC   ±   s    
ÿz3PostmarkPayload.set_attachments.<locals>.<listcomp>ÚAttachmentsrU   )r   Úattachmentsr   rW   r   Úset_attachments¯   s
   
ÿÿzPostmarkPayload.set_attachmentsc                 C   s@   t |ƒdkr|d | jd< t |ƒdkr|  d| ¡ d S d S d S )Nr   ÚTagr   zmultiple tags (%r))ÚlenrV   r‚   )r   Útagsr   r   r   Úset_tags»   s   ýzPostmarkPayload.set_tagsc                 C   s   |rdnd| j d< d S )NÚHtmlAndTextÚNoneÚ
TrackLinksrU   )r   Útrack_clicksr   r   r   Úset_track_clicksÁ   s   z PostmarkPayload.set_track_clicksc                 C   rn   )NÚ
TrackOpensrU   )r   Útrack_opensr   r   r   Úset_track_opensÄ   rr   zPostmarkPayload.set_track_opensc                 C   rn   )NrS   rU   )r   Útemplate_idr   r   r   Úset_template_idÇ   rr   zPostmarkPayload.set_template_idc                 C   rn   )NrT   rU   )r   Úmerge_global_datar   r   r   Úset_merge_global_dataÌ   rr   z%PostmarkPayload.set_merge_global_datac                 C   s"   | j  |¡ | j  d| j¡| _d S )Nr   )rV   ÚupdateÚpopr   )r   Úextrar   r   r   Úset_esp_extraÏ   s   zPostmarkPayload.set_esp_extra)rK   rL   rM   r   rX   rY   r\   r]   rf   rm   rq   ru   r|   r€   rƒ   r�   r’   r–   r›   rž   r    r¢   r¦   rO   r   r   r   r   r   _   s*    
r   )rE   Ú
exceptionsr   r   r   Úutilsr   Úbase_requestsr   r   r	   r   r   r   r   r   Ú<module>   s    U