Files
OnlineJudge/comment/views/oj.py
2024-06-30 07:59:41 +08:00

65 lines
2.3 KiB
Python

from django.db.models import Avg
from comment.models import Comment
from problem.models import Problem
from utils.api import APIView
from account.decorators import login_required
from utils.api.api import validate_serializer
from comment.serializers import CreateCommentSerializer
from submission.models import Submission, JudgeStatus
class CommentAPI(APIView):
@validate_serializer(CreateCommentSerializer)
@login_required
def post(self, request):
data = request.data
try:
problem = Problem.objects.get(id=data.problem_id, visible=True)
except Problem.DoesNotExist:
self.error("problem is not exists")
submission = None
if data.problem_solved and data.submission_id:
try:
data.submission_id
submission = Submission.objects.select_related("problem").get(
id=data.submission_id,
problem_id=data.problem_id,
result=JudgeStatus.ACCEPTED,
)
except Submission.DoesNotExist:
self.error("submission is not exists or not accepted")
if not data.problem_solved:
data.language = None
Comment.objects.create(
user=request.user,
problem=problem,
submission=submission,
problem_solved=data.problem_solved,
language=data.language,
description_rating=data.description_rating,
difficulty_rating=data.difficulty_rating,
comprehensive_rating=data.comprehensive_rating,
content=data.content,
)
return self.success()
def get(self, request):
problem_id = request.GET.get("problem_id")
comments = Comment.objects.select_related("problem").filter(
problem_id=problem_id, visible=True
)
if comments.count() == 0:
return self.success()
rating = comments.aggregate(
description=Avg("description_rating"),
difficulty=Avg("difficulty_rating"),
comprehensive=Avg("comprehensive_rating"),
)
contents = comments.filter(content__isnull=False).values_list(
"content", flat=True
)
return self.success({rating: rating, contents: contents})