Skip to content

Commit b941f99

Browse files
committed
feat: add new type PokemonStatPast
1 parent 016d97e commit b941f99

6 files changed

Lines changed: 173 additions & 0 deletions

File tree

data/v2/build.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2281,6 +2281,17 @@ def csv_record_to_objects(info):
22812281

22822282
build_generic((PokemonStat,), "pokemon_stats.csv", csv_record_to_objects)
22832283

2284+
def csv_record_to_objects(info):
2285+
yield PokemonStatPast(
2286+
pokemon_id=int(info[0]),
2287+
generation_id=int(info[1]),
2288+
stat_id=int(info[2]),
2289+
base_stat=int(info[3]),
2290+
effort=int(info[4]),
2291+
)
2292+
2293+
build_generic((PokemonStatPast,), "pokemon_stats_past.csv", csv_record_to_objects)
2294+
22842295
def csv_record_to_objects(info):
22852296
yield PokemonType(
22862297
pokemon_id=int(info[0]), type_id=int(info[1]), slot=int(info[2])

data/v2/csv/pokemon_stats_past.csv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pokemon_id,generation_id,stat_id,base_stat,effort
2+
1,1,1,500,100
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Generated by Django 4.2.27 on 2026-01-24 22:11
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
(
11+
"pokemon_v2",
12+
"0024_alter_ability_generation_alter_abilitychange_ability_and_more",
13+
),
14+
]
15+
16+
operations = [
17+
migrations.CreateModel(
18+
name="PokemonStatPast",
19+
fields=[
20+
(
21+
"id",
22+
models.AutoField(
23+
auto_created=True,
24+
primary_key=True,
25+
serialize=False,
26+
verbose_name="ID",
27+
),
28+
),
29+
("base_stat", models.IntegerField()),
30+
("effort", models.IntegerField()),
31+
(
32+
"generation",
33+
models.ForeignKey(
34+
blank=True,
35+
null=True,
36+
on_delete=django.db.models.deletion.CASCADE,
37+
related_name="%(class)s",
38+
to="pokemon_v2.generation",
39+
),
40+
),
41+
(
42+
"pokemon",
43+
models.ForeignKey(
44+
blank=True,
45+
null=True,
46+
on_delete=django.db.models.deletion.CASCADE,
47+
related_name="%(class)s",
48+
to="pokemon_v2.pokemon",
49+
),
50+
),
51+
(
52+
"stat",
53+
models.ForeignKey(
54+
blank=True,
55+
null=True,
56+
on_delete=django.db.models.deletion.CASCADE,
57+
related_name="%(class)s",
58+
to="pokemon_v2.stat",
59+
),
60+
),
61+
],
62+
options={
63+
"abstract": False,
64+
},
65+
),
66+
]

pokemon_v2/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1816,6 +1816,12 @@ class PokemonStat(HasPokemon, HasStat):
18161816
effort = models.IntegerField()
18171817

18181818

1819+
class PokemonStatPast(HasPokemon, HasStat, HasGeneration):
1820+
base_stat = models.IntegerField()
1821+
1822+
effort = models.IntegerField()
1823+
1824+
18191825
class PokemonType(HasPokemon, HasType):
18201826
slot = models.IntegerField()
18211827

pokemon_v2/serializers.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4318,6 +4318,15 @@ class Meta:
43184318
fields = ("base_stat", "effort", "stat")
43194319

43204320

4321+
class PokemonStatPastSerializer(serializers.ModelSerializer):
4322+
generation = GenerationSummarySerializer()
4323+
stat = StatSummarySerializer()
4324+
4325+
class Meta:
4326+
model = PokemonStatPast
4327+
fields = ("base_stat", "effort", "generation", "stat")
4328+
4329+
43214330
#########################
43224331
# POKEMON SERIALIZERS #
43234332
#########################
@@ -4340,6 +4349,7 @@ class PokemonDetailSerializer(serializers.ModelSerializer):
43404349
moves = serializers.SerializerMethodField("get_pokemon_moves")
43414350
species = PokemonSpeciesSummarySerializer(source="pokemon_species")
43424351
stats = PokemonStatSerializer(many=True, read_only=True, source="pokemonstat")
4352+
past_stats = serializers.SerializerMethodField("get_past_pokemon_stats")
43434353
types = serializers.SerializerMethodField("get_pokemon_types")
43444354
past_types = serializers.SerializerMethodField("get_past_pokemon_types")
43454355
forms = PokemonFormSummarySerializer(
@@ -4371,6 +4381,7 @@ class Meta:
43714381
"sprites",
43724382
"cries",
43734383
"stats",
4384+
"past_stats",
43744385
"types",
43754386
"past_types",
43764387
)
@@ -5083,6 +5094,39 @@ def get_past_pokemon_abilities(self, obj):
50835094

50845095
return final_data
50855096

