Skip to content

Commit

Permalink
Merge pull request #133 from maykinmedia/feature/127-models
Browse files Browse the repository at this point in the history
[#127] Models for response to reviews and endpoints for retrieving reviews
  • Loading branch information
SilviaAmAm authored Jun 21, 2024
2 parents 492eb16 + e2042d5 commit 33bb569
Show file tree
Hide file tree
Showing 11 changed files with 420 additions and 41 deletions.
1 change: 1 addition & 0 deletions backend/src/openarchiefbeheer/accounts/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@


@extend_schema(
tags=["Reviewers"],
summary=_("Reviewers list"),
description=_(
"List all the users that have the permission to review destruction lists."
Expand Down
6 changes: 6 additions & 0 deletions backend/src/openarchiefbeheer/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from openarchiefbeheer.accounts.api.views import ReviewersView, WhoAmIView
from openarchiefbeheer.destruction.api.views import ListStatusesListView
from openarchiefbeheer.destruction.api.viewsets import (
DestructionListItemReviewViewSet,
DestructionListItemsViewSet,
DestructionListReviewViewSet,
DestructionListViewSet,
Expand All @@ -35,6 +36,11 @@
DestructionListReviewViewSet,
basename="destruction-list-reviews",
)
router.register(
r"review-items",
DestructionListItemReviewViewSet,
basename="reviews-items",
)
router.register(r"zaken", ZakenViewSet, basename="zaken")


Expand Down
23 changes: 23 additions & 0 deletions backend/src/openarchiefbeheer/destruction/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
DestructionListItem,
DestructionListItemReview,
DestructionListReview,
ReviewItemResponse,
ReviewResponse,
)


Expand Down Expand Up @@ -59,3 +61,24 @@ class DestructionListItemReviewAdmin(admin.ModelAdmin):
list_display = ("destruction_list", "destruction_list_item")
search_fields = ("destruction_list__name", "destruction_list_item__zaak")
raw_id_fields = ("destruction_list", "review", "destruction_list_item")


@admin.register(ReviewResponse)
class ReviewResponseAdmin(admin.ModelAdmin):
list_display = ("review",)
search_fields = (
"review__author__username",
"review__destruction_list__name",
"review__destruction_list__author__username",
)


@admin.register(ReviewItemResponse)
class ReviewItemResponse(admin.ModelAdmin):
list_display = ("review_item", "action_item")
search_fields = (
"review_item__destruction_list_item__zaak",
"review_item__review__author__username",
"review_item__destruction_list__author__username",
"review_item__destruction_list__name",
)
19 changes: 16 additions & 3 deletions backend/src/openarchiefbeheer/destruction/api/filtersets.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
from django.db.models import QuerySet

from django_filters import FilterSet, NumberFilter, UUIDFilter
from django_filters import FilterSet, NumberFilter, OrderingFilter, UUIDFilter

from ..models import DestructionList, DestructionListItem, DestructionListReview
from ..models import (
DestructionList,
DestructionListItem,
DestructionListItemReview,
DestructionListReview,
)


class DestructionListItemFilterset(FilterSet):
Expand All @@ -28,12 +33,20 @@ class DestructionListReviewFilterset(FilterSet):
help_text="The UUID of the destruction list.",
method="filter_destruction_list_uuid",
)
ordering = OrderingFilter(fields=("created", "created"))

class Meta:
model = DestructionListReview
fields = ("destruction_list", "destruction_list__uuid")
fields = ("destruction_list", "destruction_list__uuid", "decision", "ordering")

def filter_destruction_list_uuid(
self, queryset: QuerySet[DestructionListReview], name: str, value: str
):
return queryset.filter(destruction_list__uuid=value)


class DestructionListReviewItemFilterset(FilterSet):

class Meta:
model = DestructionListItemReview
fields = ("review",)
64 changes: 54 additions & 10 deletions backend/src/openarchiefbeheer/destruction/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from openarchiefbeheer.accounts.api.serializers import UserSerializer
from openarchiefbeheer.logging import logevent
from openarchiefbeheer.zaken.api.serializers import ZaakSerializer
from openarchiefbeheer.zaken.models import Zaak

from ..constants import ListItemStatus, ListRole, ListStatus, ReviewDecisionChoices
from ..models import (
Expand All @@ -17,6 +18,8 @@
DestructionListItem,
DestructionListItemReview,
DestructionListReview,
ReviewItemResponse,
ReviewResponse,
)


Expand Down Expand Up @@ -166,7 +169,7 @@ def update(
return instance


class DestructionListResponseSerializer(serializers.ModelSerializer):
class DestructionListAPIResponseSerializer(serializers.ModelSerializer):
assignees = DestructionListAssigneeResponseSerializer(many=True)
author = UserSerializer(read_only=True)
assignee = UserSerializer(read_only=True)
Expand All @@ -186,15 +189,6 @@ class Meta:
)


class DestructionListItemReviewSerializer(serializers.ModelSerializer):
class Meta:
model = DestructionListItemReview
fields = (
"destruction_list_item",
"feedback",
)


class ZakenReviewSerializer(serializers.Serializer):
zaak_url = serializers.URLField(
required=True, help_text="The URL of the case for which changes are requested."
Expand All @@ -218,11 +212,13 @@ class DestructionListReviewSerializer(serializers.ModelSerializer):
class Meta:
model = DestructionListReview
fields = (
"pk",
"destruction_list",
"author",
"decision",
"list_feedback",
"zaken_reviews",
"created",
)

def validate(self, attrs: dict) -> dict:
Expand Down Expand Up @@ -318,3 +314,51 @@ def create(self, validated_data: dict) -> DestructionListReview:
destruction_list.get_author().assign()

return review


class DestructionListItemReviewSerializer(serializers.ModelSerializer):
zaak = serializers.SerializerMethodField(
help_text=_(
"In the case that the zaak has already been deleted, only the URL field will be returned."
)
)

class Meta:
model = DestructionListItemReview
fields = ("pk", "zaak", "feedback")

@extend_schema_field(ZaakSerializer)
def get_zaak(self, obj) -> dict:
zaak_url = obj.destruction_list_item.zaak
zaak = Zaak.objects.filter(url=zaak_url).first()
# The zaak is no longer present in the cache,
# it might have already been removed
if not zaak:
return {"url": zaak_url}

serializer = ZaakSerializer(instance=zaak)
return serializer.data


class ActionZaakSerializer(serializers.Serializer):
selectielijstklasse = serializers.URLField(
required=False,
help_text=_("The URL of to a 'resultaat' resource from the selectielijst API."),
)
archiefactiedatum = serializers.DateField(
required=False, help_text=_("A new date for when this case should be archived.")
)


class ReviewItemResponseSerializer(serializers.ModelSerializer):
action_zaak = ActionZaakSerializer()

class Meta:
model = ReviewItemResponse
fields = ("review_item", "action_item", "action_zaak", "created", "comment")


class ReviewResponseSerializer(serializers.ModelSerializer):
class Meta:
model = ReviewResponse
fields = ("review", "comment", "created")
2 changes: 1 addition & 1 deletion backend/src/openarchiefbeheer/destruction/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@


@extend_schema(
tags=["Destruction list"],
summary=_("List destruction list statuses"),
description=_("List the possible statuses that a destruction lists can have."),
tags=["statuses"],
responses={
200: build_array_type(build_array_type(build_basic_type(OpenApiTypes.STR)))
},
Expand Down
58 changes: 44 additions & 14 deletions backend/src/openarchiefbeheer/destruction/api/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,41 @@
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from ..models import DestructionList, DestructionListItem, DestructionListReview
from ..models import (
DestructionList,
DestructionListItem,
DestructionListItemReview,
DestructionListReview,
)
from .filtersets import (
DestructionListFilterset,
DestructionListItemFilterset,
DestructionListReviewFilterset,
DestructionListReviewItemFilterset,
)
from .permissions import (
CanMakeRequestedChanges,
CanReviewPermission,
CanStartDestructionPermission,
CanUpdateDestructionList,
)
from .serializers import (
DestructionListAPIResponseSerializer,
DestructionListItemReviewSerializer,
DestructionListItemSerializer,
DestructionListResponseSerializer,
DestructionListReviewSerializer,
DestructionListSerializer,
)


@extend_schema_view(
list=extend_schema(
tags=["Destruction list"],
summary=_("List destruction lists"),
description=_("List all destruction lists."),
responses={200: DestructionListResponseSerializer(many=True)},
responses={200: DestructionListAPIResponseSerializer(many=True)},
),
create=extend_schema(
tags=["Destruction list"],
summary=_("Create destruction list"),
description=_("Create a new destruction list."),
examples=[
Expand Down Expand Up @@ -63,6 +71,7 @@
],
),
update=extend_schema(
tags=["Destruction list"],
summary=_("Update destruction list"),
description=_(
"Update a destruction list. "
Expand Down Expand Up @@ -94,6 +103,7 @@
],
),
partial_update=extend_schema(
tags=["Destruction list"],
summary=_("Partially update a destruction list"),
description=_(
"Partially update a destruction list. "
Expand All @@ -114,9 +124,17 @@
],
),
retrieve=extend_schema(
tags=["Destruction list"],
summary=_("Retrieve destruction list"),
description=_("Retrieve details about a destruction list."),
responses={200: DestructionListResponseSerializer},
responses={200: DestructionListAPIResponseSerializer},
),
make_requested_changes=extend_schema(
tags=["Destruction list"],
summary=_("Make requested changes"),
description=_(
"Update a destruction list after a reviewer has requested changes."
),
),
)
class DestructionListViewSet(
Expand Down Expand Up @@ -145,7 +163,7 @@ def get_permissions(self):

def get_serializer_class(self):
if self.action in ["retrieve", "list"]:
return DestructionListResponseSerializer
return DestructionListAPIResponseSerializer
return self.serializer_class

@transaction.atomic
Expand All @@ -165,6 +183,7 @@ def make_requested_changes(self, request, *args, **kwargs):

@extend_schema_view(
list=extend_schema(
tags=["Destruction list"],
summary=_("List destruction list items"),
description=_(
"List all the items (cases) that are related to a destruction list."
Expand All @@ -183,13 +202,15 @@ class DestructionListItemsViewSet(

@extend_schema_view(
list=extend_schema(
summary=_("List destruction list reviews"),
tags=["Reviews"],
summary=_("List reviews"),
description=_(
"List all the reviews that have been made for a destruction list."
),
),
create=extend_schema(
summary=_("Create a destruction list review"),
tags=["Reviews"],
summary=_("Create review"),
description=_(
"Create a review for a destruction list. "
"Only the user currently assigned to the destruction list can create a review."
Expand All @@ -206,9 +227,18 @@ class DestructionListReviewViewSet(
filter_backends = (DjangoFilterBackend,)
filterset_class = DestructionListReviewFilterset

def get_permissions(self):
if self.action == "create":
permission_classes = [IsAuthenticated & CanReviewPermission]
else:
permission_classes = [IsAuthenticated]
return [permission() for permission in permission_classes]

@extend_schema_view(
list=extend_schema(
tags=["Reviews"],
summary=_("List review items"),
description=_(
"List all the feedback to specific cases within a destruction list."
),
),
)
class DestructionListItemReviewViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
serializer_class = DestructionListItemReviewSerializer
queryset = DestructionListItemReview.objects.all()
filter_backends = (DjangoFilterBackend,)
filterset_class = DestructionListReviewItemFilterset
5 changes: 5 additions & 0 deletions backend/src/openarchiefbeheer/destruction/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,8 @@ class ReviewDecisionChoices(models.TextChoices):
class ListRole(models.TextChoices):
reviewer = "reviewer", _("Reviewer")
author = "author", _("Author")


class DestructionListItemAction(models.TextChoices):
keep = "keep", _("keep")
remove = "remove", _("remove")
Loading

0 comments on commit 33bb569

Please sign in to comment.