Skip to content

Commit

Permalink
✨ [#498] Add review_advice_ignored to destruction list item serialiser
Browse files Browse the repository at this point in the history
To facilitate the life of the frontend
  • Loading branch information
SilviaAmAm authored and Xaohs committed Nov 22, 2024
1 parent ada5fe3 commit f03c366
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 4 deletions.
26 changes: 25 additions & 1 deletion backend/src/openarchiefbeheer/destruction/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
from django.db.models import F, Q, QuerySet
from django.utils.translation import gettext_lazy as _

from drf_spectacular.utils import extend_schema_field
from drf_spectacular.plumbing import build_basic_type
from drf_spectacular.utils import OpenApiTypes, extend_schema_field
from requests.exceptions import HTTPError
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
Expand Down Expand Up @@ -238,6 +239,13 @@ def validate(self, attrs: dict) -> dict:

class DestructionListItemReadSerializer(serializers.ModelSerializer):
zaak = ZaakSerializer(allow_null=True, read_only=True)
review_advice_ignored = serializers.SerializerMethodField(
help_text=_(
"Specifies whether the record manager went against"
" the advice of a reviewer when processing a review."
),
allow_null=True,
)

class Meta:
model = DestructionListItem
Expand All @@ -247,8 +255,24 @@ class Meta:
"extra_zaak_data",
"zaak",
"processing_status",
"review_advice_ignored",
)

@extend_schema_field(build_basic_type((OpenApiTypes.BOOL, OpenApiTypes.NONE)))
def get_review_advice_ignored(self, item: DestructionListItem) -> bool | None:
if hasattr(item, "review_advice_ignored"):
return item.review_advice_ignored

last_review_response = (
ReviewItemResponse.objects.filter(review_item__destruction_list_item=item)
.order_by("-created")
.last()
)
if last_review_response is None:
return

return last_review_response.action_item == DestructionListItemAction.keep


class DestructionListWriteSerializer(serializers.ModelSerializer):
add = DestructionListItemWriteSerializer(many=True, required=False)
Expand Down
51 changes: 48 additions & 3 deletions backend/src/openarchiefbeheer/destruction/api/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,16 @@

from django.contrib.contenttypes.models import ContentType
from django.db import transaction
from django.db.models import Prefetch, QuerySet
from django.db.models import (
Case,
F,
OuterRef,
Prefetch,
QuerySet,
Subquery,
Value,
When,
)
from django.shortcuts import get_object_or_404
from django.utils.translation import gettext_lazy as _

Expand All @@ -19,13 +28,19 @@
from openarchiefbeheer.utils.paginators import PageNumberPagination
from openarchiefbeheer.zaken.api.filtersets import ZaakFilterSet

from ..constants import WAITING_PERIOD, InternalStatus, ListRole
from ..constants import (
WAITING_PERIOD,
DestructionListItemAction,
InternalStatus,
ListRole,
)
from ..models import (
DestructionList,
DestructionListAssignee,
DestructionListItem,
DestructionListItemReview,
DestructionListReview,
ReviewItemResponse,
ReviewResponse,
)
from ..tasks import delete_destruction_list
Expand Down Expand Up @@ -394,14 +409,44 @@ class DestructionListItemsViewSet(
viewsets.GenericViewSet,
):
serializer_class = DestructionListItemReadSerializer
queryset = DestructionListItem.objects.all().select_related("zaak")
filter_backends = (NestedFilterBackend,)
filterset_class = DestructionListItemFilterset
filterset_kwargs = {"prefix": "item"}
nested_filterset_class = ZaakFilterSet
nested_filterset_relation_field = "zaak"
pagination_class = PageNumberPagination

def get_queryset(self):
review_response_items = ReviewItemResponse.objects.filter(
review_item__destruction_list_item=OuterRef("pk")
).order_by("-created")

qs = (
DestructionListItem.objects.all()
.select_related("zaak")
.annotate(
last_review_response_action_item=Subquery(
review_response_items.values("action_item")[:1]
)
)
.annotate(
review_advice_ignored=Case(
When(
last_review_response_action_item=DestructionListItemAction.keep,
then=Value(True),
),
When(
last_review_response_action_item=DestructionListItemAction.remove,
then=Value(False),
),
When(
last_review_response_action_item__isnull=True, then=Value(None)
),
)
)
)
return qs.order_by(F("review_advice_ignored").desc(nulls_last=True))


@extend_schema_view(
list=extend_schema(
Expand Down

0 comments on commit f03c366

Please sign in to comment.