add message and comment
This commit is contained in:
0
comment/__init__.py
Normal file
0
comment/__init__.py
Normal file
40
comment/migrations/0001_initial.py
Normal file
40
comment/migrations/0001_initial.py
Normal 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',),
|
||||
},
|
||||
),
|
||||
]
|
||||
0
comment/migrations/__init__.py
Normal file
0
comment/migrations/__init__.py
Normal file
47
comment/models.py
Normal file
47
comment/models.py
Normal 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
19
comment/serializers.py
Normal 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
0
comment/urls/__init__.py
Normal file
8
comment/urls/oj.py
Normal file
8
comment/urls/oj.py
Normal 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"),
|
||||
]
|
||||
0
comment/views/__init__.py
Normal file
0
comment/views/__init__.py
Normal file
64
comment/views/oj.py
Normal file
64
comment/views/oj.py
Normal 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})
|
||||
Reference in New Issue
Block a user