support display id
This commit is contained in:
29
contest/migrations/0002_auto_20170209_0845.py
Normal file
29
contest/migrations/0002_auto_20170209_0845.py
Normal 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')]),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -62,14 +62,14 @@ class Contest(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class ContestProblem(AbstractProblem):
|
class ContestProblem(AbstractProblem):
|
||||||
|
_id = models.CharField(max_length=24, db_index=True)
|
||||||
contest = models.ForeignKey(Contest)
|
contest = models.ForeignKey(Contest)
|
||||||
# 比如A B 或者1 2 或者 a b 将按照这个排序
|
|
||||||
sort_index = models.CharField(max_length=30)
|
|
||||||
# 是否已经公开了题目,防止重复公开
|
# 是否已经公开了题目,防止重复公开
|
||||||
is_public = models.BooleanField(default=False)
|
is_public = models.BooleanField(default=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = "contest_problem"
|
db_table = "contest_problem"
|
||||||
|
unique_together = (("_id", "contest"), )
|
||||||
|
|
||||||
|
|
||||||
class ContestRank(models.Model):
|
class ContestRank(models.Model):
|
||||||
|
|||||||
21
problem/migrations/0002_problem__id.py
Normal file
21
problem/migrations/0002_problem__id.py
Normal 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,
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -65,4 +65,4 @@ class AbstractProblem(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class Problem(AbstractProblem):
|
class Problem(AbstractProblem):
|
||||||
pass
|
_id = models.CharField(max_length=24, unique=True, db_index=True)
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ class Difficulty(object):
|
|||||||
|
|
||||||
|
|
||||||
class CreateOrEditProblemSerializer(serializers.Serializer):
|
class CreateOrEditProblemSerializer(serializers.Serializer):
|
||||||
|
_id = serializers.CharField(max_length=32, allow_blank=True, allow_null=True)
|
||||||
title = serializers.CharField(max_length=128)
|
title = serializers.CharField(max_length=128)
|
||||||
description = serializers.CharField()
|
description = serializers.CharField()
|
||||||
input_description = serializers.CharField()
|
input_description = serializers.CharField()
|
||||||
|
|||||||
@@ -111,6 +111,17 @@ class ProblemAPI(APIView):
|
|||||||
@validate_serializer(CreateProblemSerializer)
|
@validate_serializer(CreateProblemSerializer)
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
data = request.data
|
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 data["spj"]:
|
||||||
if not data["spj_language"] or not data["spj_code"]:
|
if not data["spj_language"] or not data["spj_code"]:
|
||||||
return self.error("Invalid spj")
|
return self.error("Invalid spj")
|
||||||
@@ -127,6 +138,11 @@ class ProblemAPI(APIView):
|
|||||||
tags = data.pop("tags")
|
tags = data.pop("tags")
|
||||||
|
|
||||||
problem = Problem.objects.create(**data)
|
problem = Problem.objects.create(**data)
|
||||||
|
|
||||||
|
if not _id:
|
||||||
|
problem._id = str(problem.id)
|
||||||
|
problem.save()
|
||||||
|
|
||||||
for item in tags:
|
for item in tags:
|
||||||
try:
|
try:
|
||||||
tag = ProblemTag.objects.get(name=item)
|
tag = ProblemTag.objects.get(name=item)
|
||||||
@@ -154,12 +170,24 @@ class ProblemAPI(APIView):
|
|||||||
@validate_serializer(EditProblemSerializer)
|
@validate_serializer(EditProblemSerializer)
|
||||||
def put(self, request):
|
def put(self, request):
|
||||||
data = request.data
|
data = request.data
|
||||||
|
id = data.pop("id")
|
||||||
try:
|
try:
|
||||||
problem = Problem.objects.get(id=data.pop("id"))
|
problem = Problem.objects.get(id=id)
|
||||||
if request.user.is_admin_role():
|
if request.user.is_admin_role():
|
||||||
problem = problem.get(created_by=request.user)
|
problem = problem.get(created_by=request.user)
|
||||||
except Problem.DoesNotExist:
|
except Problem.DoesNotExist:
|
||||||
return self.error("Problem does not exist")
|
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 data["spj"]:
|
||||||
if not data["spj_language"] or not data["spj_code"]:
|
if not data["spj_language"] or not data["spj_code"]:
|
||||||
return self.error("Invalid spj")
|
return self.error("Invalid spj")
|
||||||
|
|||||||
Reference in New Issue
Block a user