Ejemplo n.º 1
0
def edit_reservation(request, id):
    """
    Modify, cancel or create a reservation

    GET presents a form, POST updates the database
    If id is absent: create a new reservation
    If id is provided and also POST['cancel'], cancel a reservation
    If id is provided: modify a reservation
    """

    if not id:
        reservation = Reservation()
    else:
        reservation = Reservation.objects.get(id=id)
        if reservation == None or reservation.user != request.user:
            return HtmlResponse("Nope")

    form = None
    if request.POST:
        if id and 'cancel' in request.POST:
            # Cancel the reservation
            reservation.delete();
            return redirect(to=reverse('scheduler:reservations'))

        reservation.user = request.user
        reservation.mcu = MCU.objects.get(id=1)
        form = ReservationForm(request.POST, instance=reservation)
        try:
            form.save()
        except (ValueError, ValidationError) as e:
            # FIXME: Grab the error and show it to the user
            pass
        else:
            return redirect(to=reverse('scheduler:reservations'))

    if not form:
        form = ReservationForm(instance=reservation)

    context = { 'reservation': reservation, 'form': form }
    return render(request, 'scheduler/reservation.html', context)
Ejemplo n.º 2
0
def edit_reservation(request, id):
    """
    Modify, cancel or create a reservation

    GET presents a form, POST updates the database
    If id is absent: create a new reservation
    If id is provided and also POST['cancel'], cancel a reservation
    If id is provided: modify a reservation
    """

    if not id:
        reservation = Reservation()
    else:
        reservation = Reservation.objects.get(id=id)
        if reservation == None or reservation.user != request.user:
            return HtmlResponse("Nope")

    form = None
    if request.POST:
        if id and 'cancel' in request.POST:
            # Cancel the reservation
            reservation.delete()
            return redirect(to=reverse('scheduler:reservations'))

        reservation.user = request.user
        reservation.mcu = MCU.objects.get(id=1)
        form = ReservationForm(request.POST, instance=reservation)
        try:
            form.save()
        except (ValueError, ValidationError) as e:
            # FIXME: Grab the error and show it to the user
            pass
        else:
            return redirect(to=reverse('scheduler:reservations'))

    if not form:
        form = ReservationForm(instance=reservation)

    context = {'reservation': reservation, 'form': form}
    return render(request, 'scheduler/reservation.html', context)
Ejemplo n.º 3
0
def schedule(request, lab_id):

    lab = get_object_or_404(Lab, id=lab_id)

    # Generate the Lab's schedule for the next seven days
    schedule = Schedule(lab, tz=request.session.get("django_timezone"))

    # Determine if the current User is allowed to make a Reservation
    if not request.user.is_authenticated():
        reservation_forbidden = "You must log in in order to reserve lab time."
    elif not lab.pods.count():
        reservation_forbidden = "This lab does not have any pods defined yet."
    elif request.user in lab.admins:
        reservation_forbidden = False
    elif not lab.is_active:
        reservation_forbidden = "Sorry, this lab is not currently accepting new reservations."
    elif not lab.is_public and request.user not in lab.members:
        reservation_forbidden = "Sorry, only members can reserve time in this lab."
    elif (
        lab.max_rsv_per_user
        and lab.reservations.filter(user=request.user, end_time__gt=timezone.now()).count() >= lab.max_rsv_per_user
    ):
        reservation_forbidden = "Sorry, you have reached the maximum number of reservations for this lab ({0}).".format(
            lab.max_rsv_per_user
        )
    else:
        reservation_forbidden = False

    # Creating a new Reservation
    if not reservation_forbidden and request.method == "POST":
        reservation_form = ReservationForm(lab, schedule, request.session["django_timezone"], request.POST)
        if reservation_form.is_valid():

            # Create a full datetime from the individual date and time fields, then make it timezone-aware
            start_time = parser.parse(
                " ".join((reservation_form.cleaned_data["date"], reservation_form.cleaned_data["time"]))
            )
            start_time = request.session.get("django_timezone").localize(start_time)

            # Create the Reservation
            r = Reservation.objects.create(
                user=request.user,
                lab=lab,
                # TODO: Add awareness of X-FORWARDED-FOR header?
                created_ip_address=request.META.get("REMOTE_ADDR"),
                start_time=start_time,
                duration=int(reservation_form.cleaned_data["duration"]),
            )

            # Add reserved Pod(s) to the Reservation
            if isinstance(reservation_form.cleaned_data["pods"], list):
                for pod_id in reservation_form.cleaned_data["pods"]:
                    r.pods.add(lab.pods.get(id=pod_id))
            else:
                r.pods.add(lab.pods.get(id=reservation_form.cleaned_data["pods"]))

            messages.success(request, "Your reservation has been created.")
            return redirect(reverse("scheduler_reservation", kwargs={"rsv_id": r.id}))

    elif not reservation_forbidden:
        reservation_form = ReservationForm(lab, schedule, request.session["django_timezone"])

    else:
        reservation_form = None

    return render(
        request,
        "labs/schedule.html",
        {
            "lab": lab,
            "lab_open_hours": [h.hour for h in lab.get_open_hours(tz=request.session.get("django_timezone"))],
            "reservation_forbidden": reservation_forbidden,
            "reservation_form": reservation_form,
            "s": schedule,
            "now": {
                "day": timezone.localtime(timezone.now(), request.session.get("django_timezone")).day,
                "hour": timezone.localtime(timezone.now(), request.session.get("django_timezone")).hour,
            },
            "current_time": datetime.now(),
            "nav_labs": "schedule",
        },
    )