Skip to content

Commit 47fb73a

Browse files
committed
bug(regression): fix software version sorting
1 parent bcb9e82 commit 47fb73a

2 files changed

Lines changed: 23 additions & 13 deletions

File tree

goosebit/ui/bff/software/responses.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from tortoise.queryset import QuerySet
66

77
from goosebit.schema.software import SoftwareSchema
8-
from goosebit.ui.bff.common.requests import DataTableRequest
8+
9+
from ..common.requests import DataTableOrderDirection, DataTableRequest
910

1011

1112
class BFFSoftwareResponse(BaseModel):
@@ -23,15 +24,24 @@ async def convert(cls, dt_query: DataTableRequest, query: QuerySet, search_filte
2324

2425
filtered_records = await query.count()
2526

26-
if dt_query.order_query:
27-
query = query.order_by(dt_query.order_query)
27+
if len(dt_query.order) > 0 and dt_query.order[0].name == "version":
28+
# ordering cannot be delegated to database as semantic versioning sorting is not supported
29+
software = await query.all()
30+
reverse = dt_query.order[0].dir == DataTableOrderDirection.DESCENDING
31+
software.sort(key=lambda s: s.parsed_version, reverse=reverse)
2832

29-
# if no ordering is specified, database-side paging can be used
30-
if dt_query.length is not None:
31-
query = query.limit(dt_query.length)
33+
# in-memory paging
34+
if dt_query.length is None:
35+
software = software[dt_query.start :]
36+
else:
37+
software = software[dt_query.start : dt_query.start + dt_query.length]
3238

33-
software = await query.offset(dt_query.start).all()
39+
else:
40+
# if no ordering is specified, database-side paging can be used
41+
if dt_query.length is not None:
42+
query = query.limit(dt_query.length)
3443

44+
software = await query.offset(dt_query.start).all()
3545
data = [SoftwareSchema.model_validate(s) for s in software]
3646

3747
return cls(data=data, draw=dt_query.draw, records_total=total_records, records_filtered=filtered_records)

tests/unit/ui/bff/software/test_routes.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ async def test_list_software_version_asc(async_client, test_data):
88
assert response.status_code == 200
99
software = response.json()["data"]
1010
assert len(software) == 3
11-
assert software[0]["version"] == test_data["software_release"].version
12-
assert software[1]["version"] == test_data["software_beta"].version
13-
assert software[2]["version"] == test_data["software_rc"].version
11+
assert software[0]["version"] == test_data["software_beta"].version
12+
assert software[1]["version"] == test_data["software_rc"].version
13+
assert software[2]["version"] == test_data["software_release"].version
1414

1515

1616
@pytest.mark.asyncio
@@ -20,6 +20,6 @@ async def test_list_software_version_desc(async_client, test_data):
2020
assert response.status_code == 200
2121
software = response.json()["data"]
2222
assert len(software) == 3
23-
assert software[0]["version"] == test_data["software_rc"].version
24-
assert software[1]["version"] == test_data["software_beta"].version
25-
assert software[2]["version"] == test_data["software_release"].version
23+
assert software[0]["version"] == test_data["software_release"].version
24+
assert software[1]["version"] == test_data["software_rc"].version
25+
assert software[2]["version"] == test_data["software_beta"].version

0 commit comments

Comments
 (0)