filestorage

This commit is contained in:
Egor Matveev
2021-11-11 11:47:06 +03:00
parent a8111c45e9
commit edb58e23a3
22 changed files with 237 additions and 93 deletions

View File

@@ -45,11 +45,9 @@ class TaskSettingsView(BaseView):
filename=filename,
is_test=is_test
)
with open(ef.path, 'wb') as fs:
for chunk in self.request.FILES['file'].chunks():
fs.write(chunk)
ef.write(self.request.FILES['file'].read())
try:
open(ef.path, 'r').read()
var = ef.text
ef.readable = True
except UnicodeDecodeError:
ef.readable = False
@@ -73,8 +71,7 @@ class TaskSettingsView(BaseView):
ef, created = ExtraFile.objects.get_or_create(filename=name, task=self.entities.task)
if not created:
return f'/admin/task?task_id={self.entities.task.id}&error_message=Файл с таким именем уже существует'
with open(ef.path, 'w') as fs:
fs.write('')
ef.write(b"")
ef.is_test = is_test
ef.readable = True
ef.save()
@@ -88,8 +85,8 @@ class TaskSettingsView(BaseView):
def post_save_test(self):
ef = ExtraFile.objects.get(id=self.request.POST['test_id'])
with open(ef.path, 'w') as fs:
fs.write(self.request.POST['text'])
ef.remove_from_fs()
ef.write(self.request.POST['text'].encode('utf-8'))
ef.is_sample = 'is_sample' in self.request.POST.keys()
ef.save()
return f'/admin/task?task_id={self.entities.task.id}'

View File

@@ -1,11 +1,11 @@
import io
from zipfile import ZipFile
from os.path import join
from Main.models import Solution, Progress
from Main.models import Solution, Progress, SolutionFile
from SprintLib.BaseView import BaseView
from SprintLib.language import languages
from SprintLib.queue import send_testing
from SprintLib.testers import *
from SprintLib.utils import write_bytes
class TaskView(BaseView):
@@ -13,40 +13,54 @@ class TaskView(BaseView):
view_file = "task.html"
def get(self):
self.context['languages'] = sorted(languages, key=lambda x: x.name)
progress, _ = Progress.objects.get_or_create(user=self.request.user, task=self.entities.task)
self.context['progress'] = progress
self.context["languages"] = sorted(languages, key=lambda x: x.name)
progress, _ = Progress.objects.get_or_create(
user=self.request.user, task=self.entities.task
)
self.context["progress"] = progress
def pre_handle(self):
if self.request.method == 'GET':
if self.request.method == "GET":
return
self.solution = Solution.objects.create(
task=self.entities.task,
user=self.request.user,
language_id=int(self.request.POST["language"])
language_id=int(self.request.POST["language"]),
)
self.solution.create_dirs()
def post_0(self):
# отправка решения через текст
filename = 'solution.' + self.solution.language.file_type
file_path = join(self.solution.directory, filename)
with open(file_path, 'w') as fs:
fs.write(self.request.POST['code'])
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.id)
return "task?task_id=" + str(self.entities.task.id)
def post_1(self):
# отправка решения через файл
if 'file' not in self.request.FILES:
if "file" not in self.request.FILES:
return "task?task_id=" + str(self.entities.task.id)
filename = self.request.FILES['file'].name
file_path = join(self.solution.directory, filename)
with open(file_path, 'wb') as fs:
for chunk in self.request.FILES['file'].chunks():
fs.write(chunk)
if filename.endswith('.zip'):
with ZipFile(file_path) as obj:
obj.extractall(self.solution.directory)
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.id)
return "task?task_id=" + str(self.entities.task.id)