5097+
def get_past_pokemon_stats(self, obj):
5098+
pokemon_past_stat_objects = PokemonStatPast.objects.filter(pokemon=obj)
5099+
pokemon_past_stats = PokemonStatPastSerializer(
5100+
pokemon_past_stat_objects, many=True, context=self.context
5101+
).data
5102+
5103+
# post-process to the form we want
5104+
current_generation = ""
5105+
past_obj = {}
5106+
final_data = []
5107+
for pokemon_past_stat in pokemon_past_stats:
5108+
generation = pokemon_past_stat["generation"]["name"]
5109+
if generation != current_generation:
5110+
current_generation = generation
5111+
past_obj = {}
5112+
5113+
# create past stats object for this generation
5114+
past_obj["generation"] = pokemon_past_stat["generation"]
5115+
del pokemon_past_stat["generation"]
5116+
5117+
# create stats array
5118+
past_obj["stats"] = [pokemon_past_stat]
5119+
5120+
# add to past stats array
5121+
final_data.append(past_obj)
5122+
5123+
else:
5124+
# add to existing array for this generation
5125+
del pokemon_past_stat["generation"]
5126+
past_obj["stats"].append(pokemon_past_stat)
5127+
5128+
return final_data
5129+
50865130
# {
50875131
# "slot": 1,
50885132
# "type": {

pokemon_v2/tests.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,6 +1656,21 @@ def setup_pokemon_stat_data(cls, pokemon, base_stat=10, effort=10):
16561656

16571657
return pokemon_stat
16581658

1659+
@classmethod
1660+
def setup_pokemon_past_stat_data(cls, pokemon, generation, base_stat=10, effort=10):
1661+
stat = cls.setup_stat_data(name="stt for pkmn")
1662+
1663+
pokemon_stat_past = PokemonStatPast(
1664+
pokemon=pokemon,
1665+
generation=generation,
1666+
stat=stat,
1667+
base_stat=base_stat,
1668+
effort=effort,
1669+
)
1670+
pokemon_stat_past.save()
1671+
1672+
return pokemon_stat_past
1673+
16591674
@classmethod
16601675
def setup_pokemon_type_data(cls, pokemon, type=None, slot=1):
16611676
type = type or cls.setup_type_data(name="tp for pkmn")
@@ -4904,6 +4919,9 @@ def test_pokemon_api(self):
49044919
pokemon=pokemon, generation=generation
49054920
)
49064921
pokemon_stat = self.setup_pokemon_stat_data(pokemon=pokemon)
4922+
pokemon_past_stat = self.setup_pokemon_past_stat_data(
4923+
pokemon=pokemon, generation=generation
4924+
)
49074925
pokemon_type = self.setup_pokemon_type_data(pokemon=pokemon)
49084926
pokemon_past_type = self.setup_pokemon_past_type_data(
49094927
pokemon=pokemon, generation=generation
@@ -5029,6 +5047,29 @@ def test_pokemon_api(self):
50295047
response.data["stats"][0]["stat"]["url"],
50305048
"{}{}/stat/{}/".format(TEST_HOST, API_V2, pokemon_stat.stat.pk),
50315049
)
5050+
# past stat params
5051+
past_stats_obj = response.data["past_stats"][0]
5052+
self.assertEqual(
5053+
past_stats_obj["generation"]["name"],
5054+
pokemon_past_stat.generation.name,
5055+
)
5056+
self.assertEqual(
5057+
past_stats_obj["generation"]["url"],
5058+
"{}{}/generation/{}/".format(
5059+
TEST_HOST, API_V2, pokemon_past_stat.generation.pk
5060+
),
5061+
)
5062+
5063+
past_stats_stats_obj = past_stats_obj["stats"][0]
5064+
self.assertEqual(past_stats_stats_obj["base_stat"], pokemon_past_stat.base_stat)
5065+
self.assertEqual(past_stats_stats_obj["effort"], pokemon_past_stat.effort)
5066+
self.assertEqual(
5067+
past_stats_stats_obj["stat"]["name"], pokemon_past_stat.stat.name
5068+
)
5069+
self.assertEqual(
5070+
past_stats_stats_obj["stat"]["url"],
5071+
"{}{}/stat/{}/".format(TEST_HOST, API_V2, pokemon_past_stat.stat.pk),
5072+
)
50325073
# type params
50335074
self.assertEqual(response.data["types"][0]["slot"], pokemon_type.slot)
50345075
self.assertEqual(
@@ -5719,6 +5760,9 @@ def test_case_insensitive_api(self):
57195760
pokemon=pokemon, generation=generation
57205761
)
57215762
pokemon_stat = self.setup_pokemon_stat_data(pokemon=pokemon)
5763+
pokemon_past_stat = self.setup_pokemon_past_stat_data(
5764+
pokemon=pokemon, generation=generation
5765+
)
57225766
pokemon_type = self.setup_pokemon_type_data(pokemon=pokemon)
57235767
pokemon_past_type = self.setup_pokemon_past_type_data(
57245768
pokemon=pokemon, generation=generation

0 commit comments

Comments
 (0)