diff --git a/problem/migrations/0004_auto_20170501_0637.py b/problem/migrations/0004_auto_20170501_0637.py new file mode 100644 index 0000000..5d55ace --- /dev/null +++ b/problem/migrations/0004_auto_20170501_0637.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6 on 2017-05-01 06:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('problem', '0003_auto_20170217_0820'), + ] + + operations = [ + migrations.AlterField( + model_name='contestproblem', + name='total_accepted_number', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='contestproblem', + name='total_submit_number', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='problem', + name='total_accepted_number', + field=models.BigIntegerField(default=0), + ), + migrations.AlterField( + model_name='problem', + name='total_submit_number', + field=models.BigIntegerField(default=0), + ), + ] diff --git a/problem/models.py b/problem/models.py index 17d4e5d..61cc8f4 100644 --- a/problem/models.py +++ b/problem/models.py @@ -18,6 +18,12 @@ class ProblemRuleType(object): OI = "OI" +class ProblemDifficulty(object): + High = "High" + Mid = "Mid" + Low = "Low" + + class AbstractProblem(models.Model): title = models.CharField(max_length=128) # HTML @@ -49,19 +55,19 @@ class AbstractProblem(models.Model): difficulty = models.CharField(max_length=32) tags = models.ManyToManyField(ProblemTag) source = models.CharField(max_length=200, blank=True, null=True) - total_submit_number = models.IntegerField(default=0) - total_accepted_number = models.IntegerField(default=0) + total_submit_number = models.BigIntegerField(default=0) + total_accepted_number = models.BigIntegerField(default=0) class Meta: db_table = "problem" abstract = True def add_submission_number(self): - self.accepted_problem_number = models.F("total_submit_number") + 1 + self.total_submit_number = models.F("total_submit_number") + 1 self.save() def add_ac_number(self): - self.accepted_problem_number = models.F("total_accepted_number") + 1 + self.total_accepted_number = models.F("total_accepted_number") + 1 self.save() @@ -77,4 +83,4 @@ class ContestProblem(AbstractProblem): class Meta: db_table = "contest_problem" - unique_together = (("_id", "contest"), ) + unique_together = (("_id", "contest"),) diff --git a/problem/tests.py b/problem/tests.py index d80262a..caa6ad6 100644 --- a/problem/tests.py +++ b/problem/tests.py @@ -17,7 +17,9 @@ class ProblemTagListAPITest(APITestCase): ProblemTag.objects.create(name="name2") resp = self.client.get(self.reverse("problem_tag_list_api")) self.assertSuccess(resp) - self.assertEqual(resp.data["data"], ["name1", "name2"]) + resp_data = resp.data["data"] + self.assertEqual(resp_data[0]["name"], "name1") + self.assertEqual(resp_data[1]["name"], "name2") class TestCaseUploadAPITest(APITestCase): @@ -27,7 +29,8 @@ class TestCaseUploadAPITest(APITestCase): self.create_super_admin() def test_filter_file_name(self): - self.assertEqual(self.api.filter_name_list(["1.in", "1.out", "2.in", ".DS_Store"], spj=False), ["1.in", "1.out"]) + self.assertEqual(self.api.filter_name_list(["1.in", "1.out", "2.in", ".DS_Store"], spj=False), + ["1.in", "1.out"]) self.assertEqual(self.api.filter_name_list(["2.in", "2.out"], spj=False), []) self.assertEqual(self.api.filter_name_list(["1.in", "1.out", "2.in"], spj=True), ["1.in", "2.in"]) @@ -76,9 +79,9 @@ class TestCaseUploadAPITest(APITestCase): self.assertEqual(f.read(), name + "\n" + name + "\n" + "end") -class ProblemAPITest(APITestCase): +class ProblemAdminAPITest(APITestCase): def setUp(self): - self.url = self.reverse("problem_api") + self.url = self.reverse("problem_admin_api") self.create_super_admin() self.data = {"_id": "A-110", "title": "test", "description": "
test
", "input_description": "test", "output_description": "test", "time_limit": 1000, "memory_limit": 256, "difficulty": "Low", diff --git a/problem/urls/admin.py b/problem/urls/admin.py index b4813c5..d123f35 100644 --- a/problem/urls/admin.py +++ b/problem/urls/admin.py @@ -4,6 +4,6 @@ from ..views.admin import ContestProblemAPI, ProblemAPI, TestCaseUploadAPI urlpatterns = [ url(r"^test_case/upload/?$", TestCaseUploadAPI.as_view(), name="test_case_upload_api"), - url(r"^problem/?$", ProblemAPI.as_view(), name="problem_api"), + url(r"^problem/?$", ProblemAPI.as_view(), name="problem_admin_api"), url(r"^contest/problem/?$", ContestProblemAPI.as_view(), name="contest_problem_api") ] diff --git a/problem/urls/oj.py b/problem/urls/oj.py index a7613f1..5e7e6be 100644 --- a/problem/urls/oj.py +++ b/problem/urls/oj.py @@ -1,7 +1,8 @@ from django.conf.urls import url -from ..views.oj import ProblemTagAPI +from ..views.oj import ProblemTagAPI, ProblemAPI urlpatterns = [ - url(r"^problem/tags/?$", ProblemTagAPI.as_view(), name="problem_tag_list_api") + url(r"^problem/tags/?$", ProblemTagAPI.as_view(), name="problem_tag_list_api"), + url(r"^problems/?$", ProblemAPI.as_view(), name="problem_list_api"), ] diff --git a/problem/views/oj.py b/problem/views/oj.py index 94496ce..611c2c9 100644 --- a/problem/views/oj.py +++ b/problem/views/oj.py @@ -1,8 +1,44 @@ +from django.db.models import Q from utils.api import APIView -from ..models import ProblemTag +from ..models import ProblemTag, Problem +from ..serializers import ProblemSerializer, TagSerializer class ProblemTagAPI(APIView): def get(self, request): - return self.success([item.name for item in ProblemTag.objects.all().order_by("id")]) + return self.success(TagSerializer(ProblemTag.objects.all(), many=True).data) + + +class ProblemAPI(APIView): + def get(self, request): + # 问题详情页 + problem_id = request.GET.get("id") + if problem_id: + try: + problem = Problem.objects.get(id=problem_id) + return self.success(ProblemSerializer(problem).data) + except Problem.DoesNotExist: + return self.error("Problem does not exist") + + problems = Problem.objects.filter(visible=True) + # 按照标签筛选 + tag_text = request.GET.get("tag", None) + if tag_text: + try: + tag = ProblemTag.objects.get(name=tag_text) + except ProblemTag.DoesNotExist: + return self.error("The Tag does not exist.") + problems = tag.problem_set.all().filter(visible=True) + + # 搜索的情况 + keyword = request.GET.get("keyword", "").strip() + if keyword: + problems = problems.filter(Q(title__contains=keyword) | Q(description__contains=keyword)) + + # 难度筛选 + difficulty_rank = request.GET.get("difficulty", None) + if difficulty_rank: + problems = problems.filter(difficulty=difficulty_rank) + + return self.success(self.paginate_data(request, problems, ProblemSerializer))