Enhancement Adding SES Functionalities CreateTemplate,GetTemplate,Lis… (#2987)
* Enhancement Adding SES Functionalities CreateTemplate,GetTemplate,ListTemplates * Linting Co-authored-by: usmankb <usman@krazybee.com> Co-authored-by: Bert Blommers <info@bertblommers.nl>
This commit is contained in:
parent
9bc393801f
commit
8d3d43da90
@ -25,3 +25,19 @@ class EventDestinationAlreadyExists(RESTError):
|
|||||||
super(EventDestinationAlreadyExists, self).__init__(
|
super(EventDestinationAlreadyExists, self).__init__(
|
||||||
"EventDestinationAlreadyExists", message
|
"EventDestinationAlreadyExists", message
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TemplateNameAlreadyExists(RESTError):
|
||||||
|
code = 400
|
||||||
|
|
||||||
|
def __init__(self, message):
|
||||||
|
super(TemplateNameAlreadyExists, self).__init__(
|
||||||
|
"TemplateNameAlreadyExists", message
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TemplateDoesNotExist(RESTError):
|
||||||
|
code = 400
|
||||||
|
|
||||||
|
def __init__(self, message):
|
||||||
|
super(TemplateDoesNotExist, self).__init__("TemplateDoesNotExist", message)
|
||||||
|
@ -10,6 +10,8 @@ from .exceptions import (
|
|||||||
MessageRejectedError,
|
MessageRejectedError,
|
||||||
ConfigurationSetDoesNotExist,
|
ConfigurationSetDoesNotExist,
|
||||||
EventDestinationAlreadyExists,
|
EventDestinationAlreadyExists,
|
||||||
|
TemplateNameAlreadyExists,
|
||||||
|
TemplateDoesNotExist,
|
||||||
)
|
)
|
||||||
from .utils import get_random_message_id
|
from .utils import get_random_message_id
|
||||||
from .feedback import COMMON_MAIL, BOUNCE, COMPLAINT, DELIVERY
|
from .feedback import COMMON_MAIL, BOUNCE, COMPLAINT, DELIVERY
|
||||||
@ -91,6 +93,7 @@ class SESBackend(BaseBackend):
|
|||||||
self.config_set = {}
|
self.config_set = {}
|
||||||
self.config_set_event_destination = {}
|
self.config_set_event_destination = {}
|
||||||
self.event_destinations = {}
|
self.event_destinations = {}
|
||||||
|
self.templates = {}
|
||||||
|
|
||||||
def _is_verified_address(self, source):
|
def _is_verified_address(self, source):
|
||||||
_, address = parseaddr(source)
|
_, address = parseaddr(source)
|
||||||
@ -277,5 +280,19 @@ class SESBackend(BaseBackend):
|
|||||||
statistics["Timestamp"] = datetime.datetime.utcnow()
|
statistics["Timestamp"] = datetime.datetime.utcnow()
|
||||||
return statistics
|
return statistics
|
||||||
|
|
||||||
|
def add_template(self, template_info):
|
||||||
|
template_name = template_info["template_name"]
|
||||||
|
if self.templates.get(template_name, None):
|
||||||
|
raise TemplateNameAlreadyExists("Duplicate Template Name.")
|
||||||
|
self.templates[template_name] = template_info
|
||||||
|
|
||||||
|
def get_template(self, template_name):
|
||||||
|
if not self.templates.get(template_name, None):
|
||||||
|
raise TemplateDoesNotExist("Invalid Template Name.")
|
||||||
|
return self.templates[template_name]
|
||||||
|
|
||||||
|
def list_templates(self):
|
||||||
|
return list(self.templates.values())
|
||||||
|
|
||||||
|
|
||||||
ses_backend = SESBackend()
|
ses_backend = SESBackend()
|
||||||
|
@ -5,6 +5,7 @@ import six
|
|||||||
|
|
||||||
from moto.core.responses import BaseResponse
|
from moto.core.responses import BaseResponse
|
||||||
from .models import ses_backend
|
from .models import ses_backend
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
class EmailResponse(BaseResponse):
|
class EmailResponse(BaseResponse):
|
||||||
@ -175,6 +176,29 @@ class EmailResponse(BaseResponse):
|
|||||||
template = self.response_template(CREATE_CONFIGURATION_SET_EVENT_DESTINATION)
|
template = self.response_template(CREATE_CONFIGURATION_SET_EVENT_DESTINATION)
|
||||||
return template.render()
|
return template.render()
|
||||||
|
|
||||||
|
def create_template(self):
|
||||||
|
template_data = self._get_dict_param("Template")
|
||||||
|
template_info = {}
|
||||||
|
template_info["text_part"] = template_data["._text_part"]
|
||||||
|
template_info["html_part"] = template_data["._html_part"]
|
||||||
|
template_info["template_name"] = template_data["._name"]
|
||||||
|
template_info["subject_part"] = template_data["._subject_part"]
|
||||||
|
template_info["Timestamp"] = datetime.utcnow()
|
||||||
|
ses_backend.add_template(template_info=template_info)
|
||||||
|
template = self.response_template(CREATE_TEMPLATE)
|
||||||
|
return template.render()
|
||||||
|
|
||||||
|
def get_template(self):
|
||||||
|
template_name = self._get_param("TemplateName")
|
||||||
|
template_data = ses_backend.get_template(template_name)
|
||||||
|
template = self.response_template(GET_TEMPLATE)
|
||||||
|
return template.render(template_data=template_data)
|
||||||
|
|
||||||
|
def list_templates(self):
|
||||||
|
email_templates = ses_backend.list_templates()
|
||||||
|
template = self.response_template(LIST_TEMPLATES)
|
||||||
|
return template.render(templates=email_templates)
|
||||||
|
|
||||||
|
|
||||||
VERIFY_EMAIL_IDENTITY = """<VerifyEmailIdentityResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
|
VERIFY_EMAIL_IDENTITY = """<VerifyEmailIdentityResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
|
||||||
<VerifyEmailIdentityResult/>
|
<VerifyEmailIdentityResult/>
|
||||||
@ -324,3 +348,40 @@ CREATE_CONFIGURATION_SET_EVENT_DESTINATION = """<CreateConfigurationSetEventDest
|
|||||||
<RequestId>67e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
|
<RequestId>67e0ef1a-9bf2-11e1-9279-0100e8cf109a</RequestId>
|
||||||
</ResponseMetadata>
|
</ResponseMetadata>
|
||||||
</CreateConfigurationSetEventDestinationResponse>"""
|
</CreateConfigurationSetEventDestinationResponse>"""
|
||||||
|
|
||||||
|
CREATE_TEMPLATE = """<CreateTemplateResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
|
||||||
|
<CreateTemplateResult/>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf12ba</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</CreateTemplateResponse>"""
|
||||||
|
|
||||||
|
GET_TEMPLATE = """<GetTemplateResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
|
||||||
|
<GetTemplateResult>
|
||||||
|
<Template>
|
||||||
|
<TemplateName>{{ template_data["template_name"] }}</TemplateName>
|
||||||
|
<SubjectPart>{{ template_data["subject_part"] }}</SubjectPart>
|
||||||
|
<HtmlPart>{{ template_data["html_part"] }}</HtmlPart>
|
||||||
|
<TextPart>{{ template_data["text_part"] }}</TextPart>
|
||||||
|
</Template>
|
||||||
|
</GetTemplateResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf12ba</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</GetTemplateResponse>"""
|
||||||
|
|
||||||
|
LIST_TEMPLATES = """<ListTemplatesResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
|
||||||
|
<ListTemplatesResult>
|
||||||
|
<TemplatesMetadata>
|
||||||
|
{% for template in templates %}
|
||||||
|
<Item>
|
||||||
|
<Name>{{ template["template_name"] }}</Name>
|
||||||
|
<CreatedTimestamp>{{ template["Timestamp"] }}</CreatedTimestamp>
|
||||||
|
</Item>
|
||||||
|
{% endfor %}
|
||||||
|
</TemplatesMetadata>
|
||||||
|
</ListTemplatesResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>47e0ef1a-9bf2-11e1-9279-0100e8cf12ba</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</ListTemplatesResponse>"""
|
||||||
|
@ -277,3 +277,46 @@ def test_create_configuration_set():
|
|||||||
)
|
)
|
||||||
|
|
||||||
ex.exception.response["Error"]["Code"].should.equal("EventDestinationAlreadyExists")
|
ex.exception.response["Error"]["Code"].should.equal("EventDestinationAlreadyExists")
|
||||||
|
|
||||||
|
|
||||||
|
@mock_ses
|
||||||
|
def test_create_ses_template():
|
||||||
|
conn = boto3.client("ses", region_name="us-east-1")
|
||||||
|
|
||||||
|
conn.create_template(
|
||||||
|
Template={
|
||||||
|
"TemplateName": "MyTemplate",
|
||||||
|
"SubjectPart": "Greetings, {{name}}!",
|
||||||
|
"TextPart": "Dear {{name}},"
|
||||||
|
"\r\nYour favorite animal is {{favoriteanimal}}.",
|
||||||
|
"HtmlPart": "<h1>Hello {{name}},"
|
||||||
|
"</h1><p>Your favorite animal is {{favoriteanimal}}.</p>",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
with assert_raises(ClientError) as ex:
|
||||||
|
conn.create_template(
|
||||||
|
Template={
|
||||||
|
"TemplateName": "MyTemplate",
|
||||||
|
"SubjectPart": "Greetings, {{name}}!",
|
||||||
|
"TextPart": "Dear {{name}},"
|
||||||
|
"\r\nYour favorite animal is {{favoriteanimal}}.",
|
||||||
|
"HtmlPart": "<h1>Hello {{name}},"
|
||||||
|
"</h1><p>Your favorite animal is {{favoriteanimal}}.</p>",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
ex.exception.response["Error"]["Code"].should.equal("TemplateNameAlreadyExists")
|
||||||
|
|
||||||
|
# get a template which is already added
|
||||||
|
result = conn.get_template(TemplateName="MyTemplate")
|
||||||
|
result["Template"]["TemplateName"].should.equal("MyTemplate")
|
||||||
|
result["Template"]["SubjectPart"].should.equal("Greetings, {{name}}!")
|
||||||
|
|
||||||
|
# get a template which is not present
|
||||||
|
with assert_raises(ClientError) as ex:
|
||||||
|
conn.get_template(TemplateName="MyFakeTemplate")
|
||||||
|
|
||||||
|
ex.exception.response["Error"]["Code"].should.equal("TemplateDoesNotExist")
|
||||||
|
|
||||||
|
result = conn.list_templates()
|
||||||
|
result["TemplatesMetadata"][0]["Name"].should.equal("MyTemplate")
|
||||||
|
Loading…
Reference in New Issue
Block a user