Skip to content

Commit 36d8a0b

Browse files
committed
feat(registrations): add ordering for registrations view
Refs: LINK-2173
1 parent 2f7abe8 commit 36d8a0b

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

registrations/api.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,17 @@ class RegistrationViewSet(
175175
serializer_class = RegistrationSerializer
176176
queryset = Registration.objects.all()
177177

178+
filter_backends = [
179+
filters.OrderingFilter,
180+
]
181+
ordering_fields = [
182+
"id",
183+
"event__start_time",
184+
]
185+
ordering = [
186+
"id",
187+
]
188+
178189
permission_classes = [CanAccessRegistration]
179190

180191
def get_serializer_context(self):
@@ -338,7 +349,7 @@ def filter_queryset(self, queryset):
338349

339350
# Copy query_params to get mutable version of it
340351
query_params = self.request.query_params.copy()
341-
# By default _filter_event_queryset only returns events with GENERAL type.
352+
# By default, _filter_event_queryset only returns events with GENERAL type.
342353
# This causes problem when getting a registration details, so filter registrations # noqa: E501
343354
# by event_type only when explicitly set
344355
if not query_params.get("event_type"):
@@ -353,9 +364,9 @@ def filter_queryset(self, queryset):
353364
events = Event.objects.none()
354365
else:
355366
events = self.request.user.get_editable_events_for_registration(events)
356-
registrations = Registration.objects.filter(event__in=events)
357367

358-
return registrations
368+
queryset = super().filter_queryset(queryset)
369+
return queryset.filter(event__in=events)
359370

360371
def get_serializer_class(self):
361372
if self.action == "send_message":

registrations/tests/test_registration_get.py

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
from collections import Counter
2+
from datetime import datetime
23
from decimal import Decimal
34
from unittest.mock import PropertyMock, patch
45

6+
import freezegun
57
import pytest
68
from django.conf import settings
79
from django.test import TestCase
10+
from django.utils.timezone import make_aware
811
from rest_framework import status
912

1013
from audit_log.models import AuditLogEntry
@@ -34,13 +37,13 @@
3437
# === util methods ===
3538

3639

37-
def get_list(api_client: APIClient, query_string: str = None):
40+
def get_list(api_client: APIClient, query_string: str = None, *args, **kwargs):
3841
url = reverse("registration-list")
3942

4043
if query_string:
4144
url = "%s?%s" % (url, query_string)
4245

43-
return api_client.get(url)
46+
return api_client.get(url, *args, **kwargs)
4447

4548

4649
def assert_registrations_in_response(
@@ -668,6 +671,42 @@ def test_registration_id_is_audit_logged_on_get_detail(user_api_client, registra
668671
]
669672

670673

674+
@pytest.mark.django_db
675+
def test_list_should_order_by_id_by_default(user_api_client):
676+
registration1 = RegistrationFactory()
677+
registration2 = RegistrationFactory()
678+
registration3 = RegistrationFactory()
679+
expected_order = [registration1, registration2, registration3]
680+
681+
response = get_list(user_api_client)
682+
assert response.status_code == status.HTTP_200_OK, response.json()
683+
684+
data = response.data["data"]
685+
assert [item["id"] for item in data] == [item.pk for item in expected_order]
686+
687+
688+
@freezegun.freeze_time("2024-01-01")
689+
@pytest.mark.django_db
690+
def test_list_should_order_by_event_start_time(user_api_client):
691+
registration_jun = RegistrationFactory(
692+
event=EventFactory(start_time=make_aware(datetime(2024, 6, 1)))
693+
)
694+
registration_jan = RegistrationFactory(
695+
event=EventFactory(start_time=make_aware(datetime(2024, 1, 1)))
696+
)
697+
registration_dec = RegistrationFactory(
698+
event=EventFactory(start_time=make_aware(datetime(2024, 12, 1)))
699+
)
700+
expected_order = [registration_dec, registration_jun, registration_jan]
701+
702+
response = get_list(user_api_client, data={"sort": "-event__start_time"})
703+
704+
assert response.status_code == status.HTTP_200_OK, response.json()
705+
706+
data = response.data["data"]
707+
assert [item["id"] for item in data] == [item.pk for item in expected_order]
708+
709+
671710
@pytest.mark.django_db
672711
def test_registration_id_is_audit_logged_on_get_list(
673712
user_api_client, registration, registration2

0 commit comments

Comments
 (0)