This commit is contained in:
2025-10-23 16:09:40 +08:00
parent 03f1bfdf86
commit 1b06e94473
5 changed files with 196 additions and 35 deletions

View File

@@ -87,6 +87,41 @@ class ProblemSetBadge(models.Model):
def __str__(self):
return f"{self.problemset.title} - {self.name}"
def recalculate_user_badges(self):
"""重新计算所有用户的徽章资格"""
# 获取所有已加入该题单的用户进度
user_progresses = ProblemSetProgress.objects.filter(problemset=self.problemset)
# 删除该徽章的所有现有用户徽章记录
UserBadge.objects.filter(badge=self).delete()
# 重新评估每个用户的徽章资格
for progress in user_progresses:
self._check_user_badge_eligibility(progress)
def _check_user_badge_eligibility(self, progress):
"""检查用户是否符合该徽章的条件"""
# 检查是否已经拥有该徽章
if UserBadge.objects.filter(user=progress.user, badge=self).exists():
return False
# 根据条件类型检查用户是否符合条件
if self.condition_type == "all_problems":
if progress.completed_problems_count == progress.total_problems_count:
UserBadge.objects.create(user=progress.user, badge=self)
return True
elif self.condition_type == "problem_count":
if progress.completed_problems_count >= self.condition_value:
UserBadge.objects.create(user=progress.user, badge=self)
return True
elif self.condition_type == "score":
if progress.total_score >= self.condition_value:
UserBadge.objects.create(user=progress.user, badge=self)
return True
return False
class ProblemSetProgress(models.Model):
@@ -162,6 +197,14 @@ class ProblemSetProgress(models.Model):
self.save()
@classmethod
def sync_all_progress_for_problemset(cls, problemset):
"""同步指定题单的所有用户进度"""
progresses = cls.objects.filter(problemset=problemset)
for progress in progresses:
progress.update_progress()
return progresses.count()
class ProblemSetSubmission(models.Model):
"""题单提交记录模型"""
@@ -224,3 +267,5 @@ class UserBadge(models.Model):
def __str__(self):
return f"{self.user.username} - {self.badge.name}"