From 3913b3f73e0c1aed3b24f371e452cc8c2db9252f Mon Sep 17 00:00:00 2001 From: bytesparallel Date: Fri, 4 Feb 2022 15:38:05 -0600 Subject: [PATCH 1/3] saving final changes to ch. 2 --- levelupapi/models/__init__.py | 5 ++++- levelupapi/models/event_gamer.py | 9 +++++++++ levelupapi/models/events.py | 4 ++-- levelupapi/models/game.py | 5 ++++- levelupapi/models/game_type.py | 6 ++++++ 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 levelupapi/models/event_gamer.py create mode 100644 levelupapi/models/game_type.py diff --git a/levelupapi/models/__init__.py b/levelupapi/models/__init__.py index 0f5fc57..90d3d23 100644 --- a/levelupapi/models/__init__.py +++ b/levelupapi/models/__init__.py @@ -1 +1,4 @@ -from .gamer import Gamer \ No newline at end of file +from .gamer import Gamer +from .events import Event +from .game import Game +from .game_type import Game_Type \ No newline at end of file diff --git a/levelupapi/models/event_gamer.py b/levelupapi/models/event_gamer.py new file mode 100644 index 0000000..2e64da0 --- /dev/null +++ b/levelupapi/models/event_gamer.py @@ -0,0 +1,9 @@ +from django.db import models +from levelupapi.models.gamer import Gamer +from levelupapi.models.events import Event +class Event_Gamer(models.Model): + + #Event won't change color for some reason. Reference this if something breaks later + gamer= models.ForeignKey(Gamer) + event = models.ForeignKey(Event) + \ No newline at end of file diff --git a/levelupapi/models/events.py b/levelupapi/models/events.py index 2276f9c..f728aa7 100644 --- a/levelupapi/models/events.py +++ b/levelupapi/models/events.py @@ -3,10 +3,10 @@ from levelupapi.models.gamer import Gamer from models import Game -class Game(models.Model): +class Event(models.Model): game= models.ForeignKey(Game) description = models.CharField(max_length=256) date = models.DateField() - time = models.TimeField(_(""), auto_now=False, auto_now_add=False) + time = models.TimeField((""), auto_now=False, auto_now_add=False) organizer = models.ForeignKey(Gamer) \ No newline at end of file diff --git a/levelupapi/models/game.py b/levelupapi/models/game.py index 627a1f9..a0b12ce 100644 --- a/levelupapi/models/game.py +++ b/levelupapi/models/game.py @@ -1,10 +1,13 @@ from django.db import models +from django.contrib.auth.models import User +from django.db import models from models import Gamer +from models import Game_Type class Game(models.Model): - game_type = models.ForeignKey(game_type) + game_type = models.ForeignKey(Game_Type) title = models.CharField(max_length=256) maker = models.CharField(max_length=256) gamer = models.ForeignKey(Gamer) diff --git a/levelupapi/models/game_type.py b/levelupapi/models/game_type.py new file mode 100644 index 0000000..569d3db --- /dev/null +++ b/levelupapi/models/game_type.py @@ -0,0 +1,6 @@ +from django.db import models + + +class Game_Type(models.Model): + + label= models.CharField(max_length=50) \ No newline at end of file -- 2.47.3 From ef9d8e1615f50169b552d676fa3ba55cb50b13e1 Mon Sep 17 00:00:00 2001 From: bytesparallel Date: Fri, 4 Feb 2022 17:29:15 -0600 Subject: [PATCH 2/3] saving creation of SQL files --- levelupapi/db.sql | 5 +++ levelupapi/migrations/__init__.py | 1 + levelupapi/migrations/initial.py | 55 +++++++++++++++++++++++++++++++ levelupapi/models/__init__.py | 9 ++--- levelupapi/models/events.py | 7 ++-- levelupapi/models/game.py | 14 ++++---- 6 files changed, 75 insertions(+), 16 deletions(-) create mode 100644 levelupapi/db.sql create mode 100644 levelupapi/migrations/initial.py diff --git a/levelupapi/db.sql b/levelupapi/db.sql new file mode 100644 index 0000000..fec938b --- /dev/null +++ b/levelupapi/db.sql @@ -0,0 +1,5 @@ + +SELECT * FROM LEVELUPAPI_GAMER; + +INSERT INTO levelupapi_gamer(bio, user_id) +VALUES ("My name is Jason", 1); \ No newline at end of file diff --git a/levelupapi/migrations/__init__.py b/levelupapi/migrations/__init__.py index e69de29..e67e400 100644 --- a/levelupapi/migrations/__init__.py +++ b/levelupapi/migrations/__init__.py @@ -0,0 +1 @@ +from levelupapi.migrations.initial import migrations \ No newline at end of file diff --git a/levelupapi/migrations/initial.py b/levelupapi/migrations/initial.py new file mode 100644 index 0000000..f9be46a --- /dev/null +++ b/levelupapi/migrations/initial.py @@ -0,0 +1,55 @@ +# Generated by Django 4.0.1 on 2022-02-04 22:44 + +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='Game_Type', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.CharField(max_length=50)), + ], + ), + migrations.CreateModel( + name='Gamer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('bio', models.CharField(max_length=50)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Game', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=256)), + ('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')), + ('gamer', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='levelupapi.gamer')), + ], + ), + migrations.CreateModel( + 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='')), + ('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')), + ], + ), + ] diff --git a/levelupapi/models/__init__.py b/levelupapi/models/__init__.py index 90d3d23..eb62f9c 100644 --- a/levelupapi/models/__init__.py +++ b/levelupapi/models/__init__.py @@ -1,4 +1,5 @@ -from .gamer import Gamer -from .events import Event -from .game import Game -from .game_type import Game_Type \ No newline at end of file +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 diff --git a/levelupapi/models/events.py b/levelupapi/models/events.py index f728aa7..6ce28a1 100644 --- a/levelupapi/models/events.py +++ b/levelupapi/models/events.py @@ -1,12 +1,11 @@ from django.db import models from levelupapi.models.gamer import Gamer -from models import Game - +from levelupapi.models.game import Game class Event(models.Model): - game= models.ForeignKey(Game) + game= models.ForeignKey(Game, on_delete=models.DO_NOTHING) description = models.CharField(max_length=256) date = models.DateField() time = models.TimeField((""), auto_now=False, auto_now_add=False) - organizer = models.ForeignKey(Gamer) \ No newline at end of file + organizer = models.ForeignKey(Gamer, on_delete=models.DO_NOTHING) \ No newline at end of file diff --git a/levelupapi/models/game.py b/levelupapi/models/game.py index a0b12ce..1ce7363 100644 --- a/levelupapi/models/game.py +++ b/levelupapi/models/game.py @@ -1,15 +1,13 @@ from django.db import models -from django.contrib.auth.models import User -from django.db import models -from models import Gamer -from models import Game_Type +from levelupapi.models.game_type import Game_Type +from levelupapi.models.gamer import Gamer class Game(models.Model): - game_type = models.ForeignKey(Game_Type) + game_type = models.ForeignKey(Game_Type, on_delete=models.DO_NOTHING) title = models.CharField(max_length=256) maker = models.CharField(max_length=256) - gamer = models.ForeignKey(Gamer) - number_of_players = models.IntegerField(max_value = 1, max_value = 128) - skill_level = models.IntegerField(max_value = 1, max_value = 100) \ No newline at end of file + gamer = models.ForeignKey(Gamer, on_delete=models.DO_NOTHING) + number_of_players = models.IntegerField() + skill_level = models.IntegerField() \ No newline at end of file -- 2.47.3 From 7e8a2c20a78c0e8f9db763fc43b7a9bc7742e3a7 Mon Sep 17 00:00:00 2001 From: bytesparallel Date: Mon, 7 Feb 2022 14:58:06 -0600 Subject: [PATCH 3/3] 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) -- 2.47.3