Skip to content

Commit

Permalink
Merge pull request #848 from revoice1/Add-previous-abilities
Browse files Browse the repository at this point in the history
  • Loading branch information
Naramsim authored Oct 16, 2023
2 parents 07c8b5c + f7367fa commit b7eb083
Show file tree
Hide file tree
Showing 12 changed files with 233 additions and 3 deletions.
13 changes: 13 additions & 0 deletions data/v2/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -1913,6 +1913,19 @@ def csv_record_to_objects(info):

build_generic((PokemonAbility,), "pokemon_abilities.csv", csv_record_to_objects)

def csv_record_to_objects(info):
yield PokemonAbilityPast(
pokemon_id=int(info[0]),
generation_id=int(info[1]),
ability_id=int(info[2]),
is_hidden=bool(int(info[3])),
slot=int(info[4]),
)

build_generic(
(PokemonAbilityPast,), "pokemon_abilities_past.csv", csv_record_to_objects
)

def csv_record_to_objects(info):
yield PokemonDexNumber(
pokemon_species_id=int(info[0]),
Expand Down
12 changes: 12 additions & 0 deletions data/v2/csv/pokemon_abilities_past.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
pokemon_id,generation_id,ability_id,is_hidden,slot
94,6,26,0,1
145,5,31,1,3
243,6,10,1,3
244,6,18,1,3
245,6,11,1,3
543,5,95,1,3
544,5,95,1,3
545,5,95,1,3
607,5,23,1,3
608,5,23,1,3
609,5,23,1,3
4 changes: 2 additions & 2 deletions graphql/metadata/databases/databases.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
from_env: HASURA_GRAPHQL_DATABASE_URL
isolation_level: read-committed
pool_settings:
connection_lifetime: 60
idle_timeout: 20
max_connections: 10
retries: 1
pool_timeout: 60
connection_lifetime: 60
retries: 1
use_prepared_statements: false
tables: "!include default/tables/tables.yaml"
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ array_relationships:
table:
name: pokemon_v2_pokemonability
schema: public
- name: pokemon_v2_pokemonabilitypasts
using:
foreign_key_constraint_on:
column: ability_id
table:
name: pokemon_v2_pokemonabilitypast
schema: public
select_permissions:
- permission:
allow_aggregations: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ array_relationships:
table:
name: pokemon_v2_move
schema: public
- name: pokemon_v2_pokemonabilitypasts
using:
foreign_key_constraint_on:
column: generation_id
table:
name: pokemon_v2_pokemonabilitypast
schema: public
- name: pokemon_v2_pokemonformgenerations
using:
foreign_key_constraint_on:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ array_relationships:
table:
name: pokemon_v2_pokemonability
schema: public
- name: pokemon_v2_pokemonabilitypasts
using:
foreign_key_constraint_on:
column: pokemon_id
table:
name: pokemon_v2_pokemonabilitypast
schema: public
- name: pokemon_v2_pokemonforms
using:
foreign_key_constraint_on:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
table:
name: pokemon_v2_pokemonabilitypast
schema: public
object_relationships:
- name: pokemon_v2_ability
using:
foreign_key_constraint_on: ability_id
- name: pokemon_v2_generation
using:
foreign_key_constraint_on: generation_id
- name: pokemon_v2_pokemon
using:
foreign_key_constraint_on: pokemon_id
1 change: 1 addition & 0 deletions graphql/metadata/databases/default/tables/tables.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@
- "!include public_pokemon_v2_pokedexversiongroup.yaml"
- "!include public_pokemon_v2_pokemon.yaml"
- "!include public_pokemon_v2_pokemonability.yaml"
- "!include public_pokemon_v2_pokemonabilitypast.yaml"
- "!include public_pokemon_v2_pokemoncolor.yaml"
- "!include public_pokemon_v2_pokemoncolorname.yaml"
- "!include public_pokemon_v2_pokemondexnumber.yaml"
Expand Down
63 changes: 63 additions & 0 deletions pokemon_v2/migrations/0013_pokemonabilitypast.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Generated by Django 2.1.15 on 2023-02-27 15:33

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
("pokemon_v2", "0012_auto_20220626_1402"),
]

operations = [
migrations.CreateModel(
name="PokemonAbilityPast",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("is_hidden", models.BooleanField(default=False)),
("slot", models.IntegerField()),
(
"ability",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="pokemonabilitypast",
to="pokemon_v2.Ability",
),
),
(
"generation",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="pokemonabilitypast",
to="pokemon_v2.Generation",
),
),
(
"pokemon",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="pokemonabilitypast",
to="pokemon_v2.Pokemon",
),
),
],
options={
"abstract": False,
},
),
]
8 changes: 8 additions & 0 deletions pokemon_v2/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1689,6 +1689,14 @@ class PokemonAbility(HasPokemon, HasAbility):
slot = models.IntegerField()


# model for a Pokemon's abilities that were used until a given generation
class PokemonAbilityPast(HasPokemon, HasAbility, HasGeneration):

is_hidden = models.BooleanField(default=False)

slot = models.IntegerField()


class PokemonColor(HasName):
pass

Expand Down
48 changes: 48 additions & 0 deletions pokemon_v2/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,16 @@ class Meta:
fields = ("is_hidden", "slot", "ability", "pokemon")


