load dump

This commit is contained in:
Egor Matveev 2022-03-20 00:22:35 +03:00
parent 41e55a74a6
commit d68a5c6dd0
3 changed files with 68 additions and 4 deletions

View File

@ -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.BaseView import BaseView
from SprintLib.utils import write_bytes, delete_file
class TasksView(BaseView): class TasksView(BaseView):
@ -11,3 +18,55 @@ class TasksView(BaseView):
task_name = self.request.POST["name"] task_name = self.request.POST["name"]
task = Task.objects.create(name=task_name, creator=self.request.user) task = Task.objects.create(name=task_name, creator=self.request.user)
return f"/admin/task?task_id={task.id}" 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'

View File

@ -30,8 +30,6 @@ class Command(MessagingSupport):
'filename', 'filename',
'is_test', 'is_test',
'is_sample', 'is_sample',
'readable',
'test_number'
] ]
task_data['files'] = [ task_data['files'] = [
{ {

View File

@ -34,7 +34,10 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-primary"><i class="fa fa-arrow-up"></i> Загрузить</button> <label for="file-upload" class="btn btn-primary">
<i class="fa fa-arrow-up"></i> Загрузить архив
</label>
<input type="file" form="fileform" style="display: none;" accept=".zip" class="btn form-control-file" id="file-upload" value="Выбрать файл" name="file" onchange="this.form.submit();">
<button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-times-circle"></i> Закрыть</button> <button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-times-circle"></i> Закрыть</button>
<button type="submit" class="btn btn-success"><i class="fa fa-plus-circle"></i> Создать</button> <button type="submit" class="btn btn-success"><i class="fa fa-plus-circle"></i> Создать</button>
</div> </div>
@ -43,6 +46,10 @@
</div> </div>
</div> </div>
</td> </td>
<form method="POST" enctype="multipart/form-data" id="fileform">
<input type="hidden" name="action" value="upload_file">
{% csrf_token %}
</form>
{% endif %} {% endif %}
</tr> </tr>
</table> </table>