后端修改比赛创建部分,同时在models中增加了几个字段

This commit is contained in:
hohoTT
2015-08-18 20:12:27 +08:00
parent 15febd5cc7
commit bdf3fa9ed9
3 changed files with 57 additions and 5 deletions

View File

@@ -3,18 +3,25 @@ from django.db import models
from account.models import User from account.models import User
from problem.models import AbstractProblem from problem.models import AbstractProblem
from group.models import Group
class Contest(models.Model): class Contest(models.Model):
title = models.CharField(max_length=40) title = models.CharField(max_length=40)
description = models.TextField() description = models.TextField()
# 比赛模式 现在有 acm 模式,按照 ac 题目数量得分模式 # 比赛模式0 即为是acm模式1 即为是按照总的 ac 题目数量排名模式2 即为按照 ac 的题目的总分排名模式
# 按照 ac 的题目的总分得分模式和按照通过的测试用例总分得分模式等
mode = models.IntegerField() mode = models.IntegerField()
# 是否显示排名结果 # 是否显示排名结果
show_rank = models.BooleanField() show_rank = models.BooleanField()
# 如果这一项不为空,那这就不是公开赛,需要密码才能进入 # 是否显示别人的提交记录
show_user_submission = models.BooleanField()
# 只能超级管理员创建公开赛,管理员只能创建小组内部的比赛
# 如果这一项不为空,即为有密码的公开赛,没有密码的可以为小组赛或者是公开赛(此时用比赛的类型来表示)
password = models.CharField(max_length=30, blank=True, null=True) password = models.CharField(max_length=30, blank=True, null=True)
# 比赛的类型: 0 即为是小组赛1 即为是无密码的公开赛2 即为是有密码的公开赛
contest_type = models.IntegerField()
# 开始时间 # 开始时间
start_time = models.DateTimeField() start_time = models.DateTimeField()
# 结束时间 # 结束时间
@@ -23,7 +30,10 @@ class Contest(models.Model):
create_time = models.DateTimeField(auto_now_add=True) create_time = models.DateTimeField(auto_now_add=True)
# 最后修改时间 # 最后修改时间
last_updated_time = models.DateTimeField(auto_now=True) last_updated_time = models.DateTimeField(auto_now=True)
# 这个比赛是谁创建的
created_by = models.ForeignKey(User) created_by = models.ForeignKey(User)
groups = models.ManyToManyField(Group)
class Meta: class Meta:
db_table = "contest" db_table = "contest"

View File

@@ -10,10 +10,13 @@ class CreateContestSerializer(serializers.Serializer):
title = serializers.CharField(max_length=40) title = serializers.CharField(max_length=40)
description = serializers.CharField(max_length=5000) description = serializers.CharField(max_length=5000)
mode = serializers.IntegerField() mode = serializers.IntegerField()
contest_type = serializers.IntegerField()
show_rank = serializers.BooleanField() show_rank = serializers.BooleanField()
show_user_submission = serializers.BooleanField()
password = serializers.CharField(max_length=30, required=False) password = serializers.CharField(max_length=30, required=False)
start_time = serializers.DateTimeField() start_time = serializers.DateTimeField()
end_time = serializers.DateTimeField() end_time = serializers.DateTimeField()
groups = serializers.ListField(child=serializers.IntegerField())
class ContestSerializer(serializers.ModelSerializer): class ContestSerializer(serializers.ModelSerializer):
@@ -32,10 +35,13 @@ class EditContestSerializer(serializers.Serializer):
title = serializers.CharField(max_length=40) title = serializers.CharField(max_length=40)
description = serializers.CharField(max_length=10000) description = serializers.CharField(max_length=10000)
mode = serializers.IntegerField() mode = serializers.IntegerField()
contest_type = serializers.IntegerField()
show_rank = serializers.BooleanField() show_rank = serializers.BooleanField()
show_user_submission = serializers.BooleanField()
password = serializers.CharField(max_length=30, required=False) password = serializers.CharField(max_length=30, required=False)
start_time = serializers.DateTimeField() start_time = serializers.DateTimeField()
end_time = serializers.DateTimeField() end_time = serializers.DateTimeField()
groups = serializers.ListField(child=serializers.IntegerField())
class ContestProblemSampleSerializer(serializers.ListField): class ContestProblemSampleSerializer(serializers.ListField):

