From c743e52fe8f472fa05bdff49f41e4701f4028520 Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Tue, 4 Jul 2017 17:02:28 +0100 Subject: [PATCH] Add organisations model and create dao --- ...ganisation_dao.py => organisations_dao.py} | 7 +++++ app/models.py | 13 +++++++++ app/organisation/rest.py | 27 ++++++++++++++++--- tests/app/dao/test_organisations_dao.py | 14 ++++++++++ tests/app/db.py | 14 ++++++++++ 5 files changed, 72 insertions(+), 3 deletions(-) rename app/dao/{organisation_dao.py => organisations_dao.py} (56%) create mode 100644 tests/app/dao/test_organisations_dao.py diff --git a/app/dao/organisation_dao.py b/app/dao/organisations_dao.py similarity index 56% rename from app/dao/organisation_dao.py rename to app/dao/organisations_dao.py index 804fd8a1d..b9046816f 100644 --- a/app/dao/organisation_dao.py +++ b/app/dao/organisations_dao.py @@ -1,3 +1,5 @@ +from app import db +from app.dao.dao_utils import transactional from app.models import Organisation @@ -7,3 +9,8 @@ def dao_get_organisations(): def dao_get_organisation_by_id(org_id): return Organisation.query.filter_by(id=org_id).one() + + +@transactional +def dao_create_organisation(organisation): + db.session.add(organisation) diff --git a/app/models.py b/app/models.py index 8fda806b8..f1eb075f5 100644 --- a/app/models.py +++ b/app/models.py @@ -137,6 +137,19 @@ class Organisation(db.Model): logo = db.Column(db.String(255), nullable=True) name = db.Column(db.String(255), nullable=True) + @classmethod + def from_json(cls, data): + """ + Assumption: data has been validated appropriately. + + Returns a Service object based on the provided data. Deserialises created_by to created_by_id as marshmallow + would. + """ + # validate json with marshmallow + fields = data.copy() + + return cls(**fields) + DVLA_ORG_HM_GOVERNMENT = '001' DVLA_ORG_LAND_REGISTRY = '500' diff --git a/app/organisation/rest.py b/app/organisation/rest.py index 1bdfbff74..22b0d3968 100644 --- a/app/organisation/rest.py +++ b/app/organisation/rest.py @@ -1,8 +1,12 @@ -from flask import Blueprint, jsonify +from flask import Blueprint, jsonify, request -from app.dao.organisation_dao import dao_get_organisations, dao_get_organisation_by_id +from app.dao.organisations_dao import dao_get_organisations, dao_get_organisation_by_id, dao_create_organisation from app.schemas import organisation_schema -from app.errors import register_errors +from app.errors import ( + InvalidRequest, + register_errors +) +from app.models import Organisation organisation_blueprint = Blueprint('organisation', __name__) register_errors(organisation_blueprint) @@ -18,3 +22,20 @@ def get_organisations(): def get_organisation_by_id(org_id): data = organisation_schema.dump(dao_get_organisation_by_id(org_id)).data return jsonify(organisation=data) + + +@organisation_blueprint.route('', methods=['POST']) +def post_organisation(): + data = request.get_json() + if not data.get('name', None): + errors = {'name': ['Missing data for required field.']} + raise InvalidRequest(errors, status_code=400) + + # validate json with marshmallow + organisation_schema.load(request.get_json()) + + # unpack valid json into service object + valid_organisation = Organisation.from_json(data) + + dao_create_organisation(valid_organisation) + return jsonify(data=organisation_schema.dump(valid_organisation).data), 201 diff --git a/tests/app/dao/test_organisations_dao.py b/tests/app/dao/test_organisations_dao.py new file mode 100644 index 000000000..5192653c5 --- /dev/null +++ b/tests/app/dao/test_organisations_dao.py @@ -0,0 +1,14 @@ +import pytest + +from app.dao.organisations_dao import dao_create_organisation +from app.models import Organisation + +from tests.app.db import create_organisation + + +def test_create_organisation(notify_db, notify_db_session): + organisation = create_organisation() + + assert Organisation.query.count() == 1 + organisation_from_db = Organisation.query.first() + assert organisation == organisation_from_db diff --git a/tests/app/db.py b/tests/app/db.py index c212a6612..286ba943c 100644 --- a/tests/app/db.py +++ b/tests/app/db.py @@ -13,6 +13,7 @@ from app.models import ( ServicePermission, Job, InboundSms, + Organisation, EMAIL_TYPE, SMS_TYPE, KEY_TYPE_NORMAL, @@ -23,6 +24,7 @@ from app.dao.templates_dao import dao_create_template from app.dao.services_dao import dao_create_service from app.dao.service_permissions_dao import dao_add_service_permission from app.dao.inbound_sms_dao import dao_create_inbound_sms +from app.dao.organisations_dao import dao_create_organisation def create_user(mobile_number="+447700900986", email="notify@digital.cabinet-office.gov.uk", state='active'): @@ -225,3 +227,15 @@ def create_service_inbound_api( ) save_service_inbound_api(service_inbound_api) return service_inbound_api + + +def create_organisation(colour='blue', logo='test_x2.png', name='test_logo'): + data = { + 'colour': colour, + 'logo': logo, + 'name': name + } + organisation = Organisation(**data) + dao_create_organisation(organisation) + + return organisation