This commit is contained in:
2025-10-22 20:29:12 +08:00
parent 07aaff69f2
commit c87022793e
7 changed files with 128 additions and 32 deletions

View File

@@ -16,8 +16,10 @@ from problemset.serializers import (
EditProblemSetSerializer,
ProblemSetProblemSerializer,
AddProblemToSetSerializer,
EditProblemInSetSerializer,
ProblemSetBadgeSerializer,
CreateProblemSetBadgeSerializer,
EditProblemSetBadgeSerializer,
ProblemSetProgressSerializer,
)
from problem.models import Problem
@@ -152,7 +154,7 @@ class ProblemSetProblemAdminAPI(APIView):
data = request.data
try:
problem = Problem.objects.get(id=data["problem_id"])
problem = Problem.objects.get(_id=data["problem_id"])
except Problem.DoesNotExist:
return self.error("题目不存在")
@@ -174,7 +176,38 @@ class ProblemSetProblemAdminAPI(APIView):
return self.success("题目已添加到题单")
@super_admin_required
def delete(self, request, problem_set_id, problem_id):
@validate_serializer(EditProblemInSetSerializer)
def put(self, request, problem_set_id, problem_set_problem_id):
"""编辑题单中的题目(管理员)"""
try:
problem_set = ProblemSet.objects.get(id=problem_set_id)
ensure_created_by(problem_set, request.user)
except ProblemSet.DoesNotExist:
return self.error("题单不存在")
try:
problem_set_problem = ProblemSetProblem.objects.get(
id=problem_set_problem_id, problemset=problem_set
)
except ProblemSetProblem.DoesNotExist:
return self.error("题目不在该题单中")
data = request.data
# 更新题目属性
if 'order' in data:
problem_set_problem.order = data['order']
if 'is_required' in data:
problem_set_problem.is_required = data['is_required']
if 'score' in data:
problem_set_problem.score = data['score']
if 'hint' in data:
problem_set_problem.hint = data['hint']
problem_set_problem.save()
return self.success("题目已更新")
@super_admin_required
def delete(self, request, problem_set_id, problem_set_problem_id):
"""从题单中移除题目(管理员)"""
try:
problem_set = ProblemSet.objects.get(id=problem_set_id)
@@ -184,7 +217,7 @@ class ProblemSetProblemAdminAPI(APIView):
try:
problem_set_problem = ProblemSetProblem.objects.get(
problemset=problem_set, problem_id=problem_id
id=problem_set_problem_id, problemset=problem_set
)
problem_set_problem.delete()
return self.success("题目已从题单中移除")
@@ -224,6 +257,39 @@ class ProblemSetBadgeAdminAPI(APIView):
return self.success(ProblemSetBadgeSerializer(badge).data)
@super_admin_required
@validate_serializer(EditProblemSetBadgeSerializer)
def put(self, request, problem_set_id, badge_id):
"""编辑题单奖章(管理员)"""
try:
problem_set = ProblemSet.objects.get(id=problem_set_id)
ensure_created_by(problem_set, request.user)
except ProblemSet.DoesNotExist:
return self.error("题单不存在")
try:
badge = ProblemSetBadge.objects.get(id=badge_id, problemset=problem_set)
except ProblemSetBadge.DoesNotExist:
return self.error("奖章不存在")
data = request.data
# 更新奖章属性
if 'name' in data:
badge.name = data['name']
if 'description' in data:
badge.description = data['description']
if 'icon' in data:
badge.icon = data['icon']
if 'condition_type' in data:
badge.condition_type = data['condition_type']
if 'condition_value' in data:
badge.condition_value = data['condition_value']
if 'level' in data:
badge.level = data['level']
badge.save()
return self.success("奖章已更新")
@super_admin_required
def delete(self, request, problem_set_id, badge_id):
"""删除题单奖章(管理员)"""

View File

@@ -50,9 +50,7 @@ class ProblemSetAPI(APIView):
if status_filter:
problem_sets = problem_sets.filter(status=status_filter)
# 只显示公开的题单,除非是管理员
if not request.user.is_authenticated or not request.user.is_admin_role():
problem_sets = problem_sets.filter(is_public=True)
# 所有用户都可以看到可见的题单
# 排序
sort = request.GET.get("sort")
@@ -83,12 +81,7 @@ class ProblemSetDetailAPI(APIView):
except ProblemSet.DoesNotExist:
return self.error("题单不存在")
# 检查权限
if not problem_set.is_public and not (
request.user.is_authenticated and request.user.is_admin_role()
):
return self.error("无权限访问该题单")
# 题单可见即可访问
serializer = ProblemSetSerializer(problem_set, context={"request": request})
return self.success(serializer.data)
@@ -139,11 +132,7 @@ class ProblemSetProblemAPI(APIView):
except ProblemSet.DoesNotExist:
return self.error("题单不存在")
# 检查权限
if not problem_set.is_public and not (
request.user.is_authenticated and request.user.is_admin_role()
):
return self.error("无权限访问该题单")
# 题单可见即可访问
problems = ProblemSetProblem.objects.filter(problemset=problem_set).order_by(
"order"
@@ -221,9 +210,7 @@ class ProblemSetProgressAPI(APIView):
except ProblemSet.DoesNotExist:
return self.error("题单不存在")
# 检查权限
if not problem_set.is_public and not request.user.is_admin_role():
return self.error("无权限加入该题单")
# 题单可见即可加入
# 检查是否已经加入
if ProblemSetProgress.objects.filter(