diff --git a/Checker/urls.py b/Checker/urls.py index 2a20f34..bbf4279 100644 --- a/Checker/urls.py +++ b/Checker/urls.py @@ -7,4 +7,5 @@ urlpatterns = [ path("available", views.available), path("get_dynamic", views.get_dynamic), path("set_result", views.set_result), + path("current_test", views.current_test), ] diff --git a/Checker/views.py b/Checker/views.py index 26d432e..e59b61c 100644 --- a/Checker/views.py +++ b/Checker/views.py @@ -76,3 +76,17 @@ def set_result(request): return JsonResponse({"status": True}) except ObjectDoesNotExist: return JsonResponse({"status": "incorrect token"}, status=403) + + +def current_test(request): + try: + checker = Checker.objects.get(dynamic_token=request.GET['token']) + solution = Solution.objects.get(id=request.GET['solution_id']) + if checker.set != solution.set: + return JsonResponse({"status": "incorrect solution"}, status=403) + test = int(request.GET['test']) + solution.test = test + solution.save() + return JsonResponse({"status": True}) + except ObjectDoesNotExist: + return JsonResponse({"status": "incorrect token"}, status=403) diff --git a/CheckerExecutor/main.py b/CheckerExecutor/main.py index f004167..dc5074e 100644 --- a/CheckerExecutor/main.py +++ b/CheckerExecutor/main.py @@ -14,14 +14,14 @@ from testers import * host = "http://dev.sprinthub.ru/" -def process_solution(path, data, language_id, solution_id, timeout): +def process_solution(path, data, language_id, solution_id, timeout, token, host): with open(join(path, "package.zip"), 'wb') as fs: fs.write(data) with ZipFile(join(path, "package.zip"), 'r') as zip_ref: zip_ref.extractall(path) language = languages[language_id] try: - result = eval(language.work_name + "Tester")(path, solution_id, language_id, timeout).execute() + result = eval(language.work_name + "Tester")(path, solution_id, language_id, timeout, token, host).execute() except Exception as e: print(str(e)) result = "TE" @@ -61,6 +61,8 @@ def main(): int(data.headers['language_id']), int(data.headers['solution_id']), int(data.headers['timeout']), + dynamic_token, + host ) get(f"{host}checker/set_result", params={ "token": dynamic_token, diff --git a/CheckerExecutor/testers/BaseTester.py b/CheckerExecutor/testers/BaseTester.py index 8df24ac..5d279a6 100644 --- a/CheckerExecutor/testers/BaseTester.py +++ b/CheckerExecutor/testers/BaseTester.py @@ -3,6 +3,9 @@ from os.path import join, exists from subprocess import call, TimeoutExpired from language import * +from requests import get + +from SprintLib.language import languages class TestException(Exception): @@ -78,11 +81,13 @@ class BaseTester: def language(self): return languages[self.language_id] - def __init__(self, path, solution_id, language_id, timeout): + def __init__(self, path, solution_id, language_id, timeout, token, host): self.solution_id = solution_id self._path = path self.language_id = language_id self.timeout = timeout + self.token = token + self.host = host def execute(self): docker_command = f"docker run --name solution --volume={self.path}:/{self.working_directory} -t -d {self.language.image}" @@ -101,6 +106,7 @@ class BaseTester: if not file.endswith(".a") and exists(join(self.path, file + '.a')): self.predicted = open(join(self.path, file + '.a'), 'r').read().strip().replace('\r\n', '\n') print('predicted:', self.predicted) + get(f"{self.host}checker/current_test", params={"token": self.token, 'test': file}) self.test(file) self.after_test() result = "OK"