Skip to content

Commit 43baa06

Browse files
feat: add pokemon_form_flavor_text (per-form flavor text)
New PokemonFormFlavorText model/table exposing flavor_text_entries on /pokemon-form, mirroring the species-level table. Populated for Generation III, where Deoxys is the only Pokémon with form-specific Pokédex entries Its form was fixed per game version (Ruby/Sapphire → Normal, FireRed → Attack, LeafGreen → Defense, Emerald → Speed). Gens I–II have no form-specific entries; later generations are left for follow-up PRs.
1 parent b176ffc commit 43baa06

8 files changed

Lines changed: 158 additions & 0 deletions

File tree

‎data/v2/build.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1937,6 +1937,20 @@ def csv_record_to_objects(info):
19371937

19381938
build_generic((PokemonFormCondition,), "pokemon_form_conditions.csv", csv_record_to_objects)
19391939

1940+
def csv_record_to_objects(info):
1941+
yield PokemonFormFlavorText(
1942+
pokemon_form_id=int(info[0]),
1943+
version_id=int(info[1]),
1944+
language_id=int(info[2]),
1945+
flavor_text=info[3],
1946+
)
1947+
1948+
build_generic(
1949+
(PokemonFormFlavorText,),
1950+
"pokemon_form_flavor_text.csv",
1951+
csv_record_to_objects,
1952+
)
1953+
19401954
def csv_record_to_objects(info):
19411955
yield PokemonGameIndex(pokemon_id=int(info[0]), version_id=int(info[1]), game_index=int(info[2]))
19421956

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
pokemon_form_id,version_id,language_id,flavor_text
2+
386,7,9,"The DNA of a space virus underwent a
3+
sudden mutation upon exposure to a
4+
laser beam and resulted in DEOXYS. The crystalline organ on this POKéMON’s
5+
chest appears to be its brain."
6+
386,8,9,"DEOXYS emerged from a virus that came
7+
from space. It is highly intelligent and
8+
wields psychokinetic powers. This POKéMON shoots lasers from the
9+
crystalline organ on its chest."
10+
10031,10,9,"This DEOXYS has transformed into its
11+
aggressive guise. It can fool enemies by
12+
altering its appearance."
13+
10032,11,9,"When it changes form, an aurora appears.
14+
It absorbs attacks by altering its
15+
cellular structure."
16+
10033,9,9,"A POKéMON that mutated from an
17+
extraterrestrial virus exposed to a laser
18+
beam. Its body is configured for superior
19+
agility and speed."
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
table:
2+
name: pokemon_v2_pokemonformflavortext
3+
schema: public
4+
configuration:
5+
column_config: {}
6+
custom_column_names: {}
7+
custom_name: pokemonformflavortext
8+
custom_root_fields: {}
9+
object_relationships:
10+
- name: language
11+
using:
12+
foreign_key_constraint_on: language_id
13+
- name: pokemonform
14+
using:
15+
foreign_key_constraint_on: pokemon_form_id
16+
- name: version
17+
using:
18+
foreign_key_constraint_on: version_id
19+
select_permissions:
20+
- role: anon
21+
permission:
22+
columns: '*'
23+
filter: {}
24+
limit: 100000
25+
allow_aggregations: true
26+
query_root_fields:
27+
- select
28+
- select_aggregate
29+
subscription_root_fields: []

‎graphql/v1beta2/metadata/databases/default/tables/tables.yaml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
- "!include public_pokemon_v2_pokemonevolution.yaml"
120120
- "!include public_pokemon_v2_pokemonform.yaml"
121121
- "!include public_pokemon_v2_pokemonformcondition.yaml"
122+
- "!include public_pokemon_v2_pokemonformflavortext.yaml"
122123
- "!include public_pokemon_v2_pokemonformgeneration.yaml"
123124
- "!include public_pokemon_v2_pokemonformname.yaml"
124125
- "!include public_pokemon_v2_pokemonformsprites.yaml"

