From d68a5c6dd012f8aa8ac3072bc0a5659d5791f93d Mon Sep 17 00:00:00 2001 From: Egor Matveev Date: Sun, 20 Mar 2022 00:22:35 +0300 Subject: [PATCH] load dump --- Main/views/TasksView.py | 61 ++++++++++++++++++- daemons/management/commands/file_generator.py | 2 - templates/tasks.html | 9 ++- 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/Main/views/TasksView.py b/Main/views/TasksView.py index e00e856..b441707 100644 --- a/Main/views/TasksView.py +++ b/Main/views/TasksView.py @@ -1,5 +1,12 @@ -from Main.models import Task +import io +import json +from zipfile import ZipFile + +from django.db import transaction + +from Main.models import Task, ExtraFile from SprintLib.BaseView import BaseView +from SprintLib.utils import write_bytes, delete_file class TasksView(BaseView): @@ -11,3 +18,55 @@ class TasksView(BaseView): task_name = self.request.POST["name"] task = Task.objects.create(name=task_name, creator=self.request.user) return f"/admin/task?task_id={task.id}" + + def post_upload_file(self): + archive = ZipFile(io.BytesIO(self.request.FILES["file"].read())) + fs_ids = {} + created = True + try: + with transaction.atomic(): + task = Task(name='новый таск', creator=self.request.user) + for file in archive.infolist(): + if file.filename == 'meta.json': + continue + else: + bts = archive.read(file.filename) + fs_id = write_bytes(bts) + readable = True + try: + bts.decode('utf-8') + except UnicodeDecodeError: + readable = False + fs_ids[file.filename] = fs_id, readable + meta = json.loads(archive.read('meta.json').decode('utf-8')) + task_fields = [ + 'name', + 'public', + 'legend', + 'input_format', + 'output_format', + 'specifications', + 'time_limit', + 'time_estimation', + ] + for key in task_fields: + setattr(task, key, meta[key]) + task.save() + for file in meta['files']: + fs_id, readable = fs_ids[str(file['id'])] + ExtraFile.objects.create( + filename=file['filename'], + is_test=file['is_test'], + is_sample=file['is_sample'], + fs_id=fs_id, + readable=readable, + task=task, + ) + except Exception as e: + for fs_id in fs_ids.values(): + delete_file(fs_id[0]) + created = False + raise e + if created: + return f"/admin/task?task_id={task.id}" + return '/tasks' diff --git a/daemons/management/commands/file_generator.py b/daemons/management/commands/file_generator.py index 77e05d3..64d0741 100644 --- a/daemons/management/commands/file_generator.py +++ b/daemons/management/commands/file_generator.py @@ -30,8 +30,6 @@ class Command(MessagingSupport): 'filename', 'is_test', 'is_sample', - 'readable', - 'test_number' ] task_data['files'] = [ { diff --git a/templates/tasks.html b/templates/tasks.html index fc50ddf..f44000f 100644 --- a/templates/tasks.html +++ b/templates/tasks.html @@ -34,7 +34,10 @@ @@ -43,6 +46,10 @@ +
+ + {% csrf_token %} +
{% endif %}