From d2216195657862e81ec303e3334288743724e088 Mon Sep 17 00:00:00 2001 From: zemal Date: Mon, 1 May 2017 13:03:48 +0800 Subject: [PATCH] Add problem_list api. Fix AC/Total count bug. --- problem/models.py | 16 +++++++++++----- problem/urls/oj.py | 5 +++-- problem/views/oj.py | 42 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/problem/models.py b/problem/models.py index 17d4e5d0..8b373b0a 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/urls/oj.py b/problem/urls/oj.py index a7613f12..5e7e6bea 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 94496cee..c21c06a5 100644 --- a/problem/views/oj.py +++ b/problem/views/oj.py @@ -1,8 +1,46 @@ +from django.db.models import Q, Count 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")]) + tags = ProblemTag.objects.annotate(problem_number=Count("problem"))\ + .filter(problem_number__gt=0).order_by("-problem_number") + return self.success(TagSerializer(tags, 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))