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.' }) tool = get_object_or_404(Tool, id=request.POST.get('tool_id')) # Create the new reservation: reservation = Reservation() reservation.user = request.user reservation.creator = request.user reservation.tool = tool reservation.start = start reservation.end = end reservation.short_notice = determine_insufficient_notice(tool, start) policy_problems, overridable = check_policy_to_save_reservation( None, reservation, request.user, 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']) 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.save_and_notify() return render(request, 'mobile/reservation_success.html', {'new_reservation': reservation})
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() 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() return HttpResponse() return HttpResponseBadRequest( "Reservation creation failed because invalid parameters were sent to the server." )
def reserve_tool(request): tool = Tool.objects.get(id=request.POST["tool_id"]) customer = User.objects.get(id=request.POST["customer_id"]) project = Project.objects.get(id=request.POST["project_id"]) back = request.POST["back"] error_dictionary = { "back": back, "tool": tool, "project": project, "customer": customer } """ 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: error_dictionary[ "message"] = "Please enter a valid date, start time, and end time for the reservation." return render(request, "kiosk/error.html", error_dictionary) # Create the new reservation: reservation = Reservation() reservation.project = project reservation.user = customer reservation.creator = customer reservation.reservation_item = tool reservation.start = start reservation.end = end reservation.short_notice = determine_insufficient_notice(tool, start) policy_problems, overridable = check_policy_to_save_reservation( cancelled_reservation=None, new_reservation=reservation, user_creating_reservation=customer, explicit_policy_override=False, ) # If there was a problem in saving the reservation then return the error... if policy_problems: error_dictionary["message"] = policy_problems[0] return render(request, "kiosk/error.html", error_dictionary) # All policy checks have passed. if project is None and not customer.is_staff: error_dictionary[ "message"] = "You must specify a project for your reservation" return render(request, "kiosk/error.html", error_dictionary) 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, ReservationItemType.TOOL, tool.id, reservation.project) except RequiredUnansweredQuestionsException as e: error_dictionary["message"] = str(e) return render(request, "kiosk/error.html", error_dictionary) reservation.save_and_notify() return render(request, "kiosk/success.html", { "new_reservation": reservation, "customer": customer })
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.save_and_notify() return render(request, 'mobile/reservation_success.html', {'new_reservation': reservation})
def create_item_reservation(request, start, end, item_type: ReservationItemType, item_id): item = get_object_or_404(item_type.get_object_class(), id=item_id) 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 # set tool or area setattr(new_reservation, item_type.value, item) new_reservation.start = start new_reservation.end = end new_reservation.short_notice = determine_insufficient_notice(item, start) if item_type == ReservationItemType.TOOL else False policy_problems, overridable = check_policy_to_save_reservation(cancelled_reservation=None, new_reservation=new_reservation, user_creating_reservation=request.user, explicit_policy_override=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, 'reservation_action': 'create'}) # 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. if not user.is_staff: 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}) # Configuration rules only apply to tools if item_type == ReservationItemType.TOOL: configured = (request.POST.get('configured') == "true") # If a reservation is requested and the tool does not require configuration... if not item.is_configurable(): new_reservation.save_and_notify() return reservation_success(request, new_reservation) # If a reservation is requested and the tool requires configuration that has not been submitted... elif item.is_configurable() and not configured: configuration_information = item.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 item.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 reservation_success(request, new_reservation) elif item_type == ReservationItemType.AREA: new_reservation.save_and_notify() return HttpResponse() return HttpResponseBadRequest("Reservation creation failed because invalid parameters were sent to the server.")
def make_reservation(request): # due to unexplained CSRF failures for users try a workaround http_origins = [ 'https://rea-demo.mri.psu.edu:8080', 'https://rea-demo.mri.psu.edu:8888', 'https://leo.psu.edu' ] if request.META.get('HTTP_ORIGIN') in http_origins: origin = request.META.get('HTTP_ORIGIN') referer = str(origin) + "/new_reservation/" + str( request.POST.get('tool_id')) + "/" + str( request.POST['date']) + "/" if referer != request.META.get('HTTP_REFERER'): return render(request, 'mobile/error.html', {'message': 'Unknown referer - request rejected'}) else: return render(request, 'mobile/error.html', {'message': 'Unknown origin - request rejected'}) # 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.' }) tool = get_object_or_404(Tool, id=request.POST.get('tool_id')) # Create the new reservation: reservation = Reservation() reservation.user = request.user reservation.creator = request.user reservation.tool = tool reservation.start = start reservation.end = end reservation.short_notice = determine_insufficient_notice(tool, start) policy_problems, overridable = check_policy_to_save_reservation( request, None, reservation, request.user, 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. if request.user.is_staff: mode = request.POST['staff_charge'] if mode == "self": # make a reservation for the user and don't add a record to the ReservationProject table active_projects = request.user.active_projects() if len(active_projects) == 1: reservation.project = active_projects[0] else: try: reservation.project = Project.objects.get( id=request.POST['project_id']) except: msg = 'No project was selected. Please return to the <a href="/calendar/">calendar</a> to try again.' return render(request, 'mobile/error.html', {'message': msg}) else: # add ReservationProject entries for the customers submitted by the staff member reservation_projects = {} reservation.save() for key, value in request.POST.items(): if is_valid_field(key): attribute, separator, index = key.partition("__") index = int(index) if index not in reservation_projects: reservation_projects[index] = ReservationProject() reservation_projects[index].reservation = reservation reservation_projects[index].created = timezone.now() reservation_projects[index].updated = timezone.now() if attribute == "chosen_user": if value is not None and value != "": reservation_projects[ index].customer = User.objects.get(id=value) else: reservation.delete() return HttpResponseBadRequest( 'Please choose a user for whom the tool will be run.' ) if attribute == "chosen_project": if value is not None and value != "" and value != "-1": reservation_projects[ index].project = Project.objects.get(id=value) else: reservation.delete() return HttpResponseBadRequest( 'Please choose a project for charges made during this run.' ) for r in reservation_projects.values(): r.full_clean() r.save() else: try: reservation.project = Project.objects.get( id=request.POST['project_id']) 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, res_conf = 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 policy_problems, overridable = check_policy_to_save_reservation( request, None, reservation, request.user, False) reservation.save() for rc in res_conf: rc.reservation = reservation rc.save() return render(request, 'mobile/reservation_success.html', {'new_reservation': reservation})