This commit is contained in:
Walter 2025-02-12 18:33:45 +01:00
parent 2a98d58484
commit f1461f0e08
8 changed files with 74 additions and 25 deletions

View File

@ -4,8 +4,8 @@ from django.views.generic import TemplateView
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from bloonsa_game.models import Level
from users.models import Player, Bloonsa_LevelRating
from bloonsa_game.models import Level, LevelRating
from users.models import Player
from users.util import tag_player
@ -69,7 +69,7 @@ class RateLevel(CSRFexemptTemplateView):
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,
ratingObject = LevelRating.objects.filter(player=player,
level=level).first()
if ratingObject:
ratingObject.rating = rating
@ -77,7 +77,7 @@ class RateLevel(CSRFexemptTemplateView):
return HttpResponse(content="OK", status=200)
else:
rating = Bloonsa_LevelRating.objects.create(player=player,
rating = LevelRating.objects.create(player=player,
level=level,
rating=rating)
rating.save()

View File

@ -0,0 +1,22 @@
# Generated by Django 5.1.6 on 2025-02-12 10:28
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('bloonsa_game', '0010_alter_author_authorid'),
]
operations = [
migrations.CreateModel(
name='LevelRating',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('rating', models.SmallIntegerField()),
('level', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bloonsa_game.level')),
],
),
]

View File

@ -35,3 +35,11 @@ class Level(models.Model):
flashVarsStr = f"{seperator}".join([f"{k}={v}"
for k, v in flashVars.items()])
return flashVarsStr
class LevelRating(models.Model):
level = models.ForeignKey(Level, on_delete=models.CASCADE)
rating = models.SmallIntegerField()
def __str__(self):
return f"<{self.rating}> {self.level}"

View File

@ -5,7 +5,7 @@ from django.views.generic import TemplateView
from django.views.static import serve
from bloonsa_game.models import Level
from users.util import tag_player
from users.util import tag_player, init_player
class IndexView(TemplateView):
@ -24,6 +24,9 @@ class GameView(TemplateView):
def get(self, request, *args, **kwargs):
tag_player(request=request)
init_player(request=request)
# TODO get player object here with init_player to use in html template03.3.005
if type(kwargs.get("pk")) is int:
level = Level.objects.get(id=kwargs["pk"])
if level:

View File

@ -1,11 +1,11 @@
from django.contrib import admin
from .models import Player, Bloonsa_LevelRating
from .models import Player, LevelRating
class PlayerAdmin(admin.ModelAdmin):
# These lag too much
exclude = ("bloonsa_levelsPlayed", "bloonsa_levelsBeaten")
admin.site.register(Bloonsa_LevelRating)
admin.site.register(LevelRating)
admin.site.register(Player, PlayerAdmin)

View File

@ -0,0 +1,22 @@
# Generated by Django 5.1.6 on 2025-02-12 10:28
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('bloonsa_game', '0011_levelrating'),
('users', '0010_alter_bloonsa_levelrating_level'),
]
operations = [
migrations.AddField(
model_name='player',
name='bloonsa_levelRatings',
field=models.ManyToManyField(blank=True, related_name='levelRatings', to='bloonsa_game.levelrating'),
),
migrations.DeleteModel(
name='Bloonsa_LevelRating',
),
]

View File

@ -2,7 +2,7 @@ from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from bloonsa_game.models import Level
from bloonsa_game.models import Level, LevelRating
class Player(models.Model):
@ -10,6 +10,7 @@ class Player(models.Model):
# Savedata
bloonsa_levelsPlayed = models.ManyToManyField(Level, blank=True, related_name="levelsPlayed")
bloonsa_levelsBeaten = models.ManyToManyField(Level, blank=True, related_name="levelsBeaten")
bloonsa_levelRatings = models.ManyToManyField(LevelRating, blank=True, related_name="levelRatings")
# Logging
creationIP = models.GenericIPAddressField()
latestIP = models.GenericIPAddressField()
@ -24,10 +25,4 @@ class Player(models.Model):
def __str__(self):
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}"

View File

@ -13,28 +13,27 @@ def get_ip(request):
return ip
# Create a Player object for a User
def init_player(request, user):
if not user.is_authenticated:
def init_player(request):
if not request.user.is_authenticated:
return
player = Player.objects.filter(user=user).first()
player = Player.objects.filter(user=request.user).first()
if player:
return
ip = get_ip(request=request)
player = Player(user=user,
player = Player(user=request.user,
creationIP=ip,
latestIP=ip)
player.save()
# Update activity timestamp and IP
def tag_player(request, user=None):
def tag_player(request):
if not tracking:
return
user = user or request.user
if not user.is_authenticated:
if not request.user.is_authenticated:
return
player = Player.objects.filter(user=request.user).first()
if not player:
init_player(request=request, user=user)
init_player(request=request, user=request.user)
player.latestActivity = timezone.now()
player.latestIP = get_ip(request=request)
player.save()