From 359c4d2138c4634f24c64441a865a81a6ed36314 Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Mon, 15 May 2017 12:49:46 +0100 Subject: [PATCH 1/2] add service permissions model + migration script --- app/models.py | 48 ++++++++++++----- .../0083_add_perm_types_and_svc_perm.py | 53 +++++++++++++++++++ 2 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 migrations/versions/0083_add_perm_types_and_svc_perm.py diff --git a/app/models.py b/app/models.py index 1b07a6fc5..aec86d388 100644 --- a/app/models.py +++ b/app/models.py @@ -31,6 +31,18 @@ from app import ( from app.history_meta import Versioned from app.utils import get_utc_time_in_bst +SMS_TYPE = 'sms' +EMAIL_TYPE = 'email' +LETTER_TYPE = 'letter' + +TEMPLATE_TYPES = [SMS_TYPE, EMAIL_TYPE, LETTER_TYPE] + +template_types = db.Enum(*TEMPLATE_TYPES, name='template_type') + +NORMAL = 'normal' +PRIORITY = 'priority' +TEMPLATE_PROCESS_TYPE = [NORMAL, PRIORITY] + def filter_null_value_fields(obj): return dict( @@ -183,6 +195,29 @@ class Service(db.Model, Versioned): ) +INTERNATIONAL_SMS_TYPE = 'international_sms' +INCOMING_SMS_TYPE = 'incoming_sms' + +SERVICE_PERMISSION_TYPES = [EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INCOMING_SMS_TYPE] + + +class ServicePermissionTypes(db.Model): + __tablename__ = 'service_permission_types' + + name = db.Column(db.String(255), primary_key=True) + + +class ServicePermission(db.Model): + __tablename__ = "service_permissions" + + service_id = db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), + primary_key=True, index=True, nullable=False) + permission = db.Column(db.String(255), db.ForeignKey('service_permission_types.name'), + index=True, primary_key=True, nullable=False) + created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow, nullable=False) + updated_at = db.Column(db.DateTime, nullable=True, onupdate=datetime.datetime.utcnow) + + MOBILE_TYPE = 'mobile' EMAIL_TYPE = 'email' @@ -293,19 +328,6 @@ class TemplateProcessTypes(db.Model): name = db.Column(db.String(255), primary_key=True) -SMS_TYPE = 'sms' -EMAIL_TYPE = 'email' -LETTER_TYPE = 'letter' - -TEMPLATE_TYPES = [SMS_TYPE, EMAIL_TYPE, LETTER_TYPE] - -template_types = db.Enum(*TEMPLATE_TYPES, name='template_type') - -NORMAL = 'normal' -PRIORITY = 'priority' -TEMPLATE_PROCESS_TYPE = [NORMAL, PRIORITY] - - class Template(db.Model): __tablename__ = 'templates' diff --git a/migrations/versions/0083_add_perm_types_and_svc_perm.py b/migrations/versions/0083_add_perm_types_and_svc_perm.py new file mode 100644 index 000000000..485ddef5d --- /dev/null +++ b/migrations/versions/0083_add_perm_types_and_svc_perm.py @@ -0,0 +1,53 @@ +"""empty message + +Revision ID: 0083_add_perm_types_and_svc_perm +Revises: 0082_add_go_live_template +Create Date: 2017-05-12 11:29:32.664811 + +""" + +# revision identifiers, used by Alembic. +revision = '0083_add_perm_types_and_svc_perm' +down_revision = '0082_add_go_live_template' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + service_permission_types = op.create_table('service_permission_types', + sa.Column('name', sa.String(length=255), nullable=False), + sa.PrimaryKeyConstraint('name')) + + op.bulk_insert(service_permission_types, + [ + {'name': x} for x in { + 'letter', + 'email', + 'sms', + 'international_sms', + 'incoming_sms' + } + ]) + + op.create_table('service_permissions', + sa.Column('service_id', postgresql.UUID(as_uuid=True), nullable=False), + sa.Column('permission', sa.String(length=255), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=False), + sa.Column('updated_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['permission'], ['service_permission_types.name'], ), + sa.ForeignKeyConstraint(['service_id'], ['services.id'], ), + sa.PrimaryKeyConstraint('service_id', 'permission')) + op.create_index(op.f('ix_service_permissions_permission'), 'service_permissions', ['permission'], unique=False) + op.create_index(op.f('ix_service_permissions_service_id'), 'service_permissions', ['service_id'], unique=False) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_service_permissions_service_id'), table_name='service_permissions') + op.drop_index(op.f('ix_service_permissions_permission'), table_name='service_permissions') + op.drop_table('service_permissions') + op.drop_table('service_permission_types') + # ### end Alembic commands ### From 380bc22f22378c84c1d5336a8de3f58b5b3db0f7 Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Mon, 15 May 2017 13:44:52 +0100 Subject: [PATCH 2/2] Add relationship for service in ServicePermission --- app/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models.py b/app/models.py index aec86d388..ecbc37f28 100644 --- a/app/models.py +++ b/app/models.py @@ -212,6 +212,7 @@ class ServicePermission(db.Model): service_id = db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), primary_key=True, index=True, nullable=False) + service = db.relationship('Service') permission = db.Column(db.String(255), db.ForeignKey('service_permission_types.name'), index=True, primary_key=True, nullable=False) created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow, nullable=False)