Skip to content

Commit 217ace4

Browse files
#497 - feat: only show co-review statuses of co reviews completed after last review response
1 parent 752569c commit 217ace4

File tree

2 files changed

+99
-2
lines changed

2 files changed

+99
-2
lines changed

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

+19-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from django.db.models import Case, F, QuerySet, Value, When
1+
from django.db.models import Case, DateField, F, Max, Q, QuerySet, Value, When
22
from django.utils.translation import gettext_lazy as _
33

44
from django_filters import (
@@ -143,7 +143,24 @@ class Meta:
143143
def filter_destruction_list_uuid(
144144
self, queryset: QuerySet[DestructionListReview], name: str, value: str
145145
):
146-
return queryset.filter(destruction_list__uuid=value)
146+
"""
147+
Return CoReview objects which
148+
- associated DestructionList has no DestructionListReview
149+
- associated DestructionList has no ReviewResponse associated with its DestructionListReview
150+
- was created after the creation date of the ReviewResponse associated with the DestructionListReview
151+
associated with the DestructionList
152+
"""
153+
qs = queryset.annotate(
154+
last_review_response_date=Max(
155+
"destruction_list__reviews__responses__created",
156+
output_field=DateField(),
157+
)
158+
).filter(
159+
Q(last_review_response_date__isnull=True)
160+
| Q(created__gte=F("last_review_response_date")),
161+
destruction_list__uuid=value,
162+
)
163+
return qs
147164

148165

149166
class ReviewResponseFilterset(FilterSet):

backend/src/openarchiefbeheer/destruction/tests/endpoints/test_co_reviews.py

+80
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
DestructionListAssigneeFactory,
1313
DestructionListCoReviewFactory,
1414
DestructionListFactory,
15+
ReviewResponseFactory,
1516
)
1617

1718

@@ -52,6 +53,85 @@ def test_list_filter_destruction_list__uuid(self):
5253
self.assertEqual(len(response.data), 1)
5354
self.assertEqual(response.data[0]["pk"], co_review_related.pk)
5455

56+
def test_list_after_review_response(self):
57+
destruction_list = DestructionListFactory.create(
58+
status=ListStatus.ready_to_review
59+
)
60+
# Co review response created on date 1 chronologically
61+
co_review_date_1 = DestructionListCoReviewFactory.create(
62+
destruction_list=destruction_list
63+
)
64+
co_review_date_1.created = "1988-08-02T08:30:00+01:00"
65+
co_review_date_1.save()
66+
67+
# Review response created on date 2 chronologically
68+
review_response_date_2 = ReviewResponseFactory.create(
69+
review__destruction_list=destruction_list,
70+
)
71+
review_response_date_2.created = "1990-10-31T00:00:00+01:00"
72+
review_response_date_2.save()
73+
74+
# Co review created on date 3 chronologically
75+
co_review_date_3 = DestructionListCoReviewFactory.create(
76+
destruction_list=destruction_list
77+
)
78+
co_review_date_3.created = "2023-09-15T21:36:00+01:00"
79+
co_review_date_3.save()
80+
81+
# Unrelated review response created now (date 4 chronologically, should not exclude co_review_date_3)
82+
ReviewResponseFactory.create()
83+
84+
user = UserFactory()
85+
86+
self.client.force_login(user)
87+
url = reverse("api:destruction-list-co-reviews-list")
88+
response = self.client.get(
89+
furl(url, args={"destruction_list__uuid": destruction_list.uuid}).url
90+
)
91+
self.assertEqual(response.status_code, status.HTTP_200_OK)
92+
self.assertEqual(len(response.data), 1)
93+
self.assertEqual(response.data[0]["pk"], co_review_date_3.pk)
94+
95+
def test_list_after_review_response_multiple(self):
96+
destruction_list = DestructionListFactory.create(
97+
status=ListStatus.ready_to_review
98+
)
99+
# Co review response created on date 1 chronologically
100+
co_review_date_1 = DestructionListCoReviewFactory.create(
101+
destruction_list=destruction_list
102+
)
103+
co_review_date_1.created = "1988-08-02T08:30:00+01:00"
104+
co_review_date_1.save()
105+
106+
# Review response created now (date 4 chronologically, should exclude co_review_date_3)
107+
ReviewResponseFactory.create(
108+
review__destruction_list=destruction_list,
109+
)
110+
111+
# Review response created on date 2 chronologically
112+
review_response_date_2 = ReviewResponseFactory.create(
113+
review__destruction_list=destruction_list,
114+
)
115+
review_response_date_2.created = "1990-10-31T00:00:00+01:00"
116+
review_response_date_2.save()
117+
118+
# Co review created on date 3 chronologically
119+
co_review_date_3 = DestructionListCoReviewFactory.create(
120+
destruction_list=destruction_list
121+
)
122+
co_review_date_3.created = "2023-09-15T21:36:00+01:00"
123+
co_review_date_3.save()
124+
125+
user = UserFactory()
126+
127+
self.client.force_login(user)
128+
url = reverse("api:destruction-list-co-reviews-list")
129+
response = self.client.get(
130+
furl(url, args={"destruction_list__uuid": destruction_list.uuid}).url
131+
)
132+
self.assertEqual(response.status_code, status.HTTP_200_OK)
133+
self.assertEqual(len(response.data), 0)
134+
55135
def test_create_not_logged_in(self):
56136
co_reviewer = DestructionListAssigneeFactory.create(role=ListRole.co_reviewer)
57137
destruction_list = DestructionListFactory.create(

0 commit comments

Comments
 (0)