sprint/Main/views/TaskView.py
Administrator 46115bb3ce db prod
2022-08-21 19:21:01 +03:00

84 lines
3.1 KiB
Python

import io
from typing import Optional
from zipfile import ZipFile
from Main.models import Solution, Progress, SolutionFile, SetTask, Task, Set
from SprintLib.BaseView import BaseView, AccessError
from SprintLib.language import languages
from SprintLib.utils import write_bytes, send_testing
class TaskView(BaseView):
required_login = True
view_file = "task.html"
endpoint = "task"
setTask: Optional[SetTask] = None
task: Optional[Task] = None
set: Optional[Set] = None
def get(self):
progress, _ = Progress.objects.get_or_create(
user=self.request.user, task=self.task
)
self.context["progress"] = progress
self.context["in_set"] = self.set is not None
def pre_handle(self):
if self.setTask:
self.set = self.setTask.set
self.task = self.setTask.task
self.context['set'] = self.set
self.context['task'] = self.task
self.context['languages'] = self.set.language_models
else:
if not self.task.public and self.task.creator != self.request.user and self.request.user.username not in self.task.editors:
raise AccessError()
self.context['languages'] = languages
if self.request.method == "GET":
return
if self.set and int(self.request.POST["language"]) not in self.set.languages:
raise AccessError()
self.solution = Solution.objects.create(
task=self.task,
user=self.request.user,
language_id=int(self.request.POST["language"]),
set=self.set,
)
def post_0(self):
# отправка решения через текст
fs_id = write_bytes(self.request.POST["code"].encode("utf-8"))
SolutionFile.objects.create(
path="solution." + self.solution.language.file_type,
solution=self.solution,
fs_id=fs_id,
)
send_testing(self.solution)
return ("/task?setTask_id=" + str(self.setTask.id)) if self.set else ("/task?task_id=" + str(self.task.id))
def post_1(self):
# отправка решения через файл
if "file" not in self.request.FILES:
return "task?task_id=" + str(self.task.id)
filename = self.request.FILES["file"].name
if filename.endswith(".zip"):
archive = ZipFile(io.BytesIO(self.request.FILES["file"].read()))
for file in archive.infolist():
if file.is_dir():
continue
fs_id = write_bytes(archive.read(file.filename))
SolutionFile.objects.create(
path=file.filename,
solution=self.solution,
fs_id=fs_id,
)
else:
fs_id = write_bytes(self.request.FILES["file"].read())
SolutionFile.objects.create(
path=filename,
solution=self.solution,
fs_id=fs_id,
)
send_testing(self.solution)
return ("/task?setTask_id=" + str(self.setTask.id)) if self.set else ("/task?task_id=" + str(self.task.id))