Archived
completed ch 3 & 4
This commit is contained in:
Vendored
+1
-2
@@ -1,9 +1,8 @@
|
|||||||
{
|
{
|
||||||
"python.linting.pylintArgs": [
|
"python.linting.pylintArgs": [
|
||||||
"--load-plugins=pylint_django",
|
"--load-plugins=pylint_django",
|
||||||
"--django-settings-module=<levelup-server>.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.pylintEnabled": true,
|
||||||
"python.linting.enabled": true
|
"python.linting.enabled": true
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-1
@@ -14,8 +14,12 @@ Including another URLconf
|
|||||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
"""
|
"""
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from django.conf.urls import include
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
from levelupapi.views import register_user, login_user
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
path('register', register_user),
|
||||||
|
path('login', login_user),
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
]
|
]
|
||||||
+3
-4
@@ -1,5 +1,4 @@
|
|||||||
|
|
||||||
SELECT * FROM LEVELUPAPI_GAMER;
|
SELECT * FROM auth_user;
|
||||||
|
SELECT * FROM authtoken_token;
|
||||||
INSERT INTO levelupapi_gamer(bio, user_id)
|
SELECT * FROM levelupapi_gamer;
|
||||||
VALUES ("My name is Jason", 1);
|
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"model": "levelupapi.gamer",
|
||||||
|
"pk": 1,
|
||||||
|
"fields": {
|
||||||
|
"user": 1,
|
||||||
|
"bio": "Me"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"model": "authtoken.token",
|
||||||
|
"pk": "fa2eba9be8282d595c997ee5cd49f2ed31f65bed",
|
||||||
|
"fields": {
|
||||||
|
"user": 1,
|
||||||
|
"created": "2020-08-29T13:24:27.172Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
@@ -15,7 +15,16 @@ class Migration(migrations.Migration):
|
|||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
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=[
|
fields=[
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('label', models.CharField(max_length=50)),
|
('label', models.CharField(max_length=50)),
|
||||||
@@ -37,19 +46,26 @@ class Migration(migrations.Migration):
|
|||||||
('maker', models.CharField(max_length=256)),
|
('maker', models.CharField(max_length=256)),
|
||||||
('number_of_players', models.IntegerField()),
|
('number_of_players', models.IntegerField()),
|
||||||
('skill_level', 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')),
|
('gamer', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='levelupapi.gamer')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Event',
|
name='EventGamer',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('description', models.CharField(max_length=256)),
|
('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='levelupapi.event')),
|
||||||
('date', models.DateField()),
|
('gamer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='levelupapi.gamer')),
|
||||||
('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')),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
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'),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
@@ -1 +0,0 @@
|
|||||||
from levelupapi.migrations.initial import migrations
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
from levelupapi.models.gamer import Gamer
|
from levelupapi.models.gamer import Gamer
|
||||||
from levelupapi.models.events import Event
|
from levelupapi.models.events import Event
|
||||||
from levelupapi.models.game import Game
|
from levelupapi.models.game import Game
|
||||||
# from .game_type import Game_Type
|
from levelupapi.models.game_type import GameType
|
||||||
# from .event_gamer import Event_Gamer
|
from levelupapi.models.event_gamer import EventGamer
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from levelupapi.models.gamer import Gamer
|
from levelupapi.models.gamer import Gamer
|
||||||
from levelupapi.models.events import Event
|
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
|
#Event won't change color for some reason. Reference this if something breaks later
|
||||||
gamer= models.ForeignKey(Gamer)
|
gamer= models.ForeignKey("Gamer", on_delete=models.CASCADE)
|
||||||
event = models.ForeignKey(Event)
|
event = models.ForeignKey("Event", on_delete=models.CASCADE)
|
||||||
|
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
from django.db import models
|
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
|
from levelupapi.models.gamer import Gamer
|
||||||
|
|
||||||
|
|
||||||
class Game(models.Model):
|
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)
|
title = models.CharField(max_length=256)
|
||||||
maker = models.CharField(max_length=256)
|
maker = models.CharField(max_length=256)
|
||||||
gamer = models.ForeignKey(Gamer, on_delete=models.DO_NOTHING)
|
gamer = models.ForeignKey(Gamer, on_delete=models.DO_NOTHING)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
class Game_Type(models.Model):
|
class GameType(models.Model):
|
||||||
|
|
||||||
label= models.CharField(max_length=50)
|
label= models.CharField(max_length=50)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
from .auth import login_user, register_user
|
||||||
@@ -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)
|
||||||
Reference in New Issue
Block a user