1 ##############################################################################
2 # Copyright (c) 2016 Max Breitenfeldt and others.
3 # Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, and others.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
11 from django.contrib import messages
12 from django.shortcuts import get_object_or_404
13 from django.http import JsonResponse
14 from django.utils import timezone
15 from django.views import View
16 from django.views.generic import TemplateView
17 from django.shortcuts import redirect, render
19 from account.models import Lab
20 from resource_inventory.resource_manager import ResourceManager
21 from resource_inventory.models import ResourceBundle
22 from booking.models import Booking
23 from booking.stats import StatisticsManager
24 from workflow.views import login
25 from booking.forms import QuickBookingForm
26 from booking.quick_deployer import create_from_form, drop_filter
29 def quick_create_clear_fields(request):
30 request.session['quick_create_forminfo'] = None
33 def quick_create(request):
34 if not request.user.is_authenticated:
37 if request.method == 'GET':
40 r_manager = ResourceManager.getInstance()
42 for lab in Lab.objects.all():
43 profiles[str(lab)] = r_manager.getAvailableHostTypes(lab)
45 context['lab_profile_map'] = profiles
47 context['form'] = QuickBookingForm(initial={}, chosen_users=[], default_user=request.user.username, user=request.user)
49 context.update(drop_filter(request.user))
51 return render(request, 'booking/quick_deploy.html', context)
52 if request.method == 'POST':
53 form = QuickBookingForm(request.POST, user=request.user)
55 context['lab_profile_map'] = {}
56 context['form'] = form
60 create_from_form(form, request)
61 except Exception as e:
62 messages.error(request, "Whoops, looks like an error occurred. "
63 "Let the admins know that you got the following message: " + str(e))
64 return render(request, 'workflow/exit_redirect.html', context)
66 messages.success(request, "We've processed your request. "
67 "Check Account->My Bookings for the status of your new booking")
68 return render(request, 'workflow/exit_redirect.html', context)
70 messages.error(request, "Looks like the form didn't validate. Check that you entered everything correctly")
71 return render(request, 'booking/quick_deploy.html', context)
74 class BookingView(TemplateView):
75 template_name = "booking/booking_detail.html"
77 def get_context_data(self, **kwargs):
78 booking = get_object_or_404(Booking, id=self.kwargs['booking_id'])
79 title = 'Booking Details'
80 context = super(BookingView, self).get_context_data(**kwargs)
81 context.update({'title': title, 'booking': booking})
85 class BookingDeleteView(TemplateView):
86 template_name = "booking/booking_delete.html"
88 def get_context_data(self, **kwargs):
89 booking = get_object_or_404(Booking, id=self.kwargs['booking_id'])
90 title = 'Delete Booking'
91 context = super(BookingDeleteView, self).get_context_data(**kwargs)
92 context.update({'title': title, 'booking': booking})
96 def bookingDelete(request, booking_id):
97 booking = get_object_or_404(Booking, id=booking_id)
99 messages.add_message(request, messages.SUCCESS, 'Booking deleted')
100 return redirect('../../../../')
103 class BookingListView(TemplateView):
104 template_name = "booking/booking_list.html"
106 def get_context_data(self, **kwargs):
107 bookings = Booking.objects.filter(end__gte=timezone.now())
108 title = 'Search Booking'
109 context = super(BookingListView, self).get_context_data(**kwargs)
110 context.update({'title': title, 'bookings': bookings})
114 class ResourceBookingsJSON(View):
115 def get(self, request, *args, **kwargs):
116 resource = get_object_or_404(ResourceBundle, id=self.kwargs['resource_id'])
117 bookings = resource.booking_set.get_queryset().values(
123 'config_bundle__name'
125 return JsonResponse({'bookings': list(bookings)})
128 def booking_detail_view(request, booking_id):
130 if request.user.is_authenticated:
133 return render(request, "dashboard/login.html", {'title': 'Authentication Required'})
135 booking = get_object_or_404(Booking, id=booking_id)
136 allowed_users = set(list(booking.collaborators.all()))
137 allowed_users.add(booking.owner)
138 if user not in allowed_users:
139 return render(request, "dashboard/login.html", {'title': 'This page is private'})
143 "booking/booking_detail.html",
145 'title': 'Booking Details',
152 def booking_stats_view(request):
155 "booking/stats.html",
156 context={"data": StatisticsManager.getContinuousBookingTimeSeries(), "title": "Booking Statistics"}
160 def booking_stats_json(request):
162 span = int(request.GET.get("days", 14))
165 return JsonResponse(StatisticsManager.getContinuousBookingTimeSeries(span), safe=False)