add message and comment

This commit is contained in:
2024-06-29 21:33:22 +08:00
parent 148761c8a2
commit 88a322b248
28 changed files with 431 additions and 144 deletions

0
comment/__init__.py Normal file
View File

View File

@@ -0,0 +1,40 @@
# Generated by Django 5.0.6 on 2024-06-29 13:32
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('problem', '0015_alter_problem_io_mode_alter_problem_languages_and_more'),
('submission', '0013_alter_submission_info_and_more'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Comment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('problem_solved', models.BooleanField()),
('language', models.CharField(blank=True, choices=[('Python', 'Python'), ('C', 'C'), ('C++', 'C++'), ('Java', 'Java')], max_length=10, null=True, verbose_name='解决这道题使用的语言')),
('description_rating', models.PositiveSmallIntegerField(default=5, verbose_name='题目描述的分数')),
('difficulty_rating', models.PositiveSmallIntegerField(default=5, verbose_name='题目难度的分数')),
('comprehensive_rating', models.PositiveSmallIntegerField(default=5, verbose_name='综合的分数')),
('content', models.TextField(blank=True, null=True)),
('visible', models.BooleanField(default=True)),
('create_time', models.DateTimeField(auto_now_add=True)),
('problem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='problem.problem')),
('submission', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='submission.submission')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'db_table': 'comment',
'ordering': ('create_time',),
},
),
]

View File

47
comment/models.py Normal file
View File

@@ -0,0 +1,47 @@
from django.db import models
from account.models import User
from problem.models import Problem
from submission.models import Submission
class Languages(models.TextChoices):
Python = "Python", "Python"
C = "C", "C"
Cpp = "C++", "C++"
Java = "Java", "Java"
class Comment(models.Model):
problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
submission = models.ForeignKey(Submission, null=True, blank=True, on_delete=models.SET_NULL)
problem_solved = models.BooleanField()
language = models.CharField(
max_length=10,
choices=Languages.choices,
null=True,
blank=True,
verbose_name="解决这道题使用的语言",
)
description_rating = models.PositiveSmallIntegerField(
default=5,
verbose_name="题目描述的分数",
)
difficulty_rating = models.PositiveSmallIntegerField(
default=5,
verbose_name="题目难度的分数",
)
comprehensive_rating = models.PositiveSmallIntegerField(
default=5,
verbose_name="综合的分数",
)
content = models.TextField(null=True, blank=True)
visible = models.BooleanField(default=True)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = "comment"
ordering = ("create_time",)

19
comment/serializers.py Normal file
View File

@@ -0,0 +1,19 @@
from comment.models import Comment
from utils.api import serializers
class CreateCommentSerializer(serializers.Serializer):
problem_id = serializers.IntegerField()
submission_id = serializers.CharField(max_length=32, allow_null=True)
problem_solved = serializers.BooleanField()
language = serializers.CharField(max_length=10, allow_null=True)
description_rating = serializers.IntegerField()
difficulty_rating = serializers.IntegerField()
comprehensive_rating = serializers.IntegerField()
content = serializers.CharField()
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = "__all__"

0
comment/urls/__init__.py Normal file
View File

8
comment/urls/oj.py Normal file
View File

@@ -0,0 +1,8 @@
from django.urls import re_path as url
from ..views.oj import CommentAPI
urlpatterns = [
url(r"^comment/?$", CommentAPI.as_view(), name="comment_api"),
]

View File

64
comment/views/oj.py Normal file
View File

@@ -0,0 +1,64 @@
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})