From ecdfb91b25bb87b4e1f98ae1b8dbbbd494e39588 Mon Sep 17 00:00:00 2001 From: Julien Marcon Date: Thu, 25 Jun 2026 22:10:22 +0200 Subject: [PATCH 1/2] For pokemon with gender_rate=8 (exclusively female), fill null female sprite keys with their default counterparts across all sprite sections. --- pokemon_v2/api.py | 5 +++++ pokemon_v2/serializers.py | 25 ++++++++++++++++++++++++- pokemon_v2/tests.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/pokemon_v2/api.py b/pokemon_v2/api.py index cf0b7052c..53ff64919 100644 --- a/pokemon_v2/api.py +++ b/pokemon_v2/api.py @@ -754,6 +754,11 @@ class PokemonResource(PokeapiCommonViewset): serializer_class = PokemonDetailSerializer list_serializer_class = PokemonSummarySerializer + def get_queryset(self): + if self.action == "retrieve": + return Pokemon.objects.all().select_related("pokemon_species") + return super().get_queryset() + @extend_schema( description="A Pokémon Species forms the basis for at least one Pokémon. Attributes of a Pokémon species are shared across all varieties of Pokémon within the species. A good example is Wormadam; Wormadam is the species which can be found in three different varieties, Wormadam-Trash, Wormadam-Sandy and Wormadam-Plant.", diff --git a/pokemon_v2/serializers.py b/pokemon_v2/serializers.py index 81c56b581..eebca1b51 100644 --- a/pokemon_v2/serializers.py +++ b/pokemon_v2/serializers.py @@ -4418,7 +4418,30 @@ class Meta: ) def get_pokemon_sprites(self, obj): sprites_object = PokemonSprites.objects.get(pokemon_id=obj) - return sprites_object.sprites + sprites = sprites_object.sprites + if obj.pokemon_species.gender_rate == 8: + self._fill_female_sprites(sprites) + return sprites + + _FEMALE_FALLBACKS = { + "front_female": "front_default", + "back_female": "back_default", + "front_shiny_female": "front_shiny", + "back_shiny_female": "back_shiny", + } + + def _fill_female_sprites(self, node): + if not isinstance(node, dict): + return + for female_key, default_key in self._FEMALE_FALLBACKS.items(): + if ( + female_key in node + and node[female_key] is None + and node.get(default_key) is not None + ): + node[female_key] = node[default_key] + for value in node.values(): + self._fill_female_sprites(value) @extend_schema_field( field={ diff --git a/pokemon_v2/tests.py b/pokemon_v2/tests.py index 57086e188..d84fd6844 100644 --- a/pokemon_v2/tests.py +++ b/pokemon_v2/tests.py @@ -5257,6 +5257,36 @@ def test_pokemon_api(self): self.assertEqual(response.data["count"], 1) self.assertEqual(response.data["results"][0]["name"], pokemon.name) + def test_pokemon_api_female_only_sprites_fallback(self): + pokemon_species = self.setup_pokemon_species_data( + name="female only pkmn spcs", gender_rate=8 + ) + pokemon = self.setup_pokemon_data( + pokemon_species=pokemon_species, name="female only pkmn" + ) + self.setup_pokemon_form_data(pokemon=pokemon, name="female only pkmn form") + pokemon_sprites = self.setup_pokemon_sprites_data( + pokemon=pokemon, front_default=True, front_female=False + ) + self.setup_pokemon_cries_data(pokemon, latest=True, legacy=True) + + response = self.client.get( + "{}/pokemon/{}/".format(API_V2, pokemon.pk), headers={"host": "testserver"} + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + sprites_data = json.loads(pokemon_sprites.sprites) + response_sprites = json.loads(response.data["sprites"]) + + self.assertIsNotNone(response_sprites["front_default"]) + self.assertEqual( + response_sprites["front_female"], response_sprites["front_default"] + ) + self.assertEqual( + response_sprites["other"]["showdown"]["front_female"], + response_sprites["other"]["showdown"]["front_default"], + ) + def test_pokemon_form_api(self): pokemon_species = self.setup_pokemon_species_data() pokemon = self.setup_pokemon_data(pokemon_species=pokemon_species) From 416c268210dfe90ebb743eada3033d1167e0cc8f Mon Sep 17 00:00:00 2001 From: Julien Marcon Date: Fri, 26 Jun 2026 08:07:32 +0200 Subject: [PATCH 2/2] test --- pokemon_v2/serializers.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pokemon_v2/serializers.py b/pokemon_v2/serializers.py index eebca1b51..3493187b2 100644 --- a/pokemon_v2/serializers.py +++ b/pokemon_v2/serializers.py @@ -4420,6 +4420,10 @@ def get_pokemon_sprites(self, obj): sprites_object = PokemonSprites.objects.get(pokemon_id=obj) sprites = sprites_object.sprites if obj.pokemon_species.gender_rate == 8: + if isinstance(sprites, str): + parsed = json.loads(sprites) + self._fill_female_sprites(parsed) + return json.dumps(parsed) self._fill_female_sprites(sprites) return sprites