Insane progress, all gamebreaking bugs are fixed
This commit is contained in:
parent
d07c7f73da
commit
515a270cf3
@ -5,6 +5,7 @@ from django.utils.decorators import method_decorator
|
|||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
|
||||||
from bloonsa_game.models import Level
|
from bloonsa_game.models import Level
|
||||||
|
from users.models import Player, Bloonsa_LevelRating
|
||||||
from users.util import tag_player
|
from users.util import tag_player
|
||||||
|
|
||||||
|
|
||||||
@ -15,40 +16,71 @@ class CSRFexemptTemplateView(TemplateView):
|
|||||||
|
|
||||||
|
|
||||||
class LoadLevel(CSRFexemptTemplateView):
|
class LoadLevel(CSRFexemptTemplateView):
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
tag_player(request=request)
|
levelId = request.POST.get("levelId")
|
||||||
levelNum = request.POST.get("level_num")
|
if levelId is None or not levelId.isdigit():
|
||||||
if levelNum is None or not levelNum.isdigit():
|
|
||||||
return HttpResponseBadRequest()
|
return HttpResponseBadRequest()
|
||||||
|
|
||||||
level = Level.objects.filter(id=int(levelNum)).first()
|
level = Level.objects.filter(levelId=int(levelId)).first()
|
||||||
if level is None:
|
if level is None:
|
||||||
return HttpResponseBadRequest()
|
return HttpResponseBadRequest()
|
||||||
|
|
||||||
|
if request.user.is_authenticated:
|
||||||
|
tag_player(request=request)
|
||||||
|
player = Player.objects.get(user=request.user)
|
||||||
|
player.bloonsa_levelsPlayed.add(level)
|
||||||
|
|
||||||
flashVars = level.getFlashVars(seperator="&")
|
flashVars = level.getFlashVars(seperator="&")
|
||||||
return HttpResponse(flashVars)
|
return HttpResponse(flashVars)
|
||||||
|
|
||||||
|
|
||||||
class RandomLevel(CSRFexemptTemplateView):
|
class RandomLevel(CSRFexemptTemplateView):
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
tag_player(request=request)
|
|
||||||
level = Level.objects.order_by("?").first()
|
level = Level.objects.order_by("?").first()
|
||||||
flashVars = level.getFlashVars(seperator="&")
|
flashVars = level.getFlashVars(seperator="&")
|
||||||
|
|
||||||
|
if request.user.is_authenticated:
|
||||||
|
tag_player(request=request)
|
||||||
|
player = Player.objects.get(user=request.user)
|
||||||
|
player.bloonsa_levelsPlayed.add(level)
|
||||||
|
|
||||||
return HttpResponse(flashVars)
|
return HttpResponse(flashVars)
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
tag_player(request=request)
|
return self.post(request=request, *args, **kwargs)
|
||||||
level = Level.objects.order_by("?").first()
|
|
||||||
flashVars = level.getFlashVars(seperator="&")
|
|
||||||
return HttpResponse(flashVars)
|
|
||||||
|
|
||||||
class CompleteLevel(CSRFexemptTemplateView):
|
class CompleteLevel(CSRFexemptTemplateView):
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
tag_player(request=request)
|
if request.user.is_authenticated:
|
||||||
pass
|
tag_player(request=request)
|
||||||
|
levelId = int(request.POST.get("levelId"))
|
||||||
|
level = Level.objects.get(levelId=levelId)
|
||||||
|
player = Player.objects.get(user=request.user)
|
||||||
|
player.bloonsa_levelsBeaten.add(level)
|
||||||
|
|
||||||
|
# Sending empty content means error in as3
|
||||||
|
return HttpResponse(content="GG", status=200)
|
||||||
|
|
||||||
class RateLevel(CSRFexemptTemplateView):
|
class RateLevel(CSRFexemptTemplateView):
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
tag_player(request=request)
|
if request.user.is_authenticated:
|
||||||
pass
|
tag_player(request=request)
|
||||||
|
rating = int(request.POST.get("rating"))
|
||||||
|
levelId = int(request.POST.get("levelId"))
|
||||||
|
level = Level.objects.get(levelId=levelId)
|
||||||
|
player = Player.objects.get(user=request.user)
|
||||||
|
ratingObject = Bloonsa_LevelRating.objects.filter(player=player,
|
||||||
|
level=level).first()
|
||||||
|
if ratingObject:
|
||||||
|
ratingObject.rating = rating
|
||||||
|
ratingObject.save()
|
||||||
|
return HttpResponse(content="OK", status=200)
|
||||||
|
|
||||||
|
else:
|
||||||
|
rating = Bloonsa_LevelRating.objects.create(player=player,
|
||||||
|
level=level,
|
||||||
|
rating=rating)
|
||||||
|
rating.save()
|
||||||
|
return HttpResponse(content="OK", status=200)
|
||||||
|
|
||||||
|
return HttpResponse(status=400)
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
# Generated by Django 3.2.7 on 2021-09-28 17:44
|
# Generated by Django 5.1.6 on 2025-02-07 00:21
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
@ -12,19 +13,11 @@ class Migration(migrations.Migration):
|
|||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Level',
|
name='Author',
|
||||||
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')),
|
||||||
('author', models.TextField()),
|
('name', models.CharField(max_length=255)),
|
||||||
('title', models.CharField(max_length=16)),
|
('authorId', models.IntegerField()),
|
||||||
('author_id', models.IntegerField()),
|
|
||||||
('level_id', models.IntegerField()),
|
|
||||||
('darts', models.IntegerField()),
|
|
||||||
('target', models.IntegerField()),
|
|
||||||
('plays', models.IntegerField()),
|
|
||||||
('completions', models.IntegerField()),
|
|
||||||
('rating', models.IntegerField(blank=True, null=True)),
|
|
||||||
('data', models.CharField(max_length=288)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
@ -33,4 +26,19 @@ class Migration(migrations.Migration):
|
|||||||
('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')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Level',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('title', models.CharField(max_length=16)),
|
||||||
|
('levelId', models.IntegerField()),
|
||||||
|
('darts', models.IntegerField()),
|
||||||
|
('target', models.IntegerField()),
|
||||||
|
('plays', models.IntegerField()),
|
||||||
|
('completions', models.IntegerField()),
|
||||||
|
('rating', models.FloatField(blank=True, null=True)),
|
||||||
|
('data', models.CharField(max_length=288)),
|
||||||
|
('author', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='bloonsa_game.author')),
|
||||||
|
],
|
||||||
|
),
|
||||||
]
|
]
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 08:38
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Bloonsa_LevelRatings',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('rating', models.SmallIntegerField()),
|
||||||
|
('level', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='bloonsa_game.level')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='Player',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 08:43
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0002_bloonsa_levelratings_delete_player'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='bloonsa_levelratings',
|
||||||
|
name='level',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 08:43
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0003_remove_bloonsa_levelratings_level'),
|
||||||
|
('users', '0007_remove_player_bloonsa_levelratings_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='Bloonsa_LevelRatings',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 10:21
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0004_delete_bloonsa_levelratings'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='level',
|
||||||
|
name='completions',
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='level',
|
||||||
|
name='author',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bloonsa_game.author'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 10:23
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0005_remove_level_completions_alter_level_author'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='level',
|
||||||
|
name='author',
|
||||||
|
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='bloonsa_game.author'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='level',
|
||||||
|
name='darts',
|
||||||
|
field=models.SmallIntegerField(),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='level',
|
||||||
|
name='target',
|
||||||
|
field=models.SmallIntegerField(),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 10:32
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0006_alter_level_author_alter_level_darts_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='level',
|
||||||
|
name='beats',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='level',
|
||||||
|
name='author',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bloonsa_game.author'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='level',
|
||||||
|
name='plays',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 10:36
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0007_level_beats_alter_level_author_alter_level_plays'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='level',
|
||||||
|
name='beats',
|
||||||
|
field=models.IntegerField(),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='level',
|
||||||
|
name='plays',
|
||||||
|
field=models.IntegerField(),
|
||||||
|
),
|
||||||
|
]
|
||||||
18
app/bloonsa_game/migrations/0009_alter_author_authorid.py
Normal file
18
app/bloonsa_game/migrations/0009_alter_author_authorid.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 10:38
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0008_alter_level_beats_alter_level_plays'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='author',
|
||||||
|
name='authorId',
|
||||||
|
field=models.IntegerField(null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
19
app/bloonsa_game/migrations/0010_alter_author_authorid.py
Normal file
19
app/bloonsa_game/migrations/0010_alter_author_authorid.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 10:48
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0009_alter_author_authorid'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='author',
|
||||||
|
name='authorId',
|
||||||
|
field=models.IntegerField(default=None),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -1,22 +1,20 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
# Create your models here.
|
|
||||||
|
|
||||||
class Author(models.Model):
|
class Author(models.Model):
|
||||||
name = models.CharField(max_length=255)
|
name = models.CharField(max_length=255)
|
||||||
authorId = models.IntegerField()
|
authorId = models.IntegerField()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return f"{self.authorId} - {self.name}"
|
||||||
|
|
||||||
class Level(models.Model):
|
class Level(models.Model):
|
||||||
author = models.ForeignKey(Author, on_delete=models.DO_NOTHING)
|
author = models.ForeignKey(Author, on_delete=models.CASCADE)
|
||||||
title = models.CharField(max_length=16)
|
title = models.CharField(max_length=16)
|
||||||
levelId = models.IntegerField()
|
levelId = models.IntegerField()
|
||||||
darts = models.IntegerField()
|
darts = models.SmallIntegerField()
|
||||||
target = models.IntegerField()
|
target = models.SmallIntegerField()
|
||||||
plays = models.IntegerField()
|
plays = models.IntegerField()
|
||||||
completions = models.IntegerField()
|
beats = models.IntegerField()
|
||||||
rating = models.FloatField(null=True, blank=True)
|
rating = models.FloatField(null=True, blank=True)
|
||||||
data = models.CharField(max_length=288)
|
data = models.CharField(max_length=288)
|
||||||
|
|
||||||
@ -32,13 +30,8 @@ class Level(models.Model):
|
|||||||
"target": self.target,
|
"target": self.target,
|
||||||
"data": self.data,
|
"data": self.data,
|
||||||
"authorID": self.author.authorId,
|
"authorID": self.author.authorId,
|
||||||
"numCompleted": self.completions,
|
|
||||||
"rating": self.rating if self.rating else 0.0,
|
"rating": self.rating if self.rating else 0.0,
|
||||||
}
|
}
|
||||||
flashVarsStr = f"{seperator}".join([f"{k}={v}"
|
flashVarsStr = f"{seperator}".join([f"{k}={v}"
|
||||||
for k, v in flashVars.items()])
|
for k, v in flashVars.items()])
|
||||||
return flashVarsStr
|
return flashVarsStr
|
||||||
|
|
||||||
|
|
||||||
class Player(models.Model):
|
|
||||||
pass
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<cross-domain-policy>
|
||||||
|
<site-control permitted-cross-domain-policies="all"/>
|
||||||
|
<allow-access-from domain="*"/>
|
||||||
|
<allow-http-request-headers-from domain="*" headers="*"/>
|
||||||
|
</cross-domain-policy>
|
||||||
@ -1,5 +1,8 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.views.generic import TemplateView
|
from django.views.generic import TemplateView
|
||||||
|
from django.views.static import serve
|
||||||
|
|
||||||
from bloonsa_game.models import Level
|
from bloonsa_game.models import Level
|
||||||
from users.util import tag_player
|
from users.util import tag_player
|
||||||
|
|||||||
@ -1,36 +0,0 @@
|
|||||||
# Generated by Django 3.2.7 on 2021-09-28 18:06
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('game', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Author',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('name', models.CharField(max_length=255)),
|
|
||||||
('authorId', models.IntegerField()),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.RenameField(
|
|
||||||
model_name='level',
|
|
||||||
old_name='level_id',
|
|
||||||
new_name='levelId',
|
|
||||||
),
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='level',
|
|
||||||
name='author_id',
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='level',
|
|
||||||
name='author',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='game.author'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
# Generated by Django 3.2.7 on 2021-09-28 18:39
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('game', '0002_auto_20210928_2006'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='level',
|
|
||||||
name='rating',
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='level',
|
|
||||||
name='rating9',
|
|
||||||
field=models.IntegerField(blank=True, null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 3.2.7 on 2021-09-28 18:39
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('game', '0003_auto_20210928_2039'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RenameField(
|
|
||||||
model_name='level',
|
|
||||||
old_name='rating9',
|
|
||||||
new_name='rating',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 3.2.7 on 2021-09-28 18:43
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('game', '0004_rename_rating9_level_rating'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='level',
|
|
||||||
name='rating',
|
|
||||||
field=models.FloatField(blank=True, null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@ -1,3 +1,5 @@
|
|||||||
django==5.1.*
|
django==5.1.*
|
||||||
django-crispy-forms
|
django-crispy-forms
|
||||||
crispy-bulma
|
crispy-bulma
|
||||||
|
django-extensions
|
||||||
|
django-cors-headers
|
||||||
0
app/scripts/__init__.py
Normal file
0
app/scripts/__init__.py
Normal file
36
app/scripts/database_migration.py
Normal file
36
app/scripts/database_migration.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import sqlite3
|
||||||
|
import django
|
||||||
|
django.setup()
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
from bloonsa_game.models import Level, Author
|
||||||
|
|
||||||
|
|
||||||
|
def run():
|
||||||
|
print("yes")
|
||||||
|
|
||||||
|
with sqlite3.connect("bloonsworld_levels.db") as db:
|
||||||
|
cursor = db.cursor()
|
||||||
|
cursor.execute("SELECT * FROM Levels")
|
||||||
|
|
||||||
|
for (levelNum, title, authorname, authorID, numPlays, numCompleted, rating, target, darts, data) in tqdm(cursor.fetchall()):
|
||||||
|
authorObj = Author.objects.filter(authorId=authorID).first()
|
||||||
|
if not authorObj:
|
||||||
|
authorObj = Author.objects.create(authorId=authorID,
|
||||||
|
name=authorname)
|
||||||
|
authorObj.save()
|
||||||
|
|
||||||
|
levelObj = Level.objects.filter(levelId=levelNum).first()
|
||||||
|
if not levelObj:
|
||||||
|
levelObj = Level.objects.create(author=authorObj,
|
||||||
|
levelId=levelNum,
|
||||||
|
title=title,
|
||||||
|
plays=numPlays,
|
||||||
|
beats=numCompleted,
|
||||||
|
rating=rating,
|
||||||
|
target=target,
|
||||||
|
darts=darts,
|
||||||
|
data=data)
|
||||||
|
|
||||||
|
levelObj.save()
|
||||||
|
|
||||||
@ -25,8 +25,7 @@ SECRET_KEY = 'django-insecure-)e!wy4)=xinnd!d(iuw6*-tf^-)ptiwnttwf+9ql%*jy63wtd8
|
|||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
|
|
||||||
ALLOWED_HOSTS = []
|
ALLOWED_HOSTS = ["*"]
|
||||||
|
|
||||||
|
|
||||||
# Application definition
|
# Application definition
|
||||||
|
|
||||||
@ -41,6 +40,7 @@ INSTALLED_APPS = [
|
|||||||
# Plugins
|
# Plugins
|
||||||
"crispy_forms",
|
"crispy_forms",
|
||||||
"crispy_bulma",
|
"crispy_bulma",
|
||||||
|
"django_extensions",
|
||||||
|
|
||||||
# Global
|
# Global
|
||||||
"users",
|
"users",
|
||||||
@ -139,3 +139,5 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
|||||||
|
|
||||||
CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",)
|
CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",)
|
||||||
CRISPY_TEMPLATE_PACK = 'bulma'
|
CRISPY_TEMPLATE_PACK = 'bulma'
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -14,11 +14,17 @@ 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.urls import path, include
|
from django.urls import path, include, re_path
|
||||||
|
from django.views.generic.base import RedirectView
|
||||||
|
|
||||||
|
crossdomain_view = RedirectView.as_view(url='/static/bloonsa_game/misc/crossdomain.xml', permanent=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path("web_service/", include("bloonsa_api.urls", namespace="bloonsa_api")),
|
path("bloonsa_api/", include("bloonsa_api.urls", namespace="bloonsa_api")),
|
||||||
path("a/", include("bloonsa_game.urls", namespace="bloonsa_game")),
|
path("a/", include("bloonsa_game.urls", namespace="bloonsa_game")),
|
||||||
path("users/", include("users.urls", namespace="users"))
|
path("users/", include("users.urls", namespace="users")),
|
||||||
|
re_path(r'^crossdomain\.xml$', crossdomain_view)
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import Player, User
|
from .models import Player, Bloonsa_LevelRating
|
||||||
|
|
||||||
admin.site.register(Player)
|
admin.site.register(Player)
|
||||||
|
admin.site.register(Bloonsa_LevelRating)
|
||||||
|
|||||||
52
app/users/migrations/0001_initial.py
Normal file
52
app/users/migrations/0001_initial.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 01:25
|
||||||
|
|
||||||
|
import django.contrib.auth.models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('auth', '0012_alter_user_first_name_max_length'),
|
||||||
|
('bloonsa_game', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CustomUser',
|
||||||
|
fields=[
|
||||||
|
('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'user',
|
||||||
|
'verbose_name_plural': 'users',
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('auth.user',),
|
||||||
|
managers=[
|
||||||
|
('objects', django.contrib.auth.models.UserManager()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Player',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('creationIP', models.GenericIPAddressField()),
|
||||||
|
('latestIP', models.GenericIPAddressField()),
|
||||||
|
('creationDate', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
|
('latestActivity', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
|
('suspectedCheater', models.BooleanField(default=False)),
|
||||||
|
('suspended', models.BooleanField(default=False)),
|
||||||
|
('banned', models.BooleanField(default=False)),
|
||||||
|
('admin', models.BooleanField(default=False)),
|
||||||
|
('levelsBeaten', models.ManyToManyField(blank=True, related_name='levelsBeaten', to='bloonsa_game.level')),
|
||||||
|
('levelsPlayed', models.ManyToManyField(blank=True, related_name='levelsPlayed', to='bloonsa_game.level')),
|
||||||
|
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='users.customuser')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 02:15
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('users', '0001_initial'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='player',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='CustomUser',
|
||||||
|
),
|
||||||
|
]
|
||||||
37
app/users/migrations/0003_customuser_alter_player_user.py
Normal file
37
app/users/migrations/0003_customuser_alter_player_user.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 05:12
|
||||||
|
|
||||||
|
import django.contrib.auth.models
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('auth', '0012_alter_user_first_name_max_length'),
|
||||||
|
('users', '0002_alter_player_user_delete_customuser'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CustomUser',
|
||||||
|
fields=[
|
||||||
|
('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'user',
|
||||||
|
'verbose_name_plural': 'users',
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('auth.user',),
|
||||||
|
managers=[
|
||||||
|
('objects', django.contrib.auth.models.UserManager()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='player',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='users.customuser'),
|
||||||
|
),
|
||||||
|
]
|
||||||
19
app/users/migrations/0004_rename_customuser_bloonsuser.py
Normal file
19
app/users/migrations/0004_rename_customuser_bloonsuser.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 05:17
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('users', '0003_customuser_alter_player_user'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='CustomUser',
|
||||||
|
new_name='BloonsUser',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 05:50
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('users', '0004_rename_customuser_bloonsuser'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='player',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='BloonsUser',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 08:38
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0002_bloonsa_levelratings_delete_player'),
|
||||||
|
('users', '0005_alter_player_user_delete_bloonsuser'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='player',
|
||||||
|
old_name='levelsBeaten',
|
||||||
|
new_name='bloonsa_levelsBeaten',
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='player',
|
||||||
|
old_name='levelsPlayed',
|
||||||
|
new_name='bloonsa_levelsPlayed',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='player',
|
||||||
|
name='bloonsa_levelRatings',
|
||||||
|
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bloonsa_levelRatings', to='bloonsa_game.bloonsa_levelratings'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 08:43
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0003_remove_bloonsa_levelratings_level'),
|
||||||
|
('users', '0006_rename_levelsbeaten_player_bloonsa_levelsbeaten_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='player',
|
||||||
|
name='bloonsa_levelRatings',
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Bloonsa_LevelRatings',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('rating', models.SmallIntegerField()),
|
||||||
|
('level', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='bloonsa_game.level')),
|
||||||
|
('player', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='users.player')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 08:46
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0004_delete_bloonsa_levelratings'),
|
||||||
|
('users', '0007_remove_player_bloonsa_levelratings_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='Bloonsa_LevelRatings',
|
||||||
|
new_name='Bloonsa_LevelRating',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 10:57
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('users', '0008_rename_bloonsa_levelratings_bloonsa_levelrating'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='bloonsa_levelrating',
|
||||||
|
name='player',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.player'),
|
||||||
|
),
|
||||||
|
]
|
||||||
20
app/users/migrations/0010_alter_bloonsa_levelrating_level.py
Normal file
20
app/users/migrations/0010_alter_bloonsa_levelrating_level.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-02-07 11:14
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bloonsa_game', '0010_alter_author_authorid'),
|
||||||
|
('users', '0009_alter_bloonsa_levelrating_player'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='bloonsa_levelrating',
|
||||||
|
name='level',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bloonsa_game.level'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -5,14 +5,11 @@ from django.contrib.auth.models import User
|
|||||||
from bloonsa_game.models import Level
|
from bloonsa_game.models import Level
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Player(models.Model):
|
class Player(models.Model):
|
||||||
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
|
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
|
||||||
# Savedata
|
# Savedata
|
||||||
levelsPlayed = models.ManyToManyField(Level, blank=True, related_name="levelsPlayed")
|
bloonsa_levelsPlayed = models.ManyToManyField(Level, blank=True, related_name="levelsPlayed")
|
||||||
levelsBeaten = models.ManyToManyField(Level, blank=True, related_name="levelsBeaten")
|
bloonsa_levelsBeaten = models.ManyToManyField(Level, blank=True, related_name="levelsBeaten")
|
||||||
# levelsRated = ...
|
|
||||||
# Logging
|
# Logging
|
||||||
creationIP = models.GenericIPAddressField()
|
creationIP = models.GenericIPAddressField()
|
||||||
latestIP = models.GenericIPAddressField()
|
latestIP = models.GenericIPAddressField()
|
||||||
@ -25,4 +22,12 @@ class Player(models.Model):
|
|||||||
admin = models.BooleanField(default=False)
|
admin = models.BooleanField(default=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.user} - {self.latestIP}"
|
return f"{self.user} - {self.latestIP}"
|
||||||
|
|
||||||
|
class Bloonsa_LevelRating(models.Model):
|
||||||
|
level = models.ForeignKey(Level, on_delete=models.CASCADE)
|
||||||
|
player = models.ForeignKey(Player, on_delete=models.CASCADE)
|
||||||
|
rating = models.SmallIntegerField()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.player.user} <{self.rating}> {self.level}"
|
||||||
@ -16,7 +16,7 @@ def get_ip(request):
|
|||||||
def init_player(request, user):
|
def init_player(request, user):
|
||||||
if not user.is_authenticated:
|
if not user.is_authenticated:
|
||||||
return
|
return
|
||||||
player = Player.objects.get(user=request.user)
|
player = Player.objects.filter(user=user).first()
|
||||||
if player:
|
if player:
|
||||||
return
|
return
|
||||||
ip = get_ip(request=request)
|
ip = get_ip(request=request)
|
||||||
@ -32,7 +32,7 @@ def tag_player(request, user=None):
|
|||||||
user = user or request.user
|
user = user or request.user
|
||||||
if not user.is_authenticated:
|
if not user.is_authenticated:
|
||||||
return
|
return
|
||||||
player = Player.objects.get(user=request.user)
|
player = Player.objects.filter(user=request.user).first()
|
||||||
if not player:
|
if not player:
|
||||||
init_player(request=request, user=user)
|
init_player(request=request, user=user)
|
||||||
player.latestActivity = timezone.now()
|
player.latestActivity = timezone.now()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user