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) diff --git a/pokemon/serializers.py b/pokemon/serializers.py index 2148325..e2abed9 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','id',) + 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',) diff --git a/pokemon/views.py b/pokemon/views.py index d7ef66b..b0c902b 100644 --- a/pokemon/views.py +++ b/pokemon/views.py @@ -1,8 +1,9 @@ -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 pokemon.models import Pokemon, VALID_POKEMON_TYPES +from django.db.models import Q +from rest_framework.views import status +from pokemon.models import Pokemon, PokemonTypes from pokemon.serializers import PokemonSerializer @@ -16,15 +17,18 @@ 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): """ Get Pokemon by ID """ - # TODO: Implement Endpoint - return HttpResponse(status=501) + 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}) @csrf_exempt @@ -33,8 +37,16 @@ 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) + if serializer == []: + return JsonResponse({"error": "Not found"},status=404) + return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @csrf_exempt @@ -42,14 +54,39 @@ def pokemon_by_type(request, pokemon_type): """ Get Pokemon by type """ - # TODO: Implement Endpoint - return HttpResponse(status=501) - + 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"},status=404) + serializer = PokemonSerializer(pokemons, many=True) + return JsonResponse(serializer.data, safe=False, json_dumps_params={'ensure_ascii': False}) @csrf_exempt 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"]'},status=404) + + 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}) +