o
    ›¨ÊhØ6  ã                   @   s„   d dl Z d dlZd dlmZ ddlmZmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZmZ G d	d
„ d
eƒZG dd„ deƒZdS )é    N)ÚCaseInsensitiveDicté   )ÚAnymailConfigurationErrorÚAnymailRequestsAPIErrorÚAnymailWarning)ÚAnymailRecipientStatus)ÚBASIC_NUMERIC_TYPESÚget_anymail_settingÚ	timestampé   )ÚAnymailRequestsBackendÚRequestsPayloadc                       s4   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )	ÚEmailBackendz4
    SendGrid v2 API Email Backend (deprecated)
    ÚSendGridc                    sÊ   | j }td||ddd�| _td||ddd�| _td||ddd�| _| jdu r4| jdu s0| jdu r4tdƒ‚td||dd	�| _td
||dd	�| _td||dd	�}| d¡sW|d7 }t	t
| ƒj|fi |¤Ž dS )z!Init options from Django settingsÚapi_keyNT)Úesp_nameÚkwargsÚdefaultÚ
allow_bareÚusernameÚpasswordzuYou must set either SENDGRID_API_KEY or both SENDGRID_USERNAME and SENDGRID_PASSWORD in your Django ANYMAIL settings.Úgenerate_message_id)r   r   r   Úmerge_field_formatÚapi_urlzhttps://api.sendgrid.com/api/ú/)r   r	   r   r   r   r   r   r   ÚendswithÚsuperr   Ú__init__)Úselfr   r   r   ©Ú	__class__© úN/var/www/html/env/lib/python3.10/site-packages/anymail/backends/sendgrid_v2.pyr      s4   ÿÿÿÿÿÿÿ
zEmailBackend.__init__c                 C   s   t ||| ƒS ©N)ÚSendGridPayload)r   ÚmessageÚdefaultsr!   r!   r"   Úbuild_message_payload0   s   z"EmailBackend.build_message_payloadc              
      s’   |   |||¡}z|d }W n ttfy   td|||| d�‚w |dkr8| dg ¡}tdd |¡ |||| d�‚t|jdd	�‰ ‡ fd
d„|jD ƒS )Nr%   z$Invalid SendGrid API response format)Úemail_messageÚpayloadÚresponseÚbackendÚsuccessÚerrorszSendGrid send failed: '%s'z; Úqueued)Ú
message_idÚstatusc                    s   i | ]}|j ˆ “qS r!   ©Ú	addr_spec©Ú.0Ú	recipient©r0   r!   r"   Ú
<dictcomp>B   s    z7EmailBackend.parse_recipient_status.<locals>.<dictcomp>)	Údeserialize_json_responseÚKeyErrorÚ	TypeErrorr   ÚgetÚjoinr   r/   Úall_recipients)r   r*   r)   r%   Úparsed_responseÚsendgrid_messager-   r!   r6   r"   Úparse_recipient_status3   s"   þÿþz#EmailBackend.parse_recipient_status)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r'   r@   Ú__classcell__r!   r!   r   r"   r      s    r   c                       sà   e Zd Z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d&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Z‡  ZS )4r$   z+
    SendGrid v2 API Mail Send payload
    c                    s¦   g | _ |j| _d | _i | _g | _|j| _d | _d | _| di ¡}| di ¡}|j	d ur3d|j	 |d< n
|j
|d< |j|d< tt| ƒj|||g|¢R ||dœ|¤Ž d S )NÚheadersÚparamsz	Bearer %sÚAuthorizationÚapi_userr   )rG   rF   )r=   r   r/   ÚsmtpapiÚto_listr   Ú
merge_dataÚmerge_global_dataÚpopr   r   r   r   r$   r   )r   r%   r&   r+   Úargsr   Úhttp_headersÚquery_paramsr   r!   r"   r   J   s*   


þÿ
þzSendGridPayload.__init__c                 C   s   dS )Nzmail.send.jsonr!   ©r   r!   r!   r"   Úget_api_endpoint_   s   z SendGridPayload.get_api_endpointc                 C   s"  | j r|  ¡  |  ¡  | jdur/dd„ | jD ƒ| jd< | jd g| jd< | j dd¡g| jd< t| jƒd	krgd
| jv r]| jd
 }| 	¡ D ]\}}|dkrW| j 
|i ¡ |¡ qD|| j|< qD|  | j¡| jd
< nd
| jv rw|  | jd
 ¡| jd
