Add value field to MusicGameOrder and update score calculation logic
This commit is contained in:
parent
178a7cab03
commit
92abcb584c
3 changed files with 45 additions and 25 deletions
|
@ -1,5 +1,6 @@
|
|||
from django.contrib.auth.models import User
|
||||
from django.db import models
|
||||
from django.db.models import F
|
||||
from django.db.models.functions import Lower
|
||||
from django.db.models.signals import post_delete, post_save
|
||||
from django.dispatch import receiver
|
||||
|
@ -106,6 +107,17 @@ class MusicGameOrder(models.Model):
|
|||
player = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
music_video = models.ForeignKey(MusicVideo, on_delete=models.CASCADE)
|
||||
order = models.PositiveIntegerField()
|
||||
value = models.PositiveIntegerField(default=0)
|
||||
|
||||
def update_value(self):
|
||||
n_right = self.musicgameanswer_set.filter(game__player=F("answer")).count()
|
||||
if n_right == 0:
|
||||
self.value = 1000
|
||||
else:
|
||||
self.value = 1000 / (
|
||||
1 + ((n_right - 1) / (self.game.players.count() - 1)) ** 0.5
|
||||
)
|
||||
self.save()
|
||||
|
||||
class Meta:
|
||||
constraints = [
|
||||
|
@ -117,6 +129,17 @@ class MusicGameOrder(models.Model):
|
|||
ordering = ["order"]
|
||||
|
||||
|
||||
class AnswerManager(models.Manager):
|
||||
def score(self, game, player):
|
||||
qs = self.filter(game__game=game, game__player=player)
|
||||
return (
|
||||
qs.filter(answer=F("game__player"))
|
||||
.aggregate(score=models.Sum("game__value", default=0))
|
||||
.get("score")
|
||||
- 500 * qs.exclude(game__player=F("answer")).count()
|
||||
)
|
||||
|
||||
|
||||
class MusicGameAnswer(models.Model):
|
||||
game = models.ForeignKey(MusicGameOrder, on_delete=models.CASCADE)
|
||||
player = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
|
@ -124,6 +147,8 @@ class MusicGameAnswer(models.Model):
|
|||
User, on_delete=models.SET_NULL, null=True, related_name="+"
|
||||
)
|
||||
|
||||
objects = AnswerManager()
|
||||
|
||||
class Meta:
|
||||
constraints = [
|
||||
models.UniqueConstraint(fields=("game", "player"), name="unique_answer"),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue