From 7cdaa767b29fe104f2b97682ab61b012bfaccd6c Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Thu, 1 Sep 2022 19:17:35 -0700 Subject: [PATCH 01/21] Started lab 6 pokedex rest framework --- .../lab06_pokedex/pokedex/manage.py | 22 +++ .../lab06_pokedex/pokedex/pokedex/__init__.py | 0 .../lab06_pokedex/pokedex/pokedex/asgi.py | 16 +++ .../lab06_pokedex/pokedex/pokedex/settings.py | 132 ++++++++++++++++++ .../lab06_pokedex/pokedex/pokedex/urls.py | 40 ++++++ .../lab06_pokedex/pokedex/pokedex/wsgi.py | 16 +++ 6 files changed, 226 insertions(+) create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/manage.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/__init__.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/asgi.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/wsgi.py diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/manage.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/manage.py new file mode 100644 index 00000000..6adc02e8 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pokedex.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/__init__.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/asgi.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/asgi.py new file mode 100644 index 00000000..814acf01 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for pokedex project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pokedex.settings') + +application = get_asgi_application() diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py new file mode 100644 index 00000000..a07547b4 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py @@ -0,0 +1,132 @@ +""" +Django settings for pokedex project. + +Generated by 'django-admin startproject' using Django 4.1. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.1/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-)ld-o&xdd(brijc!%qd&-uenw-u3jp4$ir_ntptbn5j_&zbm4%' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'rest_framework', +] + +ROOT_URLCONF = 'pokedex.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'pokedex.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.1/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +REST_FRAMEWORK = { + # Use Django's standard `django.contrib.auth` permissions, + # or allow read-only access for unauthenticated users. + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' + ] +} \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py new file mode 100644 index 00000000..8b0add22 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py @@ -0,0 +1,40 @@ +"""pokedex URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.urls import path, include +from django.contrib.auth.models import User +from rest_framework import routers, serializers, viewsets + +# Serializers define the API representation. +class UserSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = User + fields = ['url', 'username', 'email', 'is_staff'] + +# ViewSets define the view behavior. +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all() + serializer_class = UserSerializer + +# Routers provide an easy way of automatically determining the URL conf. +router = routers.DefaultRouter() +router.register(r'users', UserViewSet) + +# Wire up our API using automatic URL routing. +# Additionally, we include login URLs for the browsable API. +urlpatterns = [ + path('', include(router.urls)), + path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) +] \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/wsgi.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/wsgi.py new file mode 100644 index 00000000..8676b252 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for pokedex project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pokedex.settings') + +application = get_wsgi_application() From 2c743ae86a849af494cb15d8484add33ba08bad4 Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Fri, 2 Sep 2022 18:34:15 -0700 Subject: [PATCH 02/21] Django rest framework --- .../labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py index a07547b4..eb220dac 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py @@ -37,6 +37,7 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'rest_framework', ] MIDDLEWARE = [ @@ -47,7 +48,6 @@ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'rest_framework', ] ROOT_URLCONF = 'pokedex.urls' From 7ad2dc12f212dfa9cfc5b4a376e48452af481e84 Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Fri, 9 Sep 2022 19:21:18 -0700 Subject: [PATCH 03/21] Working on Pokedex app --- .../lab06_pokedex/pokedex/pokedex/settings.py | 20 ++++++++------ .../lab06_pokedex/pokedex/pokedex/urls.py | 27 ++++++++++--------- .../lab06_pokedex/pokedex/pokemon/__init__.py | 0 .../lab06_pokedex/pokedex/pokemon/admin.py | 3 +++ .../lab06_pokedex/pokedex/pokemon/apps.py | 6 +++++ .../management/commands/load_pokemon.py | 0 .../pokedex/pokemon/migrations/__init__.py | 0 .../lab06_pokedex/pokedex/pokemon/models.py | 3 +++ .../lab06_pokedex/pokedex/pokemon/tests.py | 3 +++ .../lab06_pokedex/pokedex/pokemon/urls.py | 0 .../lab06_pokedex/pokedex/pokemon/views.py | 3 +++ .../pokedex/templates/index.html | 0 12 files changed, 44 insertions(+), 21 deletions(-) create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/__init__.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/admin.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/apps.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/__init__.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/tests.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py index eb220dac..ff3dfd97 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py @@ -37,7 +37,8 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'rest_framework', + # 'rest_framework', + 'pokemon', ] MIDDLEWARE = [ @@ -123,10 +124,13 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -REST_FRAMEWORK = { - # Use Django's standard `django.contrib.auth` permissions, - # or allow read-only access for unauthenticated users. - 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' - ] -} \ No newline at end of file +# REST_FRAMEWORK = { +# # Use Django's standard `django.contrib.auth` permissions, +# # or allow read-only access for unauthenticated users. +# 'DEFAULT_PERMISSION_CLASSES': [ +# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' +# ] +# } + +MEDIA_ROOT = [os.path.join{BASE_DIR, 'media'}] +MEDIA_URL - '/media/' diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py index 8b0add22..bdf97d5c 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py @@ -13,28 +13,29 @@ 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ +from .views import index from django.urls import path, include from django.contrib.auth.models import User from rest_framework import routers, serializers, viewsets # Serializers define the API representation. -class UserSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = User - fields = ['url', 'username', 'email', 'is_staff'] +# class UserSerializer(serializers.HyperlinkedModelSerializer): +# class Meta: +# model = User +# fields = ['url', 'username', 'email', 'is_staff'] -# ViewSets define the view behavior. -class UserViewSet(viewsets.ModelViewSet): - queryset = User.objects.all() - serializer_class = UserSerializer +# # ViewSets define the view behavior. +# class UserViewSet(viewsets.ModelViewSet): +# queryset = User.objects.all() +# serializer_class = UserSerializer -# Routers provide an easy way of automatically determining the URL conf. -router = routers.DefaultRouter() -router.register(r'users', UserViewSet) +# # Routers provide an easy way of automatically determining the URL conf. +# router = routers.DefaultRouter() +# router.register(r'users', UserViewSet) # Wire up our API using automatic URL routing. # Additionally, we include login URLs for the browsable API. urlpatterns = [ - path('', include(router.urls)), - path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) + path('', index, name='index') + # path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) ] \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/__init__.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/admin.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/apps.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/apps.py new file mode 100644 index 00000000..0b4175f1 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PokemonConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'pokemon' diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py new file mode 100644 index 00000000..e69de29b diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/__init__.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/tests.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py new file mode 100644 index 00000000..e69de29b diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html new file mode 100644 index 00000000..e69de29b From c728e5b20b05c1ac17e27c9b1091f8ef936540ce Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Fri, 9 Sep 2022 20:12:08 -0700 Subject: [PATCH 04/21] Working on Pokedex optional lab --- .../management/commands/load_pokemon.py | 33 +++++++++++++++++++ .../lab06_pokedex/pokedex/pokemon/models.py | 16 +++++++++ .../lab06_pokedex/pokedex/pokemon/urls.py | 4 +++ .../lab06_pokedex/pokedex/pokemon/views.py | 3 ++ 4 files changed, 56 insertions(+) diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py index e69de29b..02f36ff5 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py @@ -0,0 +1,33 @@ +from django.core.management.base import BaseCommand +from code.kelin.labs.django_labs.lab06_pokedex.pokedex.pokemon.models import PokemonType +from pokemon.models import Pokemon, +import json + +class Command(BaseCommand): + + def handle(self, *args, **options): + f = open('pokemon.json') + poke_balls = json.load(f) + for pokemon in poke_balls['pokemon']: + name_ext = pokemon.get('name') + number_ext = pokemon.get('number') + height_ext = pokemon.get('height') + weight_ext = pokemon.get('weight') + image_front_ext = pokemon.get('image_front') + image_back_ext = pokemon.get('image_back') + + pokemon_obj = Pokemon.objects.create( + number = number_ext, + name = name_ext, + height = height_ext, + weight = weight_ext, + image_back = image_back_ext, + image_front = image_front_ext, + + ) + + for p_types in pokemon['types']: + pokemon_type, created = PokemonType.objects.get_or_create(name=p_types) + pokemon_obj.types.app(pokemon_type) + + print(pokemon_obj.name + ' has been uploaded') \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py index 71a83623..c3a658f6 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py @@ -1,3 +1,19 @@ from django.db import models # Create your models here. + +class PokemonType(models.Model): + name = models.CharField(max_length=100) + + def __str__(self): + return self.name + +class Pokemon(request): + number = models.IntegerField() + name = models.CharField(max_length=100) + height = models.IntegerField() + weight = models.IntegerField() + image_front = models.CharField(max_length=100) + image_back = models.CharField(max_length=100) + types = models.ManyToManyField() + diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py index e69de29b..775dfdf0 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py @@ -0,0 +1,4 @@ +from code.kelin.labs.django_labs.lab06_pokedex.pokedex.pokemon.models import Pokemon + + +app_name = [Pokemon] \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py index 91ea44a2..19cfcfb6 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py @@ -1,3 +1,6 @@ from django.shortcuts import render # Create your views here. + +def index(request): + return render(request, 'index.html') \ No newline at end of file From d7bb57938bca90615322e3f7c008e26acae2c5d6 Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Sat, 10 Sep 2022 11:38:28 -0700 Subject: [PATCH 05/21] Working on settings for Pokedex --- .../django_labs/lab06_pokedex/pokedex/pokedex/settings.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py index ff3dfd97..eff1751d 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py @@ -11,6 +11,7 @@ """ from pathlib import Path +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -132,5 +133,5 @@ # ] # } -MEDIA_ROOT = [os.path.join{BASE_DIR, 'media'}] -MEDIA_URL - '/media/' +MEDIA_ROOT = [os.path.join{BASE_DIR,'media'}] +MEDIA_URL = '/media/' From 083cefb2fd45a2eb968969d574ca14de63d95bef Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Mon, 12 Sep 2022 18:27:55 -0700 Subject: [PATCH 06/21] Mob coding Pokedex API --- .../lab06_pokedex/pokedex/pokedex/settings.py | 8 ++++---- .../pokedex/pokemon/serializer.py | 18 ++++++++++++++++++ .../lab06_pokedex/pokedex/pokemon/urls.py | 13 +++++++++++-- .../lab06_pokedex/pokedex/pokemon/views.py | 12 ++++++++++-- 4 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/serializer.py diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py index eff1751d..3e508c43 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py @@ -38,8 +38,8 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - # 'rest_framework', - 'pokemon', + 'rest_framework', + 'api', ] MIDDLEWARE = [ @@ -133,5 +133,5 @@ # ] # } -MEDIA_ROOT = [os.path.join{BASE_DIR,'media'}] -MEDIA_URL = '/media/' +# MEDIA_ROOT = [os.path.join{BASE_DIR,'media'}] +# MEDIA_URL = '/media/' diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/serializer.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/serializer.py new file mode 100644 index 00000000..35e7545b --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/serializer.py @@ -0,0 +1,18 @@ +from rest_framework import serializers +from pokemon.models import Pokemon, PokemonType + +class NestedTypeSerializer(serializers.ModelSerializer): + class Meta: + fields = ('name', ) + model = PokemonType + +class PokemonSerializer(serializers.ModelSerializer): + type_info = NestedTypeSerializer(many=True, source='types') + class Meta: + fields = ('number', 'name', 'height', 'weight', 'image_front', 'image_back', 'type_info') + model = Pokemon + +class TypeSerializer(serializers.ModelSerializer): + class Meta: + fields = ('name', ) + model = PokemonType \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py index 775dfdf0..e8bccb59 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py @@ -1,4 +1,13 @@ -from code.kelin.labs.django_labs.lab06_pokedex.pokedex.pokemon.models import Pokemon +from rest_framework.routers import DefaultRouter +from .views import PokemonViewSet, TypeViewSet + +router = DefaultRouter() + +router.register('pokemon', PokemonViewSet, basename='pokemon') +router.register('types', TypeViewSet, basename='types') + +urlpatterns = router.urls + [ + +] -app_name = [Pokemon] \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py index 19cfcfb6..215b15fb 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py @@ -1,6 +1,14 @@ from django.shortcuts import render +from rest_framework import viewsets +from pokemon.models import Pokemon, PokemonType +from .serializer import PokemonSerializer, TypeSerializer # Create your views here. -def index(request): - return render(request, 'index.html') \ No newline at end of file +class PokemonViewSet(viewsets.ModelViewSet): + queryset = Pokemon.objects.all() + serializer_class = PokemonSerializer + +class TypeViewSet(viewsets.ModelViewSet): + queryset = PokemonType.objects.all() + searlizer_class = TypeSerializer \ No newline at end of file From ad69c88712c3946fa52029e422affdd55ad9d170 Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Mon, 12 Sep 2022 19:01:01 -0700 Subject: [PATCH 07/21] Working on stylizing Pokedex from mob code --- .../django_labs/lab06_pokedex/pokedex/Pipfile | 11 + .../lab06_pokedex/pokedex/Pipfile.lock | 20 + .../lab06_pokedex/pokedex/api/__init__.py | 0 .../lab06_pokedex/pokedex/api/admin.py | 3 + .../lab06_pokedex/pokedex/api/apps.py | 6 + .../pokedex/api/migrations/__init__.py | 0 .../lab06_pokedex/pokedex/api/models.py | 3 + .../lab06_pokedex/pokedex/api/serializers.py | 18 + .../lab06_pokedex/pokedex/api/tests.py | 3 + .../lab06_pokedex/pokedex/api/urls.py | 12 + .../lab06_pokedex/pokedex/api/views.py | 11 + .../lab06_pokedex/pokedex/pokedex/settings.py | 36 +- .../lab06_pokedex/pokedex/pokedex/urls.py | 31 +- .../lab06_pokedex/pokedex/pokemon.json | 1883 +++++++++++++++++ .../lab06_pokedex/pokedex/pokemon/admin.py | 3 + .../management/commands/load_pokemon.py | 16 +- .../pokemon/migrations/0001_initial.py | 34 + .../lab06_pokedex/pokedex/pokemon/models.py | 13 +- .../lab06_pokedex/pokedex/pokemon/urls.py | 15 +- .../lab06_pokedex/pokedex/pokemon/views.py | 16 +- .../lab06_pokedex/pokedex/requirements.txt | 3 + .../pokedex/templates/index.html | 28 + .../pokedex/templates/registration/login.html | 6 + .../templates/registration/profile.html | 1 + .../templates/registration/register.html | 6 + .../lab06_pokedex/pokedex/users/__init__.py | 0 .../lab06_pokedex/pokedex/users/admin.py | 5 + .../lab06_pokedex/pokedex/users/apps.py | 6 + .../lab06_pokedex/pokedex/users/forms.py | 19 + .../pokedex/users/migrations/0001_initial.py | 25 + .../pokedex/users/migrations/__init__.py | 0 .../lab06_pokedex/pokedex/users/models.py | 11 + .../lab06_pokedex/pokedex/users/tests.py | 3 + .../lab06_pokedex/pokedex/users/urls.py | 11 + .../lab06_pokedex/pokedex/users/views.py | 27 + 35 files changed, 2211 insertions(+), 74 deletions(-) create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/Pipfile create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/Pipfile.lock create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/__init__.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/admin.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/apps.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/migrations/__init__.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/models.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/tests.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon.json create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0001_initial.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/requirements.txt create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/login.html create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/profile.html create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/register.html create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/__init__.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/admin.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/apps.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/forms.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/migrations/0001_initial.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/migrations/__init__.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/models.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/tests.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/urls.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/views.py diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/Pipfile b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/Pipfile new file mode 100644 index 00000000..71e4f7cb --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/Pipfile @@ -0,0 +1,11 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] + +[requires] +python_version = "3.9" diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/Pipfile.lock b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/Pipfile.lock new file mode 100644 index 00000000..8aee7e8e --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/Pipfile.lock @@ -0,0 +1,20 @@ +{ + "_meta": { + "hash": { + "sha256": "a36a5392bb1e8bbc06bfaa0761e52593cf2d83b486696bf54667ba8da616c839" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": {} +} diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/__init__.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/admin.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/apps.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/apps.py new file mode 100644 index 00000000..66656fd2 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'api' diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/migrations/__init__.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/models.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py new file mode 100644 index 00000000..db4be90c --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py @@ -0,0 +1,18 @@ +from rest_framework import serializers +from pokemon.models import Pokemon, PokemonType + +class NestedTypeSerializer(serializers.ModelSerializer): + class Meta: + fields = ('name',) + model = PokemonType + +class PokemonSerializer(serializers.ModelSerializer): + type_info = NestedTypeSerializer(many=True, source='types') + class Meta: + fields = ('number', 'name', 'height', 'weight', 'image_front', 'image_back', 'type_info', 'id') + model = Pokemon + +class TypeSerializer(serializers.ModelSerializer): + class Meta: + fields = ('name',) + model = PokemonType diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/tests.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py new file mode 100644 index 00000000..e48fc273 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py @@ -0,0 +1,12 @@ +from django.urls import path +from rest_framework.routers import DefaultRouter + +from .views import PokemonViewSet, TypeViewSet + +router = DefaultRouter() +router.register('pokemon', PokemonViewSet, basename='pokemon') +router.register('types', TypeViewSet, basename='types') + +urlpatterns = router.urls + [ + +] \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py new file mode 100644 index 00000000..f00358b8 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py @@ -0,0 +1,11 @@ +from rest_framework import viewsets +from pokemon.models import Pokemon, PokemonType +from .serializers import PokemonSerializer, TypeSerializer + +class PokemonViewSet(viewsets.ModelViewSet): + queryset = Pokemon.objects.all() + serializer_class = PokemonSerializer + +class TypeViewSet(viewsets.ModelViewSet): + queryset = PokemonType.objects.all() + serializer_class = TypeSerializer \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py index 3e508c43..17d68278 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/settings.py @@ -9,9 +9,8 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/4.1/ref/settings/ """ - -from pathlib import Path import os +from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -21,7 +20,7 @@ # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-)ld-o&xdd(brijc!%qd&-uenw-u3jp4$ir_ntptbn5j_&zbm4%' +SECRET_KEY = 'django-insecure-b@#5$phv@fg9blgg+7ig3g=%)z5_r@!sx66e+35%y#jp@j&^&=' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True @@ -38,8 +37,11 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.admindocs', 'rest_framework', - 'api', + 'api.apps.ApiConfig', + 'users.apps.UsersConfig', + 'pokemon.apps.PokemonConfig', ] MIDDLEWARE = [ @@ -57,7 +59,7 @@ TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], + 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -119,19 +121,25 @@ # https://docs.djangoproject.com/en/4.1/howto/static-files/ STATIC_URL = 'static/' +STATIC_DIR = [os.path.join(BASE_DIR, 'static')] + +LOGIN_REDIRECT_URL = '/' +LOGOUT_REDIRECT_URL = '/' # Default primary key field type # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -# REST_FRAMEWORK = { -# # Use Django's standard `django.contrib.auth` permissions, -# # or allow read-only access for unauthenticated users. -# 'DEFAULT_PERMISSION_CLASSES': [ -# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' -# ] -# } +AUTHENTICATION_BACKENDS = ( + 'django.contrib.auth.backends.ModelBackend', + ) + +MEDIA_ROOT = [os.path.join(BASE_DIR, 'media')] +MEDIA_URL = '/media/' -# MEDIA_ROOT = [os.path.join{BASE_DIR,'media'}] -# MEDIA_URL = '/media/' +REST_FRAMEWORK = { + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.AllowAny', + ] +} \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py index bdf97d5c..c473b3f6 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py @@ -13,29 +13,14 @@ 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ -from .views import index +from django.contrib import admin from django.urls import path, include -from django.contrib.auth.models import User -from rest_framework import routers, serializers, viewsets +from django.views.generic import TemplateView -# Serializers define the API representation. -# class UserSerializer(serializers.HyperlinkedModelSerializer): -# class Meta: -# model = User -# fields = ['url', 'username', 'email', 'is_staff'] - -# # ViewSets define the view behavior. -# class UserViewSet(viewsets.ModelViewSet): -# queryset = User.objects.all() -# serializer_class = UserSerializer - -# # Routers provide an easy way of automatically determining the URL conf. -# router = routers.DefaultRouter() -# router.register(r'users', UserViewSet) - -# Wire up our API using automatic URL routing. -# Additionally, we include login URLs for the browsable API. urlpatterns = [ - path('', index, name='index') - # path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) -] \ No newline at end of file + path('admin/doc/', include('django.contrib.admindocs.urls')), + path('admin/', admin.site.urls), + path('', TemplateView.as_view(template_name='index.html'), name='index'), + path('users/', include('users.urls')), + path('api/', include('api.urls')), +] diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon.json b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon.json new file mode 100644 index 00000000..0e383d62 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon.json @@ -0,0 +1,1883 @@ +{ + "pokemon": [ + { + "number": 1, + "name": "bulbasaur", + "height": 7, + "weight": 69, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/1.png", + "types": [ + "poison", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/bulbasaur" + }, + { + "number": 2, + "name": "ivysaur", + "height": 10, + "weight": 130, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/2.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/2.png", + "types": [ + "poison", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/ivysaur" + }, + { + "number": 3, + "name": "venusaur", + "height": 20, + "weight": 1000, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/3.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/3.png", + "types": [ + "poison", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/venusaur" + }, + { + "number": 4, + "name": "charmander", + "height": 6, + "weight": 85, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/4.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/4.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/charmander" + }, + { + "number": 5, + "name": "charmeleon", + "height": 11, + "weight": 190, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/5.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/5.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/charmeleon" + }, + { + "number": 6, + "name": "charizard", + "height": 17, + "weight": 905, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/6.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/6.png", + "types": [ + "flying", + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/charizard" + }, + { + "number": 7, + "name": "squirtle", + "height": 5, + "weight": 90, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/7.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/7.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/squirtle" + }, + { + "number": 8, + "name": "wartortle", + "height": 10, + "weight": 225, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/8.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/8.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/wartortle" + }, + { + "number": 9, + "name": "blastoise", + "height": 16, + "weight": 855, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/9.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/9.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/blastoise" + }, + { + "number": 10, + "name": "caterpie", + "height": 3, + "weight": 29, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/10.png", + "types": [ + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/caterpie" + }, + { + "number": 11, + "name": "metapod", + "height": 7, + "weight": 99, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/11.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/11.png", + "types": [ + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/metapod" + }, + { + "number": 12, + "name": "butterfree", + "height": 11, + "weight": 320, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/12.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/12.png", + "types": [ + "flying", + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/butterfree" + }, + { + "number": 13, + "name": "weedle", + "height": 3, + "weight": 32, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/13.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/13.png", + "types": [ + "poison", + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/weedle" + }, + { + "number": 14, + "name": "kakuna", + "height": 6, + "weight": 100, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/14.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/14.png", + "types": [ + "poison", + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/kakuna" + }, + { + "number": 15, + "name": "beedrill", + "height": 10, + "weight": 295, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/15.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/15.png", + "types": [ + "poison", + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/beedrill" + }, + { + "number": 16, + "name": "pidgey", + "height": 3, + "weight": 18, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/16.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/16.png", + "types": [ + "flying", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/pidgey" + }, + { + "number": 17, + "name": "pidgeotto", + "height": 11, + "weight": 300, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/17.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/17.png", + "types": [ + "flying", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/pidgeotto" + }, + { + "number": 18, + "name": "pidgeot", + "height": 15, + "weight": 395, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/18.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/18.png", + "types": [ + "flying", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/pidgeot" + }, + { + "number": 19, + "name": "rattata", + "height": 3, + "weight": 35, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/19.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/19.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/rattata" + }, + { + "number": 20, + "name": "raticate", + "height": 7, + "weight": 185, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/20.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/20.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/raticate" + }, + { + "number": 21, + "name": "spearow", + "height": 3, + "weight": 20, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/21.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/21.png", + "types": [ + "flying", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/spearow" + }, + { + "number": 22, + "name": "fearow", + "height": 12, + "weight": 380, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/22.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/22.png", + "types": [ + "flying", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/fearow" + }, + { + "number": 23, + "name": "ekans", + "height": 20, + "weight": 69, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/23.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/23.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/ekans" + }, + { + "number": 24, + "name": "arbok", + "height": 35, + "weight": 650, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/24.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/24.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/arbok" + }, + { + "number": 25, + "name": "pikachu", + "height": 4, + "weight": 60, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/25.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/25.png", + "types": [ + "electric" + ], + "url": "https://pokemon.fandom.com/wiki/pikachu" + }, + { + "number": 26, + "name": "raichu", + "height": 8, + "weight": 300, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/26.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/26.png", + "types": [ + "electric" + ], + "url": "https://pokemon.fandom.com/wiki/raichu" + }, + { + "number": 27, + "name": "sandshrew", + "height": 6, + "weight": 120, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/27.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/27.png", + "types": [ + "ground" + ], + "url": "https://pokemon.fandom.com/wiki/sandshrew" + }, + { + "number": 28, + "name": "sandslash", + "height": 10, + "weight": 295, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/28.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/28.png", + "types": [ + "ground" + ], + "url": "https://pokemon.fandom.com/wiki/sandslash" + }, + { + "number": 29, + "name": "nidoran-f", + "height": 4, + "weight": 70, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/29.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/29.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/nidoran-f" + }, + { + "number": 30, + "name": "nidorina", + "height": 8, + "weight": 200, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/30.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/30.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/nidorina" + }, + { + "number": 31, + "name": "nidoqueen", + "height": 13, + "weight": 600, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/31.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/31.png", + "types": [ + "ground", + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/nidoqueen" + }, + { + "number": 32, + "name": "nidoran-m", + "height": 5, + "weight": 90, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/32.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/32.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/nidoran-m" + }, + { + "number": 33, + "name": "nidorino", + "height": 9, + "weight": 195, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/33.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/33.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/nidorino" + }, + { + "number": 34, + "name": "nidoking", + "height": 14, + "weight": 620, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/34.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/34.png", + "types": [ + "ground", + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/nidoking" + }, + { + "number": 35, + "name": "clefairy", + "height": 6, + "weight": 75, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/35.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/35.png", + "types": [ + "fairy" + ], + "url": "https://pokemon.fandom.com/wiki/clefairy" + }, + { + "number": 36, + "name": "clefable", + "height": 13, + "weight": 400, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/36.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/36.png", + "types": [ + "fairy" + ], + "url": "https://pokemon.fandom.com/wiki/clefable" + }, + { + "number": 37, + "name": "vulpix", + "height": 6, + "weight": 99, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/37.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/37.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/vulpix" + }, + { + "number": 38, + "name": "ninetales", + "height": 11, + "weight": 199, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/38.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/38.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/ninetales" + }, + { + "number": 39, + "name": "jigglypuff", + "height": 5, + "weight": 55, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/39.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/39.png", + "types": [ + "fairy", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/jigglypuff" + }, + { + "number": 40, + "name": "wigglytuff", + "height": 10, + "weight": 120, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/40.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/40.png", + "types": [ + "fairy", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/wigglytuff" + }, + { + "number": 41, + "name": "zubat", + "height": 8, + "weight": 75, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/41.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/41.png", + "types": [ + "flying", + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/zubat" + }, + { + "number": 42, + "name": "golbat", + "height": 16, + "weight": 550, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/42.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/42.png", + "types": [ + "flying", + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/golbat" + }, + { + "number": 43, + "name": "oddish", + "height": 5, + "weight": 54, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/43.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/43.png", + "types": [ + "poison", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/oddish" + }, + { + "number": 44, + "name": "gloom", + "height": 8, + "weight": 86, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/44.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/44.png", + "types": [ + "poison", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/gloom" + }, + { + "number": 45, + "name": "vileplume", + "height": 12, + "weight": 186, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/45.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/45.png", + "types": [ + "poison", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/vileplume" + }, + { + "number": 46, + "name": "paras", + "height": 3, + "weight": 54, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/46.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/46.png", + "types": [ + "grass", + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/paras" + }, + { + "number": 47, + "name": "parasect", + "height": 10, + "weight": 295, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/47.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/47.png", + "types": [ + "grass", + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/parasect" + }, + { + "number": 48, + "name": "venonat", + "height": 10, + "weight": 300, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/48.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/48.png", + "types": [ + "poison", + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/venonat" + }, + { + "number": 49, + "name": "venomoth", + "height": 15, + "weight": 125, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/49.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/49.png", + "types": [ + "poison", + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/venomoth" + }, + { + "number": 50, + "name": "diglett", + "height": 2, + "weight": 8, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/50.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/50.png", + "types": [ + "ground" + ], + "url": "https://pokemon.fandom.com/wiki/diglett" + }, + { + "number": 51, + "name": "dugtrio", + "height": 7, + "weight": 333, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/51.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/51.png", + "types": [ + "ground" + ], + "url": "https://pokemon.fandom.com/wiki/dugtrio" + }, + { + "number": 52, + "name": "meowth", + "height": 4, + "weight": 42, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/52.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/52.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/meowth" + }, + { + "number": 53, + "name": "persian", + "height": 10, + "weight": 320, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/53.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/53.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/persian" + }, + { + "number": 54, + "name": "psyduck", + "height": 8, + "weight": 196, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/54.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/54.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/psyduck" + }, + { + "number": 55, + "name": "golduck", + "height": 17, + "weight": 766, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/55.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/55.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/golduck" + }, + { + "number": 56, + "name": "mankey", + "height": 5, + "weight": 280, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/56.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/56.png", + "types": [ + "fighting" + ], + "url": "https://pokemon.fandom.com/wiki/mankey" + }, + { + "number": 57, + "name": "primeape", + "height": 10, + "weight": 320, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/57.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/57.png", + "types": [ + "fighting" + ], + "url": "https://pokemon.fandom.com/wiki/primeape" + }, + { + "number": 58, + "name": "growlithe", + "height": 7, + "weight": 190, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/58.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/58.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/growlithe" + }, + { + "number": 59, + "name": "arcanine", + "height": 19, + "weight": 1550, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/59.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/59.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/arcanine" + }, + { + "number": 60, + "name": "poliwag", + "height": 6, + "weight": 124, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/60.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/60.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/poliwag" + }, + { + "number": 61, + "name": "poliwhirl", + "height": 10, + "weight": 200, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/61.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/61.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/poliwhirl" + }, + { + "number": 62, + "name": "poliwrath", + "height": 13, + "weight": 540, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/62.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/62.png", + "types": [ + "fighting", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/poliwrath" + }, + { + "number": 63, + "name": "abra", + "height": 9, + "weight": 195, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/63.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/63.png", + "types": [ + "psychic" + ], + "url": "https://pokemon.fandom.com/wiki/abra" + }, + { + "number": 64, + "name": "kadabra", + "height": 13, + "weight": 565, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/64.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/64.png", + "types": [ + "psychic" + ], + "url": "https://pokemon.fandom.com/wiki/kadabra" + }, + { + "number": 65, + "name": "alakazam", + "height": 15, + "weight": 480, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/65.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/65.png", + "types": [ + "psychic" + ], + "url": "https://pokemon.fandom.com/wiki/alakazam" + }, + { + "number": 66, + "name": "machop", + "height": 8, + "weight": 195, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/66.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/66.png", + "types": [ + "fighting" + ], + "url": "https://pokemon.fandom.com/wiki/machop" + }, + { + "number": 67, + "name": "machoke", + "height": 15, + "weight": 705, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/67.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/67.png", + "types": [ + "fighting" + ], + "url": "https://pokemon.fandom.com/wiki/machoke" + }, + { + "number": 68, + "name": "machamp", + "height": 16, + "weight": 1300, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/68.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/68.png", + "types": [ + "fighting" + ], + "url": "https://pokemon.fandom.com/wiki/machamp" + }, + { + "number": 69, + "name": "bellsprout", + "height": 7, + "weight": 40, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/69.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/69.png", + "types": [ + "poison", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/bellsprout" + }, + { + "number": 70, + "name": "weepinbell", + "height": 10, + "weight": 64, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/70.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/70.png", + "types": [ + "poison", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/weepinbell" + }, + { + "number": 71, + "name": "victreebel", + "height": 17, + "weight": 155, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/71.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/71.png", + "types": [ + "poison", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/victreebel" + }, + { + "number": 72, + "name": "tentacool", + "height": 9, + "weight": 455, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/72.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/72.png", + "types": [ + "poison", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/tentacool" + }, + { + "number": 73, + "name": "tentacruel", + "height": 16, + "weight": 550, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/73.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/73.png", + "types": [ + "poison", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/tentacruel" + }, + { + "number": 74, + "name": "geodude", + "height": 4, + "weight": 200, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/74.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/74.png", + "types": [ + "ground", + "rock" + ], + "url": "https://pokemon.fandom.com/wiki/geodude" + }, + { + "number": 75, + "name": "graveler", + "height": 10, + "weight": 1050, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/75.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/75.png", + "types": [ + "ground", + "rock" + ], + "url": "https://pokemon.fandom.com/wiki/graveler" + }, + { + "number": 76, + "name": "golem", + "height": 14, + "weight": 3000, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/76.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/76.png", + "types": [ + "ground", + "rock" + ], + "url": "https://pokemon.fandom.com/wiki/golem" + }, + { + "number": 77, + "name": "ponyta", + "height": 10, + "weight": 300, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/77.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/77.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/ponyta" + }, + { + "number": 78, + "name": "rapidash", + "height": 17, + "weight": 950, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/78.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/78.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/rapidash" + }, + { + "number": 79, + "name": "slowpoke", + "height": 12, + "weight": 360, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/79.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/79.png", + "types": [ + "psychic", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/slowpoke" + }, + { + "number": 80, + "name": "slowbro", + "height": 16, + "weight": 785, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/80.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/80.png", + "types": [ + "psychic", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/slowbro" + }, + { + "number": 81, + "name": "magnemite", + "height": 3, + "weight": 60, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/81.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/81.png", + "types": [ + "steel", + "electric" + ], + "url": "https://pokemon.fandom.com/wiki/magnemite" + }, + { + "number": 82, + "name": "magneton", + "height": 10, + "weight": 600, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/82.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/82.png", + "types": [ + "steel", + "electric" + ], + "url": "https://pokemon.fandom.com/wiki/magneton" + }, + { + "number": 83, + "name": "farfetchd", + "height": 8, + "weight": 150, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/83.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/83.png", + "types": [ + "flying", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/farfetchd" + }, + { + "number": 84, + "name": "doduo", + "height": 14, + "weight": 392, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/84.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/84.png", + "types": [ + "flying", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/doduo" + }, + { + "number": 85, + "name": "dodrio", + "height": 18, + "weight": 852, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/85.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/85.png", + "types": [ + "flying", + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/dodrio" + }, + { + "number": 86, + "name": "seel", + "height": 11, + "weight": 900, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/86.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/86.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/seel" + }, + { + "number": 87, + "name": "dewgong", + "height": 17, + "weight": 1200, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/87.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/87.png", + "types": [ + "ice", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/dewgong" + }, + { + "number": 88, + "name": "grimer", + "height": 9, + "weight": 300, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/88.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/88.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/grimer" + }, + { + "number": 89, + "name": "muk", + "height": 12, + "weight": 300, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/89.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/89.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/muk" + }, + { + "number": 90, + "name": "shellder", + "height": 3, + "weight": 40, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/90.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/90.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/shellder" + }, + { + "number": 91, + "name": "cloyster", + "height": 15, + "weight": 1325, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/91.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/91.png", + "types": [ + "ice", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/cloyster" + }, + { + "number": 92, + "name": "gastly", + "height": 13, + "weight": 1, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/92.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/92.png", + "types": [ + "poison", + "ghost" + ], + "url": "https://pokemon.fandom.com/wiki/gastly" + }, + { + "number": 93, + "name": "haunter", + "height": 16, + "weight": 1, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/93.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/93.png", + "types": [ + "poison", + "ghost" + ], + "url": "https://pokemon.fandom.com/wiki/haunter" + }, + { + "number": 94, + "name": "gengar", + "height": 15, + "weight": 405, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/94.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/94.png", + "types": [ + "poison", + "ghost" + ], + "url": "https://pokemon.fandom.com/wiki/gengar" + }, + { + "number": 95, + "name": "onix", + "height": 88, + "weight": 2100, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/95.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/95.png", + "types": [ + "ground", + "rock" + ], + "url": "https://pokemon.fandom.com/wiki/onix" + }, + { + "number": 96, + "name": "drowzee", + "height": 10, + "weight": 324, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/96.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/96.png", + "types": [ + "psychic" + ], + "url": "https://pokemon.fandom.com/wiki/drowzee" + }, + { + "number": 97, + "name": "hypno", + "height": 16, + "weight": 756, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/97.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/97.png", + "types": [ + "psychic" + ], + "url": "https://pokemon.fandom.com/wiki/hypno" + }, + { + "number": 98, + "name": "krabby", + "height": 4, + "weight": 65, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/98.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/98.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/krabby" + }, + { + "number": 99, + "name": "kingler", + "height": 13, + "weight": 600, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/99.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/99.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/kingler" + }, + { + "number": 100, + "name": "voltorb", + "height": 5, + "weight": 104, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/100.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/100.png", + "types": [ + "electric" + ], + "url": "https://pokemon.fandom.com/wiki/voltorb" + }, + { + "number": 101, + "name": "electrode", + "height": 12, + "weight": 666, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/101.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/101.png", + "types": [ + "electric" + ], + "url": "https://pokemon.fandom.com/wiki/electrode" + }, + { + "number": 102, + "name": "exeggcute", + "height": 4, + "weight": 25, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/102.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/102.png", + "types": [ + "psychic", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/exeggcute" + }, + { + "number": 103, + "name": "exeggutor", + "height": 20, + "weight": 1200, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/103.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/103.png", + "types": [ + "psychic", + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/exeggutor" + }, + { + "number": 104, + "name": "cubone", + "height": 4, + "weight": 65, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/104.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/104.png", + "types": [ + "ground" + ], + "url": "https://pokemon.fandom.com/wiki/cubone" + }, + { + "number": 105, + "name": "marowak", + "height": 10, + "weight": 450, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/105.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/105.png", + "types": [ + "ground" + ], + "url": "https://pokemon.fandom.com/wiki/marowak" + }, + { + "number": 106, + "name": "hitmonlee", + "height": 15, + "weight": 498, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/106.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/106.png", + "types": [ + "fighting" + ], + "url": "https://pokemon.fandom.com/wiki/hitmonlee" + }, + { + "number": 107, + "name": "hitmonchan", + "height": 14, + "weight": 502, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/107.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/107.png", + "types": [ + "fighting" + ], + "url": "https://pokemon.fandom.com/wiki/hitmonchan" + }, + { + "number": 108, + "name": "lickitung", + "height": 12, + "weight": 655, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/108.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/108.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/lickitung" + }, + { + "number": 109, + "name": "koffing", + "height": 6, + "weight": 10, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/109.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/109.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/koffing" + }, + { + "number": 110, + "name": "weezing", + "height": 12, + "weight": 95, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/110.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/110.png", + "types": [ + "poison" + ], + "url": "https://pokemon.fandom.com/wiki/weezing" + }, + { + "number": 111, + "name": "rhyhorn", + "height": 10, + "weight": 1150, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/111.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/111.png", + "types": [ + "rock", + "ground" + ], + "url": "https://pokemon.fandom.com/wiki/rhyhorn" + }, + { + "number": 112, + "name": "rhydon", + "height": 19, + "weight": 1200, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/112.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/112.png", + "types": [ + "rock", + "ground" + ], + "url": "https://pokemon.fandom.com/wiki/rhydon" + }, + { + "number": 113, + "name": "chansey", + "height": 11, + "weight": 346, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/113.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/113.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/chansey" + }, + { + "number": 114, + "name": "tangela", + "height": 10, + "weight": 350, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/114.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/114.png", + "types": [ + "grass" + ], + "url": "https://pokemon.fandom.com/wiki/tangela" + }, + { + "number": 115, + "name": "kangaskhan", + "height": 22, + "weight": 800, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/115.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/115.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/kangaskhan" + }, + { + "number": 116, + "name": "horsea", + "height": 4, + "weight": 80, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/116.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/116.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/horsea" + }, + { + "number": 117, + "name": "seadra", + "height": 12, + "weight": 250, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/117.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/117.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/seadra" + }, + { + "number": 118, + "name": "goldeen", + "height": 6, + "weight": 150, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/118.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/118.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/goldeen" + }, + { + "number": 119, + "name": "seaking", + "height": 13, + "weight": 390, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/119.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/119.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/seaking" + }, + { + "number": 120, + "name": "staryu", + "height": 8, + "weight": 345, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/120.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/120.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/staryu" + }, + { + "number": 121, + "name": "starmie", + "height": 11, + "weight": 800, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/121.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/121.png", + "types": [ + "psychic", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/starmie" + }, + { + "number": 122, + "name": "mr-mime", + "height": 13, + "weight": 545, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/122.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/122.png", + "types": [ + "fairy", + "psychic" + ], + "url": "https://pokemon.fandom.com/wiki/mr-mime" + }, + { + "number": 123, + "name": "scyther", + "height": 15, + "weight": 560, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/123.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/123.png", + "types": [ + "flying", + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/scyther" + }, + { + "number": 124, + "name": "jynx", + "height": 14, + "weight": 406, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/124.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/124.png", + "types": [ + "psychic", + "ice" + ], + "url": "https://pokemon.fandom.com/wiki/jynx" + }, + { + "number": 125, + "name": "electabuzz", + "height": 11, + "weight": 300, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/125.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/125.png", + "types": [ + "electric" + ], + "url": "https://pokemon.fandom.com/wiki/electabuzz" + }, + { + "number": 126, + "name": "magmar", + "height": 13, + "weight": 445, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/126.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/126.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/magmar" + }, + { + "number": 127, + "name": "pinsir", + "height": 15, + "weight": 550, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/127.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/127.png", + "types": [ + "bug" + ], + "url": "https://pokemon.fandom.com/wiki/pinsir" + }, + { + "number": 128, + "name": "tauros", + "height": 14, + "weight": 884, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/128.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/128.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/tauros" + }, + { + "number": 129, + "name": "magikarp", + "height": 9, + "weight": 100, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/129.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/129.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/magikarp" + }, + { + "number": 130, + "name": "gyarados", + "height": 65, + "weight": 2350, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/130.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/130.png", + "types": [ + "flying", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/gyarados" + }, + { + "number": 131, + "name": "lapras", + "height": 25, + "weight": 2200, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/131.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/131.png", + "types": [ + "ice", + "water" + ], + "url": "https://pokemon.fandom.com/wiki/lapras" + }, + { + "number": 132, + "name": "ditto", + "height": 3, + "weight": 40, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/132.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/132.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/ditto" + }, + { + "number": 133, + "name": "eevee", + "height": 3, + "weight": 65, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/133.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/133.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/eevee" + }, + { + "number": 134, + "name": "vaporeon", + "height": 10, + "weight": 290, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/134.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/134.png", + "types": [ + "water" + ], + "url": "https://pokemon.fandom.com/wiki/vaporeon" + }, + { + "number": 135, + "name": "jolteon", + "height": 8, + "weight": 245, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/135.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/135.png", + "types": [ + "electric" + ], + "url": "https://pokemon.fandom.com/wiki/jolteon" + }, + { + "number": 136, + "name": "flareon", + "height": 9, + "weight": 250, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/136.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/136.png", + "types": [ + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/flareon" + }, + { + "number": 137, + "name": "porygon", + "height": 8, + "weight": 365, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/137.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/137.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/porygon" + }, + { + "number": 138, + "name": "omanyte", + "height": 4, + "weight": 75, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/138.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/138.png", + "types": [ + "water", + "rock" + ], + "url": "https://pokemon.fandom.com/wiki/omanyte" + }, + { + "number": 139, + "name": "omastar", + "height": 10, + "weight": 350, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/139.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/139.png", + "types": [ + "water", + "rock" + ], + "url": "https://pokemon.fandom.com/wiki/omastar" + }, + { + "number": 140, + "name": "kabuto", + "height": 5, + "weight": 115, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/140.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/140.png", + "types": [ + "water", + "rock" + ], + "url": "https://pokemon.fandom.com/wiki/kabuto" + }, + { + "number": 141, + "name": "kabutops", + "height": 13, + "weight": 405, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/141.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/141.png", + "types": [ + "water", + "rock" + ], + "url": "https://pokemon.fandom.com/wiki/kabutops" + }, + { + "number": 142, + "name": "aerodactyl", + "height": 18, + "weight": 590, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/142.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/142.png", + "types": [ + "flying", + "rock" + ], + "url": "https://pokemon.fandom.com/wiki/aerodactyl" + }, + { + "number": 143, + "name": "snorlax", + "height": 21, + "weight": 4600, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/143.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/143.png", + "types": [ + "normal" + ], + "url": "https://pokemon.fandom.com/wiki/snorlax" + }, + { + "number": 144, + "name": "articuno", + "height": 17, + "weight": 554, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/144.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/144.png", + "types": [ + "flying", + "ice" + ], + "url": "https://pokemon.fandom.com/wiki/articuno" + }, + { + "number": 145, + "name": "zapdos", + "height": 16, + "weight": 526, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/145.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/145.png", + "types": [ + "flying", + "electric" + ], + "url": "https://pokemon.fandom.com/wiki/zapdos" + }, + { + "number": 146, + "name": "moltres", + "height": 20, + "weight": 600, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/146.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/146.png", + "types": [ + "flying", + "fire" + ], + "url": "https://pokemon.fandom.com/wiki/moltres" + }, + { + "number": 147, + "name": "dratini", + "height": 18, + "weight": 33, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/147.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/147.png", + "types": [ + "dragon" + ], + "url": "https://pokemon.fandom.com/wiki/dratini" + }, + { + "number": 148, + "name": "dragonair", + "height": 40, + "weight": 165, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/148.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/148.png", + "types": [ + "dragon" + ], + "url": "https://pokemon.fandom.com/wiki/dragonair" + }, + { + "number": 149, + "name": "dragonite", + "height": 22, + "weight": 2100, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/149.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/149.png", + "types": [ + "flying", + "dragon" + ], + "url": "https://pokemon.fandom.com/wiki/dragonite" + }, + { + "number": 150, + "name": "mewtwo", + "height": 20, + "weight": 1220, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/150.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/150.png", + "types": [ + "psychic" + ], + "url": "https://pokemon.fandom.com/wiki/mewtwo" + }, + { + "number": 151, + "name": "mew", + "height": 4, + "weight": 40, + "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/151.png", + "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/151.png", + "types": [ + "psychic" + ], + "url": "https://pokemon.fandom.com/wiki/mew" + } + ] +} \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/admin.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/admin.py index 8c38f3f3..efb2993b 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/admin.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin +from .models import Pokemon, PokemonType # Register your models here. +admin.site.register(Pokemon) +admin.site.register(PokemonType) diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py index 02f36ff5..e09b6ddd 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/management/commands/load_pokemon.py @@ -1,6 +1,5 @@ from django.core.management.base import BaseCommand -from code.kelin.labs.django_labs.lab06_pokedex.pokedex.pokemon.models import PokemonType -from pokemon.models import Pokemon, +from pokemon.models import Pokemon, PokemonType import json class Command(BaseCommand): @@ -10,24 +9,23 @@ def handle(self, *args, **options): poke_balls = json.load(f) for pokemon in poke_balls['pokemon']: name_ext = pokemon.get('name') - number_ext = pokemon.get('number') - height_ext = pokemon.get('height') - weight_ext = pokemon.get('weight') + number_ext = int(pokemon.get('number')) + height_ext = int(pokemon.get('height')) + weight_ext = int(pokemon.get('weight')) image_front_ext = pokemon.get('image_front') image_back_ext = pokemon.get('image_back') pokemon_obj = Pokemon.objects.create( - number = number_ext, name = name_ext, + number = number_ext, height = height_ext, weight = weight_ext, image_back = image_back_ext, image_front = image_front_ext, - ) for p_types in pokemon['types']: pokemon_type, created = PokemonType.objects.get_or_create(name=p_types) - pokemon_obj.types.app(pokemon_type) + pokemon_obj.types.add(pokemon_type) - print(pokemon_obj.name + ' has been uploaded') \ No newline at end of file + print(pokemon_obj.name + ' has been uploaded') diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0001_initial.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0001_initial.py new file mode 100644 index 00000000..e19edff1 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0001_initial.py @@ -0,0 +1,34 @@ +# Generated by Django 4.1 on 2022-09-10 02:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='PokemonType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Pokemon', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('number', models.IntegerField()), + ('name', models.CharField(max_length=100)), + ('height', models.IntegerField()), + ('weight', models.IntegerField()), + ('image_front', models.CharField(max_length=200)), + ('image_back', models.CharField(max_length=200)), + ('types', models.ManyToManyField(related_name='types', to='pokemon.pokemontype')), + ], + ), + ] diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py index c3a658f6..219c4628 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/models.py @@ -1,19 +1,20 @@ from django.db import models # Create your models here. - class PokemonType(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name -class Pokemon(request): - number = models.IntegerField() +class Pokemon(models.Model): + number = models.IntegerField() name = models.CharField(max_length=100) height = models.IntegerField() weight = models.IntegerField() - image_front = models.CharField(max_length=100) - image_back = models.CharField(max_length=100) - types = models.ManyToManyField() + image_front = models.CharField(max_length=200) + image_back = models.CharField(max_length=200) + types = models.ManyToManyField(PokemonType, related_name='types') + def __str__(self): + return self.name \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py index e8bccb59..d47a33b0 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/urls.py @@ -1,13 +1,8 @@ -from rest_framework.routers import DefaultRouter -from .views import PokemonViewSet, TypeViewSet +from django.urls import path +from .views import pokemonProfile -router = DefaultRouter() +app_name = 'pokemon' -router.register('pokemon', PokemonViewSet, basename='pokemon') -router.register('types', TypeViewSet, basename='types') - -urlpatterns = router.urls + [ - +urlpatterns = [ + path('/', pokemonProfile, name='pokemon_profile') ] - - diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py index 215b15fb..dd245e7a 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/views.py @@ -1,14 +1,6 @@ from django.shortcuts import render -from rest_framework import viewsets -from pokemon.models import Pokemon, PokemonType -from .serializer import PokemonSerializer, TypeSerializer - +from .models import Pokemon # Create your views here. - -class PokemonViewSet(viewsets.ModelViewSet): - queryset = Pokemon.objects.all() - serializer_class = PokemonSerializer - -class TypeViewSet(viewsets.ModelViewSet): - queryset = PokemonType.objects.all() - searlizer_class = TypeSerializer \ No newline at end of file +def index(request): + pokemon = Pokemon.objects.all() + return render(request, 'index.html', {'pokemon':pokemon}) diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/requirements.txt b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/requirements.txt new file mode 100644 index 00000000..5879276a --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/requirements.txt @@ -0,0 +1,3 @@ +Django==4.1 +pytz==2022.2.1 +sqlparse==0.4.2 diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html index e69de29b..a08e9c5c 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html @@ -0,0 +1,28 @@ + + + + + + + Pokedex + + +
+ {% if user.is_authenticated %} + {{ user.username }} + My Profile + Logout + {% else %} + Sign-In + Sign-Up + {% endif %} +
+ + + diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/login.html b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/login.html new file mode 100644 index 00000000..1a4094da --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/login.html @@ -0,0 +1,6 @@ +
+ {% csrf_token %} + {{ form.as_p }} + +
+ \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/profile.html b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/profile.html new file mode 100644 index 00000000..6dd5606f --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/profile.html @@ -0,0 +1 @@ +{{ user.username }} \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/register.html b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/register.html new file mode 100644 index 00000000..0cd28925 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/registration/register.html @@ -0,0 +1,6 @@ +
+ {% csrf_token %} + {{ form.as_p }} + +
+ \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/__init__.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/admin.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/admin.py new file mode 100644 index 00000000..7e282670 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from users.models import Profile + +# Register your models here. +admin.site.register(Profile) \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/apps.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/apps.py new file mode 100644 index 00000000..72b14010 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'users' diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/forms.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/forms.py new file mode 100644 index 00000000..e4ddc8c4 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/forms.py @@ -0,0 +1,19 @@ +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User +from django import forms + +class NewUserForm(UserCreationForm): + email = forms.EmailField(required=True, + label='Email', + error_messages={'exists': 'User exists'}) + + class Meta: + model = User + fields = ('username', 'email', 'password1', 'password2') + + def save(self, commit=True): + user = super(UserCreationForm, self).save(commit=False) + user.email = self.cleaned_data["email"] + if commit: + user.save() + return user \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/migrations/0001_initial.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/migrations/0001_initial.py new file mode 100644 index 00000000..ba82e171 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 4.1 on 2022-08-31 01:17 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('picture', models.ImageField(default='default.jpg', upload_to='uploaded')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/migrations/__init__.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/models.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/models.py new file mode 100644 index 00000000..1ebe8887 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/models.py @@ -0,0 +1,11 @@ +from django.db import models +from django.contrib.auth.models import User + +# Create your models here. +class Profile(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) + picture = models.ImageField(default="default.jpg", upload_to='uploaded') + + + def __str__(self): + return self.user.username \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/tests.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/urls.py new file mode 100644 index 00000000..28cd82b7 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/urls.py @@ -0,0 +1,11 @@ +from django.urls import path, include +from .views import profile, register + + +app_name = "users" + +urlpatterns = [ + path('profile/', profile, name="profile"), + path('register/', register, name="register"), + path('accounts/', include("django.contrib.auth.urls")), +] diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/views.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/views.py new file mode 100644 index 00000000..9bc5a508 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/views.py @@ -0,0 +1,27 @@ +from django.shortcuts import render, redirect +from django.contrib.auth import login, authenticate +from .forms import NewUserForm +from django.contrib.auth.decorators import login_required + +@login_required +def profile(request): + return render(request, 'registration/profile.html', {'user': request.user}) + +def register(request): + if request.method == 'POST': + form = NewUserForm(request.POST) + + if form.is_valid(): + + username = form.cleaned_data.get('username') + raw_password = form.cleaned_data.get('password1') + email = form.cleaned_data.get('email') + + user = authenticate(username=username, password=raw_password, email=email) + form.save() + login(request, user) + + return redirect('index') + else: + form = NewUserForm() + return render(request, 'registration/register.html', {'form': form}) \ No newline at end of file From d28fefa601c6050b3b31ca6c5d3e1508f15a4324 Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Mon, 12 Sep 2022 19:18:47 -0700 Subject: [PATCH 08/21] Fixed Json serializer file in Pokedex --- .../pokedex/pokemon/serializer.py | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/serializer.py diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/serializer.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/serializer.py deleted file mode 100644 index 35e7545b..00000000 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/serializer.py +++ /dev/null @@ -1,18 +0,0 @@ -from rest_framework import serializers -from pokemon.models import Pokemon, PokemonType - -class NestedTypeSerializer(serializers.ModelSerializer): - class Meta: - fields = ('name', ) - model = PokemonType - -class PokemonSerializer(serializers.ModelSerializer): - type_info = NestedTypeSerializer(many=True, source='types') - class Meta: - fields = ('number', 'name', 'height', 'weight', 'image_front', 'image_back', 'type_info') - model = Pokemon - -class TypeSerializer(serializers.ModelSerializer): - class Meta: - fields = ('name', ) - model = PokemonType \ No newline at end of file From 1fd21ef8e9b5443b83eed070ad22952812ec2e37 Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Mon, 26 Sep 2022 18:38:11 -0700 Subject: [PATCH 09/21] Added Vue app to Pokedex --- .../pokedex/templates/index2.html | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html new file mode 100644 index 00000000..2c074df6 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html @@ -0,0 +1,45 @@ + + + + + + + + + + Document + + +
+ + +
+ + + \ No newline at end of file From 1f677b1285f3e1008162752a943280ac9c585962 Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Mon, 26 Sep 2022 21:15:06 -0700 Subject: [PATCH 10/21] Started Vue app in Pokedex --- .../django_labs/lab06_pokedex/pokedex/templates/index2.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html index 2c074df6..bd7fb61c 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html @@ -7,7 +7,7 @@ - Document + Pokedex in Vue
From 2b82e21a600b91b616e07f6a4c2266be0c68506a Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Tue, 27 Sep 2022 19:33:36 -0700 Subject: [PATCH 11/21] Working on Axios API call --- .../pokedex/templates/index2.html | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html index bd7fb61c..02b9539b 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html @@ -18,28 +18,32 @@
- + } + }) + \ No newline at end of file From 513e7d5d7d611f09fb8466af825b4c7d277ff50d Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Tue, 27 Sep 2022 21:48:18 -0700 Subject: [PATCH 12/21] Added Permissions to API call --- .../lab06_pokedex/pokedex/api/permissions.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/permissions.py diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/permissions.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/permissions.py new file mode 100644 index 00000000..5f6ae9c5 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/permissions.py @@ -0,0 +1,16 @@ +from rest_framework import permissions +from users.models import CustomUser + +class ReadOnly (permissions.BasePermission): + def has_permission(self, request, view): + return request.method in permissions.SAFE_METHODS + +class IsSuperUser (permissions.IsAdminUser): + def has_permission(self, request, view): + return request.user.username == 'kelin' + +class IsAuthorOrReadyOnly (permissions.BasePermission): + def has_object_permissions(self, request, view, obj): + if request.method in permissions.SAFE_METHODS: + return True + return request.user.is_authenticated \ No newline at end of file From b773cb617c9e8d556a057c854be2aa401fab86d4 Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Wed, 28 Sep 2022 18:48:10 -0700 Subject: [PATCH 13/21] Adding user views to API --- .../lab06_pokedex/pokedex/api/serializers.py | 14 ++++++++++-- .../lab06_pokedex/pokedex/api/urls.py | 8 +++---- .../lab06_pokedex/pokedex/api/views.py | 22 +++++++++++++++++-- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py index db4be90c..f099ee33 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py @@ -1,11 +1,16 @@ from rest_framework import serializers from pokemon.models import Pokemon, PokemonType +from django.contrib.auth import get_user_model class NestedTypeSerializer(serializers.ModelSerializer): class Meta: - fields = ('name',) + fields = ('type',) model = PokemonType +class NestedPokemonSerializer(serializers.ModelSerializer) + class Meta: + fields = ('name') + model = Pokemon class PokemonSerializer(serializers.ModelSerializer): type_info = NestedTypeSerializer(many=True, source='types') class Meta: @@ -14,5 +19,10 @@ class Meta: class TypeSerializer(serializers.ModelSerializer): class Meta: - fields = ('name',) + fields = ('id', 'type', 'pokemon') model = PokemonType + +class CustomUserSerializer(serializers.ModelSerializer): + class Meta: + fields = ('id', 'caught', 'username') + model = get_user_model() \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py index e48fc273..ee58388d 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py @@ -1,12 +1,12 @@ from django.urls import path from rest_framework.routers import DefaultRouter - -from .views import PokemonViewSet, TypeViewSet +from .views import PokemonViewSet, TypeViewSet, UserView, CurrentUser router = DefaultRouter() router.register('pokemon', PokemonViewSet, basename='pokemon') -router.register('types', TypeViewSet, basename='types') +router.register('type', TypeViewSet, basename='type') +router.register('users', UserView, basename='users') urlpatterns = router.urls + [ - + path('currentuser/', CurrentUser.as_view()) ] \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py index f00358b8..f98579fe 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py @@ -1,6 +1,9 @@ from rest_framework import viewsets +from django.shortcuts import render +from django.contrib.auth import get_user_model from pokemon.models import Pokemon, PokemonType -from .serializers import PokemonSerializer, TypeSerializer +from .serializers import PokemonSerializer, TypeSerializer, CustomUserSerializer +from .permissions import IsAuthorOrReadyOnly class PokemonViewSet(viewsets.ModelViewSet): queryset = Pokemon.objects.all() @@ -8,4 +11,19 @@ class PokemonViewSet(viewsets.ModelViewSet): class TypeViewSet(viewsets.ModelViewSet): queryset = PokemonType.objects.all() - serializer_class = TypeSerializer \ No newline at end of file + serializer_class = TypeSerializer + +class PokemonDetailView(generics.RetrieveUpdateDestroyAPIView): + queryset = Pokemon.objects.all() + serializer_class = PokemonSerializer + permission_classes = [permissions.IsAuthenticatedOrReadOnly] + +class UserView(viewsets.ReadOnlyModelViewSet): + queryset = get_user_model().objects.all() + serializer_class = CustomUserSerializer + permission_classes = [permissions.IsAuthenticatedOrReadOnly] + +class CurrentUser(generics.RetrieveAPIView): + serializer_class = CustomUserSerializer + def get_object(self): + return self.request.user \ No newline at end of file From dbd63490689bd2334ab3edf3b05b51aa9a36a47f Mon Sep 17 00:00:00 2001 From: rayk472 <102784710+rayk472@users.noreply.github.com> Date: Wed, 28 Sep 2022 21:27:12 -0700 Subject: [PATCH 14/21] Started over with fresh Pokedex project --- .../lab06_pokedex/pokedex/api/permissions.py | 16 ------ .../lab06_pokedex/pokedex/api/serializers.py | 14 +----- .../lab06_pokedex/pokedex/api/urls.py | 8 +-- .../lab06_pokedex/pokedex/api/views.py | 22 +-------- .../lab06_pokedex/pokedex/pokedex/urls.py | 2 +- ...e_pokemontype_type_remove_pokemon_types.py | 22 +++++++++ ...3_pokemon_caught_by_pokemontype_pokemon.py | 25 ++++++++++ ...4_rename_type_pokemontype_name_and_more.py | 31 ++++++++++++ .../pokedex/templates/index.html | 8 +-- .../pokedex/templates/index2.html | 49 ------------------- .../lab06_pokedex/pokedex/users/admin.py | 4 +- .../lab06_pokedex/pokedex/users/forms.py | 19 ------- .../0002_customuser_delete_profile.py | 46 +++++++++++++++++ .../migrations/0003_delete_customuser.py | 16 ++++++ .../lab06_pokedex/pokedex/users/models.py | 10 +--- .../lab06_pokedex/pokedex/users/urls.py | 2 +- .../lab06_pokedex/pokedex/users/views.py | 38 ++++++-------- 17 files changed, 172 insertions(+), 160 deletions(-) delete mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/permissions.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0002_rename_name_pokemontype_type_remove_pokemon_types.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0003_pokemon_caught_by_pokemontype_pokemon.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0004_rename_type_pokemontype_name_and_more.py delete mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index2.html delete mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/forms.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/migrations/0002_customuser_delete_profile.py create mode 100644 code/kelin/labs/django_labs/lab06_pokedex/pokedex/users/migrations/0003_delete_customuser.py diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/permissions.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/permissions.py deleted file mode 100644 index 5f6ae9c5..00000000 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/permissions.py +++ /dev/null @@ -1,16 +0,0 @@ -from rest_framework import permissions -from users.models import CustomUser - -class ReadOnly (permissions.BasePermission): - def has_permission(self, request, view): - return request.method in permissions.SAFE_METHODS - -class IsSuperUser (permissions.IsAdminUser): - def has_permission(self, request, view): - return request.user.username == 'kelin' - -class IsAuthorOrReadyOnly (permissions.BasePermission): - def has_object_permissions(self, request, view, obj): - if request.method in permissions.SAFE_METHODS: - return True - return request.user.is_authenticated \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py index f099ee33..db4be90c 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/serializers.py @@ -1,16 +1,11 @@ from rest_framework import serializers from pokemon.models import Pokemon, PokemonType -from django.contrib.auth import get_user_model class NestedTypeSerializer(serializers.ModelSerializer): class Meta: - fields = ('type',) + fields = ('name',) model = PokemonType -class NestedPokemonSerializer(serializers.ModelSerializer) - class Meta: - fields = ('name') - model = Pokemon class PokemonSerializer(serializers.ModelSerializer): type_info = NestedTypeSerializer(many=True, source='types') class Meta: @@ -19,10 +14,5 @@ class Meta: class TypeSerializer(serializers.ModelSerializer): class Meta: - fields = ('id', 'type', 'pokemon') + fields = ('name',) model = PokemonType - -class CustomUserSerializer(serializers.ModelSerializer): - class Meta: - fields = ('id', 'caught', 'username') - model = get_user_model() \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py index ee58388d..e48fc273 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/urls.py @@ -1,12 +1,12 @@ from django.urls import path from rest_framework.routers import DefaultRouter -from .views import PokemonViewSet, TypeViewSet, UserView, CurrentUser + +from .views import PokemonViewSet, TypeViewSet router = DefaultRouter() router.register('pokemon', PokemonViewSet, basename='pokemon') -router.register('type', TypeViewSet, basename='type') -router.register('users', UserView, basename='users') +router.register('types', TypeViewSet, basename='types') urlpatterns = router.urls + [ - path('currentuser/', CurrentUser.as_view()) + ] \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py index f98579fe..f00358b8 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/api/views.py @@ -1,9 +1,6 @@ from rest_framework import viewsets -from django.shortcuts import render -from django.contrib.auth import get_user_model from pokemon.models import Pokemon, PokemonType -from .serializers import PokemonSerializer, TypeSerializer, CustomUserSerializer -from .permissions import IsAuthorOrReadyOnly +from .serializers import PokemonSerializer, TypeSerializer class PokemonViewSet(viewsets.ModelViewSet): queryset = Pokemon.objects.all() @@ -11,19 +8,4 @@ class PokemonViewSet(viewsets.ModelViewSet): class TypeViewSet(viewsets.ModelViewSet): queryset = PokemonType.objects.all() - serializer_class = TypeSerializer - -class PokemonDetailView(generics.RetrieveUpdateDestroyAPIView): - queryset = Pokemon.objects.all() - serializer_class = PokemonSerializer - permission_classes = [permissions.IsAuthenticatedOrReadOnly] - -class UserView(viewsets.ReadOnlyModelViewSet): - queryset = get_user_model().objects.all() - serializer_class = CustomUserSerializer - permission_classes = [permissions.IsAuthenticatedOrReadOnly] - -class CurrentUser(generics.RetrieveAPIView): - serializer_class = CustomUserSerializer - def get_object(self): - return self.request.user \ No newline at end of file + serializer_class = TypeSerializer \ No newline at end of file diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py index c473b3f6..cb08fed9 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokedex/urls.py @@ -21,6 +21,6 @@ path('admin/doc/', include('django.contrib.admindocs.urls')), path('admin/', admin.site.urls), path('', TemplateView.as_view(template_name='index.html'), name='index'), - path('users/', include('users.urls')), + path('u/', include('users.urls')), path('api/', include('api.urls')), ] diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0002_rename_name_pokemontype_type_remove_pokemon_types.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0002_rename_name_pokemontype_type_remove_pokemon_types.py new file mode 100644 index 00000000..2e083a43 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0002_rename_name_pokemontype_type_remove_pokemon_types.py @@ -0,0 +1,22 @@ +# Generated by Django 4.1 on 2022-09-29 03:13 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('pokemon', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='pokemontype', + old_name='name', + new_name='type', + ), + migrations.RemoveField( + model_name='pokemon', + name='types', + ), + ] diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0003_pokemon_caught_by_pokemontype_pokemon.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0003_pokemon_caught_by_pokemontype_pokemon.py new file mode 100644 index 00000000..e6db7478 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0003_pokemon_caught_by_pokemontype_pokemon.py @@ -0,0 +1,25 @@ +# Generated by Django 4.1 on 2022-09-29 03:13 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pokemon', '0002_rename_name_pokemontype_type_remove_pokemon_types'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='pokemon', + name='caught_by', + field=models.ManyToManyField(related_name='caught', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='pokemontype', + name='pokemon', + field=models.ManyToManyField(related_name='types', to='pokemon.pokemon'), + ), + ] diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0004_rename_type_pokemontype_name_and_more.py b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0004_rename_type_pokemontype_name_and_more.py new file mode 100644 index 00000000..f5a1adf2 --- /dev/null +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/pokemon/migrations/0004_rename_type_pokemontype_name_and_more.py @@ -0,0 +1,31 @@ +# Generated by Django 4.1 on 2022-09-29 03:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pokemon', '0003_pokemon_caught_by_pokemontype_pokemon'), + ] + + operations = [ + migrations.RenameField( + model_name='pokemontype', + old_name='type', + new_name='name', + ), + migrations.RemoveField( + model_name='pokemon', + name='caught_by', + ), + migrations.RemoveField( + model_name='pokemontype', + name='pokemon', + ), + migrations.AddField( + model_name='pokemon', + name='types', + field=models.ManyToManyField(related_name='types', to='pokemon.pokemontype'), + ), + ] diff --git a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html index a08e9c5c..b140c225 100644 --- a/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html +++ b/code/kelin/labs/django_labs/lab06_pokedex/pokedex/templates/index.html @@ -10,11 +10,11 @@
{% if user.is_authenticated %} {{ user.username }} - My Profile - Logout + My Profile + Logout {% else %} - Sign-In - Sign-Up + Sign-In + Sign-Up {% endif %}