o
    ›¨Êhf  ã                   @   sd   d dl mZ ddlmZmZ ddlmZ ddlmZ ddl	m
Z
 G dd	„ d	eƒZG d
d„ deƒZdS )é    )ÚCaseInsensitiveDicté   )ÚAnymailRequestsBackendÚRequestsPayloadé   )ÚAnymailRequestsAPIError)ÚAnymailRecipientStatus)Úget_anymail_settingc                       s<   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Z‡  Z	S )ÚEmailBackendz)
    SendinBlue v3 API Email Backend
    Ú
SendinBluec                    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Úapi_keyT)Úesp_nameÚkwargsÚ
allow_bareÚapi_urlzhttps://api.sendinblue.com/v3/)r   r   Údefaultú/N)r   r	   r   ÚendswithÚsuperr
   Ú__init__)Úselfr   r   r   ©Ú	__class__© úM/var/www/html/env/lib/python3.10/site-packages/anymail/backends/sendinblue.pyr      s    üü
zEmailBackend.__init__c                 C   s   t ||| ƒS ©N)ÚSendinBluePayload)r   ÚmessageÚdefaultsr   r   r   Úbuild_message_payload#   s   z"EmailBackend.build_message_payloadc                 C   s(   |j dk s
|j dkrt|||| d�‚d S )NéÈ   i,  ©Úemail_messageÚpayloadÚresponseÚbackend)Ústatus_coder   )r   r$   r#   r   r   r   r   Úraise_for_status&   s   üÿzEmailBackend.raise_for_statusc              
      sn   d }|j dkr'|  |||¡}z|d }W n ttfy&   td|||| d�‚w t|dd�‰ ‡ fdd„|jD ƒS )	Nó    Ú	messageIdz&Invalid SendinBlue API response formatr!   Úqueued)Ú
message_idÚstatusc                    s   i | ]}|j ˆ “qS r   )Ú	addr_spec)Ú.0Ú	recipient©r,   r   r   Ú
<dictcomp>>   ó    z7EmailBackend.parse_recipient_status.<locals>.<dictcomp>)ÚcontentÚdeserialize_json_responseÚKeyErrorÚ	TypeErrorr   r   Úall_recipients)r   r$   r#   r   r+   Úparsed_responser   r0   r   Úparse_recipient_status/   s   
þÿz#EmailBackend.parse_recipient_status)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r'   r9   Ú__classcell__r   r   r   r   r
   	   s    	r
   c                       s¸   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Ze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                    sT   g | _ d | _| di ¡}|j|d< d|d< tt| ƒj|||g|¢R d|i|¤Ž d S )NÚheaderszapi-keyzapplication/jsonzContent-Type)r7   Útemplate_idÚpopr   r   r   r   )r   r   r   r%   Úargsr   Úhttp_headersr   r   r   r   C   s   
*zSendinBluePayload.__init__c                 C   s   | j rd| j  S dS )Nzsmtp/templates/%s/sendz
smtp/email©r@   ©r   r   r   r   Úget_api_endpointM   s   
z"SendinBluePayload.get_api_endpointc                 C   s   dt ƒ i| _d S ©Nr?   )r   ÚdatarE   r   r   r   Úinit_payloadS   s   
ÿzSendinBluePayload.init_payloadc                 C   s6   | j d s	| j d= | jr|  | j ¡}n| j }|  |¡S )zJPerforms any necessary serialization on self.data, and returns the result.r?   )rH   r@   Ú#_transform_data_for_templated_emailÚserialize_json)r   rH   r   r   r   Úserialize_dataX   s   

z SendinBluePayload.serialize_datac                 C   sè   |  dd¡r|  d¡ |  dd¡r|  d¡ |  dd¡s"|  dd¡r'|  d¡ d	d
ddœ}| ¡ D ](\}}||v rYtdd„ || D ƒƒrK|  d| ¡ dd„ || D ƒ||< ||= q1d|v rr|d  d¡rj|  d¡ |d d |d< |S )a  
        Transform the default Payload's data (used for basic transactional email) to
        the data used by SendinBlue in case of a templated transactional email.
        :param data: The data we want to transform
        :return: The transformed data
        ÚsubjectFzoverriding template subjectÚsenderzoverriding template from_emailÚtextContentÚhtmlContentz overriding template body contentÚemailToÚemailCcÚemailBcc©ÚtoÚccÚbccc                 s   s   � | ]}|  d ¡V  qdS )ÚnameN)Úget©r.   Úemailr   r   r   Ú	<genexpr>{   s   € zHSendinBluePayload._transform_data_for_templated_email.<locals>.<genexpr>z0display names in %s when sending with a templatec                 S   s   g | ]}|d  ‘qS )r[   r   rZ   r   r   r   Ú
<listcomp>}   r2   zISendinBluePayload._transform_data_for_templated_email.<locals>.<listcomp>ÚreplyTorX   z6display names in reply_to when sending with a templater[   )rA   Úunsupported_featureÚitemsÚanyrY   )r   rH   ÚtransformationÚkeyÚnew_keyr   r   r   rJ   f   s,   


