From e235c49dc8a81c497df35aa7b48fe0e9be029f52 Mon Sep 17 00:00:00 2001 From: johnnybeatzxxd Date: Tue, 7 Jan 2025 18:45:26 +0300 Subject: [PATCH 1/9] pokemon_by_id endpoint added --- pokemon/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pokemon/views.py b/pokemon/views.py index d7ef66b..fca2ae0 100644 --- a/pokemon/views.py +++ b/pokemon/views.py @@ -23,8 +23,10 @@ def pokemon_by_id(request, id): """ Get Pokemon by ID """ + pokemon = Pokemon.objects.get(id=id) + serializer = PokemonSerializer(pokemon, ) # TODO: Implement Endpoint - return HttpResponse(status=501) + return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @csrf_exempt From b413083240803e2754a3bf4021a47a472fe3c81a Mon Sep 17 00:00:00 2001 From: johnnybeatzxxd Date: Tue, 7 Jan 2025 19:10:13 +0300 Subject: [PATCH 2/9] pokemon_by_name endpoint added --- pokemon/views.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pokemon/views.py b/pokemon/views.py index fca2ae0..4e48a95 100644 --- a/pokemon/views.py +++ b/pokemon/views.py @@ -1,7 +1,8 @@ from django.http import JsonResponse, HttpResponse from django.views.decorators.csrf import csrf_exempt from rest_framework.decorators import api_view - +from django.db.models import Q +import pokemon from pokemon.models import Pokemon, VALID_POKEMON_TYPES from pokemon.serializers import PokemonSerializer @@ -24,8 +25,7 @@ def pokemon_by_id(request, id): Get Pokemon by ID """ pokemon = Pokemon.objects.get(id=id) - serializer = PokemonSerializer(pokemon, ) - # TODO: Implement Endpoint + serializer = PokemonSerializer(pokemon) return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @@ -35,8 +35,15 @@ def pokemon_by_name(request, name): """ Get Pokemon by name """ - # TODO: Implement Endpoint - return HttpResponse(status=501) + pokemon = Pokemon.objects.filter( + Q(name_english__icontains=name) | + Q(name_japanese__icontains=name) | + Q(name_chinese__icontains=name) | + Q(name_french__icontains=name) + + ) + serializer = PokemonSerializer(pokemon, many=True) + return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @csrf_exempt From ec9113dcd1824e9ee16c7acf62d225f951c012f5 Mon Sep 17 00:00:00 2001 From: johnnybeatzxxd Date: Tue, 7 Jan 2025 19:21:04 +0300 Subject: [PATCH 3/9] registered the models in admin --- pokemon/admin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pokemon/admin.py b/pokemon/admin.py index 8c38f3f..154f65f 100644 --- a/pokemon/admin.py +++ b/pokemon/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin +from .models import Pokemon, PokemonTypes # Register your models here. +admin.site.register(Pokemon) +admin.site.register(PokemonTypes) From 3dd3fc9e92590c0b00c2ca650590bd8718bc580e Mon Sep 17 00:00:00 2001 From: johnnybeatzxxd Date: Tue, 7 Jan 2025 19:37:36 +0300 Subject: [PATCH 4/9] pokemon_by_type endpoint added --- pokemon/views.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pokemon/views.py b/pokemon/views.py index 4e48a95..c9489cb 100644 --- a/pokemon/views.py +++ b/pokemon/views.py @@ -3,7 +3,7 @@ from rest_framework.decorators import api_view from django.db.models import Q import pokemon -from pokemon.models import Pokemon, VALID_POKEMON_TYPES +from pokemon.models import Pokemon, VALID_POKEMON_TYPES, PokemonTypes from pokemon.serializers import PokemonSerializer @@ -40,7 +40,6 @@ def pokemon_by_name(request, name): Q(name_japanese__icontains=name) | Q(name_chinese__icontains=name) | Q(name_french__icontains=name) - ) serializer = PokemonSerializer(pokemon, many=True) return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @@ -51,9 +50,10 @@ def pokemon_by_type(request, pokemon_type): """ Get Pokemon by type """ - # TODO: Implement Endpoint - return HttpResponse(status=501) - + pokemon_types = PokemonTypes.objects.filter(type=pokemon_type) + pokemons = [ pokemon_type.pokemon for pokemon_type in pokemon_types] + serializer = PokemonSerializer(pokemons, many=True) + return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @csrf_exempt def pokemon_by_hp(request): From 73add50698b9dfa970946fc9bb97c759a3c3fa0a Mon Sep 17 00:00:00 2001 From: johnnybeatzxxd Date: Wed, 8 Jan 2025 11:51:39 +0300 Subject: [PATCH 5/9] added pokemon type serializer --- pokemon/serializers.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pokemon/serializers.py b/pokemon/serializers.py index 2148325..f7fc6a1 100644 --- a/pokemon/serializers.py +++ b/pokemon/serializers.py @@ -2,12 +2,15 @@ from pokemon.models import Pokemon, PokemonTypes -# TODO: Add a serializer for PokemonTypes, and use it as a nested serializer for PokemonSerializer - +class PokemonTypesSerializer(serializers.ModelSerializer): + class Meta: + model = PokemonTypes + fields = ('type',) + class PokemonSerializer(serializers.ModelSerializer): - + types = PokemonTypesSerializer(many=True,read_only=True) class Meta: model = Pokemon fields = ('id', 'name_english', 'name_japanese', 'name_chinese', 'name_french', 'hp', 'attack', 'defense', - 'special_attack', 'special_defense', 'speed', ) + 'special_attack', 'special_defense', 'speed', 'types',) From 2959d09a4457a81179e294fa43d295900aea3d4c Mon Sep 17 00:00:00 2001 From: johnnybeatzxxd Date: Wed, 8 Jan 2025 12:02:25 +0300 Subject: [PATCH 6/9] added error handling to pokemon_types endpoint --- pokemon/views.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pokemon/views.py b/pokemon/views.py index c9489cb..9efb208 100644 --- a/pokemon/views.py +++ b/pokemon/views.py @@ -4,6 +4,7 @@ from django.db.models import Q import pokemon from pokemon.models import Pokemon, VALID_POKEMON_TYPES, PokemonTypes +from pokemon.models import Pokemon, PokemonTypes from pokemon.serializers import PokemonSerializer @@ -51,7 +52,10 @@ def pokemon_by_type(request, pokemon_type): Get Pokemon by type """ pokemon_types = PokemonTypes.objects.filter(type=pokemon_type) + pokemon_types = PokemonTypes.objects.filter(type__icontains=pokemon_type) pokemons = [ pokemon_type.pokemon for pokemon_type in pokemon_types] + if pokemons == []: + return JsonResponse({"error":"Bad request"}) serializer = PokemonSerializer(pokemons, many=True) return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) From 187fc4fdd448468a192173c314fd8df1a2072610 Mon Sep 17 00:00:00 2001 From: johnnybeatzxxd Date: Wed, 8 Jan 2025 12:05:15 +0300 Subject: [PATCH 7/9] added pokemon_by_hp endpoint added --- pokemon/views.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/pokemon/views.py b/pokemon/views.py index 9efb208..8732165 100644 --- a/pokemon/views.py +++ b/pokemon/views.py @@ -2,8 +2,6 @@ from django.views.decorators.csrf import csrf_exempt from rest_framework.decorators import api_view from django.db.models import Q -import pokemon -from pokemon.models import Pokemon, VALID_POKEMON_TYPES, PokemonTypes from pokemon.models import Pokemon, PokemonTypes from pokemon.serializers import PokemonSerializer @@ -66,3 +64,18 @@ def pokemon_by_hp(request): """ # TODO: Implement Endpoint return HttpResponse(status=501) + params = request.GET + hp_lt = request.GET.get("lt") + hp_gt = request.GET.get("gt") + query = Q() + if hp_gt: + query &= Q(hp__gt = hp_gt) + + if hp_lt: + query &= Q(hp__lt = hp_lt) + if hp_gt and hp_lt: + if hp_gt > hp_lt: + return JsonResponse({"error":"Not found"},status=404) + pokemons = Pokemon.objects.filter(query) + serializer = PokemonSerializer(pokemons,many=True) + return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) From c8daa6c83d39eb338a2a13db9dda2e8291b250d7 Mon Sep 17 00:00:00 2001 From: johnnybeatzxxd Date: Wed, 8 Jan 2025 12:06:08 +0300 Subject: [PATCH 8/9] handle error for pokemon_by_hp endpoint --- pokemon/views.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pokemon/views.py b/pokemon/views.py index 8732165..a266b8b 100644 --- a/pokemon/views.py +++ b/pokemon/views.py @@ -16,7 +16,6 @@ def pokemon_list(request): serializer = PokemonSerializer(pokemon, many=True) return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) - @csrf_exempt @api_view(['GET']) def pokemon_by_id(request, id): @@ -49,7 +48,6 @@ def pokemon_by_type(request, pokemon_type): """ Get Pokemon by type """ - pokemon_types = PokemonTypes.objects.filter(type=pokemon_type) pokemon_types = PokemonTypes.objects.filter(type__icontains=pokemon_type) pokemons = [ pokemon_type.pokemon for pokemon_type in pokemon_types] if pokemons == []: @@ -62,20 +60,27 @@ def pokemon_by_hp(request): """ Get Pokemon by HP """ - # TODO: Implement Endpoint - return HttpResponse(status=501) params = request.GET hp_lt = request.GET.get("lt") hp_gt = request.GET.get("gt") query = Q() + + for key in params: + if key not in ["gt","gte","lt","lte"]: + return JsonResponse({"error":'Invalid Operator. Must be one of ["gt","gte","lt","lte"]'}) + if hp_gt: query &= Q(hp__gt = hp_gt) if hp_lt: query &= Q(hp__lt = hp_lt) + if hp_gt and hp_lt: if hp_gt > hp_lt: return JsonResponse({"error":"Not found"},status=404) + pokemons = Pokemon.objects.filter(query) serializer = PokemonSerializer(pokemons,many=True) + return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) + From 599a3fdf7d648c695593020323dbfeb51060f82c Mon Sep 17 00:00:00 2001 From: johnnybeatzxxd Date: Wed, 8 Jan 2025 12:33:37 +0300 Subject: [PATCH 9/9] handled error for pokemon_by_id endpoint --- pokemon/serializers.py | 2 +- pokemon/views.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pokemon/serializers.py b/pokemon/serializers.py index f7fc6a1..e2abed9 100644 --- a/pokemon/serializers.py +++ b/pokemon/serializers.py @@ -6,7 +6,7 @@ class PokemonTypesSerializer(serializers.ModelSerializer): class Meta: model = PokemonTypes - fields = ('type',) + fields = ('type','id',) class PokemonSerializer(serializers.ModelSerializer): types = PokemonTypesSerializer(many=True,read_only=True) diff --git a/pokemon/views.py b/pokemon/views.py index a266b8b..b0c902b 100644 --- a/pokemon/views.py +++ b/pokemon/views.py @@ -1,7 +1,8 @@ -from django.http import JsonResponse, HttpResponse +from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from rest_framework.decorators import api_view from django.db.models import Q +from rest_framework.views import status from pokemon.models import Pokemon, PokemonTypes from pokemon.serializers import PokemonSerializer @@ -22,7 +23,10 @@ def pokemon_by_id(request, id): """ Get Pokemon by ID """ - pokemon = Pokemon.objects.get(id=id) + try: + pokemon = Pokemon.objects.get(id=id) + except: + return JsonResponse({"error": "Not found"},status=404) serializer = PokemonSerializer(pokemon) return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @@ -40,6 +44,8 @@ def pokemon_by_name(request, name): Q(name_french__icontains=name) ) serializer = PokemonSerializer(pokemon, many=True) + if serializer == []: + return JsonResponse({"error": "Not found"},status=404) return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @@ -51,7 +57,7 @@ def pokemon_by_type(request, pokemon_type): pokemon_types = PokemonTypes.objects.filter(type__icontains=pokemon_type) pokemons = [ pokemon_type.pokemon for pokemon_type in pokemon_types] if pokemons == []: - return JsonResponse({"error":"Bad request"}) + return JsonResponse({"error":"Bad request"},status=404) serializer = PokemonSerializer(pokemons, many=True) return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @@ -67,7 +73,7 @@ def pokemon_by_hp(request): for key in params: if key not in ["gt","gte","lt","lte"]: - return JsonResponse({"error":'Invalid Operator. Must be one of ["gt","gte","lt","lte"]'}) + return JsonResponse({"error":'Invalid Operator. Must be one of ["gt","gte","lt","lte"]'},status=404) if hp_gt: query &= Q(hp__gt = hp_gt)