Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions api/controllers/problem/get_all_problems_by_account.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,30 @@ 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))
query = request.query_params.get("query","")
if end == -1: end = None

personalProblems = Problem.objects.filter(creator=account).order_by('-updated_date')
personalProblems = Problem.objects.filter(creator=account, title__icontains=query).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')
manageableProblems = Problem.objects.filter(
problemgrouppermission__permission_manage_problems=True,
problemgrouppermission__group__in=GroupMember.objects.filter(account=account).values_list("group",flat=True),
title__icontains=query
).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)

# problem_ser = ProblemPopulateTestcaseSerializer(problems,many=True)
personalSerialize = ProblemPopulateTestcaseSerializer(personalProblems,many=True)
manageableSerialize = ProblemPopulateTestcaseSerializer(manageableProblems,many=True)
personalSerialize = ProblemPopulatePartialTestcaseSerializer(personalProblems,many=True)
manageableSerialize = ProblemPopulatePartialTestcaseSerializer(manageableProblems,many=True)

return Response({
"start":start,
Expand Down
12 changes: 11 additions & 1 deletion api/controllers/problem/update_problem_difficulty.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,21 @@
from rest_framework import status
from django.forms.models import model_to_dict
from ...serializers import *
import pandas as pd
from ...difficulty_predictor.preprocess import *
from ...difficulty_predictor.predictor import *

try:
import pandas as pd
pd.options.mode.chained_assignment = None
success = True
except:
success = False

def update_problem_difficulty(problem:Problem):

if not success:
return

submissions = Submission.objects.filter(problem=problem)

if submissions.count() < 10:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,22 @@
from django.forms.models import model_to_dict
from ...serializers import *

def get_all_submissions_by_creator_problem(problem:Problem):
def get_all_submissions_by_creator_problem(problem:Problem, request):

start = int(request.query_params.get("start",0))
end = int(request.query_params.get("end",-1))
# query = request.query_params.get("query","")
if end == -1: end = None

submissions = Submission.objects.filter(problem=problem)
total = submissions.count()


if submissions.count() == 0:
return Response({"submissions": []},status=status.HTTP_204_NO_CONTENT)

submissions = submissions.order_by('-date')
submissions = submissions[start:end]

result = []

Expand All @@ -23,6 +32,15 @@ def get_all_submissions_by_creator_problem(problem:Problem):
submission.runtime_output = submission_testcases
result.append(submission)

problem.testcases = Testcase.objects.filter(problem=problem,deprecated=False)

submissions_serializer = SubmissionPopulateSubmissionTestcaseAndAccountSerializer(result,many=True)
problem_serializer = ProblemPopulateTestcaseSerializer(problem)

return Response({"submissions": submissions_serializer.data},status=status.HTTP_200_OK)
return Response({
"problem": problem_serializer.data,
"submissions": submissions_serializer.data,
"start": start,
"end": end,
"total": total,
},status=status.HTTP_200_OK)
15 changes: 10 additions & 5 deletions api/difficulty_predictor/predictor.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import pickle

# Read sav

with open('./api/difficulty_predictor/difficulty_predictor_667.sav', 'rb') as f:
difficulty = pickle.load(f)
try:
import pickle
with open('./api/difficulty_predictor/difficulty_predictor_667.sav', 'rb') as f:
difficulty = pickle.load(f)
except:
print("Error during loading difficulty_predictor_667.sav")
difficulty = None
pass

# Predict some model

def predict(avg_first_passed_total_attempts,avg_first_passed_time_used):
if not difficulty:
return 0
return int(difficulty.predict([[avg_first_passed_total_attempts,avg_first_passed_time_used]])[0])
12 changes: 10 additions & 2 deletions api/difficulty_predictor/preprocess.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import pandas as pd
pd.options.mode.chained_assignment = None
try:
import pandas as pd
pd.options.mode.chained_assignment = None
success = True
except:
success = False

def modelgrader_preprocessor(submission_df):

if not success:
return [-1,-1]

submission_df = submission_df[['account_id', 'problem_id','is_passed','language','date','submission_code','passed_ratio']]

# Change submission_code to string
Expand Down
18 changes: 18 additions & 0 deletions api/migrations/0054_problem_pdf_url.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.1.2 on 2024-11-11 08:43

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('api', '0053_problem_difficulty'),
]

operations = [
migrations.AddField(
model_name='problem',
name='pdf_url',
field=models.FileField(blank=True, default=None, null=True, upload_to='import-pdf/'),
),
]
1 change: 1 addition & 0 deletions api/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class Problem(models.Model):
updated_date = models.DateTimeField(default=timezone.now)
sharing = models.BooleanField(default=False,blank=True)
allowed_languages = models.CharField(max_length=1000,blank=True,default="")
pdf_url = models.FileField(upload_to='import-pdf/',null=True,blank=True,default=None)
difficulty = models.IntegerField(default=0,blank=True)

class Testcase(models.Model):
Expand Down
41 changes: 41 additions & 0 deletions api/sandbox/container.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import sys
import resource
import pyseccomp as seccomp


MEMORY_LIMIT = 64 * 1024 * 1024 # 64kb
CPU_TIME_LIMIT = 1 # 1sec
WRITE_LIMIT = 512 # 512bytes


def drop_perms():
# respond with EPERM: operation not permitted so users can tell
# they're being blocked from doing something
filter = seccomp.SyscallFilter(seccomp.ERRNO(seccomp.errno.EPERM))

# allow `write`ing to two already-opened files stdout and stderr
filter.add_rule(
seccomp.ALLOW, "write", seccomp.Arg(0, seccomp.EQ, sys.stdout.fileno())
)
filter.add_rule(
seccomp.ALLOW, "write", seccomp.Arg(0, seccomp.EQ, sys.stderr.fileno())
)

# load the filter in the kernel
filter.load()


def set_mem_limit():
# virtual memory
resource.setrlimit(resource.RLIMIT_AS, (MEMORY_LIMIT, MEMORY_LIMIT))
# cpu time
resource.setrlimit(resource.RLIMIT_CPU, (CPU_TIME_LIMIT, CPU_TIME_LIMIT))
# write limit i.e. don't allow an infinite stream to stdout/stderr
resource.setrlimit(resource.RLIMIT_FSIZE, (WRITE_LIMIT, WRITE_LIMIT))


if __name__ == "__main__":
code = sys.argv[1]
set_mem_limit()
drop_perms()
exec(code)
1 change: 1 addition & 0 deletions api/sandbox/grader.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
Usecases:
- Create problem
- Update code

- Update testcases
- Submit problem
"""
Expand Down
12 changes: 12 additions & 0 deletions api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,18 @@ class Meta:
model = Testcase
fields = "__all__"

class TestcasePartialSerializer(serializers.ModelSerializer):
class Meta:
model = Testcase
fields = ['testcase_id','runtime_status']
class ProblemPopulatePartialTestcaseSerializer(serializers.ModelSerializer):
creator = AccountSecureSerializer()
testcases = TestcasePartialSerializer(many=True)
class Meta:
model = Problem
fields = "__all__"
# fields = ['problem_id','title','creator','testcases']
include = ['testcases']
class ProblemPopulateTestcaseSerializer(serializers.ModelSerializer):
creator = AccountSecureSerializer()
testcases = TestcaseSerializer(many=True)
Expand Down
1 change: 0 additions & 1 deletion api/views/script.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import pandas as pd
from api.utility import passwordEncryption
from rest_framework.response import Response
from rest_framework.decorators import api_view
Expand Down
2 changes: 1 addition & 1 deletion api/views/submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def account_problem_submission_view(request,problem_id,account_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)
return get_all_submissions_by_creator_problem(problem, request)

@api_view([GET])
def all_submission_view(request):
Expand Down