Skip to content

Commit 33bb569

Browse files
authored
Merge pull request #133 from maykinmedia/feature/127-models
[#127] Models for response to reviews and endpoints for retrieving reviews
2 parents 492eb16 + e2042d5 commit 33bb569

File tree

11 files changed

+420
-41
lines changed

11 files changed

+420
-41
lines changed

backend/src/openarchiefbeheer/accounts/api/views.py

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111

1212
@extend_schema(
13+
tags=["Reviewers"],
1314
summary=_("Reviewers list"),
1415
description=_(
1516
"List all the users that have the permission to review destruction lists."

backend/src/openarchiefbeheer/api/urls.py

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from openarchiefbeheer.accounts.api.views import ReviewersView, WhoAmIView
1111
from openarchiefbeheer.destruction.api.views import ListStatusesListView
1212
from openarchiefbeheer.destruction.api.viewsets import (
13+
DestructionListItemReviewViewSet,
1314
DestructionListItemsViewSet,
1415
DestructionListReviewViewSet,
1516
DestructionListViewSet,
@@ -35,6 +36,11 @@
3536
DestructionListReviewViewSet,
3637
basename="destruction-list-reviews",
3738
)
39+
router.register(
40+
r"review-items",
41+
DestructionListItemReviewViewSet,
42+
basename="reviews-items",
43+
)
3844
router.register(r"zaken", ZakenViewSet, basename="zaken")
3945

4046

backend/src/openarchiefbeheer/destruction/admin.py

+23
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
DestructionListItem,
77
DestructionListItemReview,
88
DestructionListReview,
9+
ReviewItemResponse,
10+
ReviewResponse,
911
)
1012

1113

@@ -59,3 +61,24 @@ class DestructionListItemReviewAdmin(admin.ModelAdmin):
5961
list_display = ("destruction_list", "destruction_list_item")
6062
search_fields = ("destruction_list__name", "destruction_list_item__zaak")
6163
raw_id_fields = ("destruction_list", "review", "destruction_list_item")
64+
65+
66+
@admin.register(ReviewResponse)
67+
class ReviewResponseAdmin(admin.ModelAdmin):
68+
list_display = ("review",)
69+
search_fields = (
70+
"review__author__username",
71+
"review__destruction_list__name",
72+
"review__destruction_list__author__username",
73+
)
74+
75+
76+
@admin.register(ReviewItemResponse)
77+
class ReviewItemResponse(admin.ModelAdmin):
78+
list_display = ("review_item", "action_item")
79+
search_fields = (
80+
"review_item__destruction_list_item__zaak",
81+
"review_item__review__author__username",
82+
"review_item__destruction_list__author__username",
83+
"review_item__destruction_list__name",
84+
)

backend/src/openarchiefbeheer/destruction/api/filtersets.py

+16-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
from django.db.models import QuerySet
22

3-
from django_filters import FilterSet, NumberFilter, UUIDFilter
3+
from django_filters import FilterSet, NumberFilter, OrderingFilter, UUIDFilter
44

5-
from ..models import DestructionList, DestructionListItem, DestructionListReview
5+
from ..models import (
6+
DestructionList,
7+
DestructionListItem,
8+
DestructionListItemReview,
9+
DestructionListReview,
10+
)
611

712

813
class DestructionListItemFilterset(FilterSet):
@@ -28,12 +33,20 @@ class DestructionListReviewFilterset(FilterSet):
2833
help_text="The UUID of the destruction list.",
2934
method="filter_destruction_list_uuid",
3035
)
36+
ordering = OrderingFilter(fields=("created", "created"))
3137

3238
class Meta:
3339
model = DestructionListReview
34-
fields = ("destruction_list", "destruction_list__uuid")
40+
fields = ("destruction_list", "destruction_list__uuid", "decision", "ordering")
3541

3642
def filter_destruction_list_uuid(
3743
self, queryset: QuerySet[DestructionListReview], name: str, value: str
3844
):
3945
return queryset.filter(destruction_list__uuid=value)
46+
47+
48+
class DestructionListReviewItemFilterset(FilterSet):
49+
50+
class Meta:
51+
model = DestructionListItemReview
52+
fields = ("review",)

backend/src/openarchiefbeheer/destruction/api/serializers.py

+54-10
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from openarchiefbeheer.accounts.api.serializers import UserSerializer
1010
from openarchiefbeheer.logging import logevent
1111
from openarchiefbeheer.zaken.api.serializers import ZaakSerializer
12+
from openarchiefbeheer.zaken.models import Zaak
1213

1314
from ..constants import ListItemStatus, ListRole, ListStatus, ReviewDecisionChoices
1415
from ..models import (
@@ -17,6 +18,8 @@
1718
DestructionListItem,
1819
DestructionListItemReview,
1920
DestructionListReview,
21+
ReviewItemResponse,
22+
ReviewResponse,
2023
)
2124

2225

@@ -166,7 +169,7 @@ def update(
166169
return instance
167170

168171

169-
class DestructionListResponseSerializer(serializers.ModelSerializer):
172+
class DestructionListAPIResponseSerializer(serializers.ModelSerializer):
170173
assignees = DestructionListAssigneeResponseSerializer(many=True)
171174
author = UserSerializer(read_only=True)
172175
assignee = UserSerializer(read_only=True)
@@ -186,15 +189,6 @@ class Meta:
186189
)
187190

188191

189-
class DestructionListItemReviewSerializer(serializers.ModelSerializer):
190-
class Meta:
191-
model = DestructionListItemReview
192-
fields = (
193-
"destruction_list_item",
194-
"feedback",
195-
)
196-
197-
198192
class ZakenReviewSerializer(serializers.Serializer):
199193
zaak_url = serializers.URLField(
200194
required=True, help_text="The URL of the case for which changes are requested."
@@ -218,11 +212,13 @@ class DestructionListReviewSerializer(serializers.ModelSerializer):
218212
class Meta:
219213
model = DestructionListReview
220214
fields = (
215+
"pk",
221216
"destruction_list",
222217
"author",
223218
"decision",
224219
"list_feedback",
225220
"zaken_reviews",
221+
"created",
226222
)
227223

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

320316
return review
317+
318+
319+
class DestructionListItemReviewSerializer(serializers.ModelSerializer):
320+
zaak = serializers.SerializerMethodField(
321+
help_text=_(
322+
"In the case that the zaak has already been deleted, only the URL field will be returned."
323+
)
324+
)
325+
326+
class Meta:
327+
model = DestructionListItemReview
328+
fields = ("pk", "zaak", "feedback")
329+
330+
@extend_schema_field(ZaakSerializer)
331+
def get_zaak(self, obj) -> dict:
332+
zaak_url = obj.destruction_list_item.zaak
333+
zaak = Zaak.objects.filter(url=zaak_url).first()
334+
# The zaak is no longer present in the cache,
335+
# it might have already been removed
336+
if not zaak:
337+
return {"url": zaak_url}
338+
339+
serializer = ZaakSerializer(instance=zaak)
340+
return serializer.data
341+
342+
343+
class ActionZaakSerializer(serializers.Serializer):
344+
selectielijstklasse = serializers.URLField(
345+
required=False,
346+
help_text=_("The URL of to a 'resultaat' resource from the selectielijst API."),
347+
)
348+
archiefactiedatum = serializers.DateField(
349+
required=False, help_text=_("A new date for when this case should be archived.")
350+
)
351+
352+
353+
class ReviewItemResponseSerializer(serializers.ModelSerializer):
354+
action_zaak = ActionZaakSerializer()
355+
356+
class Meta:
357+
model = ReviewItemResponse
358+
fields = ("review_item", "action_item", "action_zaak", "created", "comment")
359+
360+
361+
class ReviewResponseSerializer(serializers.ModelSerializer):
362+
class Meta:
363+
model = ReviewResponse
364+
fields = ("review", "comment", "created")

backend/src/openarchiefbeheer/destruction/api/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99

1010

1111
@extend_schema(
12+
tags=["Destruction list"],
1213
summary=_("List destruction list statuses"),
1314
description=_("List the possible statuses that a destruction lists can have."),
14-
tags=["statuses"],
1515
responses={
1616
200: build_array_type(build_array_type(build_basic_type(OpenApiTypes.STR)))
1717
},

backend/src/openarchiefbeheer/destruction/api/viewsets.py

+44-14
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,41 @@
88
from rest_framework.permissions import IsAuthenticated
99
from rest_framework.response import Response
1010

11-
from ..models import DestructionList, DestructionListItem, DestructionListReview
11+
from ..models import (
12+
DestructionList,
13+
DestructionListItem,
14+
DestructionListItemReview,
15+
DestructionListReview,
16+
)
1217
from .filtersets import (
1318
DestructionListFilterset,
1419
DestructionListItemFilterset,
1520
DestructionListReviewFilterset,
21+
DestructionListReviewItemFilterset,
1622
)
1723
from .permissions import (
1824
CanMakeRequestedChanges,
19-
CanReviewPermission,
2025
CanStartDestructionPermission,
2126
CanUpdateDestructionList,
2227
)
2328
from .serializers import (
29+
DestructionListAPIResponseSerializer,
30+
DestructionListItemReviewSerializer,
2431
DestructionListItemSerializer,
25-
DestructionListResponseSerializer,
2632
DestructionListReviewSerializer,
2733
DestructionListSerializer,
2834
)
2935

3036

3137
@extend_schema_view(
3238
list=extend_schema(
39+
tags=["Destruction list"],
3340
summary=_("List destruction lists"),
3441
description=_("List all destruction lists."),
35-
responses={200: DestructionListResponseSerializer(many=True)},
42+
responses={200: DestructionListAPIResponseSerializer(many=True)},
3643
),
3744
create=extend_schema(
45+
tags=["Destruction list"],
3846
summary=_("Create destruction list"),
3947
description=_("Create a new destruction list."),
4048
examples=[
@@ -63,6 +71,7 @@
6371
],
6472
),
6573
update=extend_schema(
74+
tags=["Destruction list"],
6675
summary=_("Update destruction list"),
6776
description=_(
6877
"Update a destruction list. "
@@ -94,6 +103,7 @@
94103
],
95104
),
96105
partial_update=extend_schema(
106+
tags=["Destruction list"],
97107
summary=_("Partially update a destruction list"),
98108
description=_(
99109
"Partially update a destruction list. "
@@ -114,9 +124,17 @@
114124
],
115125
),
116126
retrieve=extend_schema(
127+
tags=["Destruction list"],
117128
summary=_("Retrieve destruction list"),
118129
description=_("Retrieve details about a destruction list."),
119-
responses={200: DestructionListResponseSerializer},
130+
responses={200: DestructionListAPIResponseSerializer},
131+
),
132+
make_requested_changes=extend_schema(
133+
tags=["Destruction list"],
134+
summary=_("Make requested changes"),
135+
description=_(
136+
"Update a destruction list after a reviewer has requested changes."
137+
),
120138
),
121139
)
122140
class DestructionListViewSet(
@@ -145,7 +163,7 @@ def get_permissions(self):
145163

146164
def get_serializer_class(self):
147165
if self.action in ["retrieve", "list"]:
148-
return DestructionListResponseSerializer
166+
return DestructionListAPIResponseSerializer
149167
return self.serializer_class
150168

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

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

184203
@extend_schema_view(
185204
list=extend_schema(
186-
summary=_("List destruction list reviews"),
205+
tags=["Reviews"],
206+
summary=_("List reviews"),
187207
description=_(
188208
"List all the reviews that have been made for a destruction list."
189209
),
190210
),
191211
create=extend_schema(
192-
summary=_("Create a destruction list review"),
212+
tags=["Reviews"],
213+
summary=_("Create review"),
193214
description=_(
194215
"Create a review for a destruction list. "
195216
"Only the user currently assigned to the destruction list can create a review."
@@ -206,9 +227,18 @@ class DestructionListReviewViewSet(
206227
filter_backends = (DjangoFilterBackend,)
207228
filterset_class = DestructionListReviewFilterset
208229

209-
def get_permissions(self):
210-
if self.action == "create":
211-
permission_classes = [IsAuthenticated & CanReviewPermission]
212-
else:
213-
permission_classes = [IsAuthenticated]
214-
return [permission() for permission in permission_classes]
230+
231+
@extend_schema_view(
232+
list=extend_schema(
233+
tags=["Reviews"],
234+
summary=_("List review items"),
235+
description=_(
236+
"List all the feedback to specific cases within a destruction list."
237+
),
238+
),
239+
)
240+
class DestructionListItemReviewViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
241+
serializer_class = DestructionListItemReviewSerializer
242+
queryset = DestructionListItemReview.objects.all()
243+
filter_backends = (DjangoFilterBackend,)
244+
filterset_class = DestructionListReviewItemFilterset

backend/src/openarchiefbeheer/destruction/constants.py

+5
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,8 @@ class ReviewDecisionChoices(models.TextChoices):
2626
class ListRole(models.TextChoices):
2727
reviewer = "reviewer", _("Reviewer")
2828
author = "author", _("Author")
29+
30+
31+
class DestructionListItemAction(models.TextChoices):
32+
keep = "keep", _("keep")
33+
remove = "remove", _("remove")

0 commit comments

Comments
 (0)