1
0
mirror of https://gitlab.crans.org/bde/nk20 synced 2025-07-27 02:55:25 +02:00
This commit is contained in:
Ehouarn
2025-07-22 18:31:55 +02:00
parent c66cc14576
commit adc925e4b1
10 changed files with 403 additions and 86 deletions

View File

@ -4,6 +4,7 @@
from django.db import models, transaction
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _
@ -44,6 +45,9 @@ class Family(models.Model):
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse_lazy('family:family_detail', args=(self.pk,))
def update_score(self, *args, **kwargs):
challenge_set = Challenge.objects.select_for_update().filter(achievement__family=self, achievement__valid=True)
points_sum = challenge_set.aggregate(models.Sum("points"))
@ -119,10 +123,16 @@ class Challenge(models.Model):
verbose_name=_('points'),
)
obtained = models.PositiveIntegerField(
verbose_name=_('obtained'),
default=0,
)
@property
def obtained(self):
achievements = Achievement.objects.filter(challenge=self, valid=True)
return achievements.count()
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse_lazy('family:challenge_detail', args=(self.pk,))
@transaction.atomic
def save(self, *args, **kwargs):
@ -136,9 +146,6 @@ class Challenge(models.Model):
verbose_name = _('challenge')
verbose_name_plural = _('challenges')
def __str__(self):
return self.name
class Achievement(models.Model):
challenge = models.ForeignKey(
@ -176,7 +183,6 @@ class Achievement(models.Model):
"""
self.family = Family.objects.select_for_update().get(pk=self.family_id)
self.challenge = Challenge.objects.select_for_update().get(pk=self.challenge_id)
is_new = self.pk is None
super().save(*args, **kwargs)
@ -184,13 +190,6 @@ class Achievement(models.Model):
self.family.refresh_from_db()
self.family.update_score()
# Count only when getting a new achievement
if is_new:
self.challenge.refresh_from_db()
self.challenge.obtained += 1
self.challenge._force_save = True
self.challenge.save()
@transaction.atomic
def delete(self, *args, **kwargs):
"""
@ -205,8 +204,3 @@ class Achievement(models.Model):
# Remove points from the family
self.family.refresh_from_db()
self.family.update_score()
self.challenge.refresh_from_db()
self.challenge.obtained -= 1
self.challenge._force_save = True
self.challenge.save()