mirror of
https://github.com/GSA/notifications-api.git
synced 2026-02-03 18:01:08 -05:00
Refactored service permissisons data model
This commit is contained in:
@@ -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'
|
||||
|
||||
|
||||
28
migrations/versions/0085_update_incoming_to_inbound.py
Normal file
28
migrations/versions/0085_update_incoming_to_inbound.py
Normal file
@@ -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 ###
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user