diff --git a/app/main/dao/services_dao.py b/app/main/dao/services_dao.py new file mode 100644 index 000000000..53a9f64f6 --- /dev/null +++ b/app/main/dao/services_dao.py @@ -0,0 +1,38 @@ +from datetime import datetime + +from app import db +from app.models import Service + + +def insert_new_service(service_name, user): + service = Service(name=service_name, + created_at=datetime.now(), + limit=1000, + active=False, + restricted=True) + + add_service(service) + service.users.append(user) + db.session.commit() + return service.id + + +def get_service_by_id(id): + return Service.query.get(id) + + +def unrestrict_service(service_id): + service = get_service_by_id(service_id) + service.restricted = False + add_service(service) + + +def activate_service(service_id): + service = get_service_by_id(service_id) + service.active = True + add_service(service) + + +def add_service(service): + db.session.add(service) + db.session.commit() diff --git a/app/models.py b/app/models.py index cb99c26a0..ba4492874 100644 --- a/app/models.py +++ b/app/models.py @@ -78,6 +78,41 @@ class User(db.Model): return True +user_to_service = db.Table( + 'user_to_service', + db.Model.metadata, + db.Column('user_id', db.Integer, db.ForeignKey('users.id')), + db.Column('service_id', db.Integer, db.ForeignKey('services.id')) +) + + +class Service(db.Model): + __tablename__ = 'services' + + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(255), nullable=False) + + token_id = db.Column(db.BigInteger, index=True, unique=True) + created_at = db.Column(db.DateTime, index=False, unique=False, nullable=False) + active = db.Column(db.Boolean, index=False, unique=False, nullable=False) + limit = db.Column(db.BigInteger, index=False, unique=False, nullable=False) + users = db.relationship('User', secondary=user_to_service, backref=db.backref('user_to_service', lazy='dynamic')) + restricted = db.Column(db.Boolean, index=False, unique=False, nullable=False) + + def serialize(self): + serialized = { + 'id': self.id, + 'name': self.name, + 'createdAt': self.created_at.strftime(DATETIME_FORMAT), + 'active': self.active, + 'restricted': self.restricted, + 'limit': self.limit, + 'user': self.users.serialize() + } + + return filter_null_value_fields(serialized) + + def filter_null_value_fields(obj): return dict( filter(lambda x: x[1] is not None, obj.items()) diff --git a/migrations/versions/60_add_service.py b/migrations/versions/60_add_service.py new file mode 100644 index 000000000..8e366e504 --- /dev/null +++ b/migrations/versions/60_add_service.py @@ -0,0 +1,44 @@ +"""empty message + +Revision ID: 60_add_service +Revises: 50_alter_verify_code_type +Create Date: 2015-12-14 15:22:55.938819 + +""" + +# revision identifiers, used by Alembic. +revision = '60_add_service' +down_revision = '50_alter_verify_code_type' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.create_table('services', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=255), nullable=False), + sa.Column('token_id', sa.BigInteger(), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=False), + sa.Column('active', sa.Boolean(), nullable=False), + sa.Column('limit', sa.BigInteger(), nullable=False), + sa.Column('restricted', sa.Boolean(), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_services_token_id'), 'services', ['token_id'], unique=True) + op.create_table('user_to_service', + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('service_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['service_id'], ['services.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ) + ) + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_table('user_to_service') + op.drop_index(op.f('ix_services_token_id'), table_name='services') + op.drop_table('services') + ### end Alembic commands ### diff --git a/tests/app/main/dao/test_service_dao.py b/tests/app/main/dao/test_service_dao.py new file mode 100644 index 000000000..661cc0cad --- /dev/null +++ b/tests/app/main/dao/test_service_dao.py @@ -0,0 +1,39 @@ +from app.main.dao import services_dao +from tests.app.main import create_test_user + + +def test_can_insert_and_retrieve_new_service(notifications_admin, notifications_admin_db, notify_db_session): + user = create_test_user() + + id = services_dao.insert_new_service('testing service', user) + saved_service = services_dao.get_service_by_id(id) + assert id == saved_service.id + assert saved_service.users == [user] + assert saved_service.name == 'testing service' + + +def test_unrestrict_service_updates_the_service(notifications_admin, notifications_admin_db, notify_db_session): + user = create_test_user() + id = services_dao.insert_new_service('unrestricted service', user) + saved_service = services_dao.get_service_by_id(id) + assert saved_service.restricted is True + services_dao.unrestrict_service(id) + unrestricted_service = services_dao.get_service_by_id(id) + assert unrestricted_service.restricted is False + + +def test_activate_service_update_service(notifications_admin, notifications_admin_db, notify_db_session): + user = create_test_user() + id = services_dao.insert_new_service('activated service', user) + service = services_dao.get_service_by_id(id) + assert service.active is False + services_dao.activate_service(id) + activated_service = services_dao.get_service_by_id(id) + assert activated_service.active is True + + +def test_get_service_returns_none_if_service_does_not_exist(notifications_admin, + notifications_admin_db, + notify_db_session): + service = services_dao.get_service_by_id(1) + assert service is None