mirror of
https://gitlab.crans.org/bde/nk20
synced 2025-07-27 02:55:25 +02:00
Tests
This commit is contained in:
@ -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()
|
||||
|
Reference in New Issue
Block a user