mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 08:23:20 +00:00
ee49d0a815
添加problem、contest单元测试。
120 lines
5.2 KiB
Python
120 lines
5.2 KiB
Python
import dateutil.parser
|
|
|
|
from utils.api import APIView, validate_serializer
|
|
|
|
from ..models import Contest, ContestAnnouncement
|
|
from ..serializers import (ContestAnnouncementSerializer, ContestAdminSerializer,
|
|
CreateConetestSeriaizer,
|
|
CreateContestAnnouncementSerializer,
|
|
EditConetestSeriaizer)
|
|
|
|
|
|
class ContestAPI(APIView):
|
|
@validate_serializer(CreateConetestSeriaizer)
|
|
def post(self, request):
|
|
data = request.data
|
|
data["start_time"] = dateutil.parser.parse(data["start_time"])
|
|
data["end_time"] = dateutil.parser.parse(data["end_time"])
|
|
data["created_by"] = request.user
|
|
if data["end_time"] <= data["start_time"]:
|
|
return self.error("Start time must occur earlier than end time")
|
|
if not data["password"]:
|
|
data["password"] = None
|
|
contest = Contest.objects.create(**data)
|
|
return self.success(ContestAdminSerializer(contest).data)
|
|
|
|
@validate_serializer(EditConetestSeriaizer)
|
|
def put(self, request):
|
|
data = request.data
|
|
try:
|
|
contest = Contest.objects.get(id=data.pop("id"))
|
|
if request.user.is_admin() and contest.created_by != request.user:
|
|
return self.error("Contest does not exist")
|
|
except Contest.DoesNotExist:
|
|
return self.error("Contest does not exist")
|
|
data["start_time"] = dateutil.parser.parse(data["start_time"])
|
|
data["end_time"] = dateutil.parser.parse(data["end_time"])
|
|
if data["end_time"] <= data["start_time"]:
|
|
return self.error("Start time must occur earlier than end time")
|
|
if not data["password"]:
|
|
data["password"] = None
|
|
for k, v in data.items():
|
|
setattr(contest, k, v)
|
|
contest.save()
|
|
return self.success(ContestAdminSerializer(contest).data)
|
|
|
|
def get(self, request):
|
|
contest_id = request.GET.get("id")
|
|
if contest_id:
|
|
try:
|
|
contest = Contest.objects.get(id=contest_id)
|
|
if request.user.is_admin() and contest.created_by != request.user:
|
|
return self.error("Contest does not exist")
|
|
return self.success(ContestAdminSerializer(contest).data)
|
|
except Contest.DoesNotExist:
|
|
return self.error("Contest does not exist")
|
|
|
|
contests = Contest.objects.all().order_by("-create_time")
|
|
|
|
keyword = request.GET.get("keyword")
|
|
if keyword:
|
|
contests = contests.filter(title__contains=keyword)
|
|
|
|
if request.user.is_admin():
|
|
contests = contests.filter(created_by=request.user)
|
|
return self.success(self.paginate_data(request, contests, ContestAdminSerializer))
|
|
|
|
|
|
class ContestAnnouncementAPI(APIView):
|
|
@validate_serializer(CreateContestAnnouncementSerializer)
|
|
def post(self, request):
|
|
"""
|
|
Create one contest_announcement.
|
|
"""
|
|
data = request.data
|
|
try:
|
|
contest = Contest.objects.get(id=data.pop("contest_id"))
|
|
if request.user.is_admin() and contest.created_by != request.user:
|
|
return self.error("Contest does not exist")
|
|
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):
|
|
"""
|
|
Delete one contest_announcement.
|
|
"""
|
|
contest_announcement_id = request.GET.get("id")
|
|
if contest_announcement_id:
|
|
if request.user.is_admin():
|
|
ContestAnnouncement.objects.filter(id=contest_announcement_id,
|
|
contest__created_by=request.user).delete()
|
|
else:
|
|
ContestAnnouncement.objects.filter(id=contest_announcement_id).delete()
|
|
return self.success()
|
|
|
|
def get(self, request):
|
|
"""
|
|
Get one contest_announcement or contest_announcement list.
|
|
"""
|
|
contest_announcement_id = request.GET.get("id")
|
|
if contest_announcement_id:
|
|
try:
|
|
contest_announcement = ContestAnnouncement.objects.get(id=contest_announcement_id)
|
|
if request.user.is_admin() and contest_announcement.created_by != request.user:
|
|
return self.error("Contest announcement does not exist")
|
|
return self.success(ContestAnnouncementSerializer(contest_announcement).data)
|
|
except ContestAnnouncement.DoesNotExist:
|
|
return self.error("Contest announcement does not exist")
|
|
|
|
contest_announcements = ContestAnnouncement.objects.all().order_by("-create_time")
|
|
if request.user.is_admin():
|
|
contest_announcements = contest_announcements.filter(created_by=request.user)
|
|
keyword = request.GET.get("keyword")
|
|
if keyword:
|
|
contest_announcements = contest_announcements.filter(title__contains=keyword)
|
|
return self.success(self.paginate_data(request, contest_announcements, ContestAnnouncementSerializer))
|