From bc41b7e414c02dabe87c868a80253944ed271f13 Mon Sep 17 00:00:00 2001 From: Daniel Ball Date: Mon, 27 Sep 2021 17:31:03 +0100 Subject: [PATCH 01/16] Add Departments and DepartmentsSLA endpoints --- api/data_workspace/case_views.py | 10 +++++++++- api/data_workspace/urls.py | 2 ++ api/data_workspace/views.py | 9 ++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/api/data_workspace/case_views.py b/api/data_workspace/case_views.py index cba10bd4e..0e7a8225a 100644 --- a/api/data_workspace/case_views.py +++ b/api/data_workspace/case_views.py @@ -2,11 +2,12 @@ from rest_framework.pagination import LimitOffsetPagination from api.core.authentication import DataWorkspaceOnlyAuthentication -from api.cases.models import CaseAssignment, CaseAssignmentSla, CaseType, CaseQueue, EcjuQuery +from api.cases.models import CaseAssignment, CaseAssignmentSla, CaseType, CaseQueue, EcjuQuery, DepartmentSLA from api.cases.serializers import ( CaseAssignmentSlaSerializer, CaseTypeSerializer, CaseQueueSerializer, + CaseDepartmentSerializer, ) from api.data_workspace.serializers import ( EcjuQuerySerializer, @@ -42,6 +43,13 @@ class CaseQueueList(viewsets.ReadOnlyModelViewSet): queryset = CaseQueue.objects.all() +class CaseDepartmentList(viewsets.ReadOnlyModelViewSet): + authentication_classes = (DataWorkspaceOnlyAuthentication,) + serializer_class = CaseDepartmentSerializer + pagination_class = LimitOffsetPagination + queryset = DepartmentSLA.objects.all() + + class EcjuQueryList(viewsets.ReadOnlyModelViewSet): authentication_classes = (DataWorkspaceOnlyAuthentication,) serializer_class = EcjuQuerySerializer diff --git a/api/data_workspace/urls.py b/api/data_workspace/urls.py index 5335f7fb3..edc68fa3c 100644 --- a/api/data_workspace/urls.py +++ b/api/data_workspace/urls.py @@ -54,10 +54,12 @@ router_v1.register("parties", views.PartyListView, basename="dw-parties") router_v1.register("queues", views.QueueListView, basename="dw-queues") router_v1.register("teams", views.TeamListView, basename="dw-teams") +router_v1.register("departments", views.DepartmentListView, basename="dw-departments") router_v1.register("case-assignment", case_views.CaseAssignmentList, basename="dw-case-assignment") router_v1.register("case-assignment-slas", case_views.CaseAssignmentSlaList, basename="dw-case-assignment-sla") router_v1.register("case-types", case_views.CaseTypeList, basename="dw-case-type") router_v1.register("case-queues", case_views.CaseQueueList, basename="dw-case-queue") +router_v1.register("case-deparments-sla", case_views.CaseDepartmentList, basename="dw-case-deparments-sla") router_v1.register("ecju-queries", case_views.EcjuQueryList, basename="dw-ecju-query") router_v1.register( "external-data-denials", external_data_views.ExternalDataDenialView, basename="dw-external-data-denial" diff --git a/api/data_workspace/views.py b/api/data_workspace/views.py index 2de3acad8..b6d161f66 100644 --- a/api/data_workspace/views.py +++ b/api/data_workspace/views.py @@ -9,7 +9,7 @@ from api.queues.models import Queue from api.queues.serializers import QueueListSerializer from api.teams.models import Team -from api.teams.serializers import TeamReadOnlySerializer +from api.teams.serializers import TeamReadOnlySerializer, DepartmentSerializer class OrganisationListView(viewsets.ReadOnlyModelViewSet): @@ -38,3 +38,10 @@ class TeamListView(viewsets.ReadOnlyModelViewSet): serializer_class = TeamReadOnlySerializer pagination_class = LimitOffsetPagination queryset = Team.objects.all() + + +class DepartmentListView(viewsets.ReadOnlyModelViewSet): + authentication_classes = (DataWorkspaceOnlyAuthentication,) + serializer_class = DepartmentSerializer + pagination_class = LimitOffsetPagination + queryset = Team.objects.all() From c59f81a53f56334c4ecf8764b10b53d3934d1ae7 Mon Sep 17 00:00:00 2001 From: Mano Date: Mon, 27 Sep 2021 12:56:17 +0100 Subject: [PATCH 02/16] Add DepartmentFactory --- api/teams/tests/factories.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/api/teams/tests/factories.py b/api/teams/tests/factories.py index d7e24f609..6a09ce1c1 100644 --- a/api/teams/tests/factories.py +++ b/api/teams/tests/factories.py @@ -1,5 +1,5 @@ import factory -from api.teams.models import Team +from api.teams.models import Team, Department class TeamFactory(factory.django.DjangoModelFactory): @@ -7,3 +7,10 @@ class TeamFactory(factory.django.DjangoModelFactory): class Meta: model = Team + + +class DepartmentFactory(factory.django.DjangoModelFactory): + name = factory.Faker("word") + + class Meta: + model = Department From 2bb59b432ea38fafd8f1964a1119adadd53407b0 Mon Sep 17 00:00:00 2001 From: Daniel Ball Date: Tue, 28 Sep 2021 14:16:41 +0100 Subject: [PATCH 03/16] Add Serializers --- api/cases/serializers.py | 7 +++++++ api/teams/serializers.py | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/api/cases/serializers.py b/api/cases/serializers.py index 65c4a0654..715784af3 100644 --- a/api/cases/serializers.py +++ b/api/cases/serializers.py @@ -28,6 +28,7 @@ GoodCountryDecision, CaseType, CaseReviewDate, + DepartmentSLA, ) from api.compliance.models import ComplianceSiteCase, ComplianceVisitCase from api.compliance.serializers.ComplianceSiteCaseSerializers import ComplianceSiteViewSerializer @@ -93,6 +94,12 @@ class Meta: fields = "__all__" +class CaseDepartmentSerializer(serializers.ModelSerializer): + class Meta: + model = DepartmentSLA + fields = "__all__" + + class QueueCaseAssignmentUserSerializer(serializers.ModelSerializer): class Meta: model = GovUser diff --git a/api/teams/serializers.py b/api/teams/serializers.py index fbe1285c4..24c193c13 100644 --- a/api/teams/serializers.py +++ b/api/teams/serializers.py @@ -2,7 +2,7 @@ from rest_framework import serializers from rest_framework.validators import UniqueValidator -from api.teams.models import Team +from api.teams.models import Team, Department class TeamReadOnlySerializer(serializers.Serializer): @@ -48,3 +48,9 @@ def validate(self, attrs): raise serializers.ValidationError({"is_ogd": "Select yes if the team is an OGD"}) return validated_data + + +class DepartmentSerializer(serializers.ModelSerializer): + class Meta: + model = Department + fields = "__all__" From ff00cb2d66e28055644348b949360811ca829c21 Mon Sep 17 00:00:00 2001 From: Mano Date: Tue, 28 Sep 2021 14:50:28 +0100 Subject: [PATCH 04/16] Fix department view returning teams instead of deps --- api/data_workspace/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/data_workspace/views.py b/api/data_workspace/views.py index b6d161f66..d2e084dfa 100644 --- a/api/data_workspace/views.py +++ b/api/data_workspace/views.py @@ -8,7 +8,7 @@ from api.parties.serializers import PartyViewSerializer from api.queues.models import Queue from api.queues.serializers import QueueListSerializer -from api.teams.models import Team +from api.teams.models import Team, Department from api.teams.serializers import TeamReadOnlySerializer, DepartmentSerializer @@ -44,4 +44,4 @@ class DepartmentListView(viewsets.ReadOnlyModelViewSet): authentication_classes = (DataWorkspaceOnlyAuthentication,) serializer_class = DepartmentSerializer pagination_class = LimitOffsetPagination - queryset = Team.objects.all() + queryset = Department.objects.all() From 0eaa15406ea4f0aa38cece66bf1beaa1f60e99b6 Mon Sep 17 00:00:00 2001 From: Mano Date: Tue, 28 Sep 2021 14:51:45 +0100 Subject: [PATCH 05/16] Fix factory to add department to team automatically --- api/teams/tests/factories.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/api/teams/tests/factories.py b/api/teams/tests/factories.py index 6a09ce1c1..182ae4bb2 100644 --- a/api/teams/tests/factories.py +++ b/api/teams/tests/factories.py @@ -2,15 +2,21 @@ from api.teams.models import Team, Department -class TeamFactory(factory.django.DjangoModelFactory): - name = factory.Faker("word") +class DepartmentFactory(factory.django.DjangoModelFactory): + name = factory.Iterator(["HMRC", "MOD", "BEIS", "DIT", "NCSC"]) + # Commented out since probably we want to manually add this. + # team = factory.RelatedFactory( + # TeamFactory, + # factory_related_name='department', + # ) class Meta: - model = Team + model = Department -class DepartmentFactory(factory.django.DjangoModelFactory): +class TeamFactory(factory.django.DjangoModelFactory): name = factory.Faker("word") + department = factory.SubFactory(DepartmentFactory) class Meta: - model = Department + model = Team From caec40ae8fc04cdc9c890ab2b8970e57eafacd69 Mon Sep 17 00:00:00 2001 From: Mano Date: Tue, 28 Sep 2021 14:56:48 +0100 Subject: [PATCH 06/16] Add test for departments view --- api/data_workspace/tests/test_views.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/api/data_workspace/tests/test_views.py b/api/data_workspace/tests/test_views.py index b13de23a7..61857da74 100644 --- a/api/data_workspace/tests/test_views.py +++ b/api/data_workspace/tests/test_views.py @@ -3,6 +3,8 @@ from api.parties.enums import PartyType from test_helpers.clients import DataTestClient +from api.teams.tests.factories import TeamFactory +from api.teams.models import Department class DataWorkspaceTests(DataTestClient): @@ -103,3 +105,19 @@ def test_teams(self): self.assertEqual(response.status_code, status.HTTP_200_OK) options = response.json()["actions"]["OPTIONS"] self.assertEqual(tuple(options.keys()), expected_fields) + + def test_departments(self): + team = TeamFactory() + url = reverse("data_workspace:dw-departments-list") + response = self.client.get(url) + payload = response.json() + + # Ensure we get departments and not sth else + deps_ids = [d["id"] for d in payload["results"]] + assert str(team.department.id) in deps_ids + assert not str(team.id) in deps_ids + assert len(deps_ids) == Department.objects.count() + + # Ensure we get some expected fields + expected_fields = {"id", "name"} + assert set(payload["results"][0].keys()) == expected_fields From 4a621d2e707465eaac4613832a73b7557e005404 Mon Sep 17 00:00:00 2001 From: Mano Date: Wed, 29 Sep 2021 11:08:54 +0100 Subject: [PATCH 07/16] Fix URL for department SLA --- api/data_workspace/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/data_workspace/urls.py b/api/data_workspace/urls.py index edc68fa3c..5b84325ad 100644 --- a/api/data_workspace/urls.py +++ b/api/data_workspace/urls.py @@ -59,7 +59,7 @@ router_v1.register("case-assignment-slas", case_views.CaseAssignmentSlaList, basename="dw-case-assignment-sla") router_v1.register("case-types", case_views.CaseTypeList, basename="dw-case-type") router_v1.register("case-queues", case_views.CaseQueueList, basename="dw-case-queue") -router_v1.register("case-deparments-sla", case_views.CaseDepartmentList, basename="dw-case-deparments-sla") +router_v1.register("case-department-slas", case_views.CaseDepartmentList, basename="dw-case-department-sla") router_v1.register("ecju-queries", case_views.EcjuQueryList, basename="dw-ecju-query") router_v1.register( "external-data-denials", external_data_views.ExternalDataDenialView, basename="dw-external-data-denial" From 58f688ad1f06400d4727037e8a804188a6efe660 Mon Sep 17 00:00:00 2001 From: Mano Date: Wed, 29 Sep 2021 11:16:19 +0100 Subject: [PATCH 08/16] Rename DepartmentSLA -> DepartmentSla --- api/cases/models.py | 2 +- api/cases/serializers.py | 4 ++-- api/cases/tasks.py | 8 ++++---- api/cases/tests/test_sla.py | 4 ++-- api/data_workspace/case_views.py | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/api/cases/models.py b/api/cases/models.py index 4be108c39..b731c541c 100644 --- a/api/cases/models.py +++ b/api/cases/models.py @@ -249,7 +249,7 @@ class CaseAssignmentSla(models.Model): case = models.ForeignKey(Case, related_name="slas", on_delete=models.CASCADE) -class DepartmentSLA(models.Model): +class DepartmentSla(models.Model): sla_days = models.IntegerField() department = models.ForeignKey(Department, on_delete=models.CASCADE, related_name="department_slas") case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name="department_slas") diff --git a/api/cases/serializers.py b/api/cases/serializers.py index 715784af3..1e1b6bb08 100644 --- a/api/cases/serializers.py +++ b/api/cases/serializers.py @@ -28,7 +28,7 @@ GoodCountryDecision, CaseType, CaseReviewDate, - DepartmentSLA, + DepartmentSla, ) from api.compliance.models import ComplianceSiteCase, ComplianceVisitCase from api.compliance.serializers.ComplianceSiteCaseSerializers import ComplianceSiteViewSerializer @@ -96,7 +96,7 @@ class Meta: class CaseDepartmentSerializer(serializers.ModelSerializer): class Meta: - model = DepartmentSLA + model = DepartmentSla fields = "__all__" diff --git a/api/cases/tasks.py b/api/cases/tasks.py index 8f4684cd7..9ef05714a 100644 --- a/api/cases/tasks.py +++ b/api/cases/tasks.py @@ -10,7 +10,7 @@ from pytz import timezone as tz from api.cases.enums import CaseTypeSubTypeEnum -from api.cases.models import Case, CaseAssignmentSla, CaseQueue, DepartmentSLA +from api.cases.models import Case, CaseAssignmentSla, CaseQueue, DepartmentSla from api.cases.models import EcjuQuery from api.common.dates import is_weekend, is_bank_holiday from api.staticdata.statuses.enums import CaseStatusEnum @@ -117,11 +117,11 @@ def update_cases_sla(): department = assignment.queue.team.department if department is not None: try: - department_sla = DepartmentSLA.objects.get(department=department, case=assignment.case) + department_sla = DepartmentSla.objects.get(department=department, case=assignment.case) department_sla.sla_days += 1 department_sla.save() - except DepartmentSLA.DoesNotExist: - DepartmentSLA.objects.create(department=department, case=assignment.case, sla_days=1) + except DepartmentSla.DoesNotExist: + DepartmentSla.objects.create(department=department, case=assignment.case, sla_days=1) results = cases.select_for_update().update( sla_days=F("sla_days") + 1, sla_remaining_days=F("sla_remaining_days") - 1, sla_updated_at=date, diff --git a/api/cases/tests/test_sla.py b/api/cases/tests/test_sla.py index f1ab957ce..2337c6eeb 100644 --- a/api/cases/tests/test_sla.py +++ b/api/cases/tests/test_sla.py @@ -19,7 +19,7 @@ SLA_UPDATE_CUTOFF_TIME, HMRC_QUERY_TARGET_DAYS, ) -from api.cases.models import CaseAssignmentSla, CaseQueue, DepartmentSLA +from api.cases.models import CaseAssignmentSla, CaseQueue, DepartmentSla from api.staticdata.statuses.enums import CaseStatusEnum from api.staticdata.statuses.libraries.get_case_status import get_case_status_by_status from api.teams.models import Department @@ -598,5 +598,5 @@ def test_department_sla_updated( self.team.department = test_department self.team.save() update_cases_sla.now() - department_sla = DepartmentSLA.objects.get(department=test_department) + department_sla = DepartmentSla.objects.get(department=test_department) self.assertEqual(department_sla.sla_days, 1) diff --git a/api/data_workspace/case_views.py b/api/data_workspace/case_views.py index 0e7a8225a..9613beec0 100644 --- a/api/data_workspace/case_views.py +++ b/api/data_workspace/case_views.py @@ -2,7 +2,7 @@ from rest_framework.pagination import LimitOffsetPagination from api.core.authentication import DataWorkspaceOnlyAuthentication -from api.cases.models import CaseAssignment, CaseAssignmentSla, CaseType, CaseQueue, EcjuQuery, DepartmentSLA +from api.cases.models import CaseAssignment, CaseAssignmentSla, CaseType, CaseQueue, EcjuQuery, DepartmentSla from api.cases.serializers import ( CaseAssignmentSlaSerializer, CaseTypeSerializer, @@ -47,7 +47,7 @@ class CaseDepartmentList(viewsets.ReadOnlyModelViewSet): authentication_classes = (DataWorkspaceOnlyAuthentication,) serializer_class = CaseDepartmentSerializer pagination_class = LimitOffsetPagination - queryset = DepartmentSLA.objects.all() + queryset = DepartmentSla.objects.all() class EcjuQueryList(viewsets.ReadOnlyModelViewSet): From 37f0225b777dd50a37cc72ce41a98a24f33b98c2 Mon Sep 17 00:00:00 2001 From: Mano Date: Wed, 29 Sep 2021 11:34:59 +0100 Subject: [PATCH 09/16] Add docstring to SLA models --- api/cases/models.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api/cases/models.py b/api/cases/models.py index b731c541c..ec76c15fe 100644 --- a/api/cases/models.py +++ b/api/cases/models.py @@ -244,12 +244,18 @@ class Meta: class CaseAssignmentSla(models.Model): + """ + Keeps track of days passed since case assigned to a team + """ sla_days = models.IntegerField() queue = models.ForeignKey(Queue, related_name="slas", on_delete=models.CASCADE) case = models.ForeignKey(Case, related_name="slas", on_delete=models.CASCADE) class DepartmentSla(models.Model): + """ + Keeps track of days passed since application received in department + """ sla_days = models.IntegerField() department = models.ForeignKey(Department, on_delete=models.CASCADE, related_name="department_slas") case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name="department_slas") From d579be0c2151d6fb871a3860098a1ac5a89bb98e Mon Sep 17 00:00:00 2001 From: Mano Date: Wed, 29 Sep 2021 11:50:55 +0100 Subject: [PATCH 10/16] Add factory DepartmentSlaFactory --- api/cases/tests/factories.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/api/cases/tests/factories.py b/api/cases/tests/factories.py index 65adcf00d..723bf03fb 100644 --- a/api/cases/tests/factories.py +++ b/api/cases/tests/factories.py @@ -9,12 +9,13 @@ CaseType, EcjuQuery, GoodCountryDecision, + DepartmentSla, ) from api.queues.tests.factories import QueueFactory from api.organisations.tests.factories import OrganisationFactory from api.goodstype.tests.factories import GoodsTypeFactory from api.staticdata.countries.factories import CountryFactory -from api.teams.tests.factories import TeamFactory +from api.teams.tests.factories import TeamFactory, DepartmentFactory from api.users.tests.factories import GovUserFactory @@ -66,6 +67,15 @@ class Meta: model = Case +class DepartmentSlaFactory(factory.django.DjangoModelFactory): + sla_days = factory.Faker('pyint', min_value=0, max_value=30) + case = factory.SubFactory(CaseFactory) + department = factory.SubFactory(DepartmentFactory) + + class Meta: + model = DepartmentSla + + class CaseAssignmentFactory(factory.django.DjangoModelFactory): case = factory.SubFactory(CaseFactory) From 84ed7e8e9360808a55652879d4b0494f609822f3 Mon Sep 17 00:00:00 2001 From: Mano Date: Wed, 29 Sep 2021 11:51:37 +0100 Subject: [PATCH 11/16] Add test for DepartmentSla view --- api/data_workspace/tests/test_views.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/api/data_workspace/tests/test_views.py b/api/data_workspace/tests/test_views.py index 61857da74..993a0ea53 100644 --- a/api/data_workspace/tests/test_views.py +++ b/api/data_workspace/tests/test_views.py @@ -4,6 +4,7 @@ from api.parties.enums import PartyType from test_helpers.clients import DataTestClient from api.teams.tests.factories import TeamFactory +from api.cases.tests.factories import DepartmentSlaFactory from api.teams.models import Department @@ -121,3 +122,19 @@ def test_departments(self): # Ensure we get some expected fields expected_fields = {"id", "name"} assert set(payload["results"][0].keys()) == expected_fields + + def test_case_department_slas(self): + department_sla = DepartmentSlaFactory() + url = reverse("data_workspace:dw-case-department-sla-list") + response = self.client.get(url) + payload = response.json() + last_result = payload["results"][-1] + + # Ensure we get some expected fields + expected_fields = {"id", "sla_days", "department", "case"} + assert set(last_result.keys()) == expected_fields + + # Ensure values are correct + assert last_result["sla_days"] == department_sla.sla_days + assert last_result["case"] == str(department_sla.case.id) + assert last_result["department"] == str(department_sla.department.id) From cb54238e5df11ddc7406d5b2b0f2b6d6928f7825 Mon Sep 17 00:00:00 2001 From: Mano Date: Wed, 29 Sep 2021 11:59:17 +0100 Subject: [PATCH 12/16] Move DW serializers to data_workspace.serializers --- api/cases/serializers.py | 7 ------- api/data_workspace/case_views.py | 4 ++-- api/data_workspace/serializers.py | 15 ++++++++++++++- api/data_workspace/views.py | 3 ++- api/teams/serializers.py | 8 +------- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/api/cases/serializers.py b/api/cases/serializers.py index 1e1b6bb08..65c4a0654 100644 --- a/api/cases/serializers.py +++ b/api/cases/serializers.py @@ -28,7 +28,6 @@ GoodCountryDecision, CaseType, CaseReviewDate, - DepartmentSla, ) from api.compliance.models import ComplianceSiteCase, ComplianceVisitCase from api.compliance.serializers.ComplianceSiteCaseSerializers import ComplianceSiteViewSerializer @@ -94,12 +93,6 @@ class Meta: fields = "__all__" -class CaseDepartmentSerializer(serializers.ModelSerializer): - class Meta: - model = DepartmentSla - fields = "__all__" - - class QueueCaseAssignmentUserSerializer(serializers.ModelSerializer): class Meta: model = GovUser diff --git a/api/data_workspace/case_views.py b/api/data_workspace/case_views.py index 9613beec0..504e12480 100644 --- a/api/data_workspace/case_views.py +++ b/api/data_workspace/case_views.py @@ -7,11 +7,11 @@ CaseAssignmentSlaSerializer, CaseTypeSerializer, CaseQueueSerializer, - CaseDepartmentSerializer, ) from api.data_workspace.serializers import ( EcjuQuerySerializer, CaseAssignmentSerializer, + DepartmentSlaSerializer, ) @@ -45,7 +45,7 @@ class CaseQueueList(viewsets.ReadOnlyModelViewSet): class CaseDepartmentList(viewsets.ReadOnlyModelViewSet): authentication_classes = (DataWorkspaceOnlyAuthentication,) - serializer_class = CaseDepartmentSerializer + serializer_class = DepartmentSlaSerializer pagination_class = LimitOffsetPagination queryset = DepartmentSla.objects.all() diff --git a/api/data_workspace/serializers.py b/api/data_workspace/serializers.py index e6fe8a405..35a5f034c 100644 --- a/api/data_workspace/serializers.py +++ b/api/data_workspace/serializers.py @@ -1,5 +1,6 @@ from api.audit_trail.models import Audit -from api.cases.models import CaseAssignment, EcjuQuery +from api.teams.models import Department +from api.cases.models import CaseAssignment, EcjuQuery, DepartmentSla from api.queues.models import Queue from rest_framework import serializers @@ -19,6 +20,18 @@ class Meta: fields = "__all__" +class DepartmentSerializer(serializers.ModelSerializer): + class Meta: + model = Department + fields = "__all__" + + +class DepartmentSlaSerializer(serializers.ModelSerializer): + class Meta: + model = DepartmentSla + fields = "__all__" + + class AuditMoveCaseSerializer(serializers.ModelSerializer): """Serializer for serializing 'move case' audit events.""" diff --git a/api/data_workspace/views.py b/api/data_workspace/views.py index d2e084dfa..e66cb334f 100644 --- a/api/data_workspace/views.py +++ b/api/data_workspace/views.py @@ -9,7 +9,8 @@ from api.queues.models import Queue from api.queues.serializers import QueueListSerializer from api.teams.models import Team, Department -from api.teams.serializers import TeamReadOnlySerializer, DepartmentSerializer +from api.teams.serializers import TeamReadOnlySerializer +from api.data_workspace.serializers import DepartmentSerializer class OrganisationListView(viewsets.ReadOnlyModelViewSet): diff --git a/api/teams/serializers.py b/api/teams/serializers.py index 24c193c13..fbe1285c4 100644 --- a/api/teams/serializers.py +++ b/api/teams/serializers.py @@ -2,7 +2,7 @@ from rest_framework import serializers from rest_framework.validators import UniqueValidator -from api.teams.models import Team, Department +from api.teams.models import Team class TeamReadOnlySerializer(serializers.Serializer): @@ -48,9 +48,3 @@ def validate(self, attrs): raise serializers.ValidationError({"is_ogd": "Select yes if the team is an OGD"}) return validated_data - - -class DepartmentSerializer(serializers.ModelSerializer): - class Meta: - model = Department - fields = "__all__" From 061fceb5cc0fa7a0e9bff28e429d06558f4a58d4 Mon Sep 17 00:00:00 2001 From: Mano Date: Wed, 29 Sep 2021 12:52:06 +0100 Subject: [PATCH 13/16] Fix linter --- api/cases/models.py | 2 ++ api/cases/tests/factories.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/api/cases/models.py b/api/cases/models.py index ec76c15fe..7fd1fc1db 100644 --- a/api/cases/models.py +++ b/api/cases/models.py @@ -247,6 +247,7 @@ class CaseAssignmentSla(models.Model): """ Keeps track of days passed since case assigned to a team """ + sla_days = models.IntegerField() queue = models.ForeignKey(Queue, related_name="slas", on_delete=models.CASCADE) case = models.ForeignKey(Case, related_name="slas", on_delete=models.CASCADE) @@ -256,6 +257,7 @@ class DepartmentSla(models.Model): """ Keeps track of days passed since application received in department """ + sla_days = models.IntegerField() department = models.ForeignKey(Department, on_delete=models.CASCADE, related_name="department_slas") case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name="department_slas") diff --git a/api/cases/tests/factories.py b/api/cases/tests/factories.py index 723bf03fb..0715ed95b 100644 --- a/api/cases/tests/factories.py +++ b/api/cases/tests/factories.py @@ -68,7 +68,7 @@ class Meta: class DepartmentSlaFactory(factory.django.DjangoModelFactory): - sla_days = factory.Faker('pyint', min_value=0, max_value=30) + sla_days = factory.Faker("pyint", min_value=0, max_value=30) case = factory.SubFactory(CaseFactory) department = factory.SubFactory(DepartmentFactory) From 9d1600c87ed34141d4dac535640df7dc3bc0b150 Mon Sep 17 00:00:00 2001 From: Mano Date: Thu, 30 Sep 2021 08:58:58 +0100 Subject: [PATCH 14/16] Rename all models *Sla -> *SLA --- api/cases/models.py | 4 ++-- api/cases/serializers.py | 6 +++--- api/cases/tasks.py | 14 +++++++------- api/cases/tests/factories.py | 6 +++--- api/cases/tests/test_sla.py | 10 +++++----- api/data_workspace/case_views.py | 16 ++++++++-------- api/data_workspace/serializers.py | 6 +++--- api/data_workspace/tests/test_case_views.py | 4 ++-- api/data_workspace/tests/test_views.py | 4 ++-- api/data_workspace/urls.py | 2 +- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/api/cases/models.py b/api/cases/models.py index 7fd1fc1db..62cd6d50f 100644 --- a/api/cases/models.py +++ b/api/cases/models.py @@ -243,7 +243,7 @@ class Meta: db_table = "cases_case_queues" -class CaseAssignmentSla(models.Model): +class CaseAssignmentSLA(models.Model): """ Keeps track of days passed since case assigned to a team """ @@ -253,7 +253,7 @@ class CaseAssignmentSla(models.Model): case = models.ForeignKey(Case, related_name="slas", on_delete=models.CASCADE) -class DepartmentSla(models.Model): +class DepartmentSLA(models.Model): """ Keeps track of days passed since application received in department """ diff --git a/api/cases/serializers.py b/api/cases/serializers.py index 65c4a0654..de1958122 100644 --- a/api/cases/serializers.py +++ b/api/cases/serializers.py @@ -19,7 +19,7 @@ Case, CaseNote, CaseAssignment, - CaseAssignmentSla, + CaseAssignmentSLA, CaseDocument, CaseQueue, EcjuQuery, @@ -81,9 +81,9 @@ class Meta: ) -class CaseAssignmentSlaSerializer(serializers.ModelSerializer): +class CaseAssignmentSLASerializer(serializers.ModelSerializer): class Meta: - model = CaseAssignmentSla + model = CaseAssignmentSLA fields = "__all__" diff --git a/api/cases/tasks.py b/api/cases/tasks.py index 9ef05714a..cc68fca09 100644 --- a/api/cases/tasks.py +++ b/api/cases/tasks.py @@ -10,7 +10,7 @@ from pytz import timezone as tz from api.cases.enums import CaseTypeSubTypeEnum -from api.cases.models import Case, CaseAssignmentSla, CaseQueue, DepartmentSla +from api.cases.models import Case, CaseAssignmentSLA, CaseQueue, DepartmentSLA from api.cases.models import EcjuQuery from api.common.dates import is_weekend, is_bank_holiday from api.staticdata.statuses.enums import CaseStatusEnum @@ -108,20 +108,20 @@ def update_cases_sla(): for assignment in CaseQueue.objects.filter(case__in=cases): # Update team SLAs try: - assignment_sla = CaseAssignmentSla.objects.get(queue=assignment.queue, case=assignment.case) + assignment_sla = CaseAssignmentSLA.objects.get(queue=assignment.queue, case=assignment.case) assignment_sla.sla_days += 1 assignment_sla.save() - except CaseAssignmentSla.DoesNotExist: - CaseAssignmentSla.objects.create(queue=assignment.queue, case=assignment.case, sla_days=1) + except CaseAssignmentSLA.DoesNotExist: + CaseAssignmentSLA.objects.create(queue=assignment.queue, case=assignment.case, sla_days=1) # Update department SLAs department = assignment.queue.team.department if department is not None: try: - department_sla = DepartmentSla.objects.get(department=department, case=assignment.case) + department_sla = DepartmentSLA.objects.get(department=department, case=assignment.case) department_sla.sla_days += 1 department_sla.save() - except DepartmentSla.DoesNotExist: - DepartmentSla.objects.create(department=department, case=assignment.case, sla_days=1) + except DepartmentSLA.DoesNotExist: + DepartmentSLA.objects.create(department=department, case=assignment.case, sla_days=1) results = cases.select_for_update().update( sla_days=F("sla_days") + 1, sla_remaining_days=F("sla_remaining_days") - 1, sla_updated_at=date, diff --git a/api/cases/tests/factories.py b/api/cases/tests/factories.py index 0715ed95b..4618b7dee 100644 --- a/api/cases/tests/factories.py +++ b/api/cases/tests/factories.py @@ -9,7 +9,7 @@ CaseType, EcjuQuery, GoodCountryDecision, - DepartmentSla, + DepartmentSLA, ) from api.queues.tests.factories import QueueFactory from api.organisations.tests.factories import OrganisationFactory @@ -67,13 +67,13 @@ class Meta: model = Case -class DepartmentSlaFactory(factory.django.DjangoModelFactory): +class DepartmentSLAFactory(factory.django.DjangoModelFactory): sla_days = factory.Faker("pyint", min_value=0, max_value=30) case = factory.SubFactory(CaseFactory) department = factory.SubFactory(DepartmentFactory) class Meta: - model = DepartmentSla + model = DepartmentSLA class CaseAssignmentFactory(factory.django.DjangoModelFactory): diff --git a/api/cases/tests/test_sla.py b/api/cases/tests/test_sla.py index 2337c6eeb..203fe0602 100644 --- a/api/cases/tests/test_sla.py +++ b/api/cases/tests/test_sla.py @@ -19,7 +19,7 @@ SLA_UPDATE_CUTOFF_TIME, HMRC_QUERY_TARGET_DAYS, ) -from api.cases.models import CaseAssignmentSla, CaseQueue, DepartmentSla +from api.cases.models import CaseAssignmentSLA, CaseQueue, DepartmentSLA from api.staticdata.statuses.enums import CaseStatusEnum from api.staticdata.statuses.libraries.get_case_status import get_case_status_by_status from api.teams.models import Department @@ -138,7 +138,7 @@ def test_sla_update_exhibition_mod( case=application.case_ptr, queue=self.queue, ) results = update_cases_sla.now() - sla = CaseAssignmentSla.objects.get() + sla = CaseAssignmentSLA.objects.get() case.refresh_from_db() self.assertEqual(sla.sla_days, 1) @@ -163,7 +163,7 @@ def test_sla_update_F680_mod( CaseQueue.objects.create( queue=self.queue, case=application.case_ptr, ) - sla = CaseAssignmentSla.objects.create(sla_days=4, queue=self.queue, case=application.case_ptr,) + sla = CaseAssignmentSLA.objects.create(sla_days=4, queue=self.queue, case=application.case_ptr,) results = update_cases_sla.now() case.refresh_from_db() @@ -574,7 +574,7 @@ def test_sla_not_update_for_terminal( self.assertEqual(case.sla_remaining_days, STANDARD_APPLICATION_TARGET_DAYS - 1) -class DepartmentSlaTests(DataTestClient): +class DepartmentSLATests(DataTestClient): @mock.patch("api.cases.tasks.is_weekend") @mock.patch("api.cases.tasks.is_bank_holiday") def test_department_sla_updated( @@ -598,5 +598,5 @@ def test_department_sla_updated( self.team.department = test_department self.team.save() update_cases_sla.now() - department_sla = DepartmentSla.objects.get(department=test_department) + department_sla = DepartmentSLA.objects.get(department=test_department) self.assertEqual(department_sla.sla_days, 1) diff --git a/api/data_workspace/case_views.py b/api/data_workspace/case_views.py index 504e12480..ea356497a 100644 --- a/api/data_workspace/case_views.py +++ b/api/data_workspace/case_views.py @@ -2,16 +2,16 @@ from rest_framework.pagination import LimitOffsetPagination from api.core.authentication import DataWorkspaceOnlyAuthentication -from api.cases.models import CaseAssignment, CaseAssignmentSla, CaseType, CaseQueue, EcjuQuery, DepartmentSla +from api.cases.models import CaseAssignment, CaseAssignmentSLA, CaseType, CaseQueue, EcjuQuery, DepartmentSLA from api.cases.serializers import ( - CaseAssignmentSlaSerializer, + CaseAssignmentSLASerializer, CaseTypeSerializer, CaseQueueSerializer, ) from api.data_workspace.serializers import ( EcjuQuerySerializer, CaseAssignmentSerializer, - DepartmentSlaSerializer, + DepartmentSLASerializer, ) @@ -22,11 +22,11 @@ class CaseAssignmentList(viewsets.ReadOnlyModelViewSet): queryset = CaseAssignment.objects.all().order_by("id") -class CaseAssignmentSlaList(viewsets.ReadOnlyModelViewSet): +class CaseAssignmentSLAList(viewsets.ReadOnlyModelViewSet): authentication_classes = (DataWorkspaceOnlyAuthentication,) - serializer_class = CaseAssignmentSlaSerializer + serializer_class = CaseAssignmentSLASerializer pagination_class = LimitOffsetPagination - queryset = CaseAssignmentSla.objects.all() + queryset = CaseAssignmentSLA.objects.all() class CaseTypeList(viewsets.ReadOnlyModelViewSet): @@ -45,9 +45,9 @@ class CaseQueueList(viewsets.ReadOnlyModelViewSet): class CaseDepartmentList(viewsets.ReadOnlyModelViewSet): authentication_classes = (DataWorkspaceOnlyAuthentication,) - serializer_class = DepartmentSlaSerializer + serializer_class = DepartmentSLASerializer pagination_class = LimitOffsetPagination - queryset = DepartmentSla.objects.all() + queryset = DepartmentSLA.objects.all() class EcjuQueryList(viewsets.ReadOnlyModelViewSet): diff --git a/api/data_workspace/serializers.py b/api/data_workspace/serializers.py index 35a5f034c..23d891212 100644 --- a/api/data_workspace/serializers.py +++ b/api/data_workspace/serializers.py @@ -1,6 +1,6 @@ from api.audit_trail.models import Audit from api.teams.models import Department -from api.cases.models import CaseAssignment, EcjuQuery, DepartmentSla +from api.cases.models import CaseAssignment, EcjuQuery, DepartmentSLA from api.queues.models import Queue from rest_framework import serializers @@ -26,9 +26,9 @@ class Meta: fields = "__all__" -class DepartmentSlaSerializer(serializers.ModelSerializer): +class DepartmentSLASerializer(serializers.ModelSerializer): class Meta: - model = DepartmentSla + model = DepartmentSLA fields = "__all__" diff --git a/api/data_workspace/tests/test_case_views.py b/api/data_workspace/tests/test_case_views.py index 9f3f3dbaa..8ce50a071 100644 --- a/api/data_workspace/tests/test_case_views.py +++ b/api/data_workspace/tests/test_case_views.py @@ -1,7 +1,7 @@ from django.urls import reverse from rest_framework import status -from api.cases.models import CaseAssignmentSla, CaseAssignment +from api.cases.models import CaseAssignmentSLA, CaseAssignment from test_helpers.clients import DataTestClient from test_helpers.assertions import is_uuid_as_string from api.users.tests.factories import GovUserFactory @@ -13,7 +13,7 @@ def setUp(self): super().setUp() self.case = self.create_standard_application_case(self.organisation, "Example Application") self.queue.cases.add(self.case) - CaseAssignmentSla.objects.create(sla_days=4, queue=self.queue, case=self.case) + CaseAssignmentSLA.objects.create(sla_days=4, queue=self.queue, case=self.case) # Create CaseAssignment user = GovUserFactory( diff --git a/api/data_workspace/tests/test_views.py b/api/data_workspace/tests/test_views.py index 993a0ea53..27eea5ec7 100644 --- a/api/data_workspace/tests/test_views.py +++ b/api/data_workspace/tests/test_views.py @@ -4,7 +4,7 @@ from api.parties.enums import PartyType from test_helpers.clients import DataTestClient from api.teams.tests.factories import TeamFactory -from api.cases.tests.factories import DepartmentSlaFactory +from api.cases.tests.factories import DepartmentSLAFactory from api.teams.models import Department @@ -124,7 +124,7 @@ def test_departments(self): assert set(payload["results"][0].keys()) == expected_fields def test_case_department_slas(self): - department_sla = DepartmentSlaFactory() + department_sla = DepartmentSLAFactory() url = reverse("data_workspace:dw-case-department-sla-list") response = self.client.get(url) payload = response.json() diff --git a/api/data_workspace/urls.py b/api/data_workspace/urls.py index 5b84325ad..dca25494e 100644 --- a/api/data_workspace/urls.py +++ b/api/data_workspace/urls.py @@ -56,7 +56,7 @@ router_v1.register("teams", views.TeamListView, basename="dw-teams") router_v1.register("departments", views.DepartmentListView, basename="dw-departments") router_v1.register("case-assignment", case_views.CaseAssignmentList, basename="dw-case-assignment") -router_v1.register("case-assignment-slas", case_views.CaseAssignmentSlaList, basename="dw-case-assignment-sla") +router_v1.register("case-assignment-slas", case_views.CaseAssignmentSLAList, basename="dw-case-assignment-sla") router_v1.register("case-types", case_views.CaseTypeList, basename="dw-case-type") router_v1.register("case-queues", case_views.CaseQueueList, basename="dw-case-queue") router_v1.register("case-department-slas", case_views.CaseDepartmentList, basename="dw-case-department-sla") From 29ce03dc8d6fd67a77f0a974923a9e3914f0728a Mon Sep 17 00:00:00 2001 From: Mano Date: Thu, 30 Sep 2021 10:59:43 +0100 Subject: [PATCH 15/16] Dummy commit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 589d3a2f1..5f0fec61c 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ Service for handling backend calls in LITE. + ## Running the service with docker - Download the repository: From e7a8470601fe0a680ae34410bf16818b1cf7bf6c Mon Sep 17 00:00:00 2001 From: Mano Date: Thu, 30 Sep 2021 11:37:07 +0100 Subject: [PATCH 16/16] Dummy commit --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 5f0fec61c..589d3a2f1 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ Service for handling backend calls in LITE. - ## Running the service with docker - Download the repository: