add message

This commit is contained in:
2024-06-25 11:48:12 +00:00
parent 66d40e7c9f
commit f9cccdab34
6 changed files with 153 additions and 4 deletions

View 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",),
},
),
]

View File

@@ -1,6 +1,7 @@
from django.db import models
from account.models import User
from submission.models import Submission
from utils.models import RichTextField
@@ -18,3 +19,15 @@ class Announcement(models.Model):
class Meta:
db_table = "announcement"
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",)

View File

@@ -1,7 +1,8 @@
from submission.serializers import SubmissionCodeSerializer
from utils.api import serializers
from utils.api._serializers import UsernameSerializer
from .models import Announcement
from .models import Announcement, Message
class CreateAnnouncementSerializer(serializers.Serializer):
@@ -35,3 +36,29 @@ class EditAnnouncementSerializer(serializers.Serializer):
content = serializers.CharField(max_length=1024 * 1024 * 8)
visible = 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()

View File

@@ -1,7 +1,8 @@
from django.urls import re_path as url
from ..views.oj import AnnouncementAPI
from ..views.oj import AnnouncementAPI, MessageAPI
urlpatterns = [
url(r"^announcement/?$", AnnouncementAPI.as_view(), name="announcement_api"),
url(r"^message/?$", MessageAPI.as_view(), name="message_api"),
]

View File

@@ -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 announcement.models import Announcement
from announcement.serializers import AnnouncementSerializer, AnnouncementListSerializer
from announcement.models import Announcement, Message
from announcement.serializers import (AnnouncementSerializer,
AnnouncementListSerializer,
CreateMessageSerializer, MessageListSerializer,
MessageSerializer)
from utils.api.api import validate_serializer
class AnnouncementAPI(APIView):
@@ -16,3 +23,36 @@ class AnnouncementAPI(APIView):
announcements = Announcement.objects.filter(visible=True)
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()