146 lines
5.4 KiB
Python
146 lines
5.4 KiB
Python
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)
|