From b15bc13b7b977360fe4914adbe22bc4a14730d67 Mon Sep 17 00:00:00 2001 From: Anh Thang Bui Date: Sat, 7 Mar 2026 14:08:31 +0700 Subject: [PATCH 1/7] feat(data): add ItemPrice model and serializer for item pricing data --- data/v2/build.py | 10 ++++++++++ data/v2/csv/item_prices.csv | 29 +++++++++++++++++++++++++++++ pokemon_v2/models.py | 5 +++++ pokemon_v2/serializers.py | 10 ++++++++++ 4 files changed, 54 insertions(+) create mode 100644 data/v2/csv/item_prices.csv diff --git a/data/v2/build.py b/data/v2/build.py index c0e845477..cc520d4ba 100644 --- a/data/v2/build.py +++ b/data/v2/build.py @@ -544,6 +544,16 @@ def csv_record_to_objects(info): build_generic((ItemGameIndex,), "item_game_indices.csv", csv_record_to_objects) + def csv_record_to_objects(info): + yield ItemPrice( + item_id=int(info[0]), + version_group_id=int(info[1]), + purchase_price=int(info[2]), + sell_price=int(info[3]), + ) + + build_generic((ItemPrice,), "item_prices.csv", csv_record_to_objects) + def csv_record_to_objects(info): yield ItemFlavorText( item_id=int(info[0]), diff --git a/data/v2/csv/item_prices.csv b/data/v2/csv/item_prices.csv new file mode 100644 index 000000000..eb20ab0a4 --- /dev/null +++ b/data/v2/csv/item_prices.csv @@ -0,0 +1,29 @@ +item_id,version_group_id,purchase_price,sell_price +305,1,3000,1500 +305,2,3000,1500 +305,3,3000,1500 +305,4,3000,1500 +305,5,3000,1500 +305,6,3000,1500 +305,7,3000,1500 +305,8,10000,5000 +305,9,10000,5000 +305,10,10000,5000 +305,11,10000,5000 +305,12,3000,1500 +305,13,3000,1500 +305,14,10000,5000 +305,15,10000,5000 +305,16,10000,5000 +305,17,10000,5000 +305,18,10000,5000 +305,19,0,0 +305,20,3000,1500 +305,21,3000,1500 +305,22,3000,1500 +305,23,10000,5000 +305,25,50000,25000 +305,26,50000,25000 +305,27,50000,25000 +305,28,3000,1500 +305,29,3000,1500 diff --git a/pokemon_v2/models.py b/pokemon_v2/models.py index 5fd7c2ae5..5508590c6 100644 --- a/pokemon_v2/models.py +++ b/pokemon_v2/models.py @@ -885,6 +885,11 @@ class ItemGameIndex(HasItem, HasGeneration, HasGameIndex): pass +class ItemPrice(HasItem, HasVersionGroup): + purchase_price = models.IntegerField() + sell_price = models.IntegerField() + + class ItemSprites(HasItem): sprites = models.JSONField() diff --git a/pokemon_v2/serializers.py b/pokemon_v2/serializers.py index 636cdb20f..fe5f098cd 100644 --- a/pokemon_v2/serializers.py +++ b/pokemon_v2/serializers.py @@ -1806,6 +1806,14 @@ class Meta: fields = ("game_index", "generation") +class ItemPriceSerializer(serializers.ModelSerializer): + version_group = VersionGroupSummarySerializer() + + class Meta: + model = ItemPrice + fields = ("purchase_price", "sell_price", "version_group") + + class ItemNameSerializer(serializers.ModelSerializer): language = LanguageSummarySerializer() @@ -1825,6 +1833,7 @@ class ItemDetailSerializer(serializers.ModelSerializer): game_indices = ItemGameIndexSerializer( many=True, read_only=True, source="itemgameindex" ) + prices = ItemPriceSerializer(many=True, read_only=True, source="itemprice") effect_entries = ItemEffectTextSerializer( many=True, read_only=True, source="itemeffecttext" ) @@ -1852,6 +1861,7 @@ class Meta: "effect_entries", "flavor_text_entries", "game_indices", + "prices", "names", "held_by_pokemon", "sprites", From a9eab3f5c6d8cc254a192de33a932706b174e9dd Mon Sep 17 00:00:00 2001 From: Anh Thang Bui Date: Sat, 7 Mar 2026 21:21:21 +0700 Subject: [PATCH 2/7] add is_purchasable --- data/v2/build.py | 5 ++-- data/v2/csv/item_prices.csv | 59 +++++++++++++++++++------------------ pokemon_v2/models.py | 1 + pokemon_v2/serializers.py | 2 +- 4 files changed, 35 insertions(+), 32 deletions(-) diff --git a/data/v2/build.py b/data/v2/build.py index cc520d4ba..fff333671 100644 --- a/data/v2/build.py +++ b/data/v2/build.py @@ -548,8 +548,9 @@ def csv_record_to_objects(info): yield ItemPrice( item_id=int(info[0]), version_group_id=int(info[1]), - purchase_price=int(info[2]), - sell_price=int(info[3]), + is_purchasable=bool(int(info[2])), + purchase_price=int(info[3]), + sell_price=int(info[4]), ) build_generic((ItemPrice,), "item_prices.csv", csv_record_to_objects) diff --git a/data/v2/csv/item_prices.csv b/data/v2/csv/item_prices.csv index eb20ab0a4..a4b5176c3 100644 --- a/data/v2/csv/item_prices.csv +++ b/data/v2/csv/item_prices.csv @@ -1,29 +1,30 @@ -item_id,version_group_id,purchase_price,sell_price -305,1,3000,1500 -305,2,3000,1500 -305,3,3000,1500 -305,4,3000,1500 -305,5,3000,1500 -305,6,3000,1500 -305,7,3000,1500 -305,8,10000,5000 -305,9,10000,5000 -305,10,10000,5000 -305,11,10000,5000 -305,12,3000,1500 -305,13,3000,1500 -305,14,10000,5000 -305,15,10000,5000 -305,16,10000,5000 -305,17,10000,5000 -305,18,10000,5000 -305,19,0,0 -305,20,3000,1500 -305,21,3000,1500 -305,22,3000,1500 -305,23,10000,5000 -305,25,50000,25000 -305,26,50000,25000 -305,27,50000,25000 -305,28,3000,1500 -305,29,3000,1500 +item_id,version_group_id,is_purchasable,purchase_price,sell_price +305,1,1,3000,1500 +305,2,1,3000,1500 +305,16,1,10000,5000 +305,20,1,3000,1500 +305,21,1,3000,1500 +305,22,1,3000,1500 +305,25,1,50000,25000 +305,26,1,50000,25000 +305,27,1,50000,25000 +305,28,1,3000,1500 +305,29,1,3000,1500 +305,3,0,0,1500 +305,4,0,0,1500 +305,5,0,0,1500 +305,6,0,0,1500 +305,7,0,0,1500 +305,8,0,0,5000 +305,9,0,0,5000 +305,10,0,0,5000 +305,11,0,0,5000 +305,12,0,0,1500 +305,13,0,0,1500 +305,14,0,0,5000 +305,15,0,0,5000 +305,17,0,0,5000 +305,18,0,0,5000 +305,19,0,0,0 +305,23,0,0,5000 +305,24,0,0,5000 diff --git a/pokemon_v2/models.py b/pokemon_v2/models.py index 5508590c6..bbf365ebf 100644 --- a/pokemon_v2/models.py +++ b/pokemon_v2/models.py @@ -886,6 +886,7 @@ class ItemGameIndex(HasItem, HasGeneration, HasGameIndex): class ItemPrice(HasItem, HasVersionGroup): + is_purchasable = models.BooleanField() purchase_price = models.IntegerField() sell_price = models.IntegerField() diff --git a/pokemon_v2/serializers.py b/pokemon_v2/serializers.py index fe5f098cd..863ada2f5 100644 --- a/pokemon_v2/serializers.py +++ b/pokemon_v2/serializers.py @@ -1811,7 +1811,7 @@ class ItemPriceSerializer(serializers.ModelSerializer): class Meta: model = ItemPrice - fields = ("purchase_price", "sell_price", "version_group") + fields = ("is_purchasable", "purchase_price", "sell_price", "version_group") class ItemNameSerializer(serializers.ModelSerializer): From b1ee9bc3fd141c63e9173630b8ffb636f64f6781 Mon Sep 17 00:00:00 2001 From: Anh Thang Bui Date: Sat, 7 Mar 2026 22:54:09 +0700 Subject: [PATCH 3/7] feat(api): add ItemPrice resource and add item prices, remove item cost --- README.md | 2 +- .../tables/public_pokemon_v2_item.yaml | 7 +++ .../tables/public_pokemon_v2_itemprice.yaml | 17 ++++++ .../public_pokemon_v2_versiongroup.yaml | 7 +++ .../databases/default/tables/tables.yaml | 1 + .../tables/public_pokemon_v2_item.yaml | 7 +++ .../tables/public_pokemon_v2_itemprice.yaml | 22 ++++++++ .../public_pokemon_v2_versiongroup.yaml | 7 +++ .../databases/default/tables/tables.yaml | 1 + pokemon_v2/migrations/0026_itemprice.py | 54 +++++++++++++++++++ pokemon_v2/models.py | 2 - pokemon_v2/serializers.py | 1 - 12 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_itemprice.yaml create mode 100644 graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_itemprice.yaml create mode 100644 pokemon_v2/migrations/0026_itemprice.py diff --git a/README.md b/README.md index 41a113475..21dd6e7c5 100755 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ make docker-migrate When you start PokéAPI with the above Docker Compose setup, an [Hasura Engine](https://github.com/hasura/graphql-engine) server is started as well. It's possible to track all the PokeAPI tables and foreign keys by simply ```sh -# hasura cli needs to be installed and available in your $PATH: https://hasura.io/docs/latest/graphql/core/hasura-cli/install-hasura-cli.html +# hasura cli needs to be installed and available in your $PATH: https://hasura.io/docs/2.0/hasura-cli/install-hasura-cli # hasura cli's version has to greater than v2.48.1 make hasura-apply ``` diff --git a/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_item.yaml b/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_item.yaml index 7e9fbc70d..13c8feeae 100644 --- a/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_item.yaml +++ b/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_item.yaml @@ -65,6 +65,13 @@ array_relationships: table: name: pokemon_v2_itemname schema: public + - name: pokemon_v2_itemprices + using: + foreign_key_constraint_on: + column: item_id + table: + name: pokemon_v2_itemprice + schema: public - name: pokemon_v2_itemsprites using: foreign_key_constraint_on: diff --git a/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_itemprice.yaml b/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_itemprice.yaml new file mode 100644 index 000000000..d9c38bdff --- /dev/null +++ b/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_itemprice.yaml @@ -0,0 +1,17 @@ +table: + name: pokemon_v2_itemprice + schema: public +object_relationships: + - name: pokemon_v2_item + using: + foreign_key_constraint_on: item_id + - name: pokemon_v2_versiongroup + using: + foreign_key_constraint_on: version_group_id +select_permissions: + - role: anon + permission: + columns: '*' + filter: {} + limit: 100000 + allow_aggregations: true diff --git a/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_versiongroup.yaml b/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_versiongroup.yaml index bead609fe..2e5f0990b 100644 --- a/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_versiongroup.yaml +++ b/graphql/v1beta/metadata/databases/default/tables/public_pokemon_v2_versiongroup.yaml @@ -34,6 +34,13 @@ array_relationships: table: name: pokemon_v2_itemflavortext schema: public + - name: pokemon_v2_itemprices + using: + foreign_key_constraint_on: + column: version_group_id + table: + name: pokemon_v2_itemprice + schema: public - name: pokemon_v2_machines using: foreign_key_constraint_on: diff --git a/graphql/v1beta/metadata/databases/default/tables/tables.yaml b/graphql/v1beta/metadata/databases/default/tables/tables.yaml index 85ecc995e..31c3ca3a8 100644 --- a/graphql/v1beta/metadata/databases/default/tables/tables.yaml +++ b/graphql/v1beta/metadata/databases/default/tables/tables.yaml @@ -51,6 +51,7 @@ - "!include public_pokemon_v2_itemflingeffecteffecttext.yaml" - "!include public_pokemon_v2_itemgameindex.yaml" - "!include public_pokemon_v2_itemname.yaml" +- "!include public_pokemon_v2_itemprice.yaml" - "!include public_pokemon_v2_itempocket.yaml" - "!include public_pokemon_v2_itempocketname.yaml" - "!include public_pokemon_v2_itemsprites.yaml" diff --git a/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_item.yaml b/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_item.yaml index f8589db37..1e174fc7d 100644 --- a/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_item.yaml +++ b/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_item.yaml @@ -70,6 +70,13 @@ array_relationships: table: name: pokemon_v2_itemname schema: public + - name: itemprices + using: + foreign_key_constraint_on: + column: item_id + table: + name: pokemon_v2_itemprice + schema: public - name: itemsprites using: foreign_key_constraint_on: diff --git a/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_itemprice.yaml b/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_itemprice.yaml new file mode 100644 index 000000000..3082e5ffd --- /dev/null +++ b/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_itemprice.yaml @@ -0,0 +1,22 @@ +table: + name: pokemon_v2_itemprice + schema: public +configuration: + column_config: {} + custom_column_names: {} + custom_name: itemprice + custom_root_fields: {} +object_relationships: + - name: item + using: + foreign_key_constraint_on: item_id + - name: versiongroup + using: + foreign_key_constraint_on: version_group_id +select_permissions: + - role: anon + permission: + columns: '*' + filter: {} + limit: 100000 + allow_aggregations: true diff --git a/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_versiongroup.yaml b/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_versiongroup.yaml index 6bede0498..1c454f142 100644 --- a/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_versiongroup.yaml +++ b/graphql/v1beta2/metadata/databases/default/tables/public_pokemon_v2_versiongroup.yaml @@ -39,6 +39,13 @@ array_relationships: table: name: pokemon_v2_itemflavortext schema: public + - name: itemprices + using: + foreign_key_constraint_on: + column: version_group_id + table: + name: pokemon_v2_itemprice + schema: public - name: machines using: foreign_key_constraint_on: diff --git a/graphql/v1beta2/metadata/databases/default/tables/tables.yaml b/graphql/v1beta2/metadata/databases/default/tables/tables.yaml index 78b95c7c8..0021c9c22 100644 --- a/graphql/v1beta2/metadata/databases/default/tables/tables.yaml +++ b/graphql/v1beta2/metadata/databases/default/tables/tables.yaml @@ -51,6 +51,7 @@ - "!include public_pokemon_v2_itemflingeffecteffecttext.yaml" - "!include public_pokemon_v2_itemgameindex.yaml" - "!include public_pokemon_v2_itemname.yaml" +- "!include public_pokemon_v2_itemprice.yaml" - "!include public_pokemon_v2_itempocket.yaml" - "!include public_pokemon_v2_itempocketname.yaml" - "!include public_pokemon_v2_itemsprites.yaml" diff --git a/pokemon_v2/migrations/0026_itemprice.py b/pokemon_v2/migrations/0026_itemprice.py new file mode 100644 index 000000000..516cab66e --- /dev/null +++ b/pokemon_v2/migrations/0026_itemprice.py @@ -0,0 +1,54 @@ +# Generated by Django 5.2.10 on 2026-03-07 00:00 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pokemon_v2", "0025_pokemonstatpast"), + ] + + operations = [ + migrations.CreateModel( + name="ItemPrice", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("is_purchasable", models.BooleanField()), + ("purchase_price", models.IntegerField()), + ("sell_price", models.IntegerField()), + ( + "item", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="%(class)s", + to="pokemon_v2.item", + ), + ), + ( + "version_group", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="%(class)s", + to="pokemon_v2.versiongroup", + ), + ), + ], + options={ + "abstract": False, + }, + ), + ] diff --git a/pokemon_v2/models.py b/pokemon_v2/models.py index bbf365ebf..4fdc56e8b 100644 --- a/pokemon_v2/models.py +++ b/pokemon_v2/models.py @@ -848,8 +848,6 @@ class ItemFlingEffectEffectText(HasLanguage, HasEffect, HasFlingEffect): class Item(HasName, HasItemCategory, HasFlingEffect): - cost = models.IntegerField(blank=True, null=True) - fling_power = models.IntegerField(blank=True, null=True) diff --git a/pokemon_v2/serializers.py b/pokemon_v2/serializers.py index 863ada2f5..3ed7f80f3 100644 --- a/pokemon_v2/serializers.py +++ b/pokemon_v2/serializers.py @@ -1853,7 +1853,6 @@ class Meta: fields = ( "id", "name", - "cost", "fling_power", "fling_effect", "attributes", From 4423e08c54adb062cf466f6a78963a72ff6a3809 Mon Sep 17 00:00:00 2001 From: Anh Thang Bui Date: Mon, 9 Mar 2026 13:56:40 +0700 Subject: [PATCH 4/7] remove cost from build, test and migration --- data/v2/build.py | 1 - graphql/v1beta/examples/go/pokemon.go | 1 - graphql/v1beta/examples/node/pokemon.js | 1 - graphql/v1beta2/examples/go/pokemon.go | 1 - graphql/v1beta2/examples/node/pokemon.js | 1 - openapi.yml | 4 ---- .../migrations/0001_squashed_0002_auto_20160301_1408.py | 1 - pokemon_v2/tests.py | 3 --- 8 files changed, 13 deletions(-) diff --git a/data/v2/build.py b/data/v2/build.py index fff333671..19c50edfa 100644 --- a/data/v2/build.py +++ b/data/v2/build.py @@ -499,7 +499,6 @@ def csv_record_to_objects(info): id=int(info[0]), name=info[1], item_category_id=int(info[2]), - cost=int(info[3]), fling_power=int(info[4]) if info[4] != "" else None, item_fling_effect_id=int(info[5]) if info[5] != "" else None, ) diff --git a/graphql/v1beta/examples/go/pokemon.go b/graphql/v1beta/examples/go/pokemon.go index 7a1abf1f6..bd877ea90 100644 --- a/graphql/v1beta/examples/go/pokemon.go +++ b/graphql/v1beta/examples/go/pokemon.go @@ -75,7 +75,6 @@ query pokemon_details($name: String) { fireRedItems: pokemon_v2_pokemonitems(where: {pokemon_v2_version: {name: {_eq: "firered"}}}) { pokemon_v2_item { name - cost } rarity } diff --git a/graphql/v1beta/examples/node/pokemon.js b/graphql/v1beta/examples/node/pokemon.js index b11a8f598..a3fc772a5 100644 --- a/graphql/v1beta/examples/node/pokemon.js +++ b/graphql/v1beta/examples/node/pokemon.js @@ -93,7 +93,6 @@ function fetchPokemon_details(name="starmie") { fireRedItems: pokemon_v2_pokemonitems(where: {pokemon_v2_version: {name: {_eq: "firered"}}}) { pokemon_v2_item { name - cost } rarity } diff --git a/graphql/v1beta2/examples/go/pokemon.go b/graphql/v1beta2/examples/go/pokemon.go index c3be49641..ef19a9ddc 100644 --- a/graphql/v1beta2/examples/go/pokemon.go +++ b/graphql/v1beta2/examples/go/pokemon.go @@ -75,7 +75,6 @@ query pokemon_details($name: String) { fireRedItems: pokemonitems(where: {version: {name: {_eq: "firered"}}}) { item { name - cost } rarity } diff --git a/graphql/v1beta2/examples/node/pokemon.js b/graphql/v1beta2/examples/node/pokemon.js index 7597f02f9..64d6f3844 100644 --- a/graphql/v1beta2/examples/node/pokemon.js +++ b/graphql/v1beta2/examples/node/pokemon.js @@ -93,7 +93,6 @@ function fetchPokemon_details(name="starmie") { fireRedItems: pokemonitems(where: {version: {name: {_eq: "firered"}}}) { item { name - cost } rarity } diff --git a/openapi.yml b/openapi.yml index 1b600bd4e..54a2918c2 100644 --- a/openapi.yml +++ b/openapi.yml @@ -4659,10 +4659,6 @@ components: name: type: string maxLength: 200 - cost: - type: - - integer - - 'null' fling_power: type: - integer diff --git a/pokemon_v2/migrations/0001_squashed_0002_auto_20160301_1408.py b/pokemon_v2/migrations/0001_squashed_0002_auto_20160301_1408.py index 15c60c610..698ae037b 100644 --- a/pokemon_v2/migrations/0001_squashed_0002_auto_20160301_1408.py +++ b/pokemon_v2/migrations/0001_squashed_0002_auto_20160301_1408.py @@ -3497,7 +3497,6 @@ class Migration(migrations.Migration): ), ), ("name", models.CharField(max_length=100)), - ("cost", models.IntegerField(null=True, blank=True)), ("fling_power", models.IntegerField(null=True, blank=True)), ], options={ diff --git a/pokemon_v2/tests.py b/pokemon_v2/tests.py index 6bed79fcd..887056323 100644 --- a/pokemon_v2/tests.py +++ b/pokemon_v2/tests.py @@ -331,13 +331,11 @@ def setup_item_data( item_category=None, item_fling_effect=None, name="itm", - cost=100, fling_power=100, ): item = Item.objects.create( name=name, item_category=item_category, - cost=cost, fling_power=fling_power, item_fling_effect=item_fling_effect, ) @@ -2714,7 +2712,6 @@ def test_item_api(self): # base params self.assertEqual(response.data["id"], item.pk) self.assertEqual(response.data["name"], item.name) - self.assertEqual(response.data["cost"], item.cost) self.assertEqual(response.data["fling_power"], item.fling_power) # name params self.assertEqual(response.data["names"][0]["name"], item_name.name) From 8a07effb0bfd2d000d2065e417f0646cc19c0fc0 Mon Sep 17 00:00:00 2001 From: Anh Thang Bui Date: Mon, 9 Mar 2026 21:14:40 +0700 Subject: [PATCH 5/7] correct tm01, tm02 --- data/v2/csv/item_prices.csv | 48 ++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/data/v2/csv/item_prices.csv b/data/v2/csv/item_prices.csv index a4b5176c3..92c148005 100644 --- a/data/v2/csv/item_prices.csv +++ b/data/v2/csv/item_prices.csv @@ -1,30 +1,28 @@ item_id,version_group_id,is_purchasable,purchase_price,sell_price 305,1,1,3000,1500 305,2,1,3000,1500 -305,16,1,10000,5000 -305,20,1,3000,1500 -305,21,1,3000,1500 -305,22,1,3000,1500 -305,25,1,50000,25000 -305,26,1,50000,25000 -305,27,1,50000,25000 +305,3,0,,1500 +305,4,0,,1500 +305,5,0,,1500 +305,6,0,,1500 +305,7,0,,1500 +305,16,1,5000, +305,20,1,40000, +305,23,1,,1500 +305,25,1,,400 305,28,1,3000,1500 305,29,1,3000,1500 -305,3,0,0,1500 -305,4,0,0,1500 -305,5,0,0,1500 -305,6,0,0,1500 -305,7,0,0,1500 -305,8,0,0,5000 -305,9,0,0,5000 -305,10,0,0,5000 -305,11,0,0,5000 -305,12,0,0,1500 -305,13,0,0,1500 -305,14,0,0,5000 -305,15,0,0,5000 -305,17,0,0,5000 -305,18,0,0,5000 -305,19,0,0,0 -305,23,0,0,5000 -305,24,0,0,5000 +306,1,1,2000,1000 +306,2,1,2000,1000 +306,3,1,2000,1000 +306,4,1,2000,1000 +306,5,0,,1500 +306,6,0,,1500 +306,7,0,,1500 +306,8,0,,1500 +306,9,0,,1500 +306,10,0,,1500 +306,12,0,,1500 +306,13,0,,1500 +306,23,1,,1500 +306,25,1,,400 From c2c17cf26e501c470b72c238d88b891205a64af5 Mon Sep 17 00:00:00 2001 From: Anh Thang Bui Date: Mon, 9 Mar 2026 22:38:44 +0700 Subject: [PATCH 6/7] fix: purchase_price and sell_price should be nullable --- data/v2/build.py | 4 ++-- pokemon_v2/migrations/0026_itemprice.py | 4 ++-- pokemon_v2/models.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/v2/build.py b/data/v2/build.py index 19c50edfa..f7a7e864e 100644 --- a/data/v2/build.py +++ b/data/v2/build.py @@ -548,8 +548,8 @@ def csv_record_to_objects(info): item_id=int(info[0]), version_group_id=int(info[1]), is_purchasable=bool(int(info[2])), - purchase_price=int(info[3]), - sell_price=int(info[4]), + purchase_price=int(info[3]) if info[3] else None, + sell_price=int(info[4]) if info[4] else None, ) build_generic((ItemPrice,), "item_prices.csv", csv_record_to_objects) diff --git a/pokemon_v2/migrations/0026_itemprice.py b/pokemon_v2/migrations/0026_itemprice.py index 516cab66e..dcb6ec070 100644 --- a/pokemon_v2/migrations/0026_itemprice.py +++ b/pokemon_v2/migrations/0026_itemprice.py @@ -24,8 +24,8 @@ class Migration(migrations.Migration): ), ), ("is_purchasable", models.BooleanField()), - ("purchase_price", models.IntegerField()), - ("sell_price", models.IntegerField()), + ("purchase_price", models.IntegerField(blank=True, null=True)), + ("sell_price", models.IntegerField(blank=True, null=True)), ( "item", models.ForeignKey( diff --git a/pokemon_v2/models.py b/pokemon_v2/models.py index 4fdc56e8b..59b50d202 100644 --- a/pokemon_v2/models.py +++ b/pokemon_v2/models.py @@ -885,8 +885,8 @@ class ItemGameIndex(HasItem, HasGeneration, HasGameIndex): class ItemPrice(HasItem, HasVersionGroup): is_purchasable = models.BooleanField() - purchase_price = models.IntegerField() - sell_price = models.IntegerField() + purchase_price = models.IntegerField(blank=True, null=True) + sell_price = models.IntegerField(blank=True, null=True) class ItemSprites(HasItem): From c7b99917a6bdfd3d55076718a67e2714e2b65504 Mon Sep 17 00:00:00 2001 From: Anh Thang Bui Date: Tue, 10 Mar 2026 22:43:34 +0700 Subject: [PATCH 7/7] update openapi specs, fix Location.region and Region.main_generation is nullable --- openapi.yml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/openapi.yml b/openapi.yml index 54a2918c2..d5e02d28d 100644 --- a/openapi.yml +++ b/openapi.yml @@ -4700,6 +4700,11 @@ components: items: $ref: '#/components/schemas/ItemGameIndex' readOnly: true + prices: + type: array + items: + $ref: '#/components/schemas/ItemPrice' + readOnly: true names: type: array items: @@ -4919,6 +4924,24 @@ components: required: - language - name + ItemPrice: + type: object + properties: + is_purchasable: + type: boolean + purchase_price: + type: + - integer + - 'null' + sell_price: + type: + - integer + - 'null' + version_group: + $ref: '#/components/schemas/VersionGroupSummary' + required: + - is_purchasable + - version_group ItemPocketDetail: type: object properties: @@ -7526,7 +7549,6 @@ components: - name - names - pokemon_entries - - region - version_groups PokedexName: type: object @@ -8634,7 +8656,6 @@ components: required: - id - locations - - main_generation - name - names - pokedexes