add pick one api
This commit is contained in:
@@ -38,4 +38,8 @@ class Migration(migrations.Migration):
|
||||
name='test_case_score',
|
||||
field=django.contrib.postgres.fields.jsonb.JSONField(),
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='problem',
|
||||
options={'ordering': ('create_time',)},
|
||||
),
|
||||
]
|
||||
|
||||
@@ -71,6 +71,7 @@ class Problem(models.Model):
|
||||
class Meta:
|
||||
db_table = "problem"
|
||||
unique_together = (("_id", "contest"),)
|
||||
ordering = ("create_time",)
|
||||
|
||||
def add_submission_number(self):
|
||||
self.submission_number = models.F("submission_number") + 1
|
||||
|
||||
@@ -25,6 +25,7 @@ DEFAULT_PROBLEM_DATA = {"_id": "A-110", "title": "test", "description": "<p>test
|
||||
"input_size": 0, "score": 0}],
|
||||
"rule_type": "ACM", "hint": "<p>test</p>", "source": "test"}
|
||||
|
||||
|
||||
class ProblemCreateTestBase(APITestCase):
|
||||
@staticmethod
|
||||
def add_problem(problem_data, created_by):
|
||||
@@ -32,7 +33,8 @@ class ProblemCreateTestBase(APITestCase):
|
||||
if data["spj"]:
|
||||
if not data["spj_language"] or not data["spj_code"]:
|
||||
raise ValueError("Invalid spj")
|
||||
data["spj_version"] = hashlib.md5((data["spj_language"] + ":" + data["spj_code"]).encode("utf-8")).hexdigest()
|
||||
data["spj_version"] = hashlib.md5(
|
||||
(data["spj_language"] + ":" + data["spj_code"]).encode("utf-8")).hexdigest()
|
||||
else:
|
||||
data["spj_language"] = None
|
||||
data["spj_code"] = None
|
||||
@@ -215,7 +217,7 @@ class ContestProblemAdminTest(APITestCase):
|
||||
self.assertEqual(len(resp.data["data"]), 1)
|
||||
|
||||
def test_get_one_contest_problem(self):
|
||||
contest, contest_problem = self.test_create_contest_problem()
|
||||
contest, contest_problem = self.test_create_contest_problem()
|
||||
contest_id = contest.data["data"]["id"]
|
||||
problem_id = contest_problem.data["data"]["id"]
|
||||
resp = self.client.get(f"{self.url}?contest_id={contest_id}&id={problem_id}")
|
||||
@@ -233,7 +235,7 @@ class ContestProblemTest(ProblemCreateTestBase):
|
||||
self.problem = self.add_problem(DEFAULT_PROBLEM_DATA, admin)
|
||||
self.problem.contest_id = self.contest["id"]
|
||||
self.problem.save()
|
||||
self.url = self.reverse("contest_problem_api")
|
||||
self.url = self.reverse("contest_problem_api")
|
||||
|
||||
def test_admin_get_contest_problem_list(self):
|
||||
contest_id = self.contest["id"]
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
from django.conf.urls import url
|
||||
|
||||
from ..views.oj import ProblemTagAPI, ProblemAPI, ContestProblemAPI
|
||||
from ..views.oj import ProblemTagAPI, ProblemAPI, ContestProblemAPI, PickOneAPI
|
||||
|
||||
urlpatterns = [
|
||||
url(r"^problem/tags/?$", ProblemTagAPI.as_view(), name="problem_tag_list_api"),
|
||||
url(r"^problem/?$", ProblemAPI.as_view(), name="problem_api"),
|
||||
url(r"^pickone/?$", PickOneAPI.as_view(), name="pick_one_api"),
|
||||
url(r"^contest/problem/?$", ContestProblemAPI.as_view(), name="contest_problem_api"),
|
||||
]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import random
|
||||
from django.db.models import Q
|
||||
from utils.api import APIView
|
||||
from account.decorators import check_contest_permission
|
||||
@@ -12,6 +13,15 @@ class ProblemTagAPI(APIView):
|
||||
return self.success(TagSerializer(ProblemTag.objects.all(), many=True).data)
|
||||
|
||||
|
||||
class PickOneAPI(APIView):
|
||||
def get(self, request):
|
||||
problems = Problem.objects.filter(contest_id__isnull=True, visible=True)
|
||||
count = problems.count()
|
||||
if count == 0:
|
||||
return self.error("No problem to pick")
|
||||
return self.success(problems[random.randint(0, count - 1)]._id)
|
||||
|
||||
|
||||
class ProblemAPI(APIView):
|
||||
@staticmethod
|
||||
def _add_problem_status(request, queryset_values):
|
||||
@@ -24,7 +34,7 @@ class ProblemAPI(APIView):
|
||||
if results is not None:
|
||||
problems = results
|
||||
else:
|
||||
problems = [queryset_values,]
|
||||
problems = [queryset_values, ]
|
||||
for problem in problems:
|
||||
if problem["rule_type"] == ProblemRuleType.ACM:
|
||||
problem["my_status"] = acm_problems_status.get(str(problem["id"]), {}).get("status")
|
||||
@@ -36,7 +46,7 @@ class ProblemAPI(APIView):
|
||||
problem_id = request.GET.get("problem_id")
|
||||
if problem_id:
|
||||
try:
|
||||
problem = Problem.objects.select_related("created_by")\
|
||||
problem = Problem.objects.select_related("created_by") \
|
||||
.get(_id=problem_id, contest_id__isnull=True, visible=True)
|
||||
problem_data = ProblemSerializer(problem).data
|
||||
self._add_problem_status(request, problem_data)
|
||||
@@ -93,9 +103,8 @@ class ContestProblemAPI(APIView):
|
||||
except Problem.DoesNotExist:
|
||||
return self.error("Problem does not exist.")
|
||||
problem_data = ContestProblemSerializer(problem).data
|
||||
self._add_problem_status(request, [problem_data,])
|
||||
self._add_problem_status(request, [problem_data, ])
|
||||
return self.success(problem_data)
|
||||
|
||||
contest_problems = Problem.objects.select_related("created_by").filter(contest=self.contest, visible=True)
|
||||
# 根据profile, 为做过的题目添加标记
|
||||
data = ContestProblemSerializer(contest_problems, many=True).data
|
||||
|
||||
Reference in New Issue
Block a user