Add a REST API for the dashboard 99/21399/1
authormaxbr <maxbr@mi.fu-berlin.de>
Mon, 19 Sep 2016 08:14:19 +0000 (10:14 +0200)
committermaxbr <maxbr@mi.fu-berlin.de>
Mon, 19 Sep 2016 08:14:19 +0000 (10:14 +0200)
JIRA: PHAROS-265

Change-Id: Ic1b2d20415b0b84473d5915c4f26f3e65bbb1ecf
Signed-off-by: maxbr <maxbr@mi.fu-berlin.de>
tools/pharos-dashboard/api/__init__.py [new file with mode: 0644]
tools/pharos-dashboard/api/serializers.py [new file with mode: 0644]
tools/pharos-dashboard/api/urls.py [new file with mode: 0644]
tools/pharos-dashboard/api/views.py [new file with mode: 0644]
tools/pharos-dashboard/booking/models.py
tools/pharos-dashboard/dashboard/urls.py
tools/pharos-dashboard/pharos_dashboard/urls.py
tools/pharos-dashboard/templates/base.html
tools/pharos-dashboard/templates/rest_framework/api.html [new file with mode: 0644]

diff --git a/tools/pharos-dashboard/api/__init__.py b/tools/pharos-dashboard/api/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tools/pharos-dashboard/api/serializers.py b/tools/pharos-dashboard/api/serializers.py
new file mode 100644 (file)
index 0000000..c3875cc
--- /dev/null
@@ -0,0 +1,22 @@
+from rest_framework import serializers
+
+from booking.models import Booking
+from dashboard.models import Server, Resource
+
+
+class BookingSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = Booking
+        fields = ('id', 'resource', 'start', 'end', 'purpose')
+
+
+class ServerSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = Server
+        fields = ('id', 'resource', 'name', 'model', 'cpu', 'ram', 'storage')
+
+
+class ResourceSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = Resource
+        fields = ('id', 'name', 'description', 'url', 'server_set')
diff --git a/tools/pharos-dashboard/api/urls.py b/tools/pharos-dashboard/api/urls.py
new file mode 100644 (file)
index 0000000..22f12eb
--- /dev/null
@@ -0,0 +1,28 @@
+"""pharos_dashboard URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+    https://docs.djangoproject.com/en/1.10/topics/http/urls/
+Examples:
+Function views
+    1. Add an import:  from my_app import views
+    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
+Class-based views
+    1. Add an import:  from other_app.views import Home
+    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
+Including another URLconf
+    1. Import the include() function: from django.conf.urls import url, include
+    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
+"""
+from django.conf.urls import url, include
+from rest_framework import routers
+
+from api.views import *
+
+router = routers.DefaultRouter()
+router.register(r'resources', ResourceViewSet)
+router.register(r'servers', ServerViewSet)
+router.register(r'bookings', BookingViewSet)
+
+urlpatterns = [
+    url(r'^', include(router.urls)),
+]
\ No newline at end of file
diff --git a/tools/pharos-dashboard/api/views.py b/tools/pharos-dashboard/api/views.py
new file mode 100644 (file)
index 0000000..78d7b8a
--- /dev/null
@@ -0,0 +1,23 @@
+from rest_framework import viewsets
+
+from api.serializers import ResourceSerializer, ServerSerializer, BookingSerializer
+from booking.models import Booking
+from dashboard.models import Resource, Server
+
+
+class BookingViewSet(viewsets.ModelViewSet):
+    queryset = Booking.objects.all()
+    serializer_class = BookingSerializer
+    filter_fields = ('resource', 'user')
+
+
+class ServerViewSet(viewsets.ModelViewSet):
+    queryset = Server.objects.all()
+    serializer_class = ServerSerializer
+    filter_fields = ('resource', 'name')
+
+
+class ResourceViewSet(viewsets.ModelViewSet):
+    queryset = Resource.objects.all()
+    serializer_class = ResourceSerializer
+    filter_fields = ('name',)
\ No newline at end of file
index e772fb5..fed35e3 100644 (file)
@@ -6,6 +6,7 @@ from jira import JIRAError
 from dashboard.models import Resource
 from django.conf import settings
 
+
 class Booking(models.Model):
     id = models.AutoField(primary_key=True)
     user = models.ForeignKey(User, models.CASCADE)  # delete if user is deleted
index baa2d63..35c6463 100644 (file)
@@ -14,7 +14,6 @@ Including another URLconf
     2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
 """
 from django.conf.urls import url
-
 from dashboard.views import *
 
 urlpatterns = [
index d8bf560..4a9d914 100644 (file)
@@ -18,12 +18,16 @@ from django.conf.urls import url, include
 from django.conf.urls.static import static
 from django.contrib import admin
 
+
 urlpatterns = [
     url(r'^', include('dashboard.urls', namespace='dashboard')),
     url(r'^booking/', include('booking.urls', namespace='booking')),
     url(r'^accounts/', include('account.urls', namespace='account')),
 
     url(r'^admin/', admin.site.urls),
+    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
+
+    url(r'^api/', include('api.urls'))
 ]
 
 if settings.DEBUG is True:
index 42156e3..c5da483 100644 (file)
                                     class="fa fa-fw"></i>Users
                             </a>
                         </li>
+                        <li>
+                            <a href="{% url 'api-root' %}"><i
+                                    class="fa fa-fw"></i>API
+                            </a>
+                        </li>
                     </ul>
                 </div>
                 <!-- /.sidebar-collapse -->
diff --git a/tools/pharos-dashboard/templates/rest_framework/api.html b/tools/pharos-dashboard/templates/rest_framework/api.html
new file mode 100644 (file)
index 0000000..9c6c4f7
--- /dev/null
@@ -0,0 +1,9 @@
+{% extends "rest_framework/base.html" %}
+
+{% block title %}Pharos Dashboard API{% endblock %}
+
+{% block branding %}
+    <a class='navbar-brand' rel="nofollow" href=#>
+        Pharos Dashboard API
+    </a>
+{% endblock %}
\ No newline at end of file