Skip to content

Commit

Permalink
Added updated status Audit endpoint (#835)
Browse files Browse the repository at this point in the history
* serializer and test added for Audit - UpdatedStatus

* Added view and url mappings

* Used Black fix linter issue

* addresses review comments
  • Loading branch information
nahmed99 authored Oct 12, 2021
1 parent 64db05b commit 54607b4
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 2 deletions.
13 changes: 12 additions & 1 deletion api/data_workspace/audit_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from api.audit_trail.models import Audit
from api.cases.models import Case
from api.core.authentication import DataWorkspaceOnlyAuthentication
from api.data_workspace.serializers import AuditMoveCaseSerializer
from api.data_workspace.serializers import AuditMoveCaseSerializer, AuditUpdatedCaseStatusSerializer


class AuditMoveCaseListView(viewsets.ReadOnlyModelViewSet):
Expand Down Expand Up @@ -44,3 +44,14 @@ def get_queryset(self):
""",
{"verb": AuditType.MOVE_CASE, "action_type": content_type.pk, "target_type": content_type.pk},
)


class AuditUpdatedCaseStatusListView(viewsets.ReadOnlyModelViewSet):
"""Expose 'updated status' audit events to data workspace."""

authentication_classes = (DataWorkspaceOnlyAuthentication,)
serializer_class = AuditUpdatedCaseStatusSerializer
pagination_class = LimitOffsetPagination

def get_queryset(self):
return Audit.objects.filter(verb=AuditType.UPDATED_STATUS).order_by("created_at")
23 changes: 23 additions & 0 deletions api/data_workspace/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,26 @@ def get_queue(self, instance):
if queue:
return queue.pk
return None


class AuditUpdatedCaseStatusSerializer(serializers.ModelSerializer):

user = serializers.SerializerMethodField()
case = serializers.SerializerMethodField()
status = serializers.SerializerMethodField()

class Meta:
model = Audit
fields = ("created_at", "user", "case", "status")

def get_user(self, instance):
if instance.actor:
return instance.actor.pk
return None

def get_case(self, instance):
return instance.target_object_id or None

def get_status(self, instance):
status = instance.payload["status"]["new"]
return status
33 changes: 33 additions & 0 deletions api/data_workspace/tests/test_audit_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,36 @@ def test_payload_multiple_queues(self):
# The record with multiple queues should have been split into separate entries.
self.assertEqual(results[1]["queue"], str(queue1.pk))
self.assertEqual(results[2]["queue"], str(queue2.pk))


class DataWorkspaceUpdatedCaseStatusTests(DataTestClient):
def setUp(self):
super().setUp()
self.url = reverse("data_workspace:dw-audit-updated-status-list")
case = self.create_standard_application_case(self.organisation, "Test Application")
# Audit events are only created for non-draft cases
case.status = get_case_status_by_status(CaseStatusEnum.OPEN)
# This will generate an updated status audit entry.
case.save()
self.create_audit = partial(
super().create_audit, verb=AuditType.UPDATED_STATUS, actor=self.gov_user, target=case.get_case()
)

self.create_audit(verb=AuditType.CREATED_USER_ADVICE)

def test_audit_updated_status(self):
expected_fields = ("created_at", "user", "case", "status")

response = self.client.get(self.url)

self.assertEqual(response.status_code, status.HTTP_200_OK)
results = response.json()["results"]
self.assertEqual(len(results), 1)
self.assertEqual(tuple(results[0].keys()), expected_fields)
self.assertEqual(results[0]["status"], "Submitted")

response = self.client.options(self.url)

self.assertEqual(response.status_code, status.HTTP_200_OK)
options = response.json()["actions"]["GET"]
self.assertEqual(tuple(options.keys()), expected_fields)
16 changes: 15 additions & 1 deletion api/data_workspace/tests/test_serializers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
from api.audit_trail.models import AuditType
from api.audit_trail.tests.factories import AuditFactory
from api.data_workspace.serializers import AuditMoveCaseSerializer, CaseAssignmentSerializer, EcjuQuerySerializer
from api.data_workspace.serializers import (
AuditMoveCaseSerializer,
CaseAssignmentSerializer,
EcjuQuerySerializer,
AuditUpdatedCaseStatusSerializer,
)
from api.cases.tests.factories import EcjuQueryFactory, CaseAssignmentFactory


Expand All @@ -25,3 +30,12 @@ def test_AuditMoveCaseSerializer(db):
serialized = AuditMoveCaseSerializer(audit)
expected_fields = {"created_at", "user", "case", "queue"}
assert set(serialized.data.keys()) == expected_fields


def test_AuditUpdatedCaseStatusSerializer(db):
audit = AuditFactory(
verb=AuditType.UPDATED_STATUS, payload={"status": {"new": "finalised", "old": "under_final_review"}}
)
serialized = AuditUpdatedCaseStatusSerializer(audit)
expected_fields = {"created_at", "user", "case", "status"}
assert set(serialized.data.keys()) == expected_fields
3 changes: 3 additions & 0 deletions api/data_workspace/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,5 +70,8 @@
router_v1.register("users-gov-users", users_views.GovUserListView, basename="dw-users-gov-users")
router_v1.register("audit-move-case", audit_views.AuditMoveCaseListView, basename="dw-audit-move-case")
router_v1.register("advice", advice_views.AdviceListView, basename="dw-advice")
router_v1.register(
"audit-updated-status", audit_views.AuditUpdatedCaseStatusListView, basename="dw-audit-updated-status"
)

urlpatterns = [path("v0/", include(router_v0.urls)), path("v1/", include(router_v1.urls))]

0 comments on commit 54607b4

Please sign in to comment.