From 28ef9a185322ae683dcbeb6a3ae50d3099acd9ef Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Mon, 22 May 2017 10:58:41 +0100 Subject: [PATCH] Refactored service permissisons data model --- app/models.py | 39 +++++++++++-------- .../0085_update_incoming_to_inbound.py | 28 +++++++++++++ tests/app/dao/test_service_permissions_dao.py | 6 +-- 3 files changed, 54 insertions(+), 19 deletions(-) create mode 100644 migrations/versions/0085_update_incoming_to_inbound.py diff --git a/app/models.py b/app/models.py index 5fff42027..de42129f0 100644 --- a/app/models.py +++ b/app/models.py @@ -3,13 +3,14 @@ import uuid import datetime from flask import url_for, current_app +from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.dialects.postgresql import ( UUID, JSON ) from sqlalchemy import UniqueConstraint, and_ -from sqlalchemy.orm import foreign, remote +from sqlalchemy.orm import backref, foreign, remote from notifications_utils.recipients import ( validate_email_address, validate_phone_number, @@ -144,9 +145,9 @@ class DVLAOrganisation(db.Model): INTERNATIONAL_SMS_TYPE = 'international_sms' -INCOMING_SMS_TYPE = 'incoming_sms' +INBOUND_SMS_TYPE = 'inbound_sms' -SERVICE_PERMISSION_TYPES = [EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INCOMING_SMS_TYPE] +SERVICE_PERMISSION_TYPES = [EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INBOUND_SMS_TYPE] class ServicePermissionTypes(db.Model): @@ -155,18 +156,6 @@ class ServicePermissionTypes(db.Model): 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) - 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) - updated_at = db.Column(db.DateTime, nullable=True, onupdate=datetime.datetime.utcnow) - - class Service(db.Model, Versioned): __tablename__ = 'services' @@ -217,7 +206,8 @@ class Service(db.Model, Versioned): nullable=False, default=BRANDING_GOVUK ) - permissions = db.relationship('ServicePermission') + + association_proxy('permissions', 'service_permission_types') # This is only for backward compatibility and will be dropped when the columns are removed from the data model def set_permissions(self): @@ -226,6 +216,23 @@ class Service(db.Model, Versioned): self.can_send_international_sms = INTERNATIONAL_SMS_TYPE in [p.permission for p in self.permissions] +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) + service = db.relationship("Service", foreign_keys=[service_id]) + created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow, nullable=False) + + service_permission_types = db.relationship( + Service, backref=backref("permissions", cascade="all, delete-orphan")) + + def __repr__(self): + return '<{} has service permission: {}>'.format(self.service_id, self.permission) + + MOBILE_TYPE = 'mobile' EMAIL_TYPE = 'email' diff --git a/migrations/versions/0085_update_incoming_to_inbound.py b/migrations/versions/0085_update_incoming_to_inbound.py new file mode 100644 index 000000000..e5d15f064 --- /dev/null +++ b/migrations/versions/0085_update_incoming_to_inbound.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 0085_update_incoming_to_inbound +Revises: 0084_add_job_stats +Create Date: 2017-05-22 10:23:43.939050 + +""" + +# revision identifiers, used by Alembic. +revision = '0085_update_incoming_to_inbound' +down_revision = '0084_add_job_stats' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('service_permissions', 'updated_at') + op.execute("UPDATE service_permission_types SET name='inbound_sms' WHERE name='incoming_sms'") + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('service_permissions', sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True)) + op.execute("UPDATE service_permission_types SET name='incoming_sms' WHERE name='inbound_sms'") + # ### end Alembic commands ### diff --git a/tests/app/dao/test_service_permissions_dao.py b/tests/app/dao/test_service_permissions_dao.py index c41c891f4..50b5559f8 100644 --- a/tests/app/dao/test_service_permissions_dao.py +++ b/tests/app/dao/test_service_permissions_dao.py @@ -1,7 +1,7 @@ import pytest from app.dao.service_permissions_dao import dao_fetch_service_permissions, dao_remove_service_permission -from app.models import EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INCOMING_SMS_TYPE +from app.models import EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INBOUND_SMS_TYPE from tests.app.db import create_service_permission, create_service @@ -34,11 +34,11 @@ def test_fetch_service_permissions_gets_service_permissions(service_without_perm def test_remove_service_permission(service_without_permissions): create_service_permission(service_id=service_without_permissions.id, permission=EMAIL_TYPE) - create_service_permission(service_id=service_without_permissions.id, permission=INCOMING_SMS_TYPE) + create_service_permission(service_id=service_without_permissions.id, permission=INBOUND_SMS_TYPE) dao_remove_service_permission(service_without_permissions.id, EMAIL_TYPE) permissions = dao_fetch_service_permissions(service_without_permissions.id) assert len(permissions) == 1 - assert permissions[0].permission == INCOMING_SMS_TYPE + assert permissions[0].permission == INBOUND_SMS_TYPE assert permissions[0].service_id == service_without_permissions.id