Merge remote-tracking branch 'upstream/master' into feature/past-type-efficacy

This commit is contained in:
Julian Lawrance 2021-02-24 13:41:20 +00:00
commit 44f14a0118
8 changed files with 189 additions and 17 deletions

View file

@ -1975,6 +1975,13 @@ def _build_pokemons():
(PokemonFormGeneration,), "pokemon_form_generations.csv", csv_record_to_objects
)
def csv_record_to_objects(info):
yield PokemonFormType(
pokemon_form_id=int(info[0]), type_id=int(info[1]), slot=int(info[2])
)
build_generic((PokemonFormType,), "pokemon_form_types.csv", csv_record_to_objects)
def csv_record_to_objects(info):
yield PokemonGameIndex(
pokemon_id=int(info[0]), version_id=int(info[1]), game_index=int(info[2])

View file

@ -0,0 +1,36 @@
pokemon_form_id,type_id,slot
10041,7,1
10042,17,1
10043,16,1
10044,13,1
10045,2,1
10046,10,1
10047,3,1
10048,8,1
10049,12,1
10050,5,1
10051,15,1
10052,4,1
10053,14,1
10054,6,1
10055,9,1
10056,11,1
10057,10001,1
10085,18,1
10232,2,1
10233,3,1
10234,4,1
10235,5,1
10236,6,1
10237,7,1
10238,8,1
10239,9,1
10240,10,1
10241,11,1
10242,12,1
10243,13,1
10244,14,1
10245,15,1
10246,16,1
10247,17,1
10248,18,1
1 pokemon_form_id type_id slot
2 10041 7 1
3 10042 17 1
4 10043 16 1
5 10044 13 1
6 10045 2 1
7 10046 10 1
8 10047 3 1
9 10048 8 1
10 10049 12 1
11 10050 5 1
12 10051 15 1
13 10052 4 1
14 10053 14 1
15 10054 6 1
16 10055 9 1
17 10056 11 1
18 10057 10001 1
19 10085 18 1
20 10232 2 1
21 10233 3 1
22 10234 4 1
23 10235 5 1
24 10236 6 1
25 10237 7 1
26 10238 8 1
27 10239 9 1
28 10240 10 1
29 10241 11 1
30 10242 12 1
31 10243 13 1
32 10244 14 1
33 10245 15 1
34 10246 16 1
35 10247 17 1
36 10248 18 1

@ -1 +1 @@
Subproject commit e24fdb772a7568d06081645034fc03afb420ec1b
Subproject commit 5bdf22873dddb3829ebc2c05473ba19fb2b2e9ca

View file

@ -2399,6 +2399,13 @@ Pokémon are the creatures that inhabit the world of the pokemon games. They can
| slot | The order the pokémon types are listed in | integer |
| type | The type the referenced pokémon has | string |
#### PokemonFormType
| Name | Description | Data Type |
| ---- | ----------- | --------- |
| slot | The order the Pokémon form types are listed in | integer |
| type | The type the referenced Pokémon form has | string |
#### PokemonTypePast
| Name | Description | Data Type |
@ -2460,22 +2467,31 @@ Some pokémon have the ability to take on different forms. At times, these diffe
```json
{
"id": 413,
"name": "wormadam-plant",
"order": 503,
"form_order": 1,
"is_default": true,
"is_battle_only": false,
"is_mega": false,
"form_name": "plant",
"pokemon": {
"name": "wormadam-plant",
"url": "http://pokeapi.co/api/v2/pokemon/413/"
},
"version_group": {
"name": "diamond-pearl",
"url": "http://pokeapi.co/api/v2/version-group/8/"
}
"id": 10041,
"name": "arceus-bug",
"order": 631,
"form_order": 7,
"is_default": false,
"is_battle_only": false,
"is_mega": false,
"form_name": "bug",
"pokemon": {
"name": "arceus",
"url": "https://pokeapi.co/api/v2/pokemon/493/"
},
"version_group": {
"name": "diamond-pearl",
"url": "https://pokeapi.co/api/v2/version-group/8/"
},
"types": [
{
"slot": 1,
"type": {
"name": "bug",
"url": "https://pokeapi.co/api/v2/type/7/"
}
}
]
}
```
@ -2495,6 +2511,7 @@ Some pokémon have the ability to take on different forms. At times, these diffe
| form_name | The name of this form | string |
| pokemon | The pokémon that can take on this form | [NamedAPIResource](#namedapiresource) ([Pokemon](#pokemon)) |
| version_group | The version group this pokémon form was introduced in | [NamedAPIResource](#namedapiresource) ([VersionGroup](#version-groups)) |
| types | A list of details showing types this Pokémon form has, if they differ from the types of the Pokémon that can take on this form | list [PokemonFormType](#pokemonformtype) |
## Pokémon Habitats

View file

@ -0,0 +1,52 @@
# Generated by Django 2.1.11 on 2021-02-18 20:45
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("pokemon_v2", "0009_pokemontypepast"),
]
operations = [
migrations.CreateModel(
name="PokemonFormType",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("slot", models.IntegerField()),
(
"pokemon_form",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="pokemonformtype",
to="pokemon_v2.PokemonForm",
),
),
(
"type",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="pokemonformtype",
to="pokemon_v2.Type",
),
),
],
options={
"abstract": False,
},
),
]

