From 0471f98941e5403a46f07b5c31e96609ca02f011 Mon Sep 17 00:00:00 2001 From: JVMartyns Date: Mon, 8 Apr 2024 10:27:14 -0300 Subject: [PATCH 1/3] feat: add the query parameter `q` to search for pokemon using a partial name --- pokemon_v2/api.py | 10 ++++++++++ pokemon_v2/tests.py | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/pokemon_v2/api.py b/pokemon_v2/api.py index 790f62b93..e54052111 100644 --- a/pokemon_v2/api.py +++ b/pokemon_v2/api.py @@ -4,6 +4,7 @@ from rest_framework.views import APIView from django.shortcuts import get_object_or_404 from django.http import Http404 +from django.db.models import Q from .models import * from .serializers import * @@ -38,6 +39,15 @@ class NameOrIdRetrieval: idPattern = re.compile(r"^-?[0-9]+$") namePattern = re.compile(r"^[0-9A-Za-z\-\+]+$") + def get_queryset(self): + queryset = super().get_queryset() + filter = self.request.GET.get('q', '') + + if filter: + queryset = queryset.filter(Q(name__icontains=filter)) + + return queryset + def get_object(self): queryset = self.get_queryset() queryset = self.filter_queryset(queryset) diff --git a/pokemon_v2/tests.py b/pokemon_v2/tests.py index e458f467c..48b8aa5ef 100644 --- a/pokemon_v2/tests.py +++ b/pokemon_v2/tests.py @@ -5099,6 +5099,25 @@ def test_pokemon_api(self): "{}".format(cries_data["legacy"]), ) + # test search pokemon using search query param `q=partial_name` + + response = self.client.get( + "{}/pokemon/?q={}".format(API_V2, pokemon.name[:2]), + HTTP_HOST="testserver", + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["name"], pokemon.name) + + response = self.client.get( + "{}/pokemon/?q={}".format(API_V2, pokemon.name[-3:]), + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["name"], pokemon.name) + def test_pokemon_form_api(self): pokemon_species = self.setup_pokemon_species_data() pokemon = self.setup_pokemon_data(pokemon_species=pokemon_species) From eb70b7012cde8aa0ce5e664bf662e7e95779d6e3 Mon Sep 17 00:00:00 2001 From: JVMartyns Date: Mon, 8 Apr 2024 10:51:12 -0300 Subject: [PATCH 2/3] format file api.py --- pokemon_v2/api.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pokemon_v2/api.py b/pokemon_v2/api.py index e54052111..0e82eb533 100644 --- a/pokemon_v2/api.py +++ b/pokemon_v2/api.py @@ -397,7 +397,8 @@ def get(self, request, pokemon_id): for area_id in area_ids: location_area = location_area_objects.get(pk=area_id) - area_encounters = encounter_objects.filter(location_area_id=area_id) + area_encounters = encounter_objects.filter( + location_area_id=area_id) version_ids = ( area_encounters.order_by("version_id") @@ -422,8 +423,10 @@ def get(self, request, pokemon_id): encounter_details_list = [] for encounter in encounters_data: - slot = EncounterSlot.objects.get(pk=encounter["encounter_slot"]) - slot_data = EncounterSlotSerializer(slot, context=self.context).data + slot = EncounterSlot.objects.get( + pk=encounter["encounter_slot"]) + slot_data = EncounterSlotSerializer( + slot, context=self.context).data del encounter["pokemon"] del encounter["encounter_slot"] From 176fdf34179da80ec0f03d2f46f53defa868a917 Mon Sep 17 00:00:00 2001 From: JVMartyns Date: Mon, 8 Apr 2024 11:05:29 -0300 Subject: [PATCH 3/3] style: apply format using black --- config/wsgi.py | 1 + data/v2/build.py | 8 ++++--- pokemon_v2/api.py | 11 ++++----- pokemon_v2/tests.py | 58 ++++++++++++++++++++++++--------------------- 4 files changed, 41 insertions(+), 37 deletions(-) diff --git a/config/wsgi.py b/config/wsgi.py index 9642109ba..d246049de 100755 --- a/config/wsgi.py +++ b/config/wsgi.py @@ -13,6 +13,7 @@ framework. """ + import os from django.core.wsgi import get_wsgi_application diff --git a/data/v2/build.py b/data/v2/build.py index 4c3eae767..9e6459eb7 100644 --- a/data/v2/build.py +++ b/data/v2/build.py @@ -1242,9 +1242,11 @@ def csv_record_to_objects(info): id=int(info[0]), location_id=int(info[1]), game_index=int(info[2]), - name="{}-{}".format(location.name, info[3]) - if info[3] - else "{}-{}".format(location.name, "area"), + name=( + "{}-{}".format(location.name, info[3]) + if info[3] + else "{}-{}".format(location.name, "area") + ), ) build_generic((LocationArea,), "location_areas.csv", csv_record_to_objects) diff --git a/pokemon_v2/api.py b/pokemon_v2/api.py index 0e82eb533..6e8972451 100644 --- a/pokemon_v2/api.py +++ b/pokemon_v2/api.py @@ -41,7 +41,7 @@ class NameOrIdRetrieval: def get_queryset(self): queryset = super().get_queryset() - filter = self.request.GET.get('q', '') + filter = self.request.GET.get("q", "") if filter: queryset = queryset.filter(Q(name__icontains=filter)) @@ -397,8 +397,7 @@ def get(self, request, pokemon_id): for area_id in area_ids: location_area = location_area_objects.get(pk=area_id) - area_encounters = encounter_objects.filter( - location_area_id=area_id) + area_encounters = encounter_objects.filter(location_area_id=area_id) version_ids = ( area_encounters.order_by("version_id") @@ -423,10 +422,8 @@ def get(self, request, pokemon_id): encounter_details_list = [] for encounter in encounters_data: - slot = EncounterSlot.objects.get( - pk=encounter["encounter_slot"]) - slot_data = EncounterSlotSerializer( - slot, context=self.context).data + slot = EncounterSlot.objects.get(pk=encounter["encounter_slot"]) + slot_data = EncounterSlotSerializer(slot, context=self.context).data del encounter["pokemon"] del encounter["encounter_slot"] diff --git a/pokemon_v2/tests.py b/pokemon_v2/tests.py index 48b8aa5ef..efa42567d 100644 --- a/pokemon_v2/tests.py +++ b/pokemon_v2/tests.py @@ -1679,42 +1679,46 @@ def setup_pokemon_sprites_data( showdown = { "front_default": showdown_path % pokemon.id if front_default else None, - "front_female": showdown_path % f"female/{pokemon.id}" - if front_female - else None, - "front_shiny": showdown_path % f"shiny/{pokemon.id}" - if front_shiny - else None, - "front_shiny_female": showdown_path % f"shiny/female/{pokemon.id}" - if front_shiny_female - else None, - "back_default": showdown_path % f"back/{pokemon.id}" - if back_default - else None, - "back_female": showdown_path % f"back/female/{pokemon.id}" - if back_female - else None, - "back_shiny": showdown_path % f"back/shiny/{pokemon.id}" - if back_shiny - else None, - "back_shiny_female": showdown_path % f"back/shiny/female/{pokemon.id}" - if back_shiny_female - else None, + "front_female": ( + showdown_path % f"female/{pokemon.id}" if front_female else None + ), + "front_shiny": ( + showdown_path % f"shiny/{pokemon.id}" if front_shiny else None + ), + "front_shiny_female": ( + showdown_path % f"shiny/female/{pokemon.id}" + if front_shiny_female + else None + ), + "back_default": ( + showdown_path % f"back/{pokemon.id}" if back_default else None + ), + "back_female": ( + showdown_path % f"back/female/{pokemon.id}" if back_female else None + ), + "back_shiny": ( + showdown_path % f"back/shiny/{pokemon.id}" if back_shiny else None + ), + "back_shiny_female": ( + showdown_path % f"back/shiny/female/{pokemon.id}" + if back_shiny_female + else None + ), } sprites = { "front_default": sprite_path % pokemon.id if front_default else None, "front_female": sprite_path % pokemon.id if front_female else None, "front_shiny": sprite_path % pokemon.id if front_shiny else None, - "front_shiny_female": sprite_path % pokemon.id - if front_shiny_female - else None, + "front_shiny_female": ( + sprite_path % pokemon.id if front_shiny_female else None + ), "back_default": sprite_path % pokemon.id if back_default else None, "back_female": sprite_path % pokemon.id if back_female else None, "back_shiny": sprite_path % pokemon.id if back_shiny else None, - "back_shiny_female": sprite_path % pokemon.id - if back_shiny_female - else None, + "back_shiny_female": ( + sprite_path % pokemon.id if back_shiny_female else None + ), } pokemon_sprites = PokemonSprites.objects.create(