def create_reservation(request): """ Create a reservation for a user. """ try: start, end = extract_times(request.POST) except Exception as e: return HttpResponseBadRequest(str(e)) tool = get_object_or_404(Tool, name=request.POST.get('tool_name')) explicit_policy_override = False if request.user.is_staff: try: user = User.objects.get(id=request.POST['impersonate']) except: user = request.user try: explicit_policy_override = request.POST['explicit_policy_override'] == 'true' except: pass else: user = request.user # Create the new reservation: new_reservation = Reservation() new_reservation.user = user new_reservation.creator = request.user new_reservation.tool = tool new_reservation.start = start new_reservation.end = end new_reservation.short_notice = determine_insufficient_notice(tool, start) policy_problems, overridable = check_policy_to_save_reservation(None, new_reservation, user, explicit_policy_override) # If there was a problem in saving the reservation then return the error... if policy_problems: return render(request, 'calendar/policy_dialog.html', {'policy_problems': policy_problems, 'overridable': overridable and request.user.is_staff}) # All policy checks have passed. # If the user only has one project then associate it with the reservation. # Otherwise, present a dialog box for the user to choose which project to associate. active_projects = user.active_projects() if len(active_projects) == 1: new_reservation.project = active_projects[0] else: try: new_reservation.project = Project.objects.get(id=request.POST['project_id']) except: return render(request, 'calendar/project_choice.html', {'active_projects': active_projects}) # Make sure the user is actually enrolled on the project. We wouldn't want someone # forging a request to reserve against a project they don't belong to. if new_reservation.project not in new_reservation.user.active_projects(): return render(request, 'calendar/project_choice.html', {'active_projects': active_projects}) configured = (request.POST.get('configured') == "true") # If a reservation is requested and the tool does not require configuration... if not tool.is_configurable(): new_reservation.save_and_notify() return HttpResponse() # If a reservation is requested and the tool requires configuration that has not been submitted... elif tool.is_configurable() and not configured: configuration_information = tool.get_configuration_information(user=user, start=start) return render(request, 'calendar/configuration.html', configuration_information) # If a reservation is requested and configuration information is present also... elif tool.is_configurable() and configured: new_reservation.additional_information, new_reservation.self_configuration = extract_configuration(request) # Reservation can't be short notice if the user is configuring the tool themselves. if new_reservation.self_configuration: new_reservation.short_notice = False new_reservation.save_and_notify() return HttpResponse() return HttpResponseBadRequest("Reservation creation failed because invalid parameters were sent to the server.")
def make_reservation(request): """ Create a reservation for a user. """ try: date = parse_date(request.POST['date']) start = localize( datetime.combine(date, parse_time(request.POST['start']))) end = localize(datetime.combine(date, parse_time(request.POST['end']))) except: return render( request, 'mobile/error.html', { 'message': 'Please enter a valid date, start time, and end time for the reservation.' }) item_type = ReservationItemType(request.POST['item_type']) item = get_object_or_404(item_type.get_object_class(), id=request.POST.get('item_id')) # Create the new reservation: reservation = Reservation() reservation.user = request.user reservation.creator = request.user reservation.reservation_item = item reservation.start = start reservation.end = end if item_type == ReservationItemType.TOOL: reservation.short_notice = determine_insufficient_notice(item, start) else: reservation.short_notice = False policy_problems, overridable = check_policy_to_save_reservation( cancelled_reservation=None, new_reservation=reservation, user_creating_reservation=request.user, explicit_policy_override=False) # If there was a problem in saving the reservation then return the error... if policy_problems: return render(request, 'mobile/error.html', {'message': policy_problems[0]}) # All policy checks have passed. try: reservation.project = Project.objects.get( id=request.POST['project_id']) # Check if we are allowed to bill to project check_billing_to_project(reservation.project, request.user, reservation.reservation_item) except ProjectChargeException as e: return render(request, 'mobile/error.html', {'message': e.msg}) except: if not request.user.is_staff: return render( request, 'mobile/error.html', {'message': 'You must specify a project for your reservation'}) reservation.additional_information, reservation.self_configuration = extract_configuration( request) # Reservation can't be short notice if the user is configuring the tool themselves. if reservation.self_configuration: reservation.short_notice = False # Reservation questions if applicable try: reservation.question_data = extract_reservation_questions( request, item_type, item.id, reservation.project) except RequiredUnansweredQuestionsException as e: return render(request, 'mobile/error.html', {'message': str(e)}) reservation.save_and_notify() return render(request, 'mobile/reservation_success.html', {'new_reservation': reservation})