From fb893e4177bf253b9a67031f9a16a8118817e949 Mon Sep 17 00:00:00 2001 From: Ryan Voice Date: Thu, 16 Feb 2023 15:18:04 -0800 Subject: [PATCH] Add previous ability data structure --- data/v2/build.py | 11 ++++ data/v2/csv/pokemon_abilities_past.csv | 12 ++++ .../tables/public_pokemon_v2_ability.yaml | 7 +++ .../tables/public_pokemon_v2_generation.yaml | 7 +++ .../tables/public_pokemon_v2_pokemon.yaml | 7 +++ .../public_pokemon_v2_pokemonabilitypast.yaml | 20 ++++++ .../databases/default/tables/tables.yaml | 1 + .../migrations/0013_pokemonabilitypast.py | 63 +++++++++++++++++++ pokemon_v2/models.py | 8 +++ pokemon_v2/serializers.py | 48 ++++++++++++++ pokemon_v2/tests.py | 12 ++++ 11 files changed, 196 insertions(+) create mode 100644 data/v2/csv/pokemon_abilities_past.csv create mode 100644 graphql/metadata/databases/default/tables/public_pokemon_v2_pokemonabilitypast.yaml create mode 100644 pokemon_v2/migrations/0013_pokemonabilitypast.py diff --git a/data/v2/build.py b/data/v2/build.py index d7ecd66f..3aab876f 100644 --- a/data/v2/build.py +++ b/data/v2/build.py @@ -1913,6 +1913,17 @@ def _build_pokemons(): 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]), diff --git a/data/v2/csv/pokemon_abilities_past.csv b/data/v2/csv/pokemon_abilities_past.csv new file mode 100644 index 00000000..b25701ae --- /dev/null +++ b/data/v2/csv/pokemon_abilities_past.csv @@ -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 \ No newline at end of file diff --git a/graphql/metadata/databases/default/tables/public_pokemon_v2_ability.yaml b/graphql/metadata/databases/default/tables/public_pokemon_v2_ability.yaml index 78edc0a6..7f37d77c 100644 --- a/graphql/metadata/databases/default/tables/public_pokemon_v2_ability.yaml +++ b/graphql/metadata/databases/default/tables/public_pokemon_v2_ability.yaml @@ -41,6 +41,13 @@ array_relationships: table: name: pokemon_v2_pokemonability schema: public +- name: pokemon_v2_pokemonabilitiespast + using: + foreign_key_constraint_on: + column: ability_id + table: + name: pokemon_v2_pokemonabilitypast + schema: public select_permissions: - permission: allow_aggregations: true diff --git a/graphql/metadata/databases/default/tables/public_pokemon_v2_generation.yaml b/graphql/metadata/databases/default/tables/public_pokemon_v2_generation.yaml index 21e345ab..b4c394a8 100644 --- a/graphql/metadata/databases/default/tables/public_pokemon_v2_generation.yaml +++ b/graphql/metadata/databases/default/tables/public_pokemon_v2_generation.yaml @@ -13,6 +13,13 @@ array_relationships: table: name: pokemon_v2_ability schema: public +- name: pokemon_v2_abilitiespast + using: + foreign_key_constraint_on: + column: generation_id + table: + name: pokemon_v2_abilitypast + schema: public - name: pokemon_v2_generationnames using: foreign_key_constraint_on: diff --git a/graphql/metadata/databases/default/tables/public_pokemon_v2_pokemon.yaml b/graphql/metadata/databases/default/tables/public_pokemon_v2_pokemon.yaml index 59dffbbd..138e161f 100644 --- a/graphql/metadata/databases/default/tables/public_pokemon_v2_pokemon.yaml +++ b/graphql/metadata/databases/default/tables/public_pokemon_v2_pokemon.yaml @@ -20,6 +20,13 @@ array_relationships: table: name: pokemon_v2_pokemonability schema: public +- name: pokemon_v2_pokemonabilitiespast + using: + foreign_key_constraint_on: + column: pokemon_id + table: + name: pokemon_v2_pokemonabilitypast + schema: public - name: pokemon_v2_pokemonforms using: foreign_key_constraint_on: diff --git a/graphql/metadata/databases/default/tables/public_pokemon_v2_pokemonabilitypast.yaml b/graphql/metadata/databases/default/tables/public_pokemon_v2_pokemonabilitypast.yaml new file mode 100644 index 00000000..2a1ab44a --- /dev/null +++ b/graphql/metadata/databases/default/tables/public_pokemon_v2_pokemonabilitypast.yaml @@ -0,0 +1,20 @@ +table: + name: pokemon_v2_pokemonabilitypast + schema: public +object_relationships: +- name: pokemon_v2_generation + using: + foreign_key_constraint_on: generation_id +- name: pokemon_v2_pokemon + using: + foreign_key_constraint_on: pokemon_id +- name: pokemon_v2_ability + using: + foreign_key_constraint_on: ability_id +select_permissions: +- permission: + allow_aggregations: true + columns: "*" + filter: {} + limit: 100000 + role: anon diff --git a/graphql/metadata/databases/default/tables/tables.yaml b/graphql/metadata/databases/default/tables/tables.yaml index f192a01a..2e330142 100644 --- a/graphql/metadata/databases/default/tables/tables.yaml +++ b/graphql/metadata/databases/default/tables/tables.yaml @@ -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" diff --git a/pokemon_v2/migrations/0013_pokemonabilitypast.py b/pokemon_v2/migrations/0013_pokemonabilitypast.py new file mode 100644 index 00000000..c8991f3b --- /dev/null +++ b/pokemon_v2/migrations/0013_pokemonabilitypast.py @@ -0,0 +1,63 @@ + + +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()), + ( + "generation", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="pokemonabilitypast", + to="pokemon_v2.Generation", + ), + ), + ( + "ability", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="pokemonabilitypast", + to="pokemon_v2.Ability", + ), + ), + ( + "pokemon", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="pokemonabilitypast", + to="pokemon_v2.Pokemon", + ), + ), + ], + options={ + "abstract": False, + }, + ), + ] diff --git a/pokemon_v2/models.py b/pokemon_v2/models.py index 8b7e525c..7b20e3e3 100644 --- a/pokemon_v2/models.py +++ b/pokemon_v2/models.py @@ -1687,6 +1687,14 @@ class PokemonAbility(HasPokemon, HasAbility): is_hidden = models.BooleanField(default=False) 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): diff --git a/pokemon_v2/serializers.py b/pokemon_v2/serializers.py index 26097848..79f9e622 100644 --- a/pokemon_v2/serializers.py +++ b/pokemon_v2/serializers.py @@ -366,6 +366,16 @@ class PokemonAbilitySerializer(serializers.ModelSerializer): 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") @@ -2900,6 +2910,7 @@ class PokemonSpritesSerializer(serializers.ModelSerializer): 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" ) @@ -2926,6 +2937,7 @@ class PokemonDetailSerializer(serializers.ModelSerializer): "order", "weight", "abilities", + "past_abilities", "forms", "game_indices", "held_items", @@ -3062,6 +3074,42 @@ class PokemonDetailSerializer(serializers.ModelSerializer): abilities.append(ability) 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): diff --git a/pokemon_v2/tests.py b/pokemon_v2/tests.py index 7aea930f..77ac3eec 100644 --- a/pokemon_v2/tests.py +++ b/pokemon_v2/tests.py @@ -1698,6 +1698,18 @@ class APIData: return pokemon_ability + @classmethod + def setup_pokemon_past_ability_data(cls, pokemon, generation, ability=None, is_hidden=False, slot=1): + + type = type 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):