From 7ff64abc6cd26d3605a2019a6c35abdea92a3194 Mon Sep 17 00:00:00 2001 From: KanonKC Date: Sun, 12 Nov 2023 01:20:03 +0700 Subject: [PATCH 1/2] Not finished. Topic & Collection remain --- api/serializers.py | 6 ++++++ api/views/account.py | 3 ++- api/views/problem.py | 33 ++++++++++++++++++++------------- api/views/submission.py | 2 +- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 4eb25fc..4f847b0 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -43,6 +43,12 @@ class Meta: model = Problem fields = "__all__" +class ProblemPopulateAccountSerializer(serializers.ModelSerializer): + account = AccountSecureSerializer() + class Meta: + model = Problem + fields = "__all__" + class TopicCollectionSerializer(serializers.ModelSerializer): class Meta: model = TopicCollection diff --git a/api/views/account.py b/api/views/account.py index 63160a6..85b688c 100644 --- a/api/views/account.py +++ b/api/views/account.py @@ -23,7 +23,8 @@ def account_collection(request): account = Account.objects.create(**request.data) except Exception as e: return Response({'message':str(e)},status=status.HTTP_400_BAD_REQUEST) - return Response({'message':'Registration Completed','account':model_to_dict(account)},status=status.HTTP_201_CREATED) + serialize = AccountSerializer(account) + return Response(serialize.data,status=status.HTTP_201_CREATED) @api_view([GET]) def get_account(request,account_id): diff --git a/api/views/problem.py b/api/views/problem.py index 67fd3da..382ca88 100644 --- a/api/views/problem.py +++ b/api/views/problem.py @@ -63,12 +63,14 @@ def all_problem(request): problem = problem.order_by('-problem_id') + serialize = ProblemPopulateAccountSerializer(problem,many=True) + result = [model_to_dict(i) for i in problem] for i in result: i['creator'] = model_to_dict(Account.objects.get(account_id=i['account'])) - return Response({'result':result},status=status.HTTP_200_OK) + return Response({'problems':serialize.data},status=status.HTTP_200_OK) elif request.method == DELETE: target = request.data.get("problem",[]) problems = Problem.objects.filter(problem_id__in=target) @@ -85,9 +87,9 @@ def one_problem(request,problem_id: int): testcases = Testcase.objects.filter(problem_id=problem_id) if request.method == GET: - result = model_to_dict(problem) - account = Account.objects.get(account_id=result['account']) - return Response({**result,'testcases':[model_to_dict(i) for i in testcases],'creator': model_to_dict(account)},status=status.HTTP_200_OK) + problem_serialize = ProblemPopulateAccountSerializer(problem) + testcases_serialize = TestcaseSerializer(testcases,many=True) + return Response({**problem_serialize.data,'testcases': testcases_serialize.data},status=status.HTTP_200_OK) elif request.method == PUT: problem.title = request.data.get("title",problem.title) @@ -98,26 +100,31 @@ def one_problem(request,problem_id: int): problem.is_private = request.data.get("is_private",problem.is_private) if 'testcases' in request.data: - checked = checker(1,problem.solution,request.data['testcases'],request.data.get('time_limit',1.5)) - if checked['has_error'] or checked['has_timeout']: + program_output = PythonGrader(problem.solution,request.data['testcases'],1,1.5).generate_output() + + if sum([1 for i in program_output if i.runtime_status != "OK"]) > 0: return Response({'detail': 'Error during editing. Your code may has an error/timeout!'},status=status.HTTP_406_NOT_ACCEPTABLE) testcases.delete() testcase_result = [] - for unit in checked['result']: + for unit in program_output: testcase = Testcase( - problem_id = problem, - input = unit['input'], - output = unit['output'] + problem = problem, + input = unit.input, + output = unit.output ) testcase.save() - testcase_result.append(model_to_dict(testcase)) + testcase_result.append(testcase) problem.save() - return Response({'detail': 'Problem has been edited!','problem': model_to_dict(problem),'testcase': testcase_result},status=status.HTTP_201_CREATED) + problem_serialize = ProblemSerializer(problem) + testcases_serialize = TestcaseSerializer(testcase_result,many=True) + + return Response({**problem_serialize.data,'testcases': testcases_serialize.data},status=status.HTTP_201_CREATED) problem.save() - return Response({'detail': 'Problem has been edited!','problem': model_to_dict(problem)},status=status.HTTP_201_CREATED) + problem_serialize = ProblemSerializer(problem) + return Response(problem_serialize.data,status=status.HTTP_201_CREATED) elif request.method == DELETE: problem.delete() diff --git a/api/views/submission.py b/api/views/submission.py index 509bc3e..576b745 100644 --- a/api/views/submission.py +++ b/api/views/submission.py @@ -118,4 +118,4 @@ def view_all_submission(request): submission = submission.order_by('-date') serialize = SubmissionPoplulateProblemSerializer(submission,many=True) - return Response({"result": serialize.data},status=status.HTTP_200_OK) \ No newline at end of file + return Response({"submissions": serialize.data},status=status.HTTP_200_OK) \ No newline at end of file From ff8952d05ad6d8b4a05e78ab69bc1baedc696b1d Mon Sep 17 00:00:00 2001 From: KanonKC Date: Sun, 12 Nov 2023 20:18:31 +0700 Subject: [PATCH 2/2] MOD-48,53: Fixed response format --- api/views/collection.py | 4 ++-- api/views/topic.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/views/collection.py b/api/views/collection.py index 0df57b5..bac5146 100644 --- a/api/views/collection.py +++ b/api/views/collection.py @@ -65,7 +65,7 @@ def one_collection(request,collection_id:int): populated_problems.append({**col_prob_serialize.data,**prob_serialize.data}) return Response({ - 'collection': collection_ser.data, + **collection_ser.data, 'problems': sorted(populated_problems,key=lambda problem: problem['order']) } ,status=status.HTTP_200_OK) @@ -110,7 +110,7 @@ def collection_problems(request,collection_id:int,method:str): collection_serialize = CollectionSerializer(collection) return Response({ - 'collection': collection_serialize.data, + **collection_serialize.data, 'problems': populated_problems },status=status.HTTP_201_CREATED) diff --git a/api/views/topic.py b/api/views/topic.py index 24c7e03..1d25201 100644 --- a/api/views/topic.py +++ b/api/views/topic.py @@ -63,7 +63,7 @@ def one_topic(request,topic_id:int): accessedAccountsSerialize = AccountSecureSerializer(accessedAccounts,many=True) return Response({ - "topic": topic_ser.data, + **topic_ser.data, "collections": sorted(populate_collections,key=lambda collection: collection['order']), "accessed_accounts": accessedAccountsSerialize.data },status=status.HTTP_200_OK) @@ -103,7 +103,7 @@ def topic_collection(request,topic_id:int,method:str): populated_collections.append(tc_serialize.data) return Response({ - "topic": TopicSerializer(topic).data, + **TopicSerializer(topic).data, "collections": populated_collections },status=status.HTTP_201_CREATED)