View File

@@ -4,12 +4,16 @@ from django.shortcuts import render
from django.db import IntegrityError from django.db import IntegrityError
from django.db.models import Q from django.db.models import Q
from rest_framework.views import APIView from rest_framework.views import APIView
from utils.shortcuts import (serializer_invalid_response, error_response,
success_response, paginate, rand_str, error_page)
from account.models import REGULAR_USER, ADMIN, SUPER_ADMIN
from group.models import Group
from .models import Contest, ContestProblem from .models import Contest, ContestProblem
from .serializers import (CreateContestSerializer, ContestSerializer, EditContestSerializer, from .serializers import (CreateContestSerializer, ContestSerializer, EditContestSerializer,
CreateContestProblemSerializer, ContestProblemSerializer, EditContestProblemSerializer) CreateContestProblemSerializer, ContestProblemSerializer, EditContestProblemSerializer)
from utils.shortcuts import (serializer_invalid_response, error_response,
success_response, paginate, rand_str, error_page)
def contest_page(request, contest_id): def contest_page(request, contest_id):
@@ -27,15 +31,47 @@ class ContestAdminAPIView(APIView):
serializer = CreateContestSerializer(data=request.data) serializer = CreateContestSerializer(data=request.data)
if serializer.is_valid(): if serializer.is_valid():
data = serializer.data data = serializer.data
groups = []
# 首先判断比赛的类型: 0 即为是小组赛1 即为是无密码的公开赛2 即为是有密码的公开赛
# 密码字段不为空的情况,此时为有密码的公开赛,
# 此时为有密码的公开赛,并且此时只能超级管理员才有权限此创建比赛
if data["contest_type"] == 2:
if data["password"]:
if request.user.admin_type == SUPER_ADMIN:
pass
else:
return error_response(u"只有超级管理员才可创建公开赛(有密码)")
else:
return error_response(u"此比赛为有密码的公开赛,密码不可为空")
# 此时为没有密码的公开赛,并且此时只能是超级管理员才有权限创建此比赛
elif data["contest_type"]:
if not data["password"]:
if request.user.admin_type == SUPER_ADMIN:
pass
else:
return error_response(u"只有超级管理员才可创建公开赛(没有密码)")
else:
return error_response(u"此比赛为没有密码的公开赛,密码无需填写")
# 此时为没有密码的小组赛,并且此时只能是超级管理员和管理员才有权限创建此比赛
else:
if request.user.admin_type == REGULAR_USER:
return error_response(u"只有超级管理员和管理员才有权限创建比赛")
else:
if not data["password"]:
groups = Group.objects.filter(id__in=data["groups"], admin=request.user)
else:
return error_response(u"此比赛为没有密码的小组赛,密码无需填写")
try: try:
contest = Contest.objects.create(title=data["title"], description=data["description"], contest = Contest.objects.create(title=data["title"], description=data["description"],
mode=data["mode"], show_rank=data["show_rank"], mode=data["mode"], show_rank=data["show_rank"],
show_user_submission=data["show_user_submission"],
start_time=["start_time"], end_time=data["end_time"]) start_time=["start_time"], end_time=data["end_time"])
if data["password"]: if data["password"]:
contest.setpassword(data["password"]) contest.setpassword(data["password"])
contest.save() contest.save()
except IntegrityError: except IntegrityError:
return error_response(u"比赛名已经存在") return error_response(u"比赛名已经存在")
contest.groups.add(*groups)
return success_response(ContestSerializer(contest).data) return success_response(ContestSerializer(contest).data)
else: else:
serializer_invalid_response(serializer) serializer_invalid_response(serializer)