add contest announcement

This commit is contained in:
virusdefender 2017-01-29 17:04:56 +08:00
parent 5ced3d9ca0
commit 02940029ef
8 changed files with 98 additions and 6 deletions

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

View File

@ -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:

View File

@ -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()

View File

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

View File

@ -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
View 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)

View File

@ -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"))
] ]