From 945411f21a9572595247d3c26428f694b999f89d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Thu, 30 Jul 2020 13:24:23 +0200
Subject: [PATCH] Scheduling: Load resources dynamically

---
 AKModel/urls.py                               |  5 ++++
 AKScheduling/api.py                           | 25 +++++++++++++++++++
 .../admin/AKScheduling/scheduling.html        |  9 +------
 AKScheduling/views.py                         |  2 --
 4 files changed, 31 insertions(+), 10 deletions(-)
 create mode 100644 AKScheduling/api.py

diff --git a/AKModel/urls.py b/AKModel/urls.py
index a469c54f..b2cffbea 100644
--- a/AKModel/urls.py
+++ b/AKModel/urls.py
@@ -1,3 +1,4 @@
+from django.apps import apps
 from django.urls import include, path
 from rest_framework.routers import DefaultRouter
 
@@ -11,6 +12,10 @@ api_router.register('ak', views.AKViewSet, basename='AK')
 api_router.register('room', views.RoomViewSet, basename='Room')
 api_router.register('akslot', views.AKSlotViewSet, basename='AKSlot')
 
+if apps.is_installed("AKScheduling"):
+    from AKScheduling.api import ResourcesViewSet
+    api_router.register('scheduling-resources', ResourcesViewSet, basename='scheduling-resources')
+
 app_name = 'model'
 
 urlpatterns = [
diff --git a/AKScheduling/api.py b/AKScheduling/api.py
new file mode 100644
index 00000000..110b50fa
--- /dev/null
+++ b/AKScheduling/api.py
@@ -0,0 +1,25 @@
+from rest_framework import viewsets, permissions, mixins, serializers
+
+from AKModel.models import Room
+from AKModel.views import EventSlugMixin
+
+
+class ResourceSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Room
+        fields = ['id', 'title']
+
+    title = serializers.SerializerMethodField('transform_title')
+
+    def transform_title(self, obj):
+        if obj.capacity > 0:
+            return f"{obj.title} [{obj.capacity}]"
+        return obj.title
+
+
+class ResourcesViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
+    permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,)
+    serializer_class = ResourceSerializer
+
+    def get_queryset(self):
+        return Room.objects.filter(event=self.event)
diff --git a/AKScheduling/templates/admin/AKScheduling/scheduling.html b/AKScheduling/templates/admin/AKScheduling/scheduling.html
index 8c4faf98..66da8585 100644
--- a/AKScheduling/templates/admin/AKScheduling/scheduling.html
+++ b/AKScheduling/templates/admin/AKScheduling/scheduling.html
@@ -83,14 +83,7 @@
                 eventColor: '#127ba3',
                 datesAboveResources: true,
                 resourceAreaHeaderContent: '{% trans "Room" %}',
-                resources: [
-                            {% for room in rooms %}
-                                {
-                                    'id': '{{ room.title }}',
-                                    'title': '{{ room.title }}',
-                                },
-                            {% endfor %}
-                        ],
+                resources: '{% url "model:scheduling-resources-list" event_slug=event.slug %}',
                 events: [
                         {% for slot in akslots %}
                             {% if slot.start %}
diff --git a/AKScheduling/views.py b/AKScheduling/views.py
index fd30864c..61d4e2ae 100644
--- a/AKScheduling/views.py
+++ b/AKScheduling/views.py
@@ -33,8 +33,6 @@ class SchedulingAdminView(AdminViewMixin, FilterByEventSlugMixin, ListView):
         context["start"] = self.event.start
         context["end"] = self.event.end
 
-        context["rooms"] = self.event.room_set.all()
-
         context["availabilities"] = Availability.objects.filter(event=self.event, room__isnull=False)
 
         return context
-- 
GitLab