From 0955403a3bcf830c4ddf33eab04563a4cf3f99bd Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Thu, 13 Jun 2019 15:54:57 +0100 Subject: [PATCH] Slim down the /organisations response MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit At the moment this response returns a list of service IDs for hundreds of organisations. The admin app doesn’t use this information, but having to wait for it to be serialized and sent across the network slows it down all the same. --- app/models.py | 19 ++++++++++++++++--- app/organisation/rest.py | 2 +- tests/app/db.py | 7 +++++-- tests/app/organisation/test_rest.py | 12 +++++++----- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/app/models.py b/app/models.py index 320aa33de..a50a19868 100644 --- a/app/models.py +++ b/app/models.py @@ -376,6 +376,12 @@ class Organisation(db.Model): if service.active and not service.restricted ] + @property + def domain_list(self): + return [ + domain.domain for domain in self.domains + ] + def serialize(self): return { "id": str(self.id), @@ -391,13 +397,20 @@ class Organisation(db.Model): "agreement_signed_on_behalf_of_name": self.agreement_signed_on_behalf_of_name, "agreement_signed_on_behalf_of_email_address": self.agreement_signed_on_behalf_of_email_address, "agreement_signed_version": self.agreement_signed_version, - "domains": [ - domain.domain for domain in self.domains - ], + "domains": self.domain_list, "request_to_go_live_notes": self.request_to_go_live_notes, "count_of_live_services": len(self.live_services), } + def serialize_for_list(self): + return { + 'name': self.name, + 'id': str(self.id), + 'active': self.active, + 'count_of_live_services': len(self.live_services), + 'domains': self.domain_list, + } + class Service(db.Model, Versioned): __tablename__ = 'services' diff --git a/app/organisation/rest.py b/app/organisation/rest.py index fbfe09d22..6296e63dd 100644 --- a/app/organisation/rest.py +++ b/app/organisation/rest.py @@ -45,7 +45,7 @@ def handle_integrity_error(exc): @organisation_blueprint.route('', methods=['GET']) def get_organisations(): organisations = [ - org.serialize() for org in dao_get_organisations() + org.serialize_for_list() for org in dao_get_organisations() ] return jsonify(organisations) diff --git a/tests/app/db.py b/tests/app/db.py index bb388272b..418f963fa 100644 --- a/tests/app/db.py +++ b/tests/app/db.py @@ -620,15 +620,18 @@ def create_domain(domain, organisation_id): return domain -def create_organisation(name='test_org_1', active=True, organisation_type=None): +def create_organisation(name='test_org_1', active=True, organisation_type=None, domains=None): data = { 'name': name, 'active': active, - 'organisation_type': organisation_type + 'organisation_type': organisation_type, } organisation = Organisation(**data) dao_create_organisation(organisation) + for domain in domains or []: + create_domain(domain, organisation.id) + return organisation diff --git a/tests/app/organisation/test_rest.py b/tests/app/organisation/test_rest.py index d99670d7a..9d9a42b4c 100644 --- a/tests/app/organisation/test_rest.py +++ b/tests/app/organisation/test_rest.py @@ -16,7 +16,7 @@ from tests.app.db import ( def test_get_all_organisations(admin_request, notify_db_session): create_organisation(name='inactive org', active=False) - create_organisation(name='active org') + create_organisation(name='active org', domains=['example.com']) response = admin_request.get( 'organisation.get_organisations', @@ -27,9 +27,11 @@ def test_get_all_organisations(admin_request, notify_db_session): assert response[0]['name'] == 'active org' assert response[0]['active'] is True assert response[0]['count_of_live_services'] == 0 + assert response[0]['domains'] == ['example.com'] assert response[1]['name'] == 'inactive org' assert response[1]['active'] is False assert response[1]['count_of_live_services'] == 0 + assert response[1]['domains'] == [] def test_get_organisation_by_id(admin_request, notify_db_session): @@ -78,10 +80,10 @@ def test_get_organisation_by_id(admin_request, notify_db_session): def test_get_organisation_by_id_returns_domains(admin_request, notify_db_session): - org = create_organisation() - - create_domain('foo.gov.uk', org.id) - create_domain('bar.gov.uk', org.id) + org = create_organisation(domains=[ + 'foo.gov.uk', + 'bar.gov.uk', + ]) response = admin_request.get( 'organisation.get_organisation_by_id',