diff --git a/api/conf/caseworker_urls.py b/api/conf/caseworker_urls.py index e26f3e033..4e6bbbe6d 100644 --- a/api/conf/caseworker_urls.py +++ b/api/conf/caseworker_urls.py @@ -6,4 +6,5 @@ path("organisations/", include("api.organisations.caseworker.urls")), path("static/", include("api.staticdata.caseworker.urls")), path("gov_users/", include("api.gov_users.caseworker.urls")), + path("letter_templates/", include("api.letter_templates.caseworker.urls")), ] diff --git a/api/letter_templates/caseworker/__init__.py b/api/letter_templates/caseworker/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/api/letter_templates/caseworker/filters.py b/api/letter_templates/caseworker/filters.py new file mode 100644 index 000000000..d1451b7ac --- /dev/null +++ b/api/letter_templates/caseworker/filters.py @@ -0,0 +1,15 @@ +from django_filters import rest_framework as filters + +from api.letter_templates.models import LetterTemplate + + +class LetterTemplateFilter(filters.FilterSet): + case_type = filters.CharFilter(field_name="case_types__sub_type", lookup_expr="exact") + decision = filters.CharFilter(field_name="decisions__name", lookup_expr="exact") + + class Meta: + model = LetterTemplate + fields = ( + "case_types", + "decisions", + ) diff --git a/api/letter_templates/caseworker/serializers.py b/api/letter_templates/caseworker/serializers.py new file mode 100644 index 000000000..8a714b326 --- /dev/null +++ b/api/letter_templates/caseworker/serializers.py @@ -0,0 +1,12 @@ +from rest_framework import serializers + +from api.letter_templates.models import LetterTemplate +from api.staticdata.decisions.serializers import DecisionSerializer + + +class LetterTemplatesSerializer(serializers.ModelSerializer): + decisions = DecisionSerializer(many=True) + + class Meta: + model = LetterTemplate + fields = ("id", "name", "decisions") diff --git a/api/letter_templates/caseworker/tests/test_view.py b/api/letter_templates/caseworker/tests/test_view.py new file mode 100644 index 000000000..ead913780 --- /dev/null +++ b/api/letter_templates/caseworker/tests/test_view.py @@ -0,0 +1,69 @@ +from rest_framework.reverse import reverse +from rest_framework import status + +from parameterized import parameterized + +from api.cases.enums import AdviceType +from api.cases.enums import CaseTypeEnum +from test_helpers.clients import DataTestClient + + +class LetterTemplatesListTests(DataTestClient): + + def setUp(self): + super().setUp() + + # We need to shift these out to factories + self.create_letter_template( + name="F680 Approval", case_types=[CaseTypeEnum.F680.id], decisions=[AdviceType.ids[AdviceType.APPROVE]] + ) + self.create_letter_template( + name="F680 Refusal", case_types=[CaseTypeEnum.F680.id], decisions=[AdviceType.ids[AdviceType.REFUSE]] + ) + self.create_letter_template( + name="SIEL Approval", case_types=[CaseTypeEnum.SIEL.id], decisions=[AdviceType.ids[AdviceType.APPROVE]] + ) + + self.create_letter_template( + name="SIEL Refusal", case_types=[CaseTypeEnum.SIEL.id], decisions=[AdviceType.ids[AdviceType.REFUSE]] + ) + + @parameterized.expand( + [ + [{"case_type": "f680_clearance"}, ["F680 Approval", "F680 Refusal"], ["Approve", "Refuse"], 2], + [ + {"decision": "approve"}, + ["SIEL Approval", "F680 Approval"], + ["Approve"], + 2, + ], + [ + {"decision": "approve", "case_type": "f680_clearance"}, + ["F680 Approval"], + ["Approve"], + 1, + ], + [ + {"case_type": "bad_case_type"}, + None, + None, + 0, + ], + ] + ) + def test_letter_templates_list_filter(self, filter, expected_names, expected_descisions, expect_count): + + url = reverse("caseworker_letter_templates:list") + response = self.client.get(url, **self.gov_headers, data=filter) + response_data = response.json() + + self.assertEqual(response_data["count"], expect_count) + for item in response_data["results"]: + self.assertTrue(item["name"] in expected_names) + self.assertTrue(item["decisions"][0]["name"]["value"] in expected_descisions) + + def test_letter_templates_list_not_allowed(self): + + url = reverse("caseworker_letter_templates:list") + response = self.client.get(url, **self.exporter_headers, data={}) + assert response.status_code == status.HTTP_403_FORBIDDEN diff --git a/api/letter_templates/caseworker/urls.py b/api/letter_templates/caseworker/urls.py new file mode 100644 index 000000000..8d45fe645 --- /dev/null +++ b/api/letter_templates/caseworker/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from .views import LetterTemplatesList + +app_name = "caseworker_letter_templates" + +urlpatterns = [ + path("", LetterTemplatesList.as_view(), name="list"), +] diff --git a/api/letter_templates/caseworker/views.py b/api/letter_templates/caseworker/views.py new file mode 100644 index 000000000..cfecaa3cc --- /dev/null +++ b/api/letter_templates/caseworker/views.py @@ -0,0 +1,15 @@ +from api.letter_templates.caseworker.filters import LetterTemplateFilter +from rest_framework.generics import ListAPIView + +from api.core.authentication import GovAuthentication +from api.letter_templates.models import LetterTemplate +from .serializers import LetterTemplatesSerializer +from django_filters.rest_framework import DjangoFilterBackend + + +class LetterTemplatesList(ListAPIView): + authentication_classes = (GovAuthentication,) + filter_backends = [DjangoFilterBackend] + filterset_class = LetterTemplateFilter + serializer_class = LetterTemplatesSerializer + queryset = LetterTemplate.objects.order_by("name") diff --git a/api/letter_templates/tests/test_view.py b/api/letter_templates/tests/test_view.py index ad2dea2ae..2ed2d39d3 100644 --- a/api/letter_templates/tests/test_view.py +++ b/api/letter_templates/tests/test_view.py @@ -1,9 +1,7 @@ from api.letter_templates.models import LetterTemplate -from api.staticdata import decisions from api.staticdata.letter_layouts.models import LetterLayout from rest_framework import status from rest_framework.reverse import reverse -from django.test import override_settings from api.cases.enums import AdviceType, CaseTypeReferenceEnum from api.cases.enums import CaseTypeSubTypeEnum, CaseTypeEnum