(backend) allow ordering items by creator full name

We want to order the item list by creator full_name. To ensure the
number of queries made is stable we assert it using
django_assert_num_queries
This commit is contained in:
Manuel Raynaud
2026-04-01 14:48:39 +02:00
parent b84ef76892
commit 1441b4fc07
3 changed files with 64 additions and 2 deletions
+1
View File
@@ -15,6 +15,7 @@ and this project adheres to
- 📝(doc) add local network setup documentation
- ✨(global) add custom columns feature with configurable grid columns
- 🔒️(frontend) prevent search engine indexing
- ✨(backend) allow ordering items by creator full name
### Changed
+1
View File
@@ -340,6 +340,7 @@ class ItemViewSet(
"title",
"type",
"updated_at",
"creator__full_name",
]
pagination_class = Pagination
permission_classes = [
@@ -73,7 +73,7 @@ def test_api_items_list_ordering_default():
assert operator.ge(results[i]["updated_at"], results[i + 1]["updated_at"])
def test_api_items_list_ordering_by_fields():
def test_api_items_list_ordering_by_fields(django_assert_num_queries):
"""It should be possible to order by several fields"""
user = factories.UserFactory()
client = APIClient()
@@ -81,6 +81,11 @@ def test_api_items_list_ordering_by_fields():
factories.ItemFactory.create_batch(4, users=[user], type=models.ItemTypeChoices.FOLDER)
# make a first fetch to put in cache some sql queries and have a constant number
# of queries later
with django_assert_num_queries(9):
client.get("/api/v1.0/items/")
for parameter in [
"created_at",
"-created_at",
@@ -95,7 +100,8 @@ def test_api_items_list_ordering_by_fields():
field = parameter.lstrip("-")
querystring = f"?ordering={parameter}"
response = client.get(f"/api/v1.0/items/{querystring:s}")
with django_assert_num_queries(5):
response = client.get(f"/api/v1.0/items/{querystring:s}")
assert response.status_code == 200
results = response.json()["results"]
assert len(results) == 4
@@ -160,3 +166,57 @@ def test_api_items_list_ordering_by_size():
assert results[0]["id"] == str(folder.id)
assert results[1]["id"] == str(file2.id)
assert results[2]["id"] == str(file1.id)
def test_api_items_list_ordering_by_creator_fullname(django_assert_num_queries):
"""Test ordering items by creator full_name"""
user1 = factories.UserFactory(full_name="Camille Clement", short_name="camille")
user2 = factories.UserFactory(full_name="Eva Roussel", short_name="Eva")
user3 = factories.UserFactory(full_name="Olivia Pierre", short_name="Olivia")
item1 = factories.ItemFactory(
creator=user1,
users=[(user1, "owner"), (user2, "editor"), (user3, "editor")],
type=models.ItemTypeChoices.FILE,
update_upload_state=models.ItemUploadStateChoices.READY,
)
item2 = factories.ItemFactory(
creator=user2,
users=[(user2, "owner"), (user1, "editor"), (user3, "editor")],
type=models.ItemTypeChoices.FILE,
update_upload_state=models.ItemUploadStateChoices.READY,
)
item3 = factories.ItemFactory(
creator=user3,
users=[(user3, "owner"), (user1, "editor"), (user2, "editor")],
type=models.ItemTypeChoices.FILE,
update_upload_state=models.ItemUploadStateChoices.READY,
)
client = APIClient()
client.force_login(user1)
with django_assert_num_queries(8):
response = client.get("/api/v1.0/items/?ordering=creator__full_name")
assert response.status_code == 200
results = response.json()["results"]
assert len(results) == 3
assert results[0]["id"] == str(item1.id)
assert results[1]["id"] == str(item2.id)
assert results[2]["id"] == str(item3.id)
with django_assert_num_queries(5):
response = client.get("/api/v1.0/items/?ordering=-creator__full_name")
assert response.status_code == 200
results = response.json()["results"]
assert len(results) == 3
assert results[0]["id"] == str(item3.id)
assert results[1]["id"] == str(item2.id)
assert results[2]["id"] == str(item1.id)