add message
This commit is contained in:
61
announcement/migrations/0006_message.py
Normal file
61
announcement/migrations/0006_message.py
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# Generated by Django 5.0.6 on 2024-06-25 11:47
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
import utils.models
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("announcement", "0005_alter_announcement_options_announcement_top"),
|
||||||
|
("submission", "0013_alter_submission_info_and_more"),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="Message",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"id",
|
||||||
|
models.AutoField(
|
||||||
|
auto_created=True,
|
||||||
|
primary_key=True,
|
||||||
|
serialize=False,
|
||||||
|
verbose_name="ID",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("message", utils.models.RichTextField()),
|
||||||
|
("create_time", models.DateTimeField(auto_now_add=True)),
|
||||||
|
(
|
||||||
|
"recipient",
|
||||||
|
models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
related_name="recipient",
|
||||||
|
to=settings.AUTH_USER_MODEL,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"sender",
|
||||||
|
models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
related_name="sender",
|
||||||
|
to=settings.AUTH_USER_MODEL,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"submission",
|
||||||
|
models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="submission.submission",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
"db_table": "message",
|
||||||
|
"ordering": ("-create_time",),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
from account.models import User
|
from account.models import User
|
||||||
|
from submission.models import Submission
|
||||||
from utils.models import RichTextField
|
from utils.models import RichTextField
|
||||||
|
|
||||||
|
|
||||||
@@ -18,3 +19,15 @@ class Announcement(models.Model):
|
|||||||
class Meta:
|
class Meta:
|
||||||
db_table = "announcement"
|
db_table = "announcement"
|
||||||
ordering = ("-top", "-create_time",)
|
ordering = ("-top", "-create_time",)
|
||||||
|
|
||||||
|
|
||||||
|
class Message(models.Model):
|
||||||
|
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name="sender")
|
||||||
|
recipient = models.ForeignKey(User, on_delete=models.CASCADE, related_name="recipient")
|
||||||
|
submission = models.ForeignKey(Submission, on_delete=models.CASCADE)
|
||||||
|
message = RichTextField()
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = "message"
|
||||||
|
ordering = ("-create_time",)
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
from submission.serializers import SubmissionCodeSerializer
|
||||||
from utils.api import serializers
|
from utils.api import serializers
|
||||||
from utils.api._serializers import UsernameSerializer
|
from utils.api._serializers import UsernameSerializer
|
||||||
|
|
||||||
from .models import Announcement
|
from .models import Announcement, Message
|
||||||
|
|
||||||
|
|
||||||
class CreateAnnouncementSerializer(serializers.Serializer):
|
class CreateAnnouncementSerializer(serializers.Serializer):
|
||||||
@@ -35,3 +36,29 @@ class EditAnnouncementSerializer(serializers.Serializer):
|
|||||||
content = serializers.CharField(max_length=1024 * 1024 * 8)
|
content = serializers.CharField(max_length=1024 * 1024 * 8)
|
||||||
visible = serializers.BooleanField()
|
visible = serializers.BooleanField()
|
||||||
top = serializers.BooleanField()
|
top = serializers.BooleanField()
|
||||||
|
|
||||||
|
|
||||||
|
class MessageSerializer(serializers.Serializer):
|
||||||
|
sender = UsernameSerializer()
|
||||||
|
recipient = UsernameSerializer()
|
||||||
|
submission = SubmissionCodeSerializer()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Message
|
||||||
|
fields = "__all__"
|
||||||
|
|
||||||
|
|
||||||
|
class MessageListSerializer(serializers.Serializer):
|
||||||
|
sender = UsernameSerializer()
|
||||||
|
recipient = UsernameSerializer()
|
||||||
|
submission = SubmissionCodeSerializer()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Message
|
||||||
|
exclude = ["message"]
|
||||||
|
|
||||||
|
|
||||||
|
class CreateMessageSerializer(serializers.Serializer):
|
||||||
|
recipient = serializers.IntegerField()
|
||||||
|
submission = serializers.CharField()
|
||||||
|
message = serializers.CharField()
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
from django.urls import re_path as url
|
from django.urls import re_path as url
|
||||||
|
|
||||||
from ..views.oj import AnnouncementAPI
|
from ..views.oj import AnnouncementAPI, MessageAPI
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r"^announcement/?$", AnnouncementAPI.as_view(), name="announcement_api"),
|
url(r"^announcement/?$", AnnouncementAPI.as_view(), name="announcement_api"),
|
||||||
|
url(r"^message/?$", MessageAPI.as_view(), name="message_api"),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
|
from account.decorators import super_admin_required, login_required
|
||||||
|
from account.models import User
|
||||||
|
from submission.models import Submission
|
||||||
from utils.api import APIView
|
from utils.api import APIView
|
||||||
|
|
||||||
from announcement.models import Announcement
|
from announcement.models import Announcement, Message
|
||||||
from announcement.serializers import AnnouncementSerializer, AnnouncementListSerializer
|
from announcement.serializers import (AnnouncementSerializer,
|
||||||
|
AnnouncementListSerializer,
|
||||||
|
CreateMessageSerializer, MessageListSerializer,
|
||||||
|
MessageSerializer)
|
||||||
|
from utils.api.api import validate_serializer
|
||||||
|
|
||||||
|
|
||||||
class AnnouncementAPI(APIView):
|
class AnnouncementAPI(APIView):
|
||||||
@@ -16,3 +23,36 @@ class AnnouncementAPI(APIView):
|
|||||||
|
|
||||||
announcements = Announcement.objects.filter(visible=True)
|
announcements = Announcement.objects.filter(visible=True)
|
||||||
return self.success(self.paginate_data(request, announcements, AnnouncementListSerializer))
|
return self.success(self.paginate_data(request, announcements, AnnouncementListSerializer))
|
||||||
|
|
||||||
|
|
||||||
|
class MessageAPI(APIView):
|
||||||
|
@login_required
|
||||||
|
def get(self, request):
|
||||||
|
message_id = request.GET.get("id")
|
||||||
|
if message_id:
|
||||||
|
try:
|
||||||
|
message = Message.objects.filter(id=message_id, recipient=request.user)
|
||||||
|
return self.success(MessageSerializer(message).data)
|
||||||
|
except Message.DoesNotExist:
|
||||||
|
return self.error("Message does not exist")
|
||||||
|
else:
|
||||||
|
messages = Message.objects.filter(recipient=request.user)
|
||||||
|
return self.success(self.paginate_data(request, messages, MessageListSerializer))
|
||||||
|
|
||||||
|
@validate_serializer(CreateMessageSerializer)
|
||||||
|
@super_admin_required
|
||||||
|
def post(self, request):
|
||||||
|
data = request.data
|
||||||
|
try:
|
||||||
|
recipient = User.objects.get(id=data["recipient"], is_disabled=False)
|
||||||
|
except User.DoesNotExist:
|
||||||
|
return self.error("User does not exist")
|
||||||
|
try:
|
||||||
|
submission = Submission.objects.get(id=data["submission"])
|
||||||
|
except Submission.DoesNotExist:
|
||||||
|
return self.error("Submission does not exist")
|
||||||
|
Message.objects.create(submission=submission,
|
||||||
|
message=data["message"],
|
||||||
|
sender=request.user,
|
||||||
|
recipient=recipient)
|
||||||
|
return self.success()
|
||||||
|
|||||||
@@ -31,6 +31,13 @@ class SubmissionSafeModelSerializer(serializers.ModelSerializer):
|
|||||||
model = Submission
|
model = Submission
|
||||||
exclude = ("info", "contest", "ip")
|
exclude = ("info", "contest", "ip")
|
||||||
|
|
||||||
|
class SubmissionCodeSerializer(serializers.Serializer):
|
||||||
|
problem = serializers.SlugRelatedField(read_only=True, slug_field="_id")
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Submission
|
||||||
|
field = ("id", "code", "problem", "result", "language")
|
||||||
|
|
||||||
|
|
||||||
class SubmissionListSerializer(serializers.ModelSerializer):
|
class SubmissionListSerializer(serializers.ModelSerializer):
|
||||||
problem = serializers.SlugRelatedField(read_only=True, slug_field="_id")
|
problem = serializers.SlugRelatedField(read_only=True, slug_field="_id")
|
||||||
|
|||||||
Reference in New Issue
Block a user