From 28f01bd776c6e834031de4e94f52e4ba510be7d9 Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Mon, 26 Oct 2020 17:39:11 +0000 Subject: [PATCH] Use utils template to format broadcast content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Brings in: - [x] https://github.com/alphagov/notifications-utils/pull/801 Formats the content of the template at the time of creating the event. This means that any downstream code (eg Celery tasks) can assume the content is already formatted correctly. Also, these downstream tasks don’t know which template the broadcast was created from, so if we support personalisation in the future this is the most sensible place to bring together the template and the personalisation. --- I had to re-create some of the deleted code from utils for stuff like formatting the timestamp to the CAP standard. --- app/broadcast_message/rest.py | 9 ++++++--- app/models.py | 26 +++++++++++++++++++++++++- requirements-app.txt | 2 +- requirements.txt | 11 +++++------ 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/app/broadcast_message/rest.py b/app/broadcast_message/rest.py index b034b08b3..3f2df6c64 100644 --- a/app/broadcast_message/rest.py +++ b/app/broadcast_message/rest.py @@ -185,13 +185,16 @@ def _create_broadcast_event(broadcast_message): else: transmitted_finishes_at = broadcast_message.finishes_at - # TODO: This doesn't support placeholders yet. We shouldn't use BroadcastMessageTemplate when we add placeholders - # as that just outputs XML, we need the raw text. + template = broadcast_message.template._as_utils_template_with_personalisation( + # Broadcast events don’t support personalisation yet + values={} + ) + event = BroadcastEvent( service=broadcast_message.service, broadcast_message=broadcast_message, message_type=msg_types[broadcast_message.status], - transmitted_content={"body": broadcast_message.template.content}, + transmitted_content={"body": str(template)}, transmitted_areas=broadcast_message.areas, # TODO: Probably move this somewhere more standalone too and imply that it shouldn't change. Should it include # a service based identifier too? eg "flood-warnings@notifications.service.gov.uk" or similar diff --git a/app/models.py b/app/models.py index cbe9a4e14..af5d54ace 100644 --- a/app/models.py +++ b/app/models.py @@ -2342,7 +2342,31 @@ class BroadcastEvent(db.Model): @property def reference(self): - return BroadcastMessageTemplate.from_event(self.serialize()).reference + notify_email_domain = current_app.config['NOTIFY_EMAIL_DOMAIN'] + return ( + f'https://www.{notify_email_domain}/,' + f'{self.id},' + f'{self.sent_at_as_cap_datetime_string}' + ) + + @property + def sent_at_as_cap_datetime_string(self): + return self.formatted_datetime_for('sent_at') + + def formatted_datetime_for(self, property_name): + return self.convert_naive_utc_datetime_to_cap_standard_string( + getattr(self, property_name) + ) + + @staticmethod + def convert_naive_utc_datetime_to_cap_standard_string(dt): + """ + As defined in section 3.3.2 of + http://docs.oasis-open.org/emergency/cap/v1.2/CAP-v1.2-os.html + They define the standard "YYYY-MM-DDThh:mm:ssXzh:zm", where X is + `+` if the timezone is > UTC, otherwise `-` + """ + return f"{dt.strftime('%Y-%m-%dT%H:%M:%S')}-00:00" def get_earlier_message_references(self): from app.dao.broadcast_message_dao import get_earlier_events_for_broadcast_event diff --git a/requirements-app.txt b/requirements-app.txt index 53296e63d..ded61f2c9 100644 --- a/requirements-app.txt +++ b/requirements-app.txt @@ -29,7 +29,7 @@ notifications-python-client==5.7.0 # PaaS awscli-cwlogs>=1.4,<1.5 -git+https://github.com/alphagov/notifications-utils.git@42.2.1#egg=notifications-utils==42.2.1 +git+https://github.com/alphagov/notifications-utils.git@43.0.0#egg=notifications-utils==43.0.0 # gds-metrics requires prometheseus 0.2.0, override that requirement as 0.7.1 brings significant performance gains prometheus-client==0.8.0 diff --git a/requirements.txt b/requirements.txt index 1ed979fee..cae9c641a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,7 +31,7 @@ notifications-python-client==5.7.0 # PaaS awscli-cwlogs>=1.4,<1.5 -git+https://github.com/alphagov/notifications-utils.git@42.2.1#egg=notifications-utils==42.2.1 +git+https://github.com/alphagov/notifications-utils.git@43.0.0#egg=notifications-utils==43.0.0 # gds-metrics requires prometheseus 0.2.0, override that requirement as 0.7.1 brings significant performance gains prometheus-client==0.8.0 @@ -42,14 +42,14 @@ alembic==1.4.3 amqp==1.4.9 anyjson==0.3.3 attrs==20.2.0 -awscli==1.18.148 +awscli==1.18.164 bcrypt==3.2.0 billiard==3.3.0.23 bleach==3.1.4 blinker==1.4 boto==2.49.0 boto3==1.10.38 -botocore==1.18.7 +botocore==1.19.4 certifi==2020.6.20 chardet==3.0.4 click==7.1.2 @@ -66,7 +66,6 @@ importlib-metadata==2.0.0 Jinja2==2.11.2 jmespath==0.10.0 kombu==3.0.37 -lxml==4.5.1 Mako==1.1.3 MarkupSafe==1.1.1 mistune==0.8.4 @@ -89,7 +88,7 @@ s3transfer==0.3.3 six==1.15.0 smartypants==2.0.1 statsd==3.3.0 -urllib3==1.25.10 +urllib3==1.25.11 webencodings==0.5.1 Werkzeug==1.0.1 -zipp==3.2.0 +zipp==3.4.0