From 9c7443ab018e7d87b25cb6ff41c11a46055860f7 Mon Sep 17 00:00:00 2001 From: KanonKC Date: Mon, 15 Jan 2024 14:11:10 +0700 Subject: [PATCH 1/2] Get all problems pagination --- .../problem/get_all_problems_by_account.py | 22 +++++++++++++++++-- api/serializers.py | 17 ++------------ api/views/problem.py | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/api/controllers/problem/get_all_problems_by_account.py b/api/controllers/problem/get_all_problems_by_account.py index d6210d6..a9d373b 100644 --- a/api/controllers/problem/get_all_problems_by_account.py +++ b/api/controllers/problem/get_all_problems_by_account.py @@ -8,12 +8,23 @@ from django.forms.models import model_to_dict from ...serializers import * -def get_all_problems_by_account(account:Account): +def get_all_problems_by_account(account:Account,request): + + start = int(request.query_params.get("start",0)) + end = int(request.query_params.get("end",-1)) + if end == -1: end = None + personalProblems = Problem.objects.filter(creator=account).order_by('-updated_date') + maxPersonal = len(personalProblems) + if start < maxPersonal and start < maxPersonal: + personalProblems = personalProblems[start:end] for problem in personalProblems: problem.testcases = Testcase.objects.filter(problem=problem,deprecated=False) manageableProblems = Problem.objects.filter(problemgrouppermission__permission_manage_problems=True,problemgrouppermission__group__in=GroupMember.objects.filter(account=account).values_list("group",flat=True)).order_by('-updated_date') + maxManageable = len(manageableProblems) + if start < maxManageable and start < maxManageable: + manageableProblems = manageableProblems[start:end] for problem in manageableProblems: problem.testcases = Testcase.objects.filter(problem=problem,deprecated=False) @@ -21,4 +32,11 @@ def get_all_problems_by_account(account:Account): personalSerialize = ProblemPopulateTestcaseSerializer(personalProblems,many=True) manageableSerialize = ProblemPopulateTestcaseSerializer(manageableProblems,many=True) - return Response({"problems":personalSerialize.data,"manageable_problems":manageableSerialize.data},status=status.HTTP_200_OK) \ No newline at end of file + return Response({ + "start":start, + "end":end, + "total_personal_problems": maxPersonal, + "total_manageable_problems": maxManageable, + "problems":personalSerialize.data, + "manageable_problems":manageableSerialize.data + },status=status.HTTP_200_OK) \ No newline at end of file diff --git a/api/serializers.py b/api/serializers.py index a4f9030..28ad722 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -131,21 +131,8 @@ class ProblemPopulateTestcaseSerializer(serializers.ModelSerializer): testcases = TestcaseSerializer(many=True) class Meta: model = Problem - fields = [ - 'problem_id', - 'language', - 'title', - 'description', - 'solution', - 'time_limit', - 'is_active', - 'is_private', - 'submission_regex', - 'created_date', - 'updated_date', - 'creator', - 'testcases' - ] + fields = "__all__" + include = ['testcases'] # class ProblemPopulateAccountSecureSerializer(serializers.ModelSerializer): # creator = AccountSecureSerializer() diff --git a/api/views/problem.py b/api/views/problem.py index 7016010..7ceec1e 100644 --- a/api/views/problem.py +++ b/api/views/problem.py @@ -28,7 +28,7 @@ def all_problems_creator_view(request,account_id): if request.method == POST: return create_problem(account_id,request) if request.method == GET: - return get_all_problems_by_account(account_id) + return get_all_problems_by_account(account_id,request) @api_view([GET,PUT,DELETE]) def one_problem_creator_view(request,problem_id:str,account_id:str): From fb913789d14df3bbe15deb610b8101c14329a189 Mon Sep 17 00:00:00 2001 From: KanonKC Date: Mon, 15 Jan 2024 21:38:14 +0700 Subject: [PATCH 2/2] Get all submision in one problem as creator --- .../get_all_submissions_by_creator_problem.py | 28 +++++++++++++++++++ api/serializers.py | 20 +++++++++++-- api/urls.py | 3 +- api/views/submission.py | 6 ++++ 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 api/controllers/submission/get_all_submissions_by_creator_problem.py diff --git a/api/controllers/submission/get_all_submissions_by_creator_problem.py b/api/controllers/submission/get_all_submissions_by_creator_problem.py new file mode 100644 index 0000000..c4a4dde --- /dev/null +++ b/api/controllers/submission/get_all_submissions_by_creator_problem.py @@ -0,0 +1,28 @@ +from api.utility import passwordEncryption +from rest_framework.response import Response +from rest_framework.decorators import api_view +from api.sandbox.grader import PythonGrader +from ...constant import GET,POST,PUT,DELETE +from ...models import * +from rest_framework import status +from django.forms.models import model_to_dict +from ...serializers import * + +def get_all_submissions_by_creator_problem(problem:Problem): + submissions = Submission.objects.filter(problem=problem) + + if submissions.count() == 0: + return Response({"submissions": []},status=status.HTTP_204_NO_CONTENT) + + submissions = submissions.order_by('-date') + + result = [] + + for submission in submissions: + submission_testcases = SubmissionTestcase.objects.filter(submission=submission) + submission.runtime_output = submission_testcases + result.append(submission) + + submissions_serializer = SubmissionPopulateSubmissionTestcaseAndAccountSerializer(result,many=True) + + return Response({"submissions": submissions_serializer.data},status=status.HTTP_200_OK) \ No newline at end of file diff --git a/api/serializers.py b/api/serializers.py index 28ad722..267458d 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -172,13 +172,19 @@ class ProblemPopulateAccountAndSubmissionPopulateSubmissionTestcasesSecureSerial best_submission = SubmissionPopulateSubmissionTestcaseSecureSerializer() class Meta: model = Problem - fields = problem_secure_fields + ['best_submission','creator'] + # fields = problem_secure_fields + ['best_submission','creator'] + fields = "__all__" + include = ['best_submission','creator'] + exlude = ['solution','submission_regex','is_private','is_active','sharing'] class ProblemPopulatSubmissionPopulateSubmissionTestcasesSecureSerializer(serializers.ModelSerializer): best_submission = SubmissionPopulateSubmissionTestcaseSecureSerializer() class Meta: model = Problem - fields = problem_secure_fields + ['best_submission'] + # fields = problem_secure_fields + ['best_submission'] + fields = "__all__" + include = ['best_submission','creator'] + exlude = ['solution','submission_regex','is_private','is_active','sharing'] class TopicCollectionPopulateCollectionSerializer(serializers.ModelSerializer): collection = CollectionSerializer() class Meta: @@ -367,4 +373,12 @@ class CollectionPopulateCollectionProblemsPopulateProblemPopulateAccountAndTestc class Meta: model = Collection fields = "__all__" - include = ['problems','group_permissions'] \ No newline at end of file + include = ['problems','group_permissions'] + +class SubmissionPopulateSubmissionTestcaseAndAccountSerializer(serializers.ModelSerializer): + runtime_output = SubmissionTestcaseSerializer(many=True) + account = AccountSecureSerializer() + class Meta: + model = Submission + fields = "__all__" + include = ['runtime_output'] \ No newline at end of file diff --git a/api/urls.py b/api/urls.py index f4c9a13..fee16bc 100644 --- a/api/urls.py +++ b/api/urls.py @@ -15,7 +15,7 @@ path('accounts//problems',problem.all_problems_creator_view), path('accounts//problems/',problem.one_problem_creator_view), path('accounts//problems//groups',problem.problem_group_view), - path("accounts//problems//submissions",submission.account_problem_submission_view), + path("accounts//problems//submissions",submission.creator_problem_submissions_view), path("accounts//topics//problems//submissions",submission.topic_account_problem_submission_view), path('accounts//collections',collection.all_collections_creator_view), @@ -33,6 +33,7 @@ path('problems',problem.all_problems_view), path('problems/validate',problem.validation_view), path('problems/',problem.one_problem_view), + path("problems//accounts//submissions",submission.account_problem_submission_view), path('topics//problems//accounts/',problem.problem_in_topic_account_view), path('collections',collection.all_collections_view), diff --git a/api/views/submission.py b/api/views/submission.py index 4672259..1ede8e0 100644 --- a/api/views/submission.py +++ b/api/views/submission.py @@ -16,6 +16,7 @@ from ..controllers.submission.get_submissions_by_account_problem import * from ..controllers.submission.submit_problem_on_topic import * from ..controllers.submission.get_submissions_by_account_problem_in_topic import * +from ..controllers.submission.get_all_submissions_by_creator_problem import * @api_view([POST,GET]) @@ -25,6 +26,11 @@ def account_problem_submission_view(request,problem_id,account_id): if request.method == GET: return get_submissions_by_account_problem(account_id,problem_id) +@api_view([GET]) +def creator_problem_submissions_view(request,account_id,problem_id): + problem = Problem.objects.get(problem_id=problem_id) + return get_all_submissions_by_creator_problem(problem) + @api_view([GET]) def all_submission_view(request): return get_submission_by_quries(request)