diff --git a/app/bloonsa_api/views.py b/app/bloonsa_api/views.py index 084aebb..f567c17 100644 --- a/app/bloonsa_api/views.py +++ b/app/bloonsa_api/views.py @@ -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,17 +69,17 @@ 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, - level=level).first() + ratingObject = 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 = LevelRating.objects.create(player=player, + level=level, + rating=rating) rating.save() return HttpResponse(content="OK", status=200) diff --git a/app/bloonsa_game/migrations/0011_levelrating.py b/app/bloonsa_game/migrations/0011_levelrating.py new file mode 100644 index 0000000..0746d70 --- /dev/null +++ b/app/bloonsa_game/migrations/0011_levelrating.py @@ -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')), + ], + ), + ] diff --git a/app/bloonsa_game/models.py b/app/bloonsa_game/models.py index b78931d..20ccc67 100644 --- a/app/bloonsa_game/models.py +++ b/app/bloonsa_game/models.py @@ -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}" \ No newline at end of file diff --git a/app/bloonsa_game/views.py b/app/bloonsa_game/views.py index 06e73dd..e82a981 100644 --- a/app/bloonsa_game/views.py +++ b/app/bloonsa_game/views.py @@ -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: diff --git a/app/users/admin.py b/app/users/admin.py index 1e5c3b6..6df8749 100644 --- a/app/users/admin.py +++ b/app/users/admin.py @@ -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) diff --git a/app/users/migrations/0011_player_bloonsa_levelratings_and_more.py b/app/users/migrations/0011_player_bloonsa_levelratings_and_more.py new file mode 100644 index 0000000..6e67c8d --- /dev/null +++ b/app/users/migrations/0011_player_bloonsa_levelratings_and_more.py @@ -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', + ), + ] diff --git a/app/users/models.py b/app/users/models.py index b3a4595..5ddc573 100644 --- a/app/users/models.py +++ b/app/users/models.py @@ -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}" \ No newline at end of file diff --git a/app/users/util.py b/app/users/util.py index 0e0d8f3..267fb0a 100644 --- a/app/users/util.py +++ b/app/users/util.py @@ -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() \ No newline at end of file