Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 17 additions & 7 deletions goosebit/ui/bff/software/responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from tortoise.queryset import QuerySet

from goosebit.schema.software import SoftwareSchema
from goosebit.ui.bff.common.requests import DataTableRequest

from ..common.requests import DataTableOrderDirection, DataTableRequest


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

filtered_records = await query.count()

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

# if no ordering is specified, database-side paging can be used
if dt_query.length is not None:
query = query.limit(dt_query.length)
# in-memory paging
if dt_query.length is None:
software = software[dt_query.start :]
else:
software = software[dt_query.start : dt_query.start + dt_query.length]

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

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

return cls(data=data, draw=dt_query.draw, records_total=total_records, records_filtered=filtered_records)
12 changes: 6 additions & 6 deletions tests/unit/ui/bff/software/test_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ async def test_list_software_version_asc(async_client, test_data):
assert response.status_code == 200
software = response.json()["data"]
assert len(software) == 3
assert software[0]["version"] == test_data["software_release"].version
assert software[1]["version"] == test_data["software_beta"].version
assert software[2]["version"] == test_data["software_rc"].version
assert software[0]["version"] == test_data["software_beta"].version
assert software[1]["version"] == test_data["software_rc"].version
assert software[2]["version"] == test_data["software_release"].version


@pytest.mark.asyncio
Expand All @@ -20,6 +20,6 @@ async def test_list_software_version_desc(async_client, test_data):
assert response.status_code == 200
software = response.json()["data"]
assert len(software) == 3
assert software[0]["version"] == test_data["software_rc"].version
assert software[1]["version"] == test_data["software_beta"].version
assert software[2]["version"] == test_data["software_release"].version
assert software[0]["version"] == test_data["software_release"].version
assert software[1]["version"] == test_data["software_rc"].version
assert software[2]["version"] == test_data["software_beta"].version
Loading