diff --git a/app/celery/provider_tasks.py b/app/celery/provider_tasks.py index c232d5f1c..e62c9f7ec 100644 --- a/app/celery/provider_tasks.py +++ b/app/celery/provider_tasks.py @@ -23,6 +23,8 @@ from notifications_utils.template import ( unlink_govuk_escaped ) +from app.models import SMS_TYPE + def retry_iteration_to_delay(retry=0): """ @@ -75,7 +77,7 @@ def send_sms_to_provider(self, service_id, notification_id, encrypted_notificati update_provider_stats( notification_id, - 'sms', + SMS_TYPE, provider.get_name(), content_char_count=template.replaced_content_count ) diff --git a/app/celery/research_mode_tasks.py b/app/celery/research_mode_tasks.py index 0b0a5d4e4..72658d7f6 100644 --- a/app/celery/research_mode_tasks.py +++ b/app/celery/research_mode_tasks.py @@ -4,6 +4,8 @@ from flask import current_app from app import notify_celery from requests import request, RequestException, HTTPError +from app.models import SMS_TYPE + temp_fail = "07833333333" perm_fail = "07822222222" delivered = "07811111111" @@ -21,7 +23,7 @@ def send_sms_response(provider, reference, to): else: headers = {"Content-type": "application/x-www-form-urlencoded"} body = firetext_callback(reference, to) - make_request('sms', provider, body, headers) + make_request(SMS_TYPE, provider, body, headers) @notify_celery.task(name="send-ses-response") diff --git a/app/celery/tasks.py b/app/celery/tasks.py index 462770e91..85bff2376 100644 --- a/app/celery/tasks.py +++ b/app/celery/tasks.py @@ -37,8 +37,8 @@ from app.dao.services_dao import dao_fetch_service_by_id from app.dao.templates_dao import dao_get_template_by_id from app.models import ( Notification, - TEMPLATE_TYPE_EMAIL, - TEMPLATE_TYPE_SMS + EMAIL_TYPE, + SMS_TYPE ) @@ -94,7 +94,7 @@ def process_job(job_id): } }) - if template.template_type == 'sms': + if template.template_type == SMS_TYPE: send_sms.apply_async(( str(job.service_id), create_uuid(), @@ -103,7 +103,7 @@ def process_job(job_id): queue='bulk-sms' ) - if template.template_type == 'email': + if template.template_type == EMAIL_TYPE: send_email.apply_async(( str(job.service_id), create_uuid(), @@ -158,9 +158,9 @@ def send_sms(self, service_id, notification_id, encrypted_notification, created_ status='created', created_at=datetime.strptime(created_at, DATETIME_FORMAT), personalisation=notification.get('personalisation'), - notification_type='sms' + notification_type=SMS_TYPE ) - dao_create_notification(notification_db_object, TEMPLATE_TYPE_SMS) + dao_create_notification(notification_db_object, SMS_TYPE) send_sms_to_provider.apply_async((service_id, notification_id), queue='sms') @@ -207,7 +207,7 @@ def send_email(service_id, notification_id, encrypted_notification, created_at, notification_type='email' ) - dao_create_notification(notification_db_object, TEMPLATE_TYPE_EMAIL) + dao_create_notification(notification_db_object, EMAIL_TYPE) statsd_client.timing_with_dates( "notifications.tasks.send-email.queued-for", sent_at, diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index cc3cee647..14ee87b4d 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -18,8 +18,8 @@ from app.models import ( Job, NotificationStatistics, TemplateStatistics, - TEMPLATE_TYPE_SMS, - TEMPLATE_TYPE_EMAIL, + SMS_TYPE, + EMAIL_TYPE, Template, ProviderStatistics, ProviderDetails) @@ -166,8 +166,8 @@ def dao_create_notification(notification, notification_type): stats = NotificationStatistics( day=notification.created_at.date(), service_id=notification.service_id, - sms_requested=1 if notification_type == TEMPLATE_TYPE_SMS else 0, - emails_requested=1 if notification_type == TEMPLATE_TYPE_EMAIL else 0 + sms_requested=1 if notification_type == SMS_TYPE else 0, + emails_requested=1 if notification_type == EMAIL_TYPE else 0 ) db.session.add(stats) @@ -187,12 +187,12 @@ def dao_create_notification(notification, notification_type): def _update_notification_stats_query(notification_type, status): mapping = { - TEMPLATE_TYPE_SMS: { + SMS_TYPE: { STATISTICS_REQUESTED: NotificationStatistics.sms_requested, STATISTICS_DELIVERED: NotificationStatistics.sms_delivered, STATISTICS_FAILURE: NotificationStatistics.sms_failed }, - TEMPLATE_TYPE_EMAIL: { + EMAIL_TYPE: { STATISTICS_REQUESTED: NotificationStatistics.emails_requested, STATISTICS_DELIVERED: NotificationStatistics.emails_delivered, STATISTICS_FAILURE: NotificationStatistics.emails_failed @@ -294,7 +294,7 @@ def update_provider_stats( provider = ProviderDetails.query.filter_by(identifier=provider_name).one() def unit_count(): - if notification_type == TEMPLATE_TYPE_EMAIL: + if notification_type == EMAIL_TYPE: return 1 else: if (content_char_count): diff --git a/app/models.py b/app/models.py index 5941183ff..06681ec57 100644 --- a/app/models.py +++ b/app/models.py @@ -165,11 +165,13 @@ class NotificationStatistics(db.Model): ) -TEMPLATE_TYPE_SMS = 'sms' -TEMPLATE_TYPE_EMAIL = 'email' -TEMPLATE_TYPE_LETTER = 'letter' +SMS_TYPE = 'sms' +EMAIL_TYPE = 'email' +LETTER_TYPE = 'letter' -TEMPLATE_TYPES = [TEMPLATE_TYPE_SMS, TEMPLATE_TYPE_EMAIL, TEMPLATE_TYPE_LETTER] +TEMPLATE_TYPES = [SMS_TYPE, EMAIL_TYPE, LETTER_TYPE] + +template_types = db.Enum(*TEMPLATE_TYPES, name='template_type') class Template(db.Model, Versioned): @@ -177,7 +179,7 @@ class Template(db.Model, Versioned): id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name = db.Column(db.String(255), nullable=False) - template_type = db.Column(db.Enum(*TEMPLATE_TYPES, name='template_type'), nullable=False) + template_type = db.Column(template_types, nullable=False) created_at = db.Column( db.DateTime, index=False, @@ -207,7 +209,8 @@ SMS_PROVIDERS = [MMG_PROVIDER, FIRETEXT_PROVIDER] EMAIL_PROVIDERS = [SES_PROVIDER] PROVIDERS = SMS_PROVIDERS + EMAIL_PROVIDERS -NOTIFICATION_TYPE = ['email', 'sms', 'letter'] +NOTIFICATION_TYPE = [EMAIL_TYPE, SMS_TYPE, LETTER_TYPE] +notification_types = db.Enum(*NOTIFICATION_TYPE, name='notification_type') class ProviderStatistics(db.Model): @@ -241,7 +244,7 @@ class ProviderDetails(db.Model): display_name = db.Column(db.String, nullable=False) identifier = db.Column(db.String, nullable=False) priority = db.Column(db.Integer, nullable=False) - notification_type = db.Column(db.Enum(*NOTIFICATION_TYPE, name='notification_type'), nullable=False) + notification_type = db.Column(notification_types, nullable=False) active = db.Column(db.Boolean, default=False) @@ -345,7 +348,7 @@ class Notification(db.Model): api_key = db.relationship('ApiKey') key_type = db.Column(db.String, db.ForeignKey('key_types.name'), index=True, unique=False) content_char_count = db.Column(db.Integer, nullable=True) - notification_type = db.Column(db.String(), nullable=False) + notification_type = db.Column(notification_types, nullable=False) created_at = db.Column( db.DateTime, index=False, diff --git a/migrations/versions/0035_notification_type_.py b/migrations/versions/0035_notification_type_.py index b2d2efb37..70c363612 100644 --- a/migrations/versions/0035_notification_type_.py +++ b/migrations/versions/0035_notification_type_.py @@ -13,10 +13,11 @@ down_revision = '0034_pwd_changed_at_not_null' from alembic import op import sqlalchemy as sa - def upgrade(): - op.add_column('notifications', sa.Column('notification_type', sa.String(), nullable=True)) - op.execute('update notifications set notification_type = (select distinct(template_type) ' + notification_types = sa.Enum('email', 'sms', 'letter', name='notification_type') + + op.add_column('notifications', sa.Column('notification_type', notification_types, nullable=True)) + op.execute('update notifications set notification_type = (select CAST(CAST(template_type as text) as notification_type) ' 'from templates where templates.id = notifications.template_id)') op.alter_column('notifications', 'notification_type', nullable=False)