add problemset
This commit is contained in:
200
problemset/serializers.py
Normal file
200
problemset/serializers.py
Normal file
@@ -0,0 +1,200 @@
|
||||
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",
|
||||
]
|
||||
|
||||
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")
|
||||
is_public = serializers.BooleanField(default=True)
|
||||
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)
|
||||
is_public = serializers.BooleanField(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):
|
||||
"""添加题目到题单序列化器"""
|
||||
|
||||
problemset_id = serializers.IntegerField()
|
||||
problem_id = serializers.IntegerField()
|
||||
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 ProblemSetBadgeSerializer(serializers.ModelSerializer):
|
||||
"""题单奖章序列化器"""
|
||||
|
||||
class Meta:
|
||||
model = ProblemSetBadge
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class CreateProblemSetBadgeSerializer(serializers.Serializer):
|
||||
"""创建题单奖章序列化器"""
|
||||
|
||||
problemset_id = serializers.IntegerField()
|
||||
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()
|
||||
level = serializers.IntegerField(default=1)
|
||||
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user