Skip to content

Commit 2a79e7b

Browse files
matti-lamppuranta
authored andcommitted
Add reservation deny reason rank and ordering filter
1 parent 7065768 commit 2a79e7b

4 files changed

Lines changed: 68 additions & 20 deletions

File tree

api/graphql/types/reservation_deny_reason/filtersets.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.db import models
12
from graphene_django_extensions import ModelFilterSet
23
from graphene_django_extensions.filters import IntMultipleChoiceFilter
34

@@ -16,3 +17,10 @@ class Meta:
1617
fields = [
1718
"reason",
1819
]
20+
order_by = [
21+
"rank",
22+
]
23+
24+
@staticmethod
25+
def order_by_rank(qs: models.QuerySet, desc: bool) -> models.QuerySet:
26+
return qs.order_by(models.OrderBy(models.F("rank"), descending=desc, nulls_last=True))
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 5.0.6 on 2024-06-12 08:26
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("reservations", "0077_alter_reservationstatistic_reservee_type"),
9+
]
10+
11+
operations = [
12+
migrations.AlterModelOptions(
13+
name="reservationdenyreason",
14+
options={"base_manager_name": "objects", "ordering": ["rank"]},
15+
),
16+
migrations.AddField(
17+
model_name="reservationdenyreason",
18+
name="rank",
19+
field=models.PositiveBigIntegerField(blank=True, db_index=True, null=True),
20+
),
21+
]

reservations/models/reservation_deny_reason.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77

88
class ReservationDenyReason(models.Model):
9-
reason = models.CharField(max_length=255, null=False, blank=False)
9+
rank: int | None = models.PositiveBigIntegerField(null=True, blank=True, db_index=True)
10+
reason: str = models.CharField(max_length=255)
1011

1112
# Translated field hints
1213
reason_fi: str | None
@@ -17,7 +18,7 @@ class Meta:
1718
db_table = "reservation_deny_reason"
1819
base_manager_name = "objects"
1920
ordering = [
20-
"pk",
21+
"rank",
2122
]
2223

2324
def __str__(self) -> str:
Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
1+
from functools import partial
2+
13
import pytest
24
from graphene_django_extensions.testing import build_query
35

46
from tests.factories import ReservationDenyReasonFactory
5-
from tests.helpers import UserType
67

78
# Applied to all tests
89
pytestmark = [
910
pytest.mark.django_db,
1011
]
1112

1213

14+
deny_query = partial(build_query, "reservationDenyReasons", connection=True)
15+
16+
1317
def test_reservation_deny_reasons__query(graphql):
1418
deny_reason = ReservationDenyReasonFactory.create()
1519

16-
graphql.login_user_based_on_type(UserType.SUPERUSER)
20+
graphql.login_with_superuser()
1721

18-
fields = """
19-
pk
20-
reasonFi
21-
reasonEn
22-
reasonSv
23-
"""
24-
query = build_query("reservationDenyReasons", fields=fields, connection=True)
22+
query = deny_query(fields="pk reasonFi reasonEn reasonSv")
2523
response = graphql(query)
2624

2725
assert response.has_errors is False
@@ -38,15 +36,35 @@ def test_reservation_deny_reasons__query(graphql):
3836
def test_reservation_deny_reasons__query__anonymous_user(graphql):
3937
ReservationDenyReasonFactory.create()
4038

41-
graphql.login_user_based_on_type(UserType.ANONYMOUS)
42-
43-
fields = """
44-
pk
45-
reasonFi
46-
reasonEn
47-
reasonSv
48-
"""
49-
query = build_query("reservationDenyReasons", fields=fields, connection=True)
39+
query = deny_query()
5040
response = graphql(query)
5141

5242
assert response.error_message() == "No permission to access node."
43+
44+
45+
def test_reservation_deny_reasons__order__by_rank(graphql):
46+
deny_reason_1 = ReservationDenyReasonFactory.create(rank=1)
47+
deny_reason_2 = ReservationDenyReasonFactory.create(rank=3)
48+
deny_reason_3 = ReservationDenyReasonFactory.create(rank=2)
49+
50+
graphql.login_with_superuser()
51+
52+
query = deny_query(order_by="rankAsc")
53+
response = graphql(query)
54+
55+
assert response.has_errors is False
56+
57+
assert len(response.edges) == 3
58+
assert response.node(0) == {"pk": deny_reason_1.pk}
59+
assert response.node(1) == {"pk": deny_reason_3.pk}
60+
assert response.node(2) == {"pk": deny_reason_2.pk}
61+
62+
query = deny_query(order_by="rankDesc")
63+
response = graphql(query)
64+
65+
assert response.has_errors is False
66+
67+
assert len(response.edges) == 3
68+
assert response.node(0) == {"pk": deny_reason_2.pk}
69+
assert response.node(1) == {"pk": deny_reason_3.pk}
70+
assert response.node(2) == {"pk": deny_reason_1.pk}

0 commit comments

Comments
 (0)