Example #1
0
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.save_and_notify()
    return render(request, "kiosk/success.html", {
        "new_reservation": reservation,
        "customer": customer
    })
Example #2
0
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'])
    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})
Example #3
0
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.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, customer, 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.save_and_notify()
    return render(request, 'kiosk/success.html', {
        'new_reservation': reservation,
        'customer': customer
    })
Example #4
0
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})