sprint/Main/views/TaskSettingsView.py
2022-03-25 19:25:36 +03:00

146 lines
5.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.http import HttpResponse
from django.utils import timezone
from Main.models import ExtraFile, Dump, Task
from SprintLib.BaseView import BaseView, AccessError
from SprintLib.queue import send_to_queue
class TaskSettingsView(BaseView):
view_file = "task_settings.html"
required_login = True
endpoint = "admin/task"
task: Task
def pre_handle(self):
if self.request.user != self.task.creator and self.request.user.username not in self.task.editors:
raise AccessError()
def get(self):
self.context["error_message"] = self.request.GET.get("error_message", "")
def post(self):
for key, value in self.request.POST.items():
setattr(self.task, key, value.strip())
self.task.public = "public" in self.request.POST
self.task.changes.append({
'username': self.request.user.username,
'action': 'Отредактировал условия',
'time': timezone.now().strftime("%d-%m-%Y %H:%M:%S")
})
self.task.save()
return f"/admin/task?task_id={self.task.id}"
def post_dump(self):
dump = Dump.objects.create(executor=self.request.user, task=self.task)
send_to_queue("files", {"id": dump.id})
return f"/admin/task?task_id={self.task.id}"
def _upload(self, is_test):
filename = self.request.FILES["file"].name
ef, created = None, None
if is_test:
name = filename.strip(".a")
if not name.isnumeric():
return f"/admin/task?task_id={self.task.id}&error_message=Формат файла не соответствует тесту"
ef, created = ExtraFile.objects.get_or_create(
task=self.task, is_test=True, filename=filename
)
if not created:
ef.is_sample = False
ef.save()
return f"/admin/task?task_id={self.task.id}"
if ef is None or created is None:
ef, created = ExtraFile.objects.get_or_create(
task=self.task, filename=filename, is_test=is_test
)
ef.write(self.request.FILES["file"].read())
try:
var = ef.text
ef.readable = True
except UnicodeDecodeError:
ef.readable = False
ef.save()
self.task.changes.append({
'username': self.request.user.username,
'action': f'Загрузил файл {filename}',
'time': timezone.now().strftime("%d-%m-%Y %H:%M:%S")
})
self.task.save()
return "/admin/task?task_id=" + str(self.task.id)
def post_file_upload(self):
return self._upload(False)
def post_test_upload(self):
return self._upload(True)
def post_delete_file(self):
ef = ExtraFile.objects.get(id=self.request.POST["id"])
ef.delete()
self.task.changes.append({
'username': self.request.user.username,
'action': f'Удалил файл {ef.filename}',
'time': timezone.now().strftime("%d-%m-%Y %H:%M:%S")
})
self.task.save()
return HttpResponse("ok")
def _create(self, is_test):
name = self.request.POST["newfile_name"]
ef, created = ExtraFile.objects.get_or_create(
filename=name, task=self.task
)
if not created:
return f"/admin/task?task_id={self.task.id}&error_message=Файл с таким именем уже существует"
ef.write(b"")
ef.is_test = is_test
ef.readable = True
ef.save()
self.task.changes.append({
'username': self.request.user.username,
'action': f'Создал файл {ef.filename}',
'time': timezone.now().strftime("%d-%m-%Y %H:%M:%S")
})
self.task.save()
return f"/admin/task?task_id={self.task.id}"
def post_create_file(self):
return self._create(False)
def post_create_test(self):
return self._create(True)
def post_save_test(self):
ef = ExtraFile.objects.get(id=self.request.POST["test_id"])
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()
self.task.changes.append({
'username': self.request.user.username,
'action': f'Отредактировал файл {ef.filename}',
'time': timezone.now().strftime("%d-%m-%Y %H:%M:%S")
})
self.task.save()
return f"/admin/task?task_id={self.task.id}"
def post_users_edit(self):
current_users = self.task.editors
for key, value in self.request.POST.items():
if key.startswith("user_"):
i = '_'.join(key.split("_")[1:])
if i not in current_users:
self.task.editors.append(i)
to_delete = [i for i in current_users if "user_" + i not in self.request.POST and i != self.request.user.username]
for t in to_delete:
self.task.editors.remove(t)
self.task.changes.append({
'username': self.request.user.username,
'action': f'Изменил список редакторов',
'time': timezone.now().strftime("%d-%m-%Y %H:%M:%S")
})
self.task.save()
return "/admin/task?task_id=" + str(self.task.id)