mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 08:23:20 +00:00
add contest announcement
This commit is contained in:
parent
5ced3d9ca0
commit
02940029ef
24
contest/migrations/0002_contestannouncement_created_by.py
Normal file
24
contest/migrations/0002_contestannouncement_created_by.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.12 on 2017-01-29 08:56
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('contest', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='contestannouncement',
|
||||||
|
name='created_by',
|
||||||
|
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
@ -107,6 +107,7 @@ class ContestAnnouncement(models.Model):
|
|||||||
contest = models.ForeignKey(Contest)
|
contest = models.ForeignKey(Contest)
|
||||||
title = models.CharField(max_length=128)
|
title = models.CharField(max_length=128)
|
||||||
content = RichTextField()
|
content = RichTextField()
|
||||||
|
created_by = models.ForeignKey(User)
|
||||||
create_time = models.DateTimeField(auto_now_add=True)
|
create_time = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from utils.api import DateTimeTZField, UsernameSerializer, serializers
|
from utils.api import DateTimeTZField, UsernameSerializer, serializers
|
||||||
|
|
||||||
from .models import Contest, ContestRuleType
|
from .models import Contest, ContestAnnouncement, ContestRuleType
|
||||||
|
|
||||||
|
|
||||||
class CreateConetestSeriaizer(serializers.Serializer):
|
class CreateConetestSeriaizer(serializers.Serializer):
|
||||||
@ -33,6 +33,20 @@ class EditConetestSeriaizer(serializers.Serializer):
|
|||||||
description = serializers.CharField()
|
description = serializers.CharField()
|
||||||
start_time = serializers.DateTimeField()
|
start_time = serializers.DateTimeField()
|
||||||
end_time = serializers.DateTimeField()
|
end_time = serializers.DateTimeField()
|
||||||
password = serializers.CharField(allow_blank=True, max_length=32)
|
password = serializers.CharField(allow_blank=True, allow_null=True, max_length=32)
|
||||||
visible = serializers.BooleanField()
|
visible = serializers.BooleanField()
|
||||||
real_time_rank = serializers.BooleanField()
|
real_time_rank = serializers.BooleanField()
|
||||||
|
|
||||||
|
|
||||||
|
class ContestAnnouncementSerializer(serializers.ModelSerializer):
|
||||||
|
created_by = UsernameSerializer()
|
||||||
|
create_time = DateTimeTZField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = ContestAnnouncement
|
||||||
|
|
||||||
|
|
||||||
|
class CreateContestAnnouncementSerializer(serializers.Serializer):
|
||||||
|
title = serializers.CharField(max_length=128)
|
||||||
|
content = serializers.CharField()
|
||||||
|
contest_id = serializers.IntegerField()
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
|
|
||||||
from ..views.admin import ContestAPI
|
from ..views.admin import ContestAnnouncementAPI, ContestAPI
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r"^contest", ContestAPI.as_view(), name="contest_api"),
|
url(r"^contest$", ContestAPI.as_view(), name="contest_api"),
|
||||||
|
url(r"^contest/announcement$", ContestAnnouncementAPI.as_view(), name="contest_announcement_admin_api")
|
||||||
]
|
]
|
||||||
|
7
contest/urls/oj.py
Normal file
7
contest/urls/oj.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from django.conf.urls import url
|
||||||
|
|
||||||
|
from ..views.oj import ContestAnnouncementListAPI
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
url(r"^contest", ContestAnnouncementListAPI.as_view(), name="contest_list_api"),
|
||||||
|
]
|
@ -2,8 +2,11 @@ import dateutil.parser
|
|||||||
|
|
||||||
from utils.api import APIView, validate_serializer
|
from utils.api import APIView, validate_serializer
|
||||||
|
|
||||||
from ..models import Contest
|
from ..models import Contest, ContestAnnouncement
|
||||||
from ..serializers import ContestSerializer, CreateConetestSeriaizer, EditConetestSeriaizer
|
from ..serializers import (ContestAnnouncementSerializer, ContestSerializer,
|
||||||
|
CreateConetestSeriaizer,
|
||||||
|
CreateContestAnnouncementSerializer,
|
||||||
|
EditConetestSeriaizer)
|
||||||
|
|
||||||
|
|
||||||
class ContestAPI(APIView):
|
class ContestAPI(APIView):
|
||||||
@ -60,3 +63,28 @@ class ContestAPI(APIView):
|
|||||||
if request.user.is_admin_role():
|
if request.user.is_admin_role():
|
||||||
contests = contests.filter(created_by=request.user)
|
contests = contests.filter(created_by=request.user)
|
||||||
return self.success(self.paginate_data(request, contests, ContestSerializer))
|
return self.success(self.paginate_data(request, contests, ContestSerializer))
|
||||||
|
|
||||||
|
|
||||||
|
class ContestAnnouncementAPI(APIView):
|
||||||
|
@validate_serializer(CreateContestAnnouncementSerializer)
|
||||||
|
def post(self, request):
|
||||||
|
data = request.data
|
||||||
|
try:
|
||||||
|
contest = Contest.objects.get(id=data.pop("contest_id"))
|
||||||
|
if request.user.is_admin_role():
|
||||||
|
contest = contest.get(created_by=request.user)
|
||||||
|
data["contest"] = contest
|
||||||
|
data["created_by"] = request.user
|
||||||
|
except Contest.DoesNotExist:
|
||||||
|
return self.error("Contest does not exist")
|
||||||
|
announcement = ContestAnnouncement.objects.create(**data)
|
||||||
|
return self.success(ContestAnnouncementSerializer(announcement).data)
|
||||||
|
|
||||||
|
def delete(self, request):
|
||||||
|
announcement_id = request.GET.get("id")
|
||||||
|
if announcement_id:
|
||||||
|
if request.user.is_admin_role():
|
||||||
|
ContestAnnouncement.objects.filter(id=announcement_id, contest__created_by=request.user).delete()
|
||||||
|
else:
|
||||||
|
ContestAnnouncement.objects.filter(id=announcement_id).delete()
|
||||||
|
return self.success()
|
||||||
|
16
contest/views/oj.py
Normal file
16
contest/views/oj.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
from utils.api import APIView
|
||||||
|
|
||||||
|
from ..models import ContestAnnouncement
|
||||||
|
from ..serializers import ContestAnnouncementSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class ContestAnnouncementListAPI(APIView):
|
||||||
|
def get(self, request):
|
||||||
|
contest_id = request.GET.get("contest_id")
|
||||||
|
if not contest_id:
|
||||||
|
return self.error("Invalid parameter")
|
||||||
|
data = ContestAnnouncement.objects.filter(contest_id=contest_id).order_by("-create_time")
|
||||||
|
max_id = request.GET.get("max_id")
|
||||||
|
if max_id:
|
||||||
|
data = data.filter(id__gt=max_id)
|
||||||
|
return self.success(ContestAnnouncementSerializer(data, many=True).data)
|
@ -9,4 +9,5 @@ urlpatterns = [
|
|||||||
url(r"^api/", include("problem.urls.oj")),
|
url(r"^api/", include("problem.urls.oj")),
|
||||||
url(r"^api/admin/", include("problem.urls.admin")),
|
url(r"^api/admin/", include("problem.urls.admin")),
|
||||||
url(r"^api/admin/", include("contest.urls.admin")),
|
url(r"^api/admin/", include("contest.urls.admin")),
|
||||||
|
url(r"^api/", include("contest.urls.oj"))
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user