Merge "Split the dashboard into different apps, add tests"
[pharos.git] / tools / pharos-dashboard / booking / views.py
diff --git a/tools/pharos-dashboard/booking/views.py b/tools/pharos-dashboard/booking/views.py
new file mode 100644 (file)
index 0000000..bc00d3e
--- /dev/null
@@ -0,0 +1,50 @@
+from django.contrib import messages
+from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
+from django.http import JsonResponse
+from django.shortcuts import get_object_or_404
+from django.urls import reverse
+from django.views import View
+from django.views.generic import FormView
+
+from booking.forms import BookingForm
+from booking.models import Booking
+from dashboard.models import Resource
+
+class BookingFormView(LoginRequiredMixin, FormView):
+    template_name = "booking/booking_calendar.html"
+    form_class = BookingForm
+
+    def dispatch(self, request, *args, **kwargs):
+        self.resource = get_object_or_404(Resource, id=self.kwargs['resource_id'])
+        return super(BookingFormView, self).dispatch(request,*args, **kwargs)
+
+    def get_context_data(self, **kwargs):
+        title = 'Booking: ' + self.resource.name
+        context = super(BookingFormView, self).get_context_data(**kwargs)
+        context.update({'title': title, 'resource': self.resource})
+        return context
+
+    def get_success_url(self):
+        return reverse('booking:create', kwargs=self.kwargs)
+
+    def form_valid(self, form):
+        booking = Booking(start=form.cleaned_data['start'], end=form.cleaned_data['end'],
+                          purpose=form.cleaned_data['purpose'], resource=self.resource,
+                          user=self.request.user)
+        try:
+            booking.save()
+        except ValueError as err:
+            messages.add_message(self.request, messages.ERROR, err)
+            return super(BookingFormView, self).form_invalid(form)
+        except PermissionError as err:
+            messages.add_message(self.request, messages.ERROR, err)
+            return super(BookingFormView, self).form_invalid(form)
+        messages.add_message(self.request, messages.SUCCESS, 'Booking saved')
+        return super(BookingFormView, self).form_valid(form)
+
+
+class ResourceBookingsJSON(View):
+    def get(self, request, *args, **kwargs):
+        resource = get_object_or_404(Resource, id=self.kwargs['resource_id'])
+        bookings = resource.booking_set.get_queryset().values('id', 'start', 'end', 'purpose')
+        return JsonResponse({'bookings': list(bookings)})