Skip to content

Commit ede1bab

Browse files
authored
fix(issue-views): Update endpoint to sort null last_visited values correctly (#89945)
Sorting by recently viewed was putting null values at the top, which is not the intended result. this ensure that last_visited desc sorts null values at the bottom, and the opposite for ascending.
1 parent 9c29557 commit ede1bab

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

src/sentry/issues/endpoints/organization_group_search_views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.contrib.auth.models import AnonymousUser
22
from django.db import IntegrityError, router, transaction
3-
from django.db.models import Count, Q
3+
from django.db.models import Count, F, Q
44
from rest_framework import serializers, status
55
from rest_framework.request import Request
66
from rest_framework.response import Response
@@ -37,8 +37,8 @@ class MemberPermission(OrganizationPermission):
3737
SORT_MAP = {
3838
"popularity": "popularity",
3939
"-popularity": "-popularity",
40-
"visited": "groupsearchviewlastvisited__last_visited",
41-
"-visited": "-groupsearchviewlastvisited__last_visited",
40+
"visited": F("groupsearchviewlastvisited__last_visited").asc(nulls_first=True),
41+
"-visited": F("groupsearchviewlastvisited__last_visited").desc(nulls_last=True),
4242
"name": "name",
4343
"-name": "-name",
4444
"created": "date_added",

tests/sentry/issues/endpoints/test_organization_group_search_views.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,25 +1214,27 @@ def test_sort_by_default_last_seen(self) -> None:
12141214
)
12151215
view_2 = self.create_view(user=self.user_1, last_visited=timezone.now() - timedelta(days=1))
12161216
view_3 = self.create_view(user=self.user_1, last_visited=timezone.now() - timedelta(days=2))
1217+
view_4 = self.create_view(user=self.user_1, last_visited=None)
12171218

12181219
response = self.client.get(self.url, {"createdBy": "me"})
12191220
assert response.status_code == 200
1220-
assert len(response.data) == 3
1221+
assert len(response.data) == 4
12211222
# ============= Starred views =============
12221223
assert response.data[0]["id"] == str(view_1.id), response.data[0]["starred"]
12231224
# ============= Non-starred views =============
12241225
assert response.data[1]["id"] == str(view_2.id), not response.data[1]["starred"]
12251226
assert response.data[2]["id"] == str(view_3.id), not response.data[2]["starred"]
1226-
1227+
assert response.data[3]["id"] == str(view_4.id), not response.data[3]["starred"]
12271228
response = self.client.get(self.url, {"createdBy": "me", "sort": "visited"})
12281229

12291230
assert response.status_code == 200
1230-
assert len(response.data) == 3
1231+
assert len(response.data) == 4
12311232
# ============= Starred views =============
12321233
assert response.data[0]["id"] == str(view_1.id), response.data[0]["starred"]
12331234
# ============= Non-starred views =============
1234-
assert response.data[1]["id"] == str(view_3.id), not response.data[1]["starred"]
1235-
assert response.data[2]["id"] == str(view_2.id), not response.data[2]["starred"]
1235+
assert response.data[1]["id"] == str(view_4.id), not response.data[1]["starred"]
1236+
assert response.data[2]["id"] == str(view_3.id), not response.data[2]["starred"]
1237+
assert response.data[3]["id"] == str(view_2.id), not response.data[3]["starred"]
12361238

12371239
@with_feature({"organizations:issue-stream-custom-views": True})
12381240
@with_feature({"organizations:global-views": True})

0 commit comments

Comments
 (0)