From 3247b691f858057ac4dd70d2727445b4f0b24645 Mon Sep 17 00:00:00 2001 From: Brian Pepple Date: Fri, 16 Oct 2026 11:26:57 -0400 Subject: [PATCH] Fix attribution source enum colliding with reading list enum The ENUM_NAME_OVERRIDES entry added for resource attribution sources used the name AttributionSourceEnum. drf-spectacular already generates that name for the reading list's attribution_source field, so the override took it over. The reading list's writable attribution_source ended up referencing the Marvel/Wikipedia/GCD/DC choices instead of CBRO/CMRO/etc., and spectacular gave no warning. Rename the resource attribution enum to ResourceAttributionSourceEnum and fix the reading list enum to its original name so a future override can't silently take it. Extend the schema test to check both enums. --- metron/settings.py | 4 +++- tests/comicsdb/test_api_attribution.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/metron/settings.py b/metron/settings.py index c71971fc..d8444c34 100644 --- a/metron/settings.py +++ b/metron/settings.py @@ -344,7 +344,9 @@ "url": "https://creativecommons.org/licenses/by-sa/4.0/", }, "ENUM_NAME_OVERRIDES": { - "AttributionSourceEnum": "api.v1_0.serializers.attribution.SOURCE_CHOICES", + # Pin the reading list's enum so the resource attribution enum below can't claim its name. + "AttributionSourceEnum": "reading_lists.models.ReadingList.AttributionSource", + "ResourceAttributionSourceEnum": "api.v1_0.serializers.attribution.SOURCE_CHOICES", "CurrencyEnum": "metron.choices.CURRENCY_CHOICES", "DesiredGradeEnum": "user_collection.models.GRADE_CHOICES", }, diff --git a/tests/comicsdb/test_api_attribution.py b/tests/comicsdb/test_api_attribution.py index 383b1bf8..c51c5eac 100644 --- a/tests/comicsdb/test_api_attribution.py +++ b/tests/comicsdb/test_api_attribution.py @@ -14,6 +14,7 @@ from api.cache import ModelLabel, get_model_version from api.v1_0.serializers.attribution import SOURCE_NAMES from comicsdb.models import Attribution, Character, Publisher, Rating +from reading_lists.models import ReadingList # (fixture name, API basename) for every resource whose detail response embeds attribution. ATTRIBUTED_RESOURCES = [ @@ -248,8 +249,10 @@ def test_attribution_queryset_delete_bumps_each_parent_once(batman, superman, lo def test_schema_names_attribution_source_enum(db): schemas = SchemaGenerator().get_schema(request=None, public=True)["components"]["schemas"] - assert schemas["AttributionSourceEnum"]["enum"] == list(SOURCE_NAMES.values()) + assert schemas["ResourceAttributionSourceEnum"]["enum"] == list(SOURCE_NAMES.values()) assert "SourceEnum" not in schemas + # The reading list's attribution_source enum keeps its name and its own choices. + assert schemas["AttributionSourceEnum"]["enum"] == ReadingList.AttributionSource.values def test_unknown_source_code_falls_back_to_stored_value(