5
pokemon_v2/models.py Executable file → Normal file
View file

@ -1884,6 +1884,11 @@ class PokemonType(HasPokemon, HasType):
slot = models.IntegerField()
class PokemonFormType(HasPokemonForm, HasType):
slot = models.IntegerField()
# model for a Pokemon's types that were used until a given generation
class PokemonTypePast(HasPokemon, HasType, HasGeneration):

View file

@ -386,6 +386,16 @@ class PokemonTypeSerializer(serializers.ModelSerializer):
fields = ("slot", "pokemon", "type")
class PokemonFormTypeSerializer(serializers.ModelSerializer):
pokemon_form = PokemonFormSummarySerializer()
type = TypeSummarySerializer()
class Meta:
model = PokemonFormType
fields = ("slot", "pokemon_form", "type")
class PokemonTypePastSerializer(serializers.ModelSerializer):
generation = GenerationSummarySerializer()
@ -2576,6 +2586,7 @@ class PokemonFormDetailSerializer(serializers.ModelSerializer):
sprites = serializers.SerializerMethodField("get_pokemon_form_sprites")
form_names = serializers.SerializerMethodField("get_pokemon_form_names")
names = serializers.SerializerMethodField("get_pokemon_form_pokemon_names")
types = serializers.SerializerMethodField("get_pokemon_form_types")
class Meta:
model = PokemonForm
@ -2593,6 +2604,7 @@ class PokemonFormDetailSerializer(serializers.ModelSerializer):
"version_group",
"form_names",
"names",
"types",
)
def get_pokemon_form_names(self, obj):
@ -2646,6 +2658,29 @@ class PokemonFormDetailSerializer(serializers.ModelSerializer):
return sprites_data
def get_pokemon_form_types(self, obj):
form_type_objects = PokemonFormType.objects.filter(pokemon_form=obj)
form_types = PokemonFormTypeSerializer(
form_type_objects, many=True, context=self.context
).data
for form_type in form_types:
del form_type["pokemon_form"]
# defer to parent Pokemon's types if no form-specific types
if form_types == []:
pokemon_object = Pokemon.objects.get(id=obj.pokemon_id)
pokemon_type_objects = PokemonType.objects.filter(pokemon=pokemon_object)
form_types = PokemonTypeSerializer(
pokemon_type_objects, many=True, context=self.context
).data
for form_type in form_types:
del form_type["pokemon"]
return form_types
#################################
# POKEMON HABITAT SERIALIZERS #

View file

@ -1646,6 +1646,16 @@ class APIData:
return pokemon_form_sprites
@classmethod
def setup_pokemon_form_type_data(cls, pokemon_form, type=None, slot=1):
type = type or cls.setup_type_data(name="tp for pkmn frm")
form_type = PokemonFormType(pokemon_form=pokemon_form, type=type, slot=slot)
form_type.save()
return form_type
@classmethod
def setup_pokemon_form_data(
cls,
@ -5153,6 +5163,7 @@ class APITests(APIData, APITestCase):
pokemon=pokemon, name="pkm form for base pkmn"
)
pokemon_form_sprites = self.setup_pokemon_form_sprites_data(pokemon_form)
pokemon_form_type = self.setup_pokemon_form_type_data(pokemon_form)
sprites_data = json.loads(pokemon_form_sprites.sprites)
@ -5196,6 +5207,15 @@ class APITests(APIData, APITestCase):
),
)
self.assertEqual(response.data["sprites"]["back_default"], None)
# type params
self.assertEqual(response.data["types"][0]["slot"], pokemon_form_type.slot)
self.assertEqual(
response.data["types"][0]["type"]["name"], pokemon_form_type.type.name
)
self.assertEqual(
response.data["types"][0]["type"]["url"],
"{}{}/type/{}/".format(TEST_HOST, API_V2, pokemon_form_type.type.pk),
)
# Evolution test
def test_evolution_trigger_api(self):