diff --git a/contest/migrations/0002_auto_20170209_0845.py b/contest/migrations/0002_auto_20170209_0845.py new file mode 100644 index 00000000..447545f1 --- /dev/null +++ b/contest/migrations/0002_auto_20170209_0845.py @@ -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')]), + ), + ] diff --git a/contest/models.py b/contest/models.py index 13da3a8f..d2fd537a 100644 --- a/contest/models.py +++ b/contest/models.py @@ -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): diff --git a/problem/migrations/0002_problem__id.py b/problem/migrations/0002_problem__id.py new file mode 100644 index 00000000..7c5d61dc --- /dev/null +++ b/problem/migrations/0002_problem__id.py @@ -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, + ), + ] diff --git a/problem/models.py b/problem/models.py index 54b15c89..faddb6ac 100644 --- a/problem/models.py +++ b/problem/models.py @@ -65,4 +65,4 @@ class AbstractProblem(models.Model): class Problem(AbstractProblem): - pass + _id = models.CharField(max_length=24, unique=True, db_index=True) diff --git a/problem/serializers.py b/problem/serializers.py index 3c1c7d81..ad21c1ad 100644 --- a/problem/serializers.py +++ b/problem/serializers.py @@ -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() diff --git a/problem/views/admin.py b/problem/views/admin.py index 6955d554..2006841b 100644 --- a/problem/views/admin.py +++ b/problem/views/admin.py @@ -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")