contest and contest_problems api.
add ordering for contest and submission models
This commit is contained in:
19
contest/migrations/0004_auto_20170717_1324.py
Normal file
19
contest/migrations/0004_auto_20170717_1324.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.6 on 2017-07-17 13:24
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('contest', '0003_auto_20170217_0820'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='contest',
|
||||
options={'ordering': ('create_time',)},
|
||||
),
|
||||
]
|
||||
@@ -12,9 +12,9 @@ class ContestType(object):
|
||||
|
||||
|
||||
class ContestStatus(object):
|
||||
CONTEST_NOT_START = "Not Started"
|
||||
CONTEST_ENDED = "Ended"
|
||||
CONTEST_UNDERWAY = "Underway"
|
||||
CONTEST_NOT_START = "1"
|
||||
CONTEST_ENDED = "-1"
|
||||
CONTEST_UNDERWAY = "0"
|
||||
|
||||
|
||||
class ContestRuleType(object):
|
||||
@@ -58,6 +58,7 @@ class Contest(models.Model):
|
||||
|
||||
class Meta:
|
||||
db_table = "contest"
|
||||
ordering = ("create_time",)
|
||||
|
||||
|
||||
class ContestRank(models.Model):
|
||||
|
||||
@@ -2,6 +2,8 @@ from utils.api import DateTimeTZField, UsernameSerializer, serializers
|
||||
|
||||
from .models import Contest, ContestAnnouncement, ContestRuleType
|
||||
|
||||
from problem.serializers import ContestProblemSerializer
|
||||
|
||||
|
||||
class CreateConetestSeriaizer(serializers.Serializer):
|
||||
title = serializers.CharField(max_length=128)
|
||||
@@ -14,6 +16,17 @@ class CreateConetestSeriaizer(serializers.Serializer):
|
||||
real_time_rank = serializers.BooleanField()
|
||||
|
||||
|
||||
class EditConetestSeriaizer(serializers.Serializer):
|
||||
id = serializers.IntegerField()
|
||||
title = serializers.CharField(max_length=128)
|
||||
description = serializers.CharField()
|
||||
start_time = serializers.DateTimeField()
|
||||
end_time = serializers.DateTimeField()
|
||||
password = serializers.CharField(allow_blank=True, allow_null=True, max_length=32)
|
||||
visible = serializers.BooleanField()
|
||||
real_time_rank = serializers.BooleanField()
|
||||
|
||||
|
||||
class ContestSerializer(serializers.ModelSerializer):
|
||||
start_time = DateTimeTZField()
|
||||
end_time = DateTimeTZField()
|
||||
@@ -27,16 +40,6 @@ class ContestSerializer(serializers.ModelSerializer):
|
||||
model = Contest
|
||||
exclude = ('password', 'visible')
|
||||
|
||||
class EditConetestSeriaizer(serializers.Serializer):
|
||||
id = serializers.IntegerField()
|
||||
title = serializers.CharField(max_length=128)
|
||||
description = serializers.CharField()
|
||||
start_time = serializers.DateTimeField()
|
||||
end_time = serializers.DateTimeField()
|
||||
password = serializers.CharField(allow_blank=True, allow_null=True, max_length=32)
|
||||
visible = serializers.BooleanField()
|
||||
real_time_rank = serializers.BooleanField()
|
||||
|
||||
|
||||
class ContestAnnouncementSerializer(serializers.ModelSerializer):
|
||||
created_by = UsernameSerializer()
|
||||
@@ -50,3 +53,8 @@ class CreateContestAnnouncementSerializer(serializers.Serializer):
|
||||
title = serializers.CharField(max_length=128)
|
||||
content = serializers.CharField()
|
||||
contest_id = serializers.IntegerField()
|
||||
|
||||
|
||||
class ContestPasswordVerifySerializer(serializers.Serializer):
|
||||
contest_id = serializers.IntegerField()
|
||||
password = serializers.CharField(max_length=30, required=True)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from django.conf.urls import url
|
||||
|
||||
from ..views.oj import ContestAnnouncementListAPI, ContestListAPI
|
||||
from ..views.oj import ContestAnnouncementListAPI, ContestAPI
|
||||
|
||||
urlpatterns = [
|
||||
url(r"^contest/?$", ContestListAPI.as_view(), name="contest_api"),
|
||||
url(r"^contest/?$", ContestAPI.as_view(), name="contest_api"),
|
||||
url(r"^contest/announcement/?$", ContestAnnouncementListAPI.as_view(), name="contest_announcement_api"),
|
||||
|
||||
]
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
from utils.api import APIView
|
||||
from utils.api import APIView, validate_serializer
|
||||
from account.decorators import login_required
|
||||
|
||||
from ..models import ContestAnnouncement, Contest
|
||||
from ..serializers import ContestAnnouncementSerializer
|
||||
from ..serializers import ContestSerializer
|
||||
from ..serializers import ContestSerializer, ContestPasswordVerifySerializer
|
||||
|
||||
|
||||
class ContestAnnouncementListAPI(APIView):
|
||||
@@ -17,18 +18,39 @@ class ContestAnnouncementListAPI(APIView):
|
||||
return self.success(ContestAnnouncementSerializer(data, many=True).data)
|
||||
|
||||
|
||||
class ContestListAPI(APIView):
|
||||
class ContestAPI(APIView):
|
||||
def get(self, request):
|
||||
contest_id = request.GET.get("id")
|
||||
contest_id = request.GET.get("contest_id")
|
||||
if contest_id:
|
||||
try:
|
||||
contest = Contest.objects.get(id=contest_id, visible=True)
|
||||
return self.success(ContestSerializer(contest).data)
|
||||
except Contest.DoesNotExist:
|
||||
return self.error("Contest Doesn't exist.")
|
||||
return self.error("Contest doesn't exist.")
|
||||
|
||||
contests = Contest.objects.filter(visible=True)
|
||||
keyword = request.GET.get("keyword")
|
||||
if keyword:
|
||||
contests = contests.filter(title__contains=keyword)
|
||||
return self.success(self.paginate_data(request, contests, ContestSerializer))
|
||||
|
||||
|
||||
class ContestPasswordVerifyAPI(APIView):
|
||||
@validate_serializer(ContestPasswordVerifySerializer)
|
||||
@login_required
|
||||
def get(self, request):
|
||||
data = request.data
|
||||
try:
|
||||
contest = Contest.objects.get(id=data["contest_id"], visible=True, password__isnull=False)
|
||||
except Contest.DoesNotExist:
|
||||
return self.error("Contest %s doesn't exist." % data["contest_id"])
|
||||
if contest.password != data["password"]:
|
||||
return self.error("Password doesn't match.")
|
||||
|
||||
# password verify OK.
|
||||
if "contests" not in request.session:
|
||||
request.session["contests"] = []
|
||||
request.session["contests"].append(int(data["contest_id"]))
|
||||
# https://docs.djangoproject.com/en/dev/topics/http/sessions/#when-sessions-are-saved
|
||||
request.session.modified = True
|
||||
return self.success(True)
|
||||
|
||||
Reference in New Issue
Block a user