Add Quick-Booking Workflow
[laas.git] / src / booking / views.py
1 ##############################################################################
2 # Copyright (c) 2016 Max Breitenfeldt and others.
3 # Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, and others.
4 #
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 ##############################################################################
10
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
18
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
27
28
29 def quick_create_clear_fields(request):
30     request.session['quick_create_forminfo'] = None
31
32
33 def quick_create(request):
34     if not request.user.is_authenticated:
35         return login(request)
36
37     if request.method == 'GET':
38         context = {}
39
40         r_manager = ResourceManager.getInstance()
41         profiles = {}
42         for lab in Lab.objects.all():
43             profiles[str(lab)] = r_manager.getAvailableHostTypes(lab)
44
45         context['lab_profile_map'] = profiles
46
47         context['form'] = QuickBookingForm(initial={}, chosen_users=[], default_user=request.user.username, user=request.user)
48
49         context.update(drop_filter(request.user))
50
51         return render(request, 'booking/quick_deploy.html', context)
52     if request.method == 'POST':
53         form = QuickBookingForm(request.POST, user=request.user)
54         context = {}
55         context['lab_profile_map'] = {}
56         context['form'] = form
57
58         if form.is_valid():
59             try:
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)
65
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)
69         else:
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)
72
73
74 class BookingView(TemplateView):
75     template_name = "booking/booking_detail.html"
76
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})
82         return context
83
84
85 class BookingDeleteView(TemplateView):
86     template_name = "booking/booking_delete.html"
87
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})
93         return context
94
95
96 def bookingDelete(request, booking_id):
97     booking = get_object_or_404(Booking, id=booking_id)
98     booking.delete()
99     messages.add_message(request, messages.SUCCESS, 'Booking deleted')
100     return redirect('../../../../')
101
102
103 class BookingListView(TemplateView):
104     template_name = "booking/booking_list.html"
105
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})
111         return context
112
113
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(
118             'id',
119             'start',
120             'end',
121             'purpose',
122             'jira_issue_status',
123             'config_bundle__name'
124         )
125         return JsonResponse({'bookings': list(bookings)})
126
127
128 def booking_detail_view(request, booking_id):
129     user = None
130     if request.user.is_authenticated:
131         user = request.user
132     else:
133         return render(request, "dashboard/login.html", {'title': 'Authentication Required'})
134
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'})
140
141     return render(
142         request,
143         "booking/booking_detail.html",
144         {
145             'title': 'Booking Details',
146             'booking': booking,
147             'pdf': booking.pdf,
148             'user_id': user.id
149         })
150
151
152 def booking_stats_view(request):
153     return render(
154         request,
155         "booking/stats.html",
156         context={"data": StatisticsManager.getContinuousBookingTimeSeries(), "title": "Booking Statistics"}
157     )
158
159
160 def booking_stats_json(request):
161     try:
162         span = int(request.GET.get("days", 14))
163     except Exception:
164         span = 14
165     return JsonResponse(StatisticsManager.getContinuousBookingTimeSeries(span), safe=False)