diff --git a/contest/migrations/0014_auto_20160404_1509.py b/contest/migrations/0014_auto_20160404_1509.py new file mode 100644 index 00000000..fc78c36a --- /dev/null +++ b/contest/migrations/0014_auto_20160404_1509.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.1 on 2016-04-04 07:09 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contest', '0013_auto_20151017_1511'), + ] + + operations = [ + migrations.AddField( + model_name='contestproblem', + name='spj', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='contestproblem', + name='spj_code', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='contestproblem', + name='spj_code_language', + field=models.IntegerField(blank=True, null=True), + ), + ] diff --git a/contest/migrations/0015_auto_20160404_1641.py b/contest/migrations/0015_auto_20160404_1641.py new file mode 100644 index 00000000..5b59ef2b --- /dev/null +++ b/contest/migrations/0015_auto_20160404_1641.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.1 on 2016-04-04 08:41 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('contest', '0014_auto_20160404_1509'), + ] + + operations = [ + migrations.RenameField( + model_name='contestproblem', + old_name='spj_code_language', + new_name='spj_language', + ), + ] diff --git a/contest/serializers.py b/contest/serializers.py index 0ee0def5..317eb76e 100644 --- a/contest/serializers.py +++ b/contest/serializers.py @@ -73,6 +73,9 @@ class CreateContestProblemSerializer(serializers.Serializer): test_case_id = serializers.CharField(max_length=40) time_limit = serializers.IntegerField() memory_limit = serializers.IntegerField() + spj = serializers.BooleanField() + spj_language = serializers.IntegerField(required=False, default=None) + spj_code = serializers.CharField(max_length=10000, required=False, default=None) hint = serializers.CharField(max_length=3000, allow_blank=True) score = serializers.IntegerField(required=False, default=0) sort_index = serializers.CharField(max_length=30) @@ -101,6 +104,9 @@ class EditContestProblemSerializer(serializers.Serializer): test_case_id = serializers.CharField(max_length=40) time_limit = serializers.IntegerField() memory_limit = serializers.IntegerField() + spj = serializers.BooleanField() + spj_language = serializers.IntegerField(required=False, default=None) + spj_code = serializers.CharField(max_length=10000, required=False, default=None) samples = ContestProblemSampleSerializer() hint = serializers.CharField(max_length=3000, allow_blank=True) visible = serializers.BooleanField() diff --git a/problem/migrations/0012_auto_20160404_1509.py b/problem/migrations/0012_auto_20160404_1509.py new file mode 100644 index 00000000..260f8bfb --- /dev/null +++ b/problem/migrations/0012_auto_20160404_1509.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.1 on 2016-04-04 07:09 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('problem', '0011_auto_20151017_1227'), + ] + + operations = [ + migrations.AddField( + model_name='problem', + name='spj', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='problem', + name='spj_code', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='problem', + name='spj_code_language', + field=models.IntegerField(blank=True, null=True), + ), + ] diff --git a/problem/migrations/0013_auto_20160404_1641.py b/problem/migrations/0013_auto_20160404_1641.py new file mode 100644 index 00000000..23f9e508 --- /dev/null +++ b/problem/migrations/0013_auto_20160404_1641.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.1 on 2016-04-04 08:41 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('problem', '0012_auto_20160404_1509'), + ] + + operations = [ + migrations.RenameField( + model_name='problem', + old_name='spj_code_language', + new_name='spj_language', + ), + ] diff --git a/problem/models.py b/problem/models.py index 5944ca6d..a0491b6c 100644 --- a/problem/models.py +++ b/problem/models.py @@ -38,6 +38,10 @@ class AbstractProblem(models.Model): time_limit = models.IntegerField() # 内存限制 单位是MB memory_limit = models.IntegerField() + # special judge + spj = models.BooleanField(default=False) + spj_language = models.IntegerField(blank=True, null=True) + spj_code = models.TextField(blank=True, null=True) # 是否可见 false的话相当于删除 visible = models.BooleanField(default=True) # 总共提交数量 diff --git a/problem/serizalizers.py b/problem/serizalizers.py index 1b0e9557..1682d3b5 100644 --- a/problem/serizalizers.py +++ b/problem/serizalizers.py @@ -27,6 +27,9 @@ class CreateProblemSerializer(serializers.Serializer): test_case_id = serializers.CharField(max_length=40) time_limit = serializers.IntegerField(min_value=1, max_value=10000) memory_limit = serializers.IntegerField(min_value=16) + spj = serializers.BooleanField() + spj_language = serializers.IntegerField(required=False, default=None) + spj_code = serializers.CharField(max_length=10000, required=False, default=None) difficulty = serializers.IntegerField() tags = serializers.ListField(child=serializers.CharField(max_length=10)) hint = serializers.CharField(max_length=3000, allow_blank=True) @@ -73,6 +76,9 @@ class EditProblemSerializer(serializers.Serializer): source = serializers.CharField(max_length=100) time_limit = serializers.IntegerField(min_value=1) memory_limit = serializers.IntegerField(min_value=1) + spj = serializers.BooleanField() + spj_language = serializers.IntegerField(required=False, default=None) + spj_code = serializers.CharField(max_length=10000, required=False, default=None) difficulty = serializers.IntegerField() tags = serializers.ListField(child=serializers.CharField(max_length=20)) samples = ProblemSampleSerializer() diff --git a/problem/views.py b/problem/views.py index 27f8c705..2ee65648 100644 --- a/problem/views.py +++ b/problem/views.py @@ -91,6 +91,9 @@ class ProblemAdminAPIView(APIView): samples=json.dumps(data["samples"]), time_limit=data["time_limit"], memory_limit=data["memory_limit"], + spj=data["spj"], + spj_language=data["spj_language"], + spj_code=data["spj_code"], difficulty=data["difficulty"], created_by=request.user, hint=data["hint"], diff --git a/static/src/js/app/admin/problem/addProblem.js b/static/src/js/app/admin/problem/addProblem.js index 0e8605eb..e15c116c 100644 --- a/static/src/js/app/admin/problem/addProblem.js +++ b/static/src/js/app/admin/problem/addProblem.js @@ -1,5 +1,5 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", - "csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent", "testCaseUploader"], + "csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent", "testCaseUploader", "spj"], function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { avalon.ready(function () { @@ -37,6 +37,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", bsAlert("请至少添加一个标签,这将有利于用户发现你的题目!"); return false; } + var spjVM = avalon.vmodels.spjConfig; + if (spjVM.spj && spjVM.spjCode == ""){ + bsAlert("请填写Special Judge的代码"); + return false; + } var ajaxData = { id: avalon.vmodels.admin.problemId, title: vm.title, @@ -51,8 +56,13 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", tags: tags, input_description: vm.inputDescription, output_description: vm.outputDescription, - difficulty: vm.difficulty + difficulty: vm.difficulty, + spj: spjVM.spj }; + if (spjVM.spj) { + ajaxData.spj_language = spjVM.spjLanguage; + ajaxData.spj_code = spjVM.spjCode; + } for (var i = 0; i < vm.samples.$model.length; i++) { ajaxData.samples.push({ diff --git a/static/src/js/components/spj.js b/static/src/js/components/spj.js new file mode 100644 index 00000000..07dc1bc8 --- /dev/null +++ b/static/src/js/components/spj.js @@ -0,0 +1,30 @@ +define("spj", ["avalon"], function (avalon) { + avalon.component("ms:spj", { + $template: '
上传进度%
' + '| 编号 | 输入文件名 | 输出文件名 |