Add problem_list api.

Fix  AC/Total count bug.
This commit is contained in:
zemal 2017-05-01 13:03:48 +08:00
parent ef9cdd9f75
commit d221619565
3 changed files with 54 additions and 9 deletions

View File

@ -18,6 +18,12 @@ class ProblemRuleType(object):
OI = "OI" OI = "OI"
class ProblemDifficulty(object):
High = "High"
Mid = "Mid"
Low = "Low"
class AbstractProblem(models.Model): class AbstractProblem(models.Model):
title = models.CharField(max_length=128) title = models.CharField(max_length=128)
# HTML # HTML
@ -49,19 +55,19 @@ class AbstractProblem(models.Model):
difficulty = models.CharField(max_length=32) difficulty = models.CharField(max_length=32)
tags = models.ManyToManyField(ProblemTag) tags = models.ManyToManyField(ProblemTag)
source = models.CharField(max_length=200, blank=True, null=True) source = models.CharField(max_length=200, blank=True, null=True)
total_submit_number = models.IntegerField(default=0) total_submit_number = models.BigIntegerField(default=0)
total_accepted_number = models.IntegerField(default=0) total_accepted_number = models.BigIntegerField(default=0)
class Meta: class Meta:
db_table = "problem" db_table = "problem"
abstract = True abstract = True
def add_submission_number(self): 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() self.save()
def add_ac_number(self): 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() self.save()
@ -77,4 +83,4 @@ class ContestProblem(AbstractProblem):
class Meta: class Meta:
db_table = "contest_problem" db_table = "contest_problem"
unique_together = (("_id", "contest"), ) unique_together = (("_id", "contest"),)

View File

@ -1,7 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
from ..views.oj import ProblemTagAPI from ..views.oj import ProblemTagAPI, ProblemAPI
urlpatterns = [ 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"),
] ]

View File

@ -1,8 +1,46 @@
from django.db.models import Q, Count
from utils.api import APIView from utils.api import APIView
from ..models import ProblemTag from ..models import ProblemTag, Problem
from ..serializers import ProblemSerializer, TagSerializer
class ProblemTagAPI(APIView): class ProblemTagAPI(APIView):
def get(self, request): 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))