ý€
z5SendinBluePayload._transform_data_for_templated_emailc                 C   s$   t ƒ }| j|d< | jr| j|d< |S )z-Converts EmailAddress to SendinBlue API arrayr[   rX   )Údictr-   Údisplay_name)r[   Úemail_objectr   r   r   rg   ‹   s
   

zSendinBluePayload.email_objectc                 C   s   |   |¡| jd< d S )NrN   )rg   rH   )r   r[   r   r   r   Úset_from_email”   ó   z SendinBluePayload.set_from_emailc                    s>   |dv sJ ‚|r‡ fdd„|D ƒˆ j |< ˆ  j|7  _d S d S )NrT   c                    s   g | ]}ˆ   |¡‘qS r   )rg   rZ   rE   r   r   r]   š   s    z4SendinBluePayload.set_recipients.<locals>.<listcomp>)rH   r7   )r   Úrecipient_typeÚemailsr   rE   r   Úset_recipients—   s
   þz SendinBluePayload.set_recipientsc                 C   s   |dkr|| j d< d S d S )NÚ rM   ©rH   )r   rM   r   r   r   Úset_subject�   s   ÿzSendinBluePayload.set_subjectc                 C   s>   t |ƒdkr|  d¡ t |ƒdkr|  |d ¡| jd< d S d S )Nr   zmultiple reply_to addressesr   r^   )Úlenr_   rg   rH   )r   rk   r   r   r   Úset_reply_to¡   s
   
ÿzSendinBluePayload.set_reply_toc                 C   s   | j d  |¡ d S rG   ©rH   Úupdate)r   r?   r   r   r   Úset_extra_headers¨   ri   z#SendinBluePayload.set_extra_headersc                 C   sD   t |ƒdkr|d | jd d< t |ƒdkr |  d| ¡ d S d S d S )Nr   r?   zX-Mailin-tagr   zmultiple tags (%r))rp   rH   r_   )r   Útagsr   r   r   Úset_tags«   s   ýzSendinBluePayload.set_tagsc                 C   s
   || _ d S r   rD   )r   r@   r   r   r   Úset_template_id±   s   
z!SendinBluePayload.set_template_idc                 C   s   |r	|| j d< d S d S )NrO   rn   ©r   Úbodyr   r   r   Úset_text_body´   s   ÿzSendinBluePayload.set_text_bodyc                 C   s*   |rd| j v r|  d¡ || j d< d S d S )NrP   zmultiple html parts)rH   r_   rx   r   r   r   Úset_html_body¸   s
   

üzSendinBluePayload.set_html_bodyc                 C   s:   |j pd|jdœ}|jr|  d¡ | j dg ¡ |¡ dS )z;Converts attachments to SendinBlue API {name, base64} arrayrm   )rX   r3   zinline attachmentsÚ
attachmentN)rX   Ú
b64contentÚinliner_   rH   Ú
setdefaultÚappend)r   r|   Úattr   r   r   Úadd_attachment¿   s   þ
z SendinBluePayload.add_attachmentc                 C   s   | j  |¡ d S r   rr   )r   Úextrar   r   r   Úset_esp_extraË   s   zSendinBluePayload.set_esp_extrac                 C   s   |   d¡ dS )z@SendinBlue doesn't support special attributes for each recipientÚ
merge_dataN)r_   )r   r…   r   r   r   Úset_merge_dataÎ   s   z SendinBluePayload.set_merge_datac                 C   s   || j d< d S )NÚ
attributesrn   )r   Úmerge_global_datar   r   r   Úset_merge_global_dataÒ   s   z'SendinBluePayload.set_merge_global_datac                 C   s   |   |¡| jd d< d S )Nr?   zX-Mailin-custom)rK   rH   )r   Úmetadatar   r   r   Úset_metadataÕ   s   zSendinBluePayload.set_metadata)r:   r;   r<   r   rF   rI   rL   rJ   Ústaticmethodrg   rh   rl   ro   rq   rt   rv   rw   rz   r{   r‚   r„   r†   r‰   r‹   r>   r   r   r   r   r   A   s,    
%
r   N)Úrequests.structuresr   Úbase_requestsr   r   Ú
exceptionsr   r   r   Úutilsr	   r
   r   r   r   r   r   Ú<module>   s    8