Skip to content

Commit ac0c97a

Browse files
committed
✨(backend) sort favorite docs by last updated
Sort favorite_list results by updated_at property descending. Signed-off-by: Paul Vernin <paul.vernin@gmail.com>
1 parent 7f9869f commit ac0c97a

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to
99
### Changed
1010

1111
- ♿(frontend) use aria-haspopup menu on DropButton triggers #2126
12+
- ✨(backend) Order pinned documents by last updated at
1213

1314
## [v4.8.4] - 2026-03-25
1415

src/backend/core/api/viewsets.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,7 @@ def favorite_list(self, request, *args, **kwargs):
829829
queryset = self.queryset.filter(path_list)
830830
queryset = queryset.filter(id__in=favorite_documents_ids)
831831
queryset = queryset.filter(ancestors_deleted_at__isnull=True)
832+
queryset = queryset.order_by("-updated_at")
832833
queryset = queryset.annotate_user_roles(user)
833834
queryset = queryset.annotate(
834835
is_favorite=db.Value(True, output_field=db.BooleanField())

src/backend/core/tests/documents/test_api_documents_favorite_list.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
"""Test for the document favorite_list endpoint."""
22

3+
from datetime import timedelta
4+
5+
from django.utils import timezone
6+
37
import pytest
48
from rest_framework.test import APIClient
59

@@ -116,6 +120,48 @@ def test_api_document_favorite_list_with_favorite_children():
116120
assert content[2]["id"] == str(access.document.id)
117121

118122

123+
def test_api_document_favorite_list_sorted_by_updated_at():
124+
"""
125+
Authenticated users should receive their favorite documents including children
126+
sorted by last updated_at timestamp.
127+
"""
128+
user = factories.UserFactory()
129+
client = APIClient()
130+
client.force_login(user)
131+
132+
root = factories.DocumentFactory(creator=user, users=[user])
133+
children = factories.DocumentFactory.create_batch(
134+
2, parent=root, favorited_by=[user]
135+
)
136+
137+
access = factories.UserDocumentAccessFactory(
138+
user=user, role=models.RoleChoices.READER, document__favorited_by=[user]
139+
)
140+
141+
other_root = factories.DocumentFactory(creator=user, users=[user])
142+
factories.DocumentFactory.create_batch(2, parent=other_root)
143+
144+
now = timezone.now()
145+
146+
models.Document.objects.filter(pk=children[0].pk).update(
147+
updated_at=now + timedelta(seconds=2)
148+
)
149+
models.Document.objects.filter(pk=children[1].pk).update(
150+
updated_at=now + timedelta(seconds=3)
151+
)
152+
153+
response = client.get("/api/v1.0/documents/favorite_list/")
154+
155+
assert response.status_code == 200
156+
assert response.json()["count"] == 3
157+
158+
content = response.json()["results"]
159+
160+
assert content[0]["id"] == str(children[1].id)
161+
assert content[1]["id"] == str(children[0].id)
162+
assert content[2]["id"] == str(access.document.id)
163+
164+
119165
def test_api_document_favorite_list_with_deleted_child():
120166
"""
121167
Authenticated users should not see deleted documents in their favorite list.

0 commit comments

Comments
 (0)