From 2ed7a465aa99f2ef0cfd95c51b233a1cf2830db8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Fri, 31 Jul 2020 01:54:13 +0200
Subject: [PATCH] Scheduling: Allow to place previously unscheduled slots

---
 AKScheduling/api.py                           |  4 +--
 .../admin/AKScheduling/scheduling.html        | 27 +++++++++++++++++--
 AKScheduling/views.py                         |  5 +++-
 3 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/AKScheduling/api.py b/AKScheduling/api.py
index e54e75fd..84b62922 100644
--- a/AKScheduling/api.py
+++ b/AKScheduling/api.py
@@ -91,8 +91,8 @@ class EventSerializer(serializers.ModelSerializer):
     roomId = serializers.IntegerField(source='room.pk')
 
     def update(self, instance, validated_data):
-        start = timezone.make_aware(timezone.make_naive(validated_data.get('start', instance.start)), instance.event.timezone)
-        end = timezone.make_aware(timezone.make_naive(validated_data.get('end', instance.end)), instance.event.timezone)
+        start = timezone.make_aware(timezone.make_naive(validated_data.get('start')), instance.event.timezone)
+        end = timezone.make_aware(timezone.make_naive(validated_data.get('end')), instance.event.timezone)
         instance.start = start
         instance.room = get_object_or_404(Room, pk=validated_data.get('room')["pk"])
         diff = end - start
diff --git a/AKScheduling/templates/admin/AKScheduling/scheduling.html b/AKScheduling/templates/admin/AKScheduling/scheduling.html
index a17cb88b..1c45be59 100644
--- a/AKScheduling/templates/admin/AKScheduling/scheduling.html
+++ b/AKScheduling/templates/admin/AKScheduling/scheduling.html
@@ -2,6 +2,7 @@
 {% load tags_AKModel %}
 
 {% load i18n %}
+{% load l10n %}
 {% load tz %}
 {% load static %}
 {% load tags_AKPlan %}
@@ -19,6 +20,13 @@
         <script src="{% static locale_file %}"></script>
     {% endwith %}
 
+    <style>
+    .unscheduled-slot {
+        cursor: move;
+
+    }
+    </style>
+
     <script>
         document.addEventListener('DOMContentLoaded', function () {
             // CSRF Protection/Authentication
@@ -62,7 +70,7 @@
             // Calendar
             var planEl = document.getElementById('planCalendar');
 
-            var plan = new FullCalendar.Calendar(planEl, {
+            plan = new FullCalendar.Calendar(planEl, {
                 timeZone: '{{ event.timezone }}',
                 headerToolbar : {
                     left: 'today prev,next',
@@ -118,7 +126,12 @@
 
                 // React to event changes (moving or change of duration)
                 eventChange: updateEvent,
+                eventReceive: updateEvent,
                 editable: true,
+                dropable: true,
+                drop: function(info) {
+                    info.draggedEl.parentNode.removeChild(info.draggedEl);
+                },
                 allDaySlot: false,
                 nowIndicator: true,
                 eventTextColor: '#fff',
@@ -160,7 +173,17 @@
 
 {% block content %}
 
-    <div id="planCalendar" style="margin-bottom: 50px;"></div>
+    <div class="row" style="margin-bottom: 50px;">
+        <div class="col-md-10 col-lg-11">
+            <div id="planCalendar" ></div>
+        </div>
+        <div class="col-md-2 col-lg-1" id="unscheduled-slots">
+            {% for slot in slots_unscheduled %}
+                <div class="unscheduled-slot badge badge-primary" data-event='{ "title": "{{ slot.ak.short_name }}", "duration": {"hours": "{{ slot.duration|unlocalize }}"}, "description": "{{ slot.ak.name }}", "slotID": "{{ slot.pk }}"}'>{{ slot.ak.short_name }} ({{ slot.duration }} h)</div>
+            {% endfor %}
+        </div>
+    </div>
+
 
     <a href="{% url 'admin:event_status' event.slug %}">{% trans "Event Status" %}</a>
 {% endblock %}
diff --git a/AKScheduling/views.py b/AKScheduling/views.py
index c0649ab7..6bae0a31 100644
--- a/AKScheduling/views.py
+++ b/AKScheduling/views.py
@@ -23,7 +23,10 @@ class UnscheduledSlotsAdminView(AdminViewMixin, FilterByEventSlugMixin, ListView
 class SchedulingAdminView(AdminViewMixin, FilterByEventSlugMixin, ListView):
     template_name = "admin/AKScheduling/scheduling.html"
     model = AKSlot
-    context_object_name = "akslots"
+    context_object_name = "slots_unscheduled"
+
+    def get_queryset(self):
+        return super().get_queryset().filter(start__isnull=True)
 
     def get_context_data(self, *, object_list=None, **kwargs):
         context = super().get_context_data(object_list=object_list, **kwargs)
-- 
GitLab