‎openapi.yml‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7355,7 +7355,13 @@ components:
73557355
items:
73567356
$ref: '#/components/schemas/PokemonFormTriggerCondition'
73577357
readOnly: true
7358+
flavor_text_entries:
7359+
type: array
7360+
items:
7361+
$ref: '#/components/schemas/PokemonFormFlavorText'
7362+
readOnly: true
73587363
required:
7364+
- flavor_text_entries
73597365
- form_name
73607366
- form_names
73617367
- id
@@ -7366,6 +7372,19 @@ components:
73667372
- trigger_conditions
73677373
- types
73687374
- version_group
7375+
PokemonFormFlavorText:
7376+
type: object
7377+
properties:
7378+
flavor_text:
7379+
type: string
7380+
language:
7381+
$ref: '#/components/schemas/LanguageSummary'
7382+
version:
7383+
$ref: '#/components/schemas/VersionSummary'
7384+
required:
7385+
- flavor_text
7386+
- language
7387+
- version
73697388
PokemonFormName:
73707389
type: object
73717390
properties:
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import django.db.models.deletion
2+
from django.db import migrations, models
3+
4+
5+
class Migration(migrations.Migration):
6+
dependencies = [
7+
("pokemon_v2", "0034_item_cost_and_time_of_day"),
8+
]
9+
10+
operations = [
11+
migrations.CreateModel(
12+
name="PokemonFormFlavorText",
13+
fields=[
14+
(
15+
"id",
16+
models.AutoField(
17+
auto_created=True,
18+
primary_key=True,
19+
serialize=False,
20+
verbose_name="ID",
21+
),
22+
),
23+
("flavor_text", models.CharField(max_length=500)),
24+
(
25+
"language",
26+
models.ForeignKey(
27+
blank=True,
28+
null=True,
29+
on_delete=django.db.models.deletion.CASCADE,
30+
related_name="%(class)s_language",
31+
to="pokemon_v2.language",
32+
),
33+
),
34+
(
35+
"pokemon_form",
36+
models.ForeignKey(
37+
blank=True,
38+
null=True,
39+
on_delete=django.db.models.deletion.CASCADE,
40+
related_name="%(class)s",
41+
to="pokemon_v2.pokemonform",
42+
),
43+
),
44+
(
45+
"version",
46+
models.ForeignKey(
47+
blank=True,
48+
null=True,
49+
on_delete=django.db.models.deletion.CASCADE,
50+
related_name="%(class)s",
51+
to="pokemon_v2.version",
52+
),
53+
),
54+
],
55+
options={
56+
"abstract": False,
57+
},
58+
),
59+
]

‎pokemon_v2/models.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@
183183
"PokemonEvolution",
184184
"PokemonForm",
185185
"PokemonFormCondition",
186+
"PokemonFormFlavorText",
186187
"PokemonFormGeneration",
187188
"PokemonFormName",
188189
"PokemonFormSprites",
@@ -1829,6 +1830,10 @@ class PokemonSpeciesFlavorText(IsFlavorText, HasPokemonSpecies, HasVersion):
18291830
pass
18301831

18311832

1833+
class PokemonFormFlavorText(IsFlavorText, HasPokemonForm, HasVersion):
1834+
pass
1835+
1836+
18321837
class Pokemon(HasName, HasPokemonSpecies, HasOrder):
18331838
height = models.IntegerField(blank=True, null=True)
18341839

‎pokemon_v2/serializers.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2571,6 +2571,16 @@ class Meta:
25712571
fields = ("awesome_name", "language")
25722572

25732573

2574+
class PokemonFormFlavorTextSerializer(serializers.ModelSerializer[PokemonFormFlavorText]):
2575+
flavor_text = serializers.CharField()
2576+
language = LanguageSummarySerializer()
2577+
version = VersionSummarySerializer()
2578+
2579+
class Meta:
2580+
model = PokemonFormFlavorText
2581+
fields = ("flavor_text", "language", "version")
2582+
2583+
25742584
class PokemonFormDetailSerializer(serializers.ModelSerializer[PokemonForm]):
25752585
pokemon = PokemonSummarySerializer()
25762586
version_group = VersionGroupSummarySerializer()
@@ -2579,6 +2589,7 @@ class PokemonFormDetailSerializer(serializers.ModelSerializer[PokemonForm]):
25792589
names = serializers.SerializerMethodField("get_pokemon_form_pokemon_names")
25802590
types = serializers.SerializerMethodField("get_pokemon_form_types")
25812591
trigger_conditions = serializers.SerializerMethodField("get_pokemon_form_triggers_conditions")
2592+
flavor_text_entries = PokemonFormFlavorTextSerializer(many=True, read_only=True, source="pokemonformflavortext")
25822593

25832594
class Meta:
25842595
model = PokemonForm
@@ -2598,6 +2609,7 @@ class Meta:
25982609
"names",
25992610
"types",
26002611
"trigger_conditions",
2612+
"flavor_text_entries",
26012613
)
26022614

26032615
@extend_schema_field(PokemonFormNameSerializer(many=True))

0 commit comments

Comments
 (0)