class PokemonAbilityPastSerializer(serializers.ModelSerializer):

generation = GenerationSummarySerializer()
ability = AbilitySummarySerializer()

class Meta:
model = PokemonAbilityPast
fields = ("is_hidden", "pokemon", "generation", "slot", "ability")


class PokemonDexEntrySerializer(serializers.ModelSerializer):

entry_number = serializers.IntegerField(source="pokedex_number")
Expand Down Expand Up @@ -2900,6 +2910,7 @@ class Meta:
class PokemonDetailSerializer(serializers.ModelSerializer):

abilities = serializers.SerializerMethodField("get_pokemon_abilities")
past_abilities = serializers.SerializerMethodField("get_past_pokemon_abilities")
game_indices = PokemonGameIndexSerializer(
many=True, read_only=True, source="pokemongameindex"
)
Expand All @@ -2926,6 +2937,7 @@ class Meta:
"order",
"weight",
"abilities",
"past_abilities",
"forms",
"game_indices",
"held_items",
Expand Down Expand Up @@ -3063,6 +3075,42 @@ def get_pokemon_abilities(self, obj):

return abilities

def get_past_pokemon_abilities(self, obj):

pokemon_past_ability_objects = PokemonAbilityPast.objects.filter(pokemon=obj)
pokemon_past_abilities = PokemonAbilityPastSerializer(
pokemon_past_ability_objects, many=True, context=self.context
).data

# post-process to the form we want
current_generation = ""
past_obj = {}
final_data = []
for pokemon_past_ability in pokemon_past_abilities:
del pokemon_past_ability["pokemon"]

generation = pokemon_past_ability["generation"]["name"]
if generation != current_generation:
current_generation = generation
past_obj = {}

# create past abilities object for this generation
past_obj["generation"] = pokemon_past_ability["generation"]
del pokemon_past_ability["generation"]

# create abilities array
past_obj["abilities"] = [pokemon_past_ability]

# add to past abilities array
final_data.append(past_obj)

else:
# add to existing array for this generation
del pokemon_past_ability["generation"]
past_obj["abilities"].append(pokemon_past_ability)

return final_data

def get_pokemon_types(self, obj):

poke_type_objects = PokemonType.objects.filter(pokemon=obj)
Expand Down
53 changes: 52 additions & 1 deletion pokemon_v2/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1698,6 +1698,24 @@ def setup_pokemon_ability_data(cls, pokemon, ability=None, is_hidden=False, slot

return pokemon_ability

@classmethod
def setup_pokemon_past_ability_data(
cls, pokemon, generation, ability=None, is_hidden=False, slot=1
):

ability = ability or cls.setup_ability_data(name="ablty for pkmn")

pokemon_ability_past = PokemonAbilityPast(
pokemon=pokemon,
generation=generation,
ability=ability,
is_hidden=is_hidden,
slot=slot,
)
pokemon_ability_past.save()

return pokemon_ability_past

@classmethod
def setup_pokemon_stat_data(cls, pokemon, base_stat=10, effort=10):

Expand Down Expand Up @@ -4940,10 +4958,13 @@ def test_pokemon_api(self):
pokemon_form = self.setup_pokemon_form_data(
pokemon=pokemon, name="pkm form for base pkmn"
)
generation = self.setup_generation_data(name="base gen")
pokemon_ability = self.setup_pokemon_ability_data(pokemon=pokemon)
pokemon_past_ability = self.setup_pokemon_past_ability_data(
pokemon=pokemon, generation=generation
)
pokemon_stat = self.setup_pokemon_stat_data(pokemon=pokemon)
pokemon_type = self.setup_pokemon_type_data(pokemon=pokemon)
generation = self.setup_generation_data(name="base gen")
pokemon_past_type = self.setup_pokemon_past_type_data(
pokemon=pokemon, generation=generation
)
Expand Down Expand Up @@ -5029,6 +5050,36 @@ def test_pokemon_api(self):
response.data["abilities"][0]["ability"]["url"],
"{}{}/ability/{}/".format(TEST_HOST, API_V2, pokemon_ability.ability.pk),
)
# past abilities params
past_abilities_obj = response.data["past_abilities"][0]
self.assertEqual(
past_abilities_obj["generation"]["name"],
pokemon_past_ability.generation.name,
)
self.assertEqual(
past_abilities_obj["generation"]["url"],
"{}{}/generation/{}/".format(
TEST_HOST, API_V2, pokemon_past_ability.generation.pk
),
)

past_abilities_abilities_obj = past_abilities_obj["abilities"][0]
self.assertEqual(
past_abilities_abilities_obj["is_hidden"], pokemon_past_ability.is_hidden
)
self.assertEqual(
past_abilities_abilities_obj["slot"], pokemon_past_ability.slot
)
self.assertEqual(
past_abilities_abilities_obj["ability"]["name"],
pokemon_past_ability.ability.name,
)
self.assertEqual(
past_abilities_abilities_obj["ability"]["url"],
"{}{}/ability/{}/".format(
TEST_HOST, API_V2, pokemon_past_ability.ability.pk
),
)
# stat params
self.assertEqual(response.data["stats"][0]["base_stat"], pokemon_stat.base_stat)
self.assertEqual(response.data["stats"][0]["effort"], pokemon_stat.effort)
Expand Down

0 comments on commit b7eb083

Please sign in to comment.