< | jd rŠ|  | jd ¡| jd< | jS | jd= | jS )zJPerforms any necessary serialization on self.data, and returns the result.Nc                 S   ó   g | ]}|j ‘qS r!   ©Úaddress©r4   Úemailr!   r!   r"   Ú
<listcomp>o   ó    z2SendGridPayload.serialize_data.<locals>.<listcomp>ÚtoÚfromÚfromnameú Útonamer   z	x-smtpapiÚfiltersrF   )r   Úset_anymail_idÚbuild_merge_datarL   rK   rJ   Údatar;   ÚlenÚitemsÚ
setdefaultÚupdateÚserialize_json)r   Úesp_extra_smtpapiÚkeyÚvaluer!   r!   r"   Úserialize_datab   s,   




þzSendGridPayload.serialize_datac                 C   s&   t t ¡ ƒ| _| j| j di ¡d< dS )z>Ensure message has a known anymail_id for later event trackingÚunique_argsÚ
anymail_idN)ÚstrÚuuidÚuuid4r/   rJ   rf   rR   r!   r!   r"   ra   ‹   s   zSendGridPayload.set_anymail_idc                    sØ   ˆj durOtƒ }ˆj  ¡ D ]	}| | ¡ ¡}qdd„ ˆjD ƒ‰ ˆjdu r3tdd„ |D ƒƒr3t 	dt
¡ ˆjp7d‰‡fdd	„|D ƒ‰‡ ‡‡fd
d	„|D ƒˆjd< ˆjdurjˆjpXd‰‡fdd	„ˆj ¡ D ƒˆjd< dS dS )z"Set smtpapi['sub'] and ['section']Nc                 S   rT   r!   r1   rW   r!   r!   r"   rY   ™   rZ   z4SendGridPayload.build_merge_data.<locals>.<listcomp>c                 s   s   � | ]}|  ¡ V  qd S r#   )Úisalnum©r4   Úfieldr!   r!   r"   Ú	<genexpr>›   s   € z3SendGridPayload.build_merge_data.<locals>.<genexpr>z½Your SendGrid merge fields don't seem to have delimiters, which can cause unexpected results with Anymail's merge_data. Search SENDGRID_MERGE_FIELD_FORMAT in the Anymail docs for more info.z{}c                    s   i | ]}|ˆ   |¡“qS r!   ©Úformatrs   )Úsub_field_fmtr!   r"   r7   £   s    z4SendGridPayload.build_merge_data.<locals>.<dictcomp>c                    s(   i | ]‰ ˆˆ  ‡ ‡‡fd d„ˆD ƒ“qS )c                    s&   g | ]}ˆj  |i ¡ ˆ ˆˆ  ¡‘qS r!   )rL   r;   r3   )rt   r   Ú
sub_fieldsr!   r"   rY   ¨   s    ÿz?SendGridPayload.build_merge_data.<locals>.<dictcomp>.<listcomp>r!   )r4   )Ú
recipientsr   ry   )rt   r"   r7   ¥   s    þÿýÚsubc                    s   i | ]
\}}ˆ   |¡|“qS r!   rv   )r4   rt   rc   )Úsection_field_fmtr!   r"   r7   ¯   s    
ÿÿÚsection)rL   ÚsetÚvaluesÚunionÚkeysrK   r   ÚallÚwarningsÚwarnr   rJ   rM   re   )r   Ú
all_fieldsÚrecipient_datar!   )rz   r|   r   rx   ry   r"   rb   ‘   s*   
ü
û


þþz SendGridPayload.build_merge_datac                 C   s   i | _ i | _tƒ | j d< d S )NrF   )rc   Úfilesr   rR   r!   r!   r"   Úinit_payload¸   s   zSendGridPayload.init_payloadc                 C   s&   |j | jd< |jr|j| jd< d S d S )Nr\   r]   )r2   rc   Údisplay_name)r   rX   r!   r!   r"   Úset_from_email½   s   ÿzSendGridPayload.set_from_emailc                 C   s   || _ |  d|¡ d S )Nr[   )rK   Úset_recipients)r   Úemailsr!   r!   r"   Úset_toÂ   s   zSendGridPayload.set_toc                    sZ   |dv sJ ‚|r+dd„ |D ƒ| j |< d‰ ‡ fdd„|D ƒ| j |d < |  j|7  _d S d S )N)r[   ÚccÚbccc                 S   rT   r!   r1   rW   r!   r!   r"   rY   É   rZ   z2SendGridPayload.set_recipients.<locals>.<listcomp>r^   c                    s   g | ]}|j pˆ ‘qS r!   )r‰   rW   ©Ú
empty_namer!   r"   rY   Ë   s    Úname)rc   r=   )r   Úrecipient_typerŒ   r!   r�   r"   r‹   Æ   s   üzSendGridPayload.set_recipientsc                 C   ó   || j d< d S )NÚsubject©rc   )r   r•   r!   r!   r"   Úset_subjectÎ   ó   zSendGridPayload.set_subjectc                 C   s.   |rd  dd„ |D ƒ¡}|| jd d< d S d S )Nz, c                 S   rT   r!   rU   rW   r!   r!   r"   rY   Ù   rZ   z0SendGridPayload.set_reply_to.<locals>.<listcomp>rF   zReply-To)r<   rc   )r   rŒ   Úreply_tor!   r!   r"   Úset_reply_toÑ   s   þzSendGridPayload.set_reply_toc                 C   s"   | j d  dd„ | ¡ D ƒ¡ d S )NrF   c                 S   s(   i | ]\}}|t |tƒrt|ƒn|“qS r!   )Ú
isinstancer   ro   )r4   ÚkÚvr!   r!   r"   r7   à   s    ÿÿz5SendGridPayload.set_extra_headers.<locals>.<dictcomp>)rc   rg   re   )r   rF   r!   r!   r"   Úset_extra_headersÜ   s   þz!SendGridPayload.set_extra_headersc                 C   r”   )NÚtextr–   ©r   Úbodyr!   r!   r"   Úset_text_bodyå   r˜   zSendGridPayload.set_text_bodyc                 C   s"   d| j v r
|  d¡ || j d< d S )NÚhtmlzmultiple html parts)rc   Úunsupported_featurer    r!   r!   r"   Úset_html_bodyè   s   

