From 03f1bfdf861ab4fec06214b9f95564ceb0e32c66 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Thu, 23 Oct 2025 12:42:24 +0800 Subject: [PATCH] update --- .../0006_remove_is_displayed_field.py | 17 ++++++ problemset/models.py | 2 - problemset/serializers.py | 16 ++++++ problemset/urls/oj.py | 5 -- problemset/views/oj.py | 54 +++++++++++++------ submission/views/oj.py | 9 ---- 6 files changed, 72 insertions(+), 31 deletions(-) create mode 100644 problemset/migrations/0006_remove_is_displayed_field.py diff --git a/problemset/migrations/0006_remove_is_displayed_field.py b/problemset/migrations/0006_remove_is_displayed_field.py new file mode 100644 index 0000000..eb7cfe3 --- /dev/null +++ b/problemset/migrations/0006_remove_is_displayed_field.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.3 on 2025-10-23 03:41 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('problemset', '0005_alter_problemsetsubmission_options_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='userbadge', + name='is_displayed', + ), + ] diff --git a/problemset/models.py b/problemset/models.py index b16c9fc..00d7770 100644 --- a/problemset/models.py +++ b/problemset/models.py @@ -215,8 +215,6 @@ class UserBadge(models.Model): ) # 获得时间 earned_time = models.DateTimeField(auto_now_add=True, verbose_name="获得时间") - # 是否已展示给用户 - is_displayed = models.BooleanField(default=False, verbose_name="是否已展示") class Meta: db_table = "user_badge" diff --git a/problemset/serializers.py b/problemset/serializers.py index 202dabb..a98a587 100644 --- a/problemset/serializers.py +++ b/problemset/serializers.py @@ -137,6 +137,7 @@ class ProblemSetProblemSerializer(serializers.ModelSerializer): """题单题目序列化器""" problem = serializers.SerializerMethodField() + is_completed = serializers.SerializerMethodField() class Meta: model = ProblemSetProblem @@ -148,6 +149,20 @@ class ProblemSetProblemSerializer(serializers.ModelSerializer): return ProblemListSerializer(obj.problem, context=self.context).data + def get_is_completed(self, obj): + """获取当前用户是否已完成该题目""" + request = self.context.get("request") + if request and request.user.is_authenticated: + try: + progress = ProblemSetProgress.objects.get( + problemset=obj.problemset, user=request.user + ) + problem_id = str(obj.problem.id) + return problem_id in progress.progress_detail + except ProblemSetProgress.DoesNotExist: + return False + return False + class AddProblemToSetSerializer(serializers.Serializer): """添加题目到题单序列化器""" @@ -226,5 +241,6 @@ class UpdateProgressSerializer(serializers.Serializer): problemset_id = serializers.IntegerField() problem_id = serializers.IntegerField() + submission_id = serializers.CharField(required=False) diff --git a/problemset/urls/oj.py b/problemset/urls/oj.py index 47f3287..ec9449f 100644 --- a/problemset/urls/oj.py +++ b/problemset/urls/oj.py @@ -41,11 +41,6 @@ urlpatterns = [ path("user/progress", UserProgressAPI.as_view(), name="user_progress_api"), # 奖章相关API path("user/badges", UserBadgeAPI.as_view(), name="user_badges_api"), - path( - "user/badges/", - UserBadgeAPI.as_view(), - name="user_badge_detail_api", - ), path( "problemset//badges", ProblemSetBadgeAPI.as_view(), diff --git a/problemset/views/oj.py b/problemset/views/oj.py index f0d0258..fb72f26 100644 --- a/problemset/views/oj.py +++ b/problemset/views/oj.py @@ -1,3 +1,4 @@ +from ssl import HAS_SNI from django.db.models import Q from django.utils import timezone @@ -8,6 +9,7 @@ from problemset.models import ( ProblemSetProblem, ProblemSetBadge, ProblemSetProgress, + ProblemSetSubmission, UserBadge, ) from problemset.serializers import ( @@ -21,6 +23,9 @@ from problemset.serializers import ( UpdateProgressSerializer, ) +from submission.models import Submission +from problem.models import Problem + class ProblemSetAPI(APIView): """题单API - 用户端""" @@ -168,7 +173,7 @@ class ProblemSetProgressAPI(APIView): # 更新详细进度 problem_id = str(data["problem_id"]) - + # 获取该题目在题单中的分值 try: problemset_problem = ProblemSetProblem.objects.get( @@ -177,7 +182,7 @@ class ProblemSetProgressAPI(APIView): problem_score = problemset_problem.score except ProblemSetProblem.DoesNotExist: problem_score = 0 - + progress.progress_detail[problem_id] = { "score": problem_score, "submit_time": data.get("submit_time", timezone.now().isoformat()), @@ -186,6 +191,22 @@ class ProblemSetProgressAPI(APIView): # 更新进度 progress.update_progress() + submission = Submission.objects.get(id=data["submission_id"]) + problem = Problem.objects.get(id=problem_id) + + has_accepted = ProblemSetSubmission.objects.filter( + problemset=problem_set, + user=request.user, + problem=problem, + ).exists() + if not has_accepted: + ProblemSetSubmission.objects.create( + problemset=problem_set, + user=request.user, + submission=submission, + problem=problem, + ) + # 检查是否获得奖章 self._check_badges(progress) @@ -194,22 +215,38 @@ class ProblemSetProgressAPI(APIView): def _check_badges(self, progress): """检查是否获得奖章""" badges = ProblemSetBadge.objects.filter(problemset=progress.problemset) + print(f"[BadgeCheck] 检查用户 {progress.user.username} 的徽章,题单 {progress.problemset.title}") + print(f"[BadgeCheck] 已完成题目数: {progress.completed_problems_count}, 总题目数: {progress.total_problems_count}") + print(f"[BadgeCheck] 总分数: {progress.total_score}") + print(f"[BadgeCheck] 找到 {badges.count()} 个徽章") for badge in badges: + print(f"[BadgeCheck] 检查徽章: {badge.name} (条件: {badge.condition_type}, 值: {badge.condition_value})") + # 检查是否已经获得该奖章 if UserBadge.objects.filter(user=progress.user, badge=badge).exists(): + print(f"[BadgeCheck] 用户已获得徽章: {badge.name}") continue # 检查是否满足获得条件 if badge.condition_type == "all_problems": if progress.completed_problems_count == progress.total_problems_count: + print(f"[BadgeCheck] 满足条件,创建徽章: {badge.name}") UserBadge.objects.create(user=progress.user, badge=badge) + else: + print(f"[BadgeCheck] 不满足条件: 已完成 {progress.completed_problems_count}/{progress.total_problems_count}") elif badge.condition_type == "problem_count": if progress.completed_problems_count >= badge.condition_value: + print(f"[BadgeCheck] 满足条件,创建徽章: {badge.name}") UserBadge.objects.create(user=progress.user, badge=badge) + else: + print(f"[BadgeCheck] 不满足条件: 已完成 {progress.completed_problems_count} < {badge.condition_value}") elif badge.condition_type == "score": if progress.total_score >= badge.condition_value: + print(f"[BadgeCheck] 满足条件,创建徽章: {badge.name}") UserBadge.objects.create(user=progress.user, badge=badge) + else: + print(f"[BadgeCheck] 不满足条件: 总分数 {progress.total_score} < {badge.condition_value}") class UserProgressAPI(APIView): @@ -233,15 +270,6 @@ class UserBadgeAPI(APIView): serializer = UserBadgeSerializer(badges, many=True) return self.success(serializer.data) - def put(self, request, badge_id): - """标记奖章为已展示""" - try: - user_badge = UserBadge.objects.get(id=badge_id, user=request.user) - user_badge.is_displayed = True - user_badge.save() - return self.success("奖章已标记为已展示") - except UserBadge.DoesNotExist: - return self.error("奖章不存在") class ProblemSetBadgeAPI(APIView): @@ -261,7 +289,3 @@ class ProblemSetBadgeAPI(APIView): badges = ProblemSetBadge.objects.filter(problemset=problem_set) serializer = ProblemSetBadgeSerializer(badges, many=True) return self.success(serializer.data) - - - - diff --git a/submission/views/oj.py b/submission/views/oj.py index 7634319..b5e8ebb 100644 --- a/submission/views/oj.py +++ b/submission/views/oj.py @@ -93,15 +93,6 @@ class SubmissionAPI(APIView): contest_id=data.get("contest_id"), ) - # 如果有problemset_id,创建ProblemSetSubmission记录 - if data.get("problemset_id"): - ProblemSetSubmission.objects.create( - problemset_id=data["problemset_id"], - user=request.user, - submission=submission, - problem=problem, - ) - # use this for debug # JudgeDispatcher(submission.id, problem.id).judge() judge_task.send(submission.id, problem.id)