support display id

This commit is contained in:
virusdefender 2017-02-09 16:47:08 +08:00
parent 7f105e4a69
commit 0678dd4fca
6 changed files with 83 additions and 4 deletions

View File

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.12 on 2017-02-09 08:45
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('contest', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='contestproblem',
name='_id',
field=models.CharField(db_index=True, default='1', max_length=24),
preserve_default=False,
),
migrations.RemoveField(
model_name='contestproblem',
name='sort_index',
),
migrations.AlterUniqueTogether(
name='contestproblem',
unique_together=set([('_id', 'contest')]),
),
]

View File

@ -62,14 +62,14 @@ class Contest(models.Model):
class ContestProblem(AbstractProblem):
_id = models.CharField(max_length=24, db_index=True)
contest = models.ForeignKey(Contest)
# 比如A B 或者1 2 或者 a b 将按照这个排序
sort_index = models.CharField(max_length=30)
# 是否已经公开了题目,防止重复公开
is_public = models.BooleanField(default=False)
class Meta:
db_table = "contest_problem"
unique_together = (("_id", "contest"), )
class ContestRank(models.Model):

View File

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.12 on 2017-02-09 08:45
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('problem', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='problem',
name='_id',
field=models.CharField(db_index=True, default='1', max_length=24, unique=True),
preserve_default=False,
),
]

View File

@ -65,4 +65,4 @@ class AbstractProblem(models.Model):
class Problem(AbstractProblem):
pass
_id = models.CharField(max_length=24, unique=True, db_index=True)

View File

@ -33,6 +33,7 @@ class Difficulty(object):
class CreateOrEditProblemSerializer(serializers.Serializer):
_id = serializers.CharField(max_length=32, allow_blank=True, allow_null=True)
title = serializers.CharField(max_length=128)
description = serializers.CharField()
input_description = serializers.CharField()

View File

@ -111,6 +111,17 @@ class ProblemAPI(APIView):
@validate_serializer(CreateProblemSerializer)
def post(self, request):
data = request.data
_id = data["_id"]
if _id:
try:
Problem.objects.get(_id=_id)
return self.error("Display ID already exists")
except Problem.DoesNotExist:
pass
else:
data["_id"] = rand_str(8)
if data["spj"]:
if not data["spj_language"] or not data["spj_code"]:
return self.error("Invalid spj")
@ -127,6 +138,11 @@ class ProblemAPI(APIView):
tags = data.pop("tags")
problem = Problem.objects.create(**data)
if not _id:
problem._id = str(problem.id)
problem.save()
for item in tags:
try:
tag = ProblemTag.objects.get(name=item)
@ -154,12 +170,24 @@ class ProblemAPI(APIView):
@validate_serializer(EditProblemSerializer)
def put(self, request):
data = request.data
id = data.pop("id")
try:
problem = Problem.objects.get(id=data.pop("id"))
problem = Problem.objects.get(id=id)
if request.user.is_admin_role():
problem = problem.get(created_by=request.user)
except Problem.DoesNotExist:
return self.error("Problem does not exist")
_id = data["_id"]
if _id:
try:
Problem.objects.exclude(id=id).get(_id=_id)
return self.error("Display ID already exists")
except Problem.DoesNotExist:
pass
else:
data["_id"] = str(id)
if data["spj"]:
if not data["spj_language"] or not data["spj_code"]:
return self.error("Invalid spj")