From 7e8a2c20a78c0e8f9db763fc43b7a9bc7742e3a7 Mon Sep 17 00:00:00 2001 From: bytesparallel Date: Mon, 7 Feb 2022 14:58:06 -0600 Subject: [PATCH] completed ch 3 & 4 --- .vscode/settings.json | 3 +- levelup/urls.py | 6 +- levelupapi/db.sql | 7 +- levelupapi/fixtures/events.json | 24 +++++++ levelupapi/fixtures/game_types.json | 23 +++++++ levelupapi/fixtures/gamers.json | 10 +++ levelupapi/fixtures/games.json | 27 ++++++++ levelupapi/fixtures/tokens.json | 10 +++ levelupapi/fixtures/users.json | 20 ++++++ .../{initial.py => 0001_initial.py} | 34 +++++++--- levelupapi/migrations/__init__.py | 1 - levelupapi/models/__init__.py | 4 +- levelupapi/models/event_gamer.py | 6 +- levelupapi/models/game.py | 4 +- levelupapi/models/game_type.py | 2 +- levelupapi/views/__init__.py | 1 + levelupapi/views/auth.py | 66 +++++++++++++++++++ 17 files changed, 223 insertions(+), 25 deletions(-) create mode 100644 levelupapi/fixtures/events.json create mode 100644 levelupapi/fixtures/game_types.json create mode 100644 levelupapi/fixtures/gamers.json create mode 100644 levelupapi/fixtures/games.json create mode 100644 levelupapi/fixtures/tokens.json create mode 100644 levelupapi/fixtures/users.json rename levelupapi/migrations/{initial.py => 0001_initial.py} (66%) create mode 100644 levelupapi/views/auth.py diff --git a/.vscode/settings.json b/.vscode/settings.json index a954313..fd2fbf2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,8 @@ { "python.linting.pylintArgs": [ "--load-plugins=pylint_django", - "--django-settings-module=.settings", + "--django-settings-module=levelup.settings", ], - "python.pythonPath": "/Users/jason.ross/.local/share/virtualenvs/levelup-server-Wy00p224/bin/python", "python.linting.pylintEnabled": true, "python.linting.enabled": true } diff --git a/levelup/urls.py b/levelup/urls.py index 6414569..01c8ce8 100644 --- a/levelup/urls.py +++ b/levelup/urls.py @@ -14,8 +14,12 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin +from django.conf.urls import include from django.urls import path +from levelupapi.views import register_user, login_user urlpatterns = [ + path('register', register_user), + path('login', login_user), path('admin/', admin.site.urls), -] +] \ No newline at end of file diff --git a/levelupapi/db.sql b/levelupapi/db.sql index fec938b..aca671e 100644 --- a/levelupapi/db.sql +++ b/levelupapi/db.sql @@ -1,5 +1,4 @@ -SELECT * FROM LEVELUPAPI_GAMER; - -INSERT INTO levelupapi_gamer(bio, user_id) -VALUES ("My name is Jason", 1); \ No newline at end of file +SELECT * FROM auth_user; +SELECT * FROM authtoken_token; +SELECT * FROM levelupapi_gamer; \ No newline at end of file diff --git a/levelupapi/fixtures/events.json b/levelupapi/fixtures/events.json new file mode 100644 index 0000000..2558f1e --- /dev/null +++ b/levelupapi/fixtures/events.json @@ -0,0 +1,24 @@ +[ + { + "model":"levelupapi.event", + "pk": 1, + "fields":{ + "game": 1, + "description": "Dungeons and Dragons session 0, ", + "date": "2022-02-15", + "time": "19:00", + "organizer": 1 + } + }, + { + "model":"levelupapi.event", + "pk": 2, + "fields":{ + "game": 2, + "description": "Raid on the Lich King, final Alliance campaign raid", + "date": "2022-02-22", + "time": "12:00", + "organizer": 1 + } + } +] \ No newline at end of file diff --git a/levelupapi/fixtures/game_types.json b/levelupapi/fixtures/game_types.json new file mode 100644 index 0000000..b7e94ce --- /dev/null +++ b/levelupapi/fixtures/game_types.json @@ -0,0 +1,23 @@ +[ + { + "model": "levelupapi.gametype", + "pk": 1, + "fields": { + "label": "Board game" + } + }, + { + "model": "levelupapi.gametype", + "pk": 2, + "fields": { + "label": "Role-playing game" + } + }, + { + "model": "levelupapi.gametype", + "pk": 3, + "fields": { + "label": "MMO game" + } + } +] \ No newline at end of file diff --git a/levelupapi/fixtures/gamers.json b/levelupapi/fixtures/gamers.json new file mode 100644 index 0000000..2fe32f0 --- /dev/null +++ b/levelupapi/fixtures/gamers.json @@ -0,0 +1,10 @@ +[ + { + "model": "levelupapi.gamer", + "pk": 1, + "fields": { + "user": 1, + "bio": "Me" + } + } +] \ No newline at end of file diff --git a/levelupapi/fixtures/games.json b/levelupapi/fixtures/games.json new file mode 100644 index 0000000..fc99187 --- /dev/null +++ b/levelupapi/fixtures/games.json @@ -0,0 +1,27 @@ +[ + { + "model": "levelupapi.game", + "pk":1, + "fields": { + "game_type": 2, + "title": "Dungeons & Dragons, 5th edition", + "maker": "Wizards of the Coast", + "gamer" : 1, + "number_of_players": 4, + "skill_level": 6 + } + }, + { + "model": "levelupapi.game", + "pk": 2, + "fields": { + "game_type": 2, + "title": "World of Warcraft", + "maker": "Blizzard/Activision", + "gamer" : 1, + "number_of_players": 10000, + "skill_level": 4 + } + } + +] \ No newline at end of file diff --git a/levelupapi/fixtures/tokens.json b/levelupapi/fixtures/tokens.json new file mode 100644 index 0000000..1f3e0a4 --- /dev/null +++ b/levelupapi/fixtures/tokens.json @@ -0,0 +1,10 @@ +[ + { + "model": "authtoken.token", + "pk": "fa2eba9be8282d595c997ee5cd49f2ed31f65bed", + "fields": { + "user": 1, + "created": "2020-08-29T13:24:27.172Z" + } + } +] \ No newline at end of file diff --git a/levelupapi/fixtures/users.json b/levelupapi/fixtures/users.json new file mode 100644 index 0000000..198f256 --- /dev/null +++ b/levelupapi/fixtures/users.json @@ -0,0 +1,20 @@ +[ + { + "model": "auth.user", + "pk": 1, + "fields": { + "password": "pbkdf2_sha256$216000$qMRH8szID7Z8$Vljya2V3XfruOHuvx1hGz9ZyKg4bxbw7rc2WO0gTR7I=", + "last_login": null, + "is_superuser": false, + "username": "Carrie1945", + "first_name": "Carrie", + "last_name": "Belk", + "email": "me@me.com", + "is_staff": false, + "is_active": true, + "date_joined": "2020-08-28T14:51:39.989Z", + "groups": [], + "user_permissions": [] + } + } +] \ No newline at end of file diff --git a/levelupapi/migrations/initial.py b/levelupapi/migrations/0001_initial.py similarity index 66% rename from levelupapi/migrations/initial.py rename to levelupapi/migrations/0001_initial.py index f9be46a..41638d6 100644 --- a/levelupapi/migrations/initial.py +++ b/levelupapi/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.1 on 2022-02-04 22:44 +# Generated by Django 4.0.1 on 2022-02-07 16:48 from django.conf import settings from django.db import migrations, models @@ -15,7 +15,16 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='Game_Type', + name='Event', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.CharField(max_length=256)), + ('date', models.DateField()), + ('time', models.TimeField(verbose_name='')), + ], + ), + migrations.CreateModel( + name='GameType', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('label', models.CharField(max_length=50)), @@ -37,19 +46,26 @@ class Migration(migrations.Migration): ('maker', models.CharField(max_length=256)), ('number_of_players', models.IntegerField()), ('skill_level', models.IntegerField()), - ('game_type', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='levelupapi.game_type')), + ('game_type', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='levelupapi.gametype')), ('gamer', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='levelupapi.gamer')), ], ), migrations.CreateModel( - name='Event', + name='EventGamer', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.CharField(max_length=256)), - ('date', models.DateField()), - ('time', models.TimeField(verbose_name='')), - ('game', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='levelupapi.game')), - ('organizer', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='levelupapi.gamer')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='levelupapi.event')), + ('gamer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='levelupapi.gamer')), ], ), + migrations.AddField( + model_name='event', + name='game', + field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='levelupapi.game'), + ), + migrations.AddField( + model_name='event', + name='organizer', + field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='levelupapi.gamer'), + ), ] diff --git a/levelupapi/migrations/__init__.py b/levelupapi/migrations/__init__.py index e67e400..e69de29 100644 --- a/levelupapi/migrations/__init__.py +++ b/levelupapi/migrations/__init__.py @@ -1 +0,0 @@ -from levelupapi.migrations.initial import migrations \ No newline at end of file diff --git a/levelupapi/models/__init__.py b/levelupapi/models/__init__.py index eb62f9c..a02c0c3 100644 --- a/levelupapi/models/__init__.py +++ b/levelupapi/models/__init__.py @@ -1,5 +1,5 @@ from levelupapi.models.gamer import Gamer from levelupapi.models.events import Event from levelupapi.models.game import Game -# from .game_type import Game_Type -# from .event_gamer import Event_Gamer \ No newline at end of file +from levelupapi.models.game_type import GameType +from levelupapi.models.event_gamer import EventGamer \ No newline at end of file diff --git a/levelupapi/models/event_gamer.py b/levelupapi/models/event_gamer.py index 2e64da0..9d71141 100644 --- a/levelupapi/models/event_gamer.py +++ b/levelupapi/models/event_gamer.py @@ -1,9 +1,9 @@ from django.db import models from levelupapi.models.gamer import Gamer from levelupapi.models.events import Event -class Event_Gamer(models.Model): +class EventGamer(models.Model): #Event won't change color for some reason. Reference this if something breaks later - gamer= models.ForeignKey(Gamer) - event = models.ForeignKey(Event) + gamer= models.ForeignKey("Gamer", on_delete=models.CASCADE) + event = models.ForeignKey("Event", on_delete=models.CASCADE) \ No newline at end of file diff --git a/levelupapi/models/game.py b/levelupapi/models/game.py index 1ce7363..a4b7c86 100644 --- a/levelupapi/models/game.py +++ b/levelupapi/models/game.py @@ -1,11 +1,11 @@ from django.db import models -from levelupapi.models.game_type import Game_Type +from levelupapi.models.game_type import GameType from levelupapi.models.gamer import Gamer class Game(models.Model): - game_type = models.ForeignKey(Game_Type, on_delete=models.DO_NOTHING) + game_type = models.ForeignKey(GameType, on_delete=models.DO_NOTHING) title = models.CharField(max_length=256) maker = models.CharField(max_length=256) gamer = models.ForeignKey(Gamer, on_delete=models.DO_NOTHING) diff --git a/levelupapi/models/game_type.py b/levelupapi/models/game_type.py index 569d3db..92e61d3 100644 --- a/levelupapi/models/game_type.py +++ b/levelupapi/models/game_type.py @@ -1,6 +1,6 @@ from django.db import models -class Game_Type(models.Model): +class GameType(models.Model): label= models.CharField(max_length=50) \ No newline at end of file diff --git a/levelupapi/views/__init__.py b/levelupapi/views/__init__.py index e69de29..0801135 100644 --- a/levelupapi/views/__init__.py +++ b/levelupapi/views/__init__.py @@ -0,0 +1 @@ +from .auth import login_user, register_user \ No newline at end of file diff --git a/levelupapi/views/auth.py b/levelupapi/views/auth.py new file mode 100644 index 0000000..b69ffc5 --- /dev/null +++ b/levelupapi/views/auth.py @@ -0,0 +1,66 @@ +from django.contrib.auth import authenticate +from django.contrib.auth.models import User +from rest_framework.authtoken.models import Token +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import AllowAny +from rest_framework.response import Response + +from levelupapi.models import Gamer + +@api_view(['POST']) +@permission_classes([AllowAny]) +def login_user(request): + '''Handles the authentication of a gamer + + Method arguments: + request -- The full HTTP request object + ''' + username = request.data['username'] + password = request.data['password'] + + # Use the built-in authenticate method to verify + # authenticate returns the user object or None if no user is found + authenticated_user = authenticate(username=username, password=password) + + # If authentication was successful, respond with their token + if authenticated_user is not None: + token = Token.objects.get(user=authenticated_user) + data = { + 'valid': True, + 'token': token.key + } + return Response(data) + else: + # Bad login details were provided. So we can't log the user in. + data = { 'valid': False } + return Response(data) + +@api_view(['POST']) +@permission_classes([AllowAny]) +def register_user(request): + '''Handles the creation of a new gamer for authentication + + Method arguments: + request -- The full HTTP request object + ''' + + # Create a new user by invoking the `create_user` helper method + # on Django's built-in User model + new_user = User.objects.create_user( + username=request.data['username'], + password=request.data['password'], + first_name=request.data['first_name'], + last_name=request.data['last_name'] + ) + + # Now save the extra info in the levelupapi_gamer table + gamer = Gamer.objects.create( + bio=request.data['bio'], + user=new_user + ) + + # Use the REST Framework's token generator on the new user account + token = Token.objects.create(user=gamer.user) + # Return the token to the client + data = { 'token': token.key } + return Response(data)