diff --git a/backend/endpoints/responses/rom.py b/backend/endpoints/responses/rom.py index 2644c6db8..bb5b3fc95 100644 --- a/backend/endpoints/responses/rom.py +++ b/backend/endpoints/responses/rom.py @@ -246,6 +246,7 @@ class RomSchema(BaseModel): fs_size_bytes: int name: str | None + sort_name: str | None slug: str | None summary: str | None diff --git a/backend/endpoints/roms/__init__.py b/backend/endpoints/roms/__init__.py index 6374a4436..d3d1cb0e2 100644 --- a/backend/endpoints/roms/__init__.py +++ b/backend/endpoints/roms/__init__.py @@ -131,6 +131,7 @@ class RomUpdateForm(BaseModel): default=None, description="Raw manual metadata as JSON string." ) name: str | None = None + sort_name: str | None = None summary: str | None = None fs_name: str | None = None url_cover: str | None = None @@ -190,6 +191,7 @@ async def parse_rom_update_form( raw_hltb_metadata: str | None = Form(default=None), raw_manual_metadata: str | None = Form(default=None), name: str | None = Form(default=None), + sort_name: str | None = Form(default=None), summary: str | None = Form(default=None), fs_name: str | None = Form(default=None), url_cover: str | None = Form(default=None), @@ -218,6 +220,7 @@ async def parse_rom_update_form( "raw_hltb_metadata": raw_hltb_metadata, "raw_manual_metadata": raw_manual_metadata, "name": name, + "sort_name": sort_name, "summary": summary, "fs_name": fs_name, "url_cover": url_cover, @@ -1108,6 +1111,7 @@ async def update_rom( "hltb_id": None, "libretro_id": None, "name": rom.fs_name, + "sort_name": None, "summary": "", "url_screenshots": [], "path_screenshots": [], @@ -1294,6 +1298,11 @@ async def update_rom( cleaned_data.update( { "name": form_data.name if "name" in provided_fields else rom.name, + "sort_name": ( + form_data.sort_name or None + if "sort_name" in provided_fields + else rom.sort_name + ), "summary": ( form_data.summary if "summary" in provided_fields else rom.summary ), diff --git a/backend/tests/endpoints/roms/test_rom.py b/backend/tests/endpoints/roms/test_rom.py index 498c5593b..7ec264b5d 100644 --- a/backend/tests/endpoints/roms/test_rom.py +++ b/backend/tests/endpoints/roms/test_rom.py @@ -74,6 +74,7 @@ def test_update_rom( data={ "igdb_id": str(MOCK_IGDB_ID), "name": "Metroid Prime Remastered", + "sort_name": "Metroid Prime", "slug": "metroid-prime-remastered", "fs_name": "Metroid Prime Remastered.zip", "summary": "summary test", @@ -99,6 +100,7 @@ def test_update_rom( body = response.json() assert body["fs_name"] == "Metroid Prime Remastered.zip" + assert body["sort_name"] == "Metroid Prime" assert rename_fs_rom_mock.called assert get_rom_by_id_mock.called @@ -420,7 +422,10 @@ class TestUpdateMetadataIDs: response = client.put( f"/api/roms/{rom.id}", headers={"Authorization": f"Bearer {access_token}"}, - data={"igdb_id": str(MOCK_IGDB_ID)}, + data={ + "igdb_id": str(MOCK_IGDB_ID), + "sort_name": "Imported sort title", + }, ) assert response.status_code == status.HTTP_200_OK @@ -1101,7 +1106,10 @@ class TestUnmatchMetadata: initial_response = client.put( f"/api/roms/{rom.id}", headers={"Authorization": f"Bearer {access_token}"}, - data={"igdb_id": str(MOCK_IGDB_ID)}, + data={ + "igdb_id": str(MOCK_IGDB_ID), + "sort_name": "Imported sort title", + }, ) assert initial_response.status_code == status.HTTP_200_OK assert get_rom_by_id_mock.called @@ -1109,6 +1117,7 @@ class TestUnmatchMetadata: initial_body = initial_response.json() assert initial_body["igdb_id"] == MOCK_IGDB_ID assert initial_body["igdb_metadata"] is not None + assert initial_body["sort_name"] == "Imported sort title" # Now unmatch all metadata response = client.put( @@ -1131,6 +1140,7 @@ class TestUnmatchMetadata: assert body["hltb_id"] is None assert body["name"] == rom.fs_name + assert body["sort_name"] is None assert body["summary"] == "" assert body["url_cover"] == "" assert body["slug"] == "" diff --git a/frontend/src/__generated__/models/Body_update_rom_api_roms__id__put.ts b/frontend/src/__generated__/models/Body_update_rom_api_roms__id__put.ts index 1a58f7fa6..ff4263ccb 100644 --- a/frontend/src/__generated__/models/Body_update_rom_api_roms__id__put.ts +++ b/frontend/src/__generated__/models/Body_update_rom_api_roms__id__put.ts @@ -27,9 +27,9 @@ export type Body_update_rom_api_roms__id__put = { raw_hltb_metadata?: (string | null); raw_manual_metadata?: (string | null); name?: (string | null); + sort_name?: (string | null); summary?: (string | null); fs_name?: (string | null); url_cover?: (string | null); url_manual?: (string | null); }; - diff --git a/frontend/src/__generated__/models/DetailedRomSchema.ts b/frontend/src/__generated__/models/DetailedRomSchema.ts index f3015098f..f0ffa3692 100644 --- a/frontend/src/__generated__/models/DetailedRomSchema.ts +++ b/frontend/src/__generated__/models/DetailedRomSchema.ts @@ -47,6 +47,7 @@ export type DetailedRomSchema = { fs_path: string; fs_size_bytes: number; name: (string | null); + sort_name: (string | null); slug: (string | null); summary: (string | null); alternative_names: Array; @@ -99,4 +100,3 @@ export type DetailedRomSchema = { user_collections: Array; all_user_notes: Array; }; - diff --git a/frontend/src/__generated__/models/SimpleRomSchema.ts b/frontend/src/__generated__/models/SimpleRomSchema.ts index 920e2e5db..5cb8e5d6c 100644 --- a/frontend/src/__generated__/models/SimpleRomSchema.ts +++ b/frontend/src/__generated__/models/SimpleRomSchema.ts @@ -40,6 +40,7 @@ export type SimpleRomSchema = { fs_path: string; fs_size_bytes: number; name: (string | null); + sort_name: (string | null); slug: (string | null); summary: (string | null); alternative_names: Array; @@ -85,4 +86,3 @@ export type SimpleRomSchema = { merged_ra_metadata: (RomRAMetadata | null); sibling_ids: Array; }; - diff --git a/frontend/src/components/common/Game/Dialog/EditRom.vue b/frontend/src/components/common/Game/Dialog/EditRom.vue index 5cc42d0cc..f63b9dd21 100644 --- a/frontend/src/components/common/Game/Dialog/EditRom.vue +++ b/frontend/src/components/common/Game/Dialog/EditRom.vue @@ -312,6 +312,14 @@ function handleRomUpdateFromMetadata(updatedRom: UpdateRom) { variant="outlined" class="my-4" /> + [] = [ ["name", rom.name], + ["sort_name", rom.sort_name], ["fs_name", rom.fs_name], ["summary", rom.summary], ["igdb_id", toFormIdValue(rom.igdb_id)],