From d987b13da03083f1e2b0097638f9dbb122d7f86d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?= <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de> Date: Sat, 3 Dec 2022 00:45:59 +0100 Subject: [PATCH] Allow AKSlot creation via scheduler This implements #120 --- AKModel/views.py | 3 +- .../admin/AKScheduling/scheduling.html | 62 +++++++++++++++++++ AKScheduling/views.py | 3 + AKSubmission/forms.py | 11 ++++ 4 files changed, 78 insertions(+), 1 deletion(-) diff --git a/AKModel/views.py b/AKModel/views.py index 973ef0c8..fa923251 100644 --- a/AKModel/views.py +++ b/AKModel/views.py @@ -133,7 +133,8 @@ class RoomViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMix return Room.objects.filter(event=self.event) -class AKSlotViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): +class AKSlotViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, + mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,) serializer_class = AKSlotSerializer diff --git a/AKScheduling/templates/admin/AKScheduling/scheduling.html b/AKScheduling/templates/admin/AKScheduling/scheduling.html index 52be9830..fc07b69d 100644 --- a/AKScheduling/templates/admin/AKScheduling/scheduling.html +++ b/AKScheduling/templates/admin/AKScheduling/scheduling.html @@ -134,9 +134,19 @@ eventChange: updateEvent, eventReceive: updateEvent, editable: true, + selectable: true, drop: function (info) { info.draggedEl.parentNode.removeChild(info.draggedEl); }, + select: function (info) { + console.log(info); + $('#id_start').val(info.startStr); + $('#id_end').val(info.endStr); + $('#id_room').val(info.resource._resource.id); + $('#id_duration').val(Math.abs(info.end-info.start)/1000/60/60); + $('#id_ak').val(""); + $('#newAKSlotModal').modal('show'); + }, allDaySlot: false, nowIndicator: true, now: "{% timestamp_now event.timezone %}", @@ -232,11 +242,63 @@ } reloadBtn.click(reload); + + function addSlot() { + let ak = $('#id_ak').val(); + if(ak === "") { + alert("{% trans "Bitte AK auswählen" %}"); + } + else { + $.ajax({ + url: "{% url "model:AKSlot-list" event_slug=event.slug %}", + type: 'POST', + data: { + start: $('#id_start').val(), + duration: $('#id_duration').val(), + room: $('#id_room').val(), + ak: ak, + event: "{{ event.pk }}" + }, + success: function (response) { + $('#newAKSlotModal').modal('hide'); + reload(); + }, + error: function (response) { + console.error(response); + alert("{% trans 'Could not create slot' %}"); + } + }); + } + } + + $('#newAKSlotModalSubmitButton').click(addSlot); }); </script> </head> <body> + <div class="modal" id="newAKSlotModal"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title">{% trans "Add slot" %}</h5> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + <div class="modal-body"> + <form> + {% bootstrap_form akSlotAddForm %} + </form> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-primary" id="newAKSlotModalSubmitButton">{% trans "Add" %}</button> + <button type="button" class="btn btn-secondary" data-dismiss="modal">{% trans "Cancel" %}</button> + </div> + </div> + </div> + </div> + <div class="box p-3"> <div class="row header pb-2"> <div class="col"> diff --git a/AKScheduling/views.py b/AKScheduling/views.py index 0834c4f7..50c485a7 100644 --- a/AKScheduling/views.py +++ b/AKScheduling/views.py @@ -8,6 +8,7 @@ from django.views.generic import ListView, DetailView, UpdateView from AKModel.models import AKSlot, AKTrack, Event, AK, AKCategory from AKModel.views import AdminViewMixin, FilterByEventSlugMixin, EventSlugMixin, IntermediateAdminView from AKScheduling.forms import AKInterestForm +from AKSubmission.forms import AKAddSlotForm class UnscheduledSlotsAdminView(AdminViewMixin, FilterByEventSlugMixin, ListView): @@ -40,6 +41,8 @@ class SchedulingAdminView(AdminViewMixin, FilterByEventSlugMixin, ListView): context["start"] = self.event.start context["end"] = self.event.end + context["akSlotAddForm"] = AKAddSlotForm(self.event) + return context diff --git a/AKSubmission/forms.py b/AKSubmission/forms.py index 55959be4..ccd7398b 100644 --- a/AKSubmission/forms.py +++ b/AKSubmission/forms.py @@ -186,3 +186,14 @@ class AKOrgaMessageForm(forms.ModelForm): 'event': forms.HiddenInput, 'text': forms.Textarea, } + + +class AKAddSlotForm(forms.Form): + start = forms.CharField(label=_("Start"), disabled=True) + end = forms.CharField(label=_("End"), disabled=True) + duration = forms.CharField(label=_("Duration"), disabled=True) + room = forms.IntegerField(label=_("Room"), disabled=True) + + def __init__(self, event): + super().__init__() + self.fields['ak'] = forms.ModelChoiceField(event.ak_set.all(), label=_("AK")) -- GitLab