Skip to content
Open
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
32 changes: 30 additions & 2 deletions pokemon_v2/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from __future__ import annotations

import itertools
import json
from typing import TYPE_CHECKING, Any, ClassVar, Protocol, cast

from django.db.models import Q
Expand Down Expand Up @@ -2933,10 +2934,37 @@ class Meta:
"past_types",
)

_FEMALE_FALLBACKS: ClassVar[dict[str, str]] = {
"front_female": "front_default",
"back_female": "back_default",
"front_shiny_female": "front_shiny",
"back_shiny_female": "back_shiny",
}

@extend_schema_field(PokemonSpritesSerializer)
def get_pokemon_sprites(self, obj: Pokemon) -> dict[str, str | None]:
def get_pokemon_sprites(self, obj: Pokemon) -> dict[str, str | None] | str:
sprites_list = list(cast("PokemonWithRelations", obj).pokemonsprites.all())
return sprites_list[0].sprites if sprites_list else {}
if not sprites_list:
return {}
sprites: Any = sprites_list[0].sprites
if obj.pokemon_species is None or obj.pokemon_species.gender_rate != 8:
return sprites
if isinstance(sprites, str):
parsed = json.loads(sprites)
self._fill_female_sprites(parsed)
return json.dumps(parsed)
self._fill_female_sprites(sprites)
return sprites

def _fill_female_sprites(self, node: object) -> None:
if not isinstance(node, dict):
return
sprites = cast("dict[str, Any]", node)
for female_key, default_key in self._FEMALE_FALLBACKS.items():
if female_key in sprites and sprites[female_key] is None and sprites.get(default_key) is not None:
sprites[female_key] = sprites[default_key]
for value in sprites.values():
self._fill_female_sprites(value)

@extend_schema_field(PokemonCriesSerializer)
def get_pokemon_cries(self, obj: Pokemon) -> dict[str, str | None]:
Expand Down
20 changes: 20 additions & 0 deletions pokemon_v2/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -4649,6 +4649,26 @@ def test_pokemon_moves_version_group_details_are_deterministically_ordered(self)
[1, 2, 3],
)

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")
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)

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)
Expand Down
Loading