zSendGridPayload.set_html_bodyc                 C   sn   |j pd}|jr|p|j}d| }|j| j|< d| }|| jv r+|  |r(d| nd¡ ||j|jf| j|< d S )NÚ zcontent[%s]z	files[%s]z2multiple attachments with the same filename ('%s')zmultiple unnamed attachments)r’   ÚinlineÚcidrc   r‡   r¤   ÚcontentÚmimetype)r   Ú
attachmentÚfilenameÚcontent_fieldÚfiles_fieldr!   r!   r"   Úadd_attachmentî   s   


þzSendGridPayload.add_attachmentc                 C   r”   )Nrm   ©rJ   )r   Úmetadatar!   r!   r"   Úset_metadata   r˜   zSendGridPayload.set_metadatac                 C   s   t t|ƒƒ| jd< d S )NÚsend_at)Úintr
   rJ   )r   r³   r!   r!   r"   Úset_send_at  s   zSendGridPayload.set_send_atc                 C   r”   )NÚcategoryr°   )r   Útagsr!   r!   r"   Úset_tags  r˜   zSendGridPayload.set_tagsc                 C   s&   || j  di ¡ |i ¡ di ¡|< d S )Nr`   Úsettings)rJ   rf   )r   Úfilter_nameÚsettingÚvalr!   r!   r"   Ú
add_filter  s
   þ
þzSendGridPayload.add_filterc                 C   ó   |   ddt|ƒ¡ d S )NÚ
clicktrackÚenable©r½   r´   )r   Útrack_clicksr!   r!   r"   Úset_track_clicks  s   z SendGridPayload.set_track_clicksc                 C   r¾   )NÚ	opentrackrÀ   rÁ   )r   Útrack_opensr!   r!   r"   Úset_track_opens  s   zSendGridPayload.set_track_opensc                 C   sT   |   ddd¡ |   dd|¡ | j dd¡sd| jd< | j dd¡s(d| jd< d S d S )	NÚ	templatesrÀ   r   Útemplate_idrŸ   r¦   r^   r£   )r½   rc   r;   )r   rÈ   r!   r!   r"   Úset_template_id  s   
ÿzSendGridPayload.set_template_idc                 C   ó
   || _ d S r#   )rL   )r   rL   r!   r!   r"   Úset_merge_data#  ó   
zSendGridPayload.set_merge_datac                 C   rÊ   r#   )rM   )r   rM   r!   r!   r"   Úset_merge_global_data'  rÌ   z%SendGridPayload.set_merge_global_datac                 C   s    |  d| j¡| _| j |¡ d S )Nr   )rN   r   rc   rg   )r   Úextrar!   r!   r"   Úset_esp_extra+  s   zSendGridPayload.set_esp_extra)rA   rB   rC   rD   r   rS   rl   ra   rb   rˆ   rŠ   r�   r‹   r—   rš   rž   r¢   r¥   r¯   r²   rµ   r¸   r½   rÃ   rÆ   rÉ   rË   rÍ   rÏ   rE   r!   r!   r   r"   r$   E   s6    )'	
r$   )rp   rƒ   Úrequests.structuresr   Ú
exceptionsr   r   r   r%   r   Úutilsr   r	   r
   Úbase_requestsr   r   r   r$   r!   r!   r!   r"   Ú<module>   s    8