214 lines
6.7 KiB
Python
214 lines
6.7 KiB
Python
from utils.api import UsernameSerializer, serializers
|
|
from .models import (
|
|
ProblemSet,
|
|
ProblemSetProblem,
|
|
ProblemSetBadge,
|
|
ProblemSetProgress,
|
|
UserBadge,
|
|
)
|
|
|
|
|
|
class ProblemSetSerializer(serializers.ModelSerializer):
|
|
"""题单序列化器"""
|
|
|
|
created_by = UsernameSerializer()
|
|
problems_count = serializers.SerializerMethodField()
|
|
completed_count = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ProblemSet
|
|
fields = "__all__"
|
|
|
|
def get_problems_count(self, obj):
|
|
"""获取题单中的题目数量"""
|
|
return ProblemSetProblem.objects.filter(problemset=obj).count()
|
|
|
|
def get_completed_count(self, obj):
|
|
"""获取当前用户在该题单中完成的题目数量"""
|
|
request = self.context.get("request")
|
|
if request and request.user.is_authenticated:
|
|
try:
|
|
progress = ProblemSetProgress.objects.get(
|
|
problemset=obj, user=request.user
|
|
)
|
|
return progress.completed_problems_count
|
|
except ProblemSetProgress.DoesNotExist:
|
|
return 0
|
|
return 0
|
|
|
|
|
|
class ProblemSetListSerializer(serializers.ModelSerializer):
|
|
"""题单列表序列化器"""
|
|
|
|
created_by = UsernameSerializer()
|
|
problems_count = serializers.SerializerMethodField()
|
|
user_progress = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ProblemSet
|
|
fields = [
|
|
"id",
|
|
"title",
|
|
"description",
|
|
"created_by",
|
|
"create_time",
|
|
"difficulty",
|
|
"status",
|
|
"problems_count",
|
|
"user_progress",
|
|
"visible",
|
|
]
|
|
|
|
def get_problems_count(self, obj):
|
|
"""获取题单中的题目数量"""
|
|
return ProblemSetProblem.objects.filter(problemset=obj).count()
|
|
|
|
def get_user_progress(self, obj):
|
|
"""获取当前用户在该题单中的进度"""
|
|
request = self.context.get("request")
|
|
if request and request.user.is_authenticated:
|
|
try:
|
|
progress = ProblemSetProgress.objects.get(
|
|
problemset=obj, user=request.user
|
|
)
|
|
return {
|
|
"is_joined": True,
|
|
"progress_percentage": progress.progress_percentage,
|
|
"completed_count": progress.completed_problems_count,
|
|
"total_count": progress.total_problems_count,
|
|
"is_completed": progress.is_completed,
|
|
}
|
|
except ProblemSetProgress.DoesNotExist:
|
|
return {
|
|
"is_joined": False,
|
|
"progress_percentage": 0,
|
|
"completed_count": 0,
|
|
"total_count": 0,
|
|
"is_completed": False,
|
|
}
|
|
return {
|
|
"is_joined": False,
|
|
"progress_percentage": 0,
|
|
"completed_count": 0,
|
|
"total_count": 0,
|
|
"is_completed": False,
|
|
}
|
|
|
|
|
|
class CreateProblemSetSerializer(serializers.Serializer):
|
|
"""创建题单序列化器"""
|
|
|
|
title = serializers.CharField(max_length=200)
|
|
description = serializers.CharField()
|
|
difficulty = serializers.CharField(default="Easy")
|
|
status = serializers.CharField(default="active")
|
|
|
|
|
|
class EditProblemSetSerializer(serializers.Serializer):
|
|
"""编辑题单序列化器"""
|
|
|
|
id = serializers.IntegerField()
|
|
title = serializers.CharField(max_length=200, required=False)
|
|
description = serializers.CharField(required=False)
|
|
difficulty = serializers.CharField(required=False)
|
|
status = serializers.CharField(required=False)
|
|
visible = serializers.BooleanField(required=False)
|
|
|
|
|
|
class ProblemSetProblemSerializer(serializers.ModelSerializer):
|
|
"""题单题目序列化器"""
|
|
|
|
problem = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ProblemSetProblem
|
|
fields = "__all__"
|
|
|
|
def get_problem(self, obj):
|
|
"""获取题目详细信息"""
|
|
from problem.serializers import ProblemSerializer
|
|
|
|
return ProblemSerializer(obj.problem, context=self.context).data
|
|
|
|
|
|
class AddProblemToSetSerializer(serializers.Serializer):
|
|
"""添加题目到题单序列化器"""
|
|
|
|
problem_id = serializers.CharField()
|
|
order = serializers.IntegerField(default=0)
|
|
is_required = serializers.BooleanField(default=True)
|
|
score = serializers.IntegerField(default=0)
|
|
hint = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
|
class EditProblemInSetSerializer(serializers.Serializer):
|
|
"""编辑题单中的题目序列化器"""
|
|
|
|
order = serializers.IntegerField(required=False)
|
|
is_required = serializers.BooleanField(required=False)
|
|
score = serializers.IntegerField(required=False)
|
|
hint = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
|
class ProblemSetBadgeSerializer(serializers.ModelSerializer):
|
|
"""题单奖章序列化器"""
|
|
|
|
class Meta:
|
|
model = ProblemSetBadge
|
|
fields = "__all__"
|
|
|
|
|
|
class CreateProblemSetBadgeSerializer(serializers.Serializer):
|
|
"""创建题单奖章序列化器"""
|
|
name = serializers.CharField(max_length=100)
|
|
description = serializers.CharField()
|
|
icon = serializers.CharField()
|
|
condition_type = serializers.CharField() # all_problems, problem_count, score
|
|
condition_value = serializers.IntegerField()
|
|
|
|
|
|
class EditProblemSetBadgeSerializer(serializers.Serializer):
|
|
"""编辑题单奖章序列化器"""
|
|
name = serializers.CharField(max_length=100, required=False)
|
|
description = serializers.CharField(required=False)
|
|
icon = serializers.CharField(required=False)
|
|
condition_type = serializers.CharField(required=False) # all_problems, problem_count, score
|
|
condition_value = serializers.IntegerField(required=False)
|
|
|
|
|
|
class ProblemSetProgressSerializer(serializers.ModelSerializer):
|
|
"""题单进度序列化器"""
|
|
|
|
problemset = ProblemSetListSerializer()
|
|
user = UsernameSerializer()
|
|
|
|
class Meta:
|
|
model = ProblemSetProgress
|
|
fields = "__all__"
|
|
|
|
|
|
class UserBadgeSerializer(serializers.ModelSerializer):
|
|
"""用户奖章序列化器"""
|
|
|
|
badge = ProblemSetBadgeSerializer()
|
|
|
|
class Meta:
|
|
model = UserBadge
|
|
fields = "__all__"
|
|
|
|
|
|
class JoinProblemSetSerializer(serializers.Serializer):
|
|
"""加入题单序列化器"""
|
|
|
|
problemset_id = serializers.IntegerField()
|
|
|
|
|
|
class UpdateProgressSerializer(serializers.Serializer):
|
|
"""更新进度序列化器"""
|
|
|
|
problemset_id = serializers.IntegerField()
|
|
problem_id = serializers.IntegerField()
|
|
status = serializers.CharField() # completed, attempted, not_started
|
|
score = serializers.IntegerField(default=0)
|
|
submit_time = serializers.DateTimeField(required=False)
|