set settings
This commit is contained in:
parent
f836f37f55
commit
375426dd38
@ -17,6 +17,18 @@ class Set(models.Model):
|
|||||||
end_time = models.DateTimeField(default=None, null=True)
|
end_time = models.DateTimeField(default=None, null=True)
|
||||||
editors = ArrayField(models.TextField(), default=list)
|
editors = ArrayField(models.TextField(), default=list)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def start_time_format(self):
|
||||||
|
if self.start_time is None:
|
||||||
|
return None
|
||||||
|
return self.start_time.astimezone(timezone.get_current_timezone()).strftime("%Y-%m-%dT%H:%M")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def end_time_format(self):
|
||||||
|
if self.end_time is None:
|
||||||
|
return None
|
||||||
|
return self.end_time.astimezone(timezone.get_current_timezone()).strftime("%Y-%m-%dT%H:%M")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def available(self):
|
def available(self):
|
||||||
return (
|
return (
|
||||||
|
@ -1,35 +1,86 @@
|
|||||||
from django.db.models import Q
|
import datetime
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
from Main.models import SetTask, Task
|
import pytz
|
||||||
from SprintLib.BaseView import BaseView
|
from django.utils import timezone
|
||||||
|
|
||||||
|
from Main.models import SetTask, Set
|
||||||
|
from SprintLib.BaseView import BaseView, AccessError
|
||||||
|
|
||||||
|
|
||||||
class SetSettingsView(BaseView):
|
class SetSettingsView(BaseView):
|
||||||
required_login = True
|
required_login = True
|
||||||
view_file = "set_settings.html"
|
view_file = "set_settings.html"
|
||||||
endpoint = "admin/set"
|
endpoint = "admin/set"
|
||||||
|
current_set: Optional[Set] = None
|
||||||
|
|
||||||
|
def pre_handle(self):
|
||||||
|
self.current_set = self.entities.set
|
||||||
|
if (
|
||||||
|
self.request.user != self.current_set.creator
|
||||||
|
and self.request.user.username not in self.current_set.editors
|
||||||
|
):
|
||||||
|
raise AccessError()
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
self.context['settasks'] = SetTask.objects.filter(set=self.entities.set).order_by('name')
|
self.context["settasks"] = SetTask.objects.filter(
|
||||||
|
set=self.current_set
|
||||||
|
).order_by("name")
|
||||||
|
self.context["start_time"] = (
|
||||||
|
self.current_set.start_time_format
|
||||||
|
if self.current_set.start_time
|
||||||
|
else timezone.now().strftime("%Y-%m-%dT%H:%M")
|
||||||
|
)
|
||||||
|
self.context["end_time"] = (
|
||||||
|
self.current_set.end_time_format
|
||||||
|
if self.current_set.end_time
|
||||||
|
else timezone.now().strftime("%Y-%m-%dT%H:%M")
|
||||||
|
)
|
||||||
|
|
||||||
def post_save(self):
|
def post_save(self):
|
||||||
for key, value in self.request.POST.items():
|
for key, value in self.request.POST.items():
|
||||||
if key.startswith('settask_'):
|
if key.startswith("settask_"):
|
||||||
st = SetTask.objects.get(id=key.split('_')[1])
|
st = SetTask.objects.get(id=key.split("_")[1])
|
||||||
st.name = value
|
st.name = value
|
||||||
st.save()
|
st.save()
|
||||||
self.entities.set.name = self.request.POST['name']
|
self.current_set.name = self.request.POST["name"]
|
||||||
self.entities.set.save()
|
self.current_set.save()
|
||||||
return '/admin/set?set_id=' + str(self.entities.set.id)
|
return "/admin/set?set_id=" + str(self.current_set.id)
|
||||||
|
|
||||||
def post_edit(self):
|
def post_edit(self):
|
||||||
current_tasks = self.entities.set.tasks
|
current_tasks = self.entities.set.tasks
|
||||||
task_ids = [task.id for task in current_tasks]
|
task_ids = [task.id for task in current_tasks]
|
||||||
for key, value in self.request.POST.items():
|
for key, value in self.request.POST.items():
|
||||||
if key.startswith('task_'):
|
if key.startswith("task_"):
|
||||||
i = int(key.split('_')[1])
|
i = int(key.split("_")[1])
|
||||||
if i not in task_ids:
|
if i not in task_ids:
|
||||||
SetTask.objects.create(set=self.entities.set, task_id=i)
|
SetTask.objects.create(set=self.entities.set, task_id=i)
|
||||||
to_delete = [i for i in task_ids if 'task_' + str(i) not in self.request.POST]
|
to_delete = [i for i in task_ids if "task_" + str(i) not in self.request.POST]
|
||||||
SetTask.objects.filter(task_id__in=to_delete).delete()
|
SetTask.objects.filter(task_id__in=to_delete).delete()
|
||||||
return '/admin/set?set_id=' + str(self.entities.set.id)
|
return "/admin/set?set_id=" + str(self.entities.set.id)
|
||||||
|
|
||||||
|
def post_time(self):
|
||||||
|
try:
|
||||||
|
tz = pytz.timezone("Europe/Moscow")
|
||||||
|
if "start_time_check" in self.request.POST:
|
||||||
|
self.current_set.start_time = None
|
||||||
|
else:
|
||||||
|
self.current_set.start_time = tz.localize(
|
||||||
|
datetime.datetime.strptime(
|
||||||
|
self.request.POST["start_time"], "%Y-%m-%dT%H:%M"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if "end_time_check" in self.request.POST:
|
||||||
|
self.current_set.end_time = None
|
||||||
|
else:
|
||||||
|
self.current_set.end_time = tz.localize(
|
||||||
|
datetime.datetime.strptime(
|
||||||
|
self.request.POST["end_time"], "%Y-%m-%dT%H:%M"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.current_set.opened = 'opened' in self.request.POST.keys()
|
||||||
|
self.current_set.public = 'public' in self.request.POST.keys()
|
||||||
|
except ValueError:
|
||||||
|
return "/admin/set?set_id=" + str(self.current_set.id)
|
||||||
|
self.current_set.save()
|
||||||
|
return "/admin/set?set_id=" + str(self.current_set.id)
|
||||||
|
@ -2,11 +2,18 @@
|
|||||||
|
|
||||||
{% block title %}{{ set.name }}{% endblock %}
|
{% block title %}{{ set.name }}{% endblock %}
|
||||||
|
|
||||||
|
{% block scripts %}
|
||||||
|
function handle(value) {
|
||||||
|
const elem = document.getElementById(value);
|
||||||
|
elem.hidden = !elem.hidden;
|
||||||
|
}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block main %}
|
{% block main %}
|
||||||
<form method="POST">
|
<form method="POST">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="hidden" name="action" value="save">
|
<input type="hidden" name="action" value="save">
|
||||||
<h2><input name="name" value="{{ set.name }}"></h2>
|
<h3><input name="name" value="{{ set.name }}"></h3>
|
||||||
<h4>Таски</h4>
|
<h4>Таски</h4>
|
||||||
{% for settask in settasks %}
|
{% for settask in settasks %}
|
||||||
<input name="settask_{{ settask.id }}" style="width: 30px;" value="{{ settask.name }}"> {% if settask.task.creator == user or user.username in settask.task.editors %}<a href="/admin/task?task_id={{ settask.task.id }}">{{ settask.task.name }}</a>{% else %}{{ settask.task.name }}{% endif %}<br>
|
<input name="settask_{{ settask.id }}" style="width: 30px;" value="{{ settask.name }}"> {% if settask.task.creator == user or user.username in settask.task.editors %}<a href="/admin/task?task_id={{ settask.task.id }}">{{ settask.task.name }}</a>{% else %}{{ settask.task.name }}{% endif %}<br>
|
||||||
@ -45,18 +52,22 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr><hr>
|
<hr><hr>
|
||||||
<h3>Время доступа</h3>
|
<h3>Настройки доступа</h3>
|
||||||
<h5>
|
<form method="POST">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="action" value="time">
|
||||||
|
Набор открыт для решения <input type="checkbox" name="opened" {% if set.opened %}checked{% endif %}><br>
|
||||||
|
Набор доступен всем пользователям <input type="checkbox" name="public" {% if set.public %}checked{% endif %}>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-2">
|
<div class="col-2">
|
||||||
<p>
|
<p>
|
||||||
Время начала<br>
|
Время начала<br>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Без ограничений <input type="checkbox">
|
Без ограничений <input type="checkbox" name="start_time_check" onclick="handle('start_time');" {% if not set.start_time %}checked{% endif %}>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p id="start_time" {% if not set.start_time %}hidden{% endif %}>
|
||||||
<input type="datetime-local" value="">
|
<input type="datetime-local" name="start_time" value="{{ start_time }}">
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-2">
|
<div class="col-2">
|
||||||
@ -64,12 +75,14 @@
|
|||||||
Время окончания<br>
|
Время окончания<br>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Без ограничений <input type="checkbox">
|
Без ограничений <input type="checkbox" name="end_time_check" onclick="handle('end_time')" {% if not set.end_time %}checked{% endif %}>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p id="end_time" {% if not set.end_time %}hidden{% endif %}>
|
||||||
<input type="datetime-local">
|
<input type="datetime-local" name="end_time" value="{{ end_time }}">
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</h5>
|
<button class="btn btn-light"><i class="fa fa-save"></i> Сохранить</button>
|
||||||
|
</form>
|
||||||
|
<hr><hr>
|
||||||
{% endblock %}
|
{% endblock %}
|
Loading…
Reference in New Issue
Block a user