diff --git a/app/models.py b/app/models.py index d61f725cd..707d2a431 100644 --- a/app/models.py +++ b/app/models.py @@ -36,7 +36,12 @@ from app.hashing import ( check_hash ) from app import db, encryption -from app.utils import DATETIME_FORMAT, DATETIME_FORMAT_NO_TIMEZONE, get_dt_string_or_none +from app.utils import ( + DATETIME_FORMAT, + DATETIME_FORMAT_NO_TIMEZONE, + get_dt_string_or_none, + get_uuid_string_or_none, +) from app.history_meta import Versioned @@ -2245,7 +2250,7 @@ class BroadcastMessage(db.Model): cancelled_at = db.Column(db.DateTime, nullable=True) updated_at = db.Column(db.DateTime, nullable=True, onupdate=datetime.datetime.utcnow) - created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=False) + created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=True) approved_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=True) cancelled_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=True) @@ -2253,6 +2258,13 @@ class BroadcastMessage(db.Model): approved_by = db.relationship('User', foreign_keys=[approved_by_id]) cancelled_by = db.relationship('User', foreign_keys=[cancelled_by_id]) + api_key_id = db.Column(UUID(as_uuid=True), db.ForeignKey('api_keys.id'), nullable=True) + api_key = db.relationship('ApiKey') + + reference = db.Column(db.String(255), nullable=True) + + CheckConstraint("created_by_id is not null or api_key_id is not null") + @property def personalisation(self): if self._personalisation: @@ -2266,6 +2278,7 @@ class BroadcastMessage(db.Model): def serialize(self): return { 'id': str(self.id), + 'reference': self.reference, 'service_id': str(self.service_id), @@ -2288,9 +2301,9 @@ class BroadcastMessage(db.Model): 'cancelled_at': get_dt_string_or_none(self.cancelled_at), 'updated_at': get_dt_string_or_none(self.updated_at), - 'created_by_id': str(self.created_by_id), - 'approved_by_id': str(self.approved_by_id), - 'cancelled_by_id': str(self.cancelled_by_id), + 'created_by_id': get_uuid_string_or_none(self.created_by_id), + 'approved_by_id': get_uuid_string_or_none(self.approved_by_id), + 'cancelled_by_id': get_uuid_string_or_none(self.cancelled_by_id), } diff --git a/app/utils.py b/app/utils.py index df12e0ac1..a5a2d15f2 100644 --- a/app/utils.py +++ b/app/utils.py @@ -150,5 +150,9 @@ def get_dt_string_or_none(val): return val.strftime(DATETIME_FORMAT) if val else None +def get_uuid_string_or_none(val): + return str(val) if val else None + + def format_sequential_number(sequential_number): return format(sequential_number, "x").zfill(8) diff --git a/migrations/versions/0336_broadcast_msg_content_2.py b/migrations/versions/0336_broadcast_msg_content_2.py index 36905b4af..51f05b351 100644 --- a/migrations/versions/0336_broadcast_msg_content_2.py +++ b/migrations/versions/0336_broadcast_msg_content_2.py @@ -7,6 +7,7 @@ Create Date: 2020-12-04 15:06:22.544803 """ from alembic import op import sqlalchemy as sa +from notifications_utils.template import BroadcastMessageTemplate from sqlalchemy.dialects import postgresql from sqlalchemy.orm.session import Session @@ -17,18 +18,22 @@ down_revision = '0335_broadcast_msg_content' def upgrade(): - session = Session(bind=op.get_bind()) - broadcast_messages = session.query(BroadcastMessage).filter(BroadcastMessage.content == None) + conn = op.get_bind() - for broadcast_message in broadcast_messages: - broadcast_message.content = broadcast_message.template._as_utils_template_with_personalisation( - broadcast_message.personalisation - ).content_with_placeholders_filled_in - - session.commit() - - op.alter_column('broadcast_message', 'content', nullable=False) + results = conn.execute(sa.text(""" + UPDATE + broadcast_message + SET + content = templates_history.content + FROM + templates_history + WHERE + broadcast_message.content is NULL and + broadcast_message.template_id = templates_history.id and + broadcast_message.template_version = templates_history.version + ; + """)) def downgrade(): diff --git a/migrations/versions/0337_broadcast_msg_api.py b/migrations/versions/0337_broadcast_msg_api.py new file mode 100644 index 000000000..96287e2bc --- /dev/null +++ b/migrations/versions/0337_broadcast_msg_api.py @@ -0,0 +1,26 @@ +""" + +Revision ID: 0337_broadcast_msg_api +Revises: 0336_broadcast_msg_content_2 +Create Date: 2020-12-04 15:06:22.544803 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +revision = '0337_broadcast_msg_api' +down_revision = '0336_broadcast_msg_content_2' + + +def upgrade(): + op.alter_column('broadcast_message', 'created_by_id', nullable=True) + op.add_column('broadcast_message', sa.Column('api_key_id', postgresql.UUID(), nullable=True)) + op.create_foreign_key(None, 'broadcast_message', 'api_keys', ['api_key_id'], ['id']) + op.add_column('broadcast_message', sa.Column('reference', sa.String(length=255), nullable=True)) + + +def downgrade(): + op.alter_column('broadcast_message', 'created_by_id', nullable=False) + op.drop_column('broadcast_message', 'api_key_id') + op.add_column('broadcast_message', 'reference')