Exemple #1
0
def assign_shifts_view(request, semester):
    """
    View all members' preferences. This view also includes forms to create an
    entire semester's worth of weekly workshifts.
    """
    page_name = "Assign Shifts"
    assign_forms = []
    for shift in RegularWorkshift.objects.filter(pool__semester=semester,
                                                 active=True):
        form = AssignShiftForm(
            request.POST or None,
            prefix="shift-{0}".format(shift.pk),
            instance=shift,
            semester=semester,
            )
        assign_forms.append(form)
    if all(i.is_valid() for i in assign_forms):
        for form in assign_forms:
            form.save()
        messages.add_message(request, messages.INFO, "Workshift assignments saved.")
        if "finalize" in request.POST:
            # TODO: Finalize everything, close preferences, etc?
            return HttpResponseRedirect(wurl('workshift:manage',
                                             sem_url=semester.sem_url))
        else:
            return HttpResponseRedirect(wurl('workshift:assign_shifts',
                                            sem_url=semester.sem_url))
    return render_to_response("assign_shifts.html", {
        "page_name": page_name,
        "assign_forms": assign_forms,
    }, context_instance=RequestContext(request))
Exemple #2
0
def edit_pool_view(request, semester, pk, profile=None):
    pool = get_object_or_404(WorkshiftPool, semester=semester, pk=pk)
    page_name = "Edit " + pool.title
    full_management = utils.can_manage(request.user, semester=semester)
    managers = pool.managers.filter(incumbent__user=request.user)

    if not full_management and not managers.count():
        messages.add_message(request, messages.ERROR,
                             MESSAGES['ADMINS_ONLY'])
        return HttpResponseRedirect(semester.get_view_url())

    # TODO: Link auto-verify / auto-blown / etc to pool view?

    edit_pool_form = PoolForm(
        request.POST or None,
        instance=pool,
        full_management=full_management,
        )
    if "delete" in request.POST:
        pool.delete()
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))
    if edit_pool_form.is_valid():
        edit_pool_form.save()
        messages.add_message(request, messages.INFO,
                             "Workshift pool successfully updated.")
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))

    return render_to_response("edit_pool.html", {
        "page_name": page_name,
        "edit_pool_form": edit_pool_form,
    }, context_instance=RequestContext(request))
Exemple #3
0
def edit_pool_view(request, semester, pk, profile=None):
    pool = get_object_or_404(WorkshiftPool, semester=semester, pk=pk)
    page_name = "Edit " + pool.title
    full_management = utils.can_manage(request.user, semester=semester)
    managers = pool.managers.filter(incumbent__user=request.user)

    if not full_management and not managers.count():
        messages.add_message(request, messages.ERROR,
                             MESSAGES['ADMINS_ONLY'])
        return HttpResponseRedirect(wurl('workshift:view_semester',
                                         sem_url=semester.sem_url))

    edit_pool_form = PoolForm(
        request.POST or None,
        instance=pool,
        full_management=full_management,
        )
    if "delete" in request.POST:
        pool.delete()
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))
    if edit_pool_form.is_valid():
        edit_pool_form.save()
        messages.add_message(request, messages.INFO,
                             "Workshift pool successfully updated.")
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))

    return render_to_response("edit_pool.html", {
        "page_name": page_name,
        "edit_pool_form": edit_pool_form,
    }, context_instance=RequestContext(request))
Exemple #4
0
def preferences_view(request, semester, targetUsername, profile=None):
    """
    Show the user their preferences for the given semester.
    """
    wprofile = get_object_or_404(WorkshiftProfile, user__username=targetUsername)

    if wprofile.user != request.user and \
      not utils.can_manage(request.user, semester=semester):
        messages.add_message(request, messages.ERROR,
                             MESSAGES['ADMINS_ONLY'])
        return HttpResponseRedirect(wurl('workshift:view_semester',
                                         sem_url=semester.sem_url))

    rating_forms = []
    for wtype in WorkshiftType.objects.filter(rateable=True):
        try:
            rating = wprofile.ratings.get(workshift_type=wtype)
        except WorkshiftRating.DoesNotExist:
            rating = WorkshiftRating(workshift_type=wtype)
        form = WorkshiftRatingForm(
            request.POST or None,
            prefix="rating-{0}".format(wtype.pk),
            instance=rating,
            profile=wprofile,
            )
        rating_forms.append(form)

    time_formset = TimeBlockFormSet(
        request.POST or None,
        prefix="time",
        profile=wprofile,
        )
    note_form = ProfileNoteForm(request.POST or None, instance=wprofile)

    if all(i.is_valid() for i in rating_forms) and time_formset.is_valid() and \
      note_form.is_valid():
        for form in rating_forms:
            form.save()
        time_formset.save()
        instance = note_form.save()
        messages.add_message(request, messages.INFO, "Preferences saved.")
        return HttpResponseRedirect(wurl('workshift:preferences',
                                         sem_url=semester.sem_url,
                                         targetUsername=request.user.username))

    if wprofile == profile:
        page_name = "My Workshift Preferences"
    else:
        page_name = "{0}'s Workshift Preferences".format(
        wprofile.user.get_full_name())
    return render_to_response("preferences.html", {
        "page_name": page_name,
        "profile": wprofile,
        "rating_forms": rating_forms,
        "time_formset": time_formset,
        "note_form": note_form,
    }, context_instance=RequestContext(request))
Exemple #5
0
def add_shift_view(request, semester):
    """
    View for the workshift manager to create new types of workshifts.
    """
    page_name = "Add Workshift"
    pools = WorkshiftPool.objects.filter(semester=semester)
    full_management = utils.can_manage(request.user, semester=semester)
    if not full_management:
        pools = pools.filter(managers__incumbent__user=request.user)
        if not pools.count():
            messages.add_message(request, messages.ERROR,
                                 MESSAGES['ADMINS_ONLY'])
            return HttpResponseRedirect(wurl('workshift:view_semester',
                                             sem_url=semester.sem_url))

    if full_management:
        add_type_form = WorkshiftTypeForm(
            request.POST if "add_type" in request.POST else None,
            )
    else:
        add_type_form = None

    add_instance_form = WorkshiftInstanceForm(
        request.POST if "add_instance" in request.POST else None,
        pools=pools,
        semester=semester,
        )
    if WorkshiftType.objects.count():
        add_shift_form = RegularWorkshiftForm(
            request.POST if "add_shift" in request.POST else None,
            pools=pools,
            semester=semester,
            )
    else:
        add_shift_form = None

    if add_type_form and add_type_form.is_valid():
        add_type_form.save()
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))
    elif add_instance_form and add_instance_form.is_valid():
        add_instance_form.save()
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))
    elif add_shift_form and add_shift_form.is_valid():
        add_shift_form.save()
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))
    return render_to_response("add_shift.html", {
        "page_name": page_name,
        "add_type_form": add_type_form,
        "add_instance_form": add_instance_form,
        "add_shift_form": add_shift_form,
    }, context_instance=RequestContext(request))
Exemple #6
0
def add_shift_view(request, semester):
    """
    View for the workshift manager to create new types of workshifts.
    """
    page_name = "Add Workshift"
    pools = WorkshiftPool.objects.filter(semester=semester)
    full_management = utils.can_manage(request.user, semester=semester)
    if not full_management:
        pools = pools.filter(managers__incumbent__user=request.user)
        if not pools.count():
            messages.add_message(request, messages.ERROR,
                                 MESSAGES['ADMINS_ONLY'])
            return HttpResponseRedirect(semester.get_view_url())

    if full_management:
        add_type_form = WorkshiftTypeForm(
            request.POST if "add_type" in request.POST else None,
            prefix="type",
            )
        shifts_formset = RegularWorkshiftFormSet(
            request.POST if "add_type" in request.POST else None,
            prefix="shifts",
            queryset=RegularWorkshift.objects.none(),
            pools=pools,
            )

        if add_type_form.is_valid() and shifts_formset.is_valid():
            wtype = add_type_form.save()
            shifts_formset.save(workshift_type=wtype)
            return HttpResponseRedirect(wurl("workshift:manage",
                                             sem_url=semester.sem_url))
    else:
        add_type_form = None
        shifts_formset = None

    add_instance_form = WorkshiftInstanceForm(
        request.POST if "add_instance" in request.POST else None,
        pools=pools,
        semester=semester,
        )
    if add_instance_form.is_valid():
        add_instance_form.save()
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))
    return render_to_response("add_shift.html", {
        "page_name": page_name,
        "add_type_form": add_type_form,
        "shifts_formset": shifts_formset,
        "add_instance_form": add_instance_form,
    }, context_instance=RequestContext(request))
Exemple #7
0
def edit_shift_view(request, semester, pk, profile=None):
    """
    View for a manager to edit the details of a particular RegularWorkshift.
    """
    shift = get_object_or_404(RegularWorkshift, pk=pk)
    managers = shift.pool.managers.filter(incumbent__user=request.user)

    if not request.user.is_superuser and not managers.count():
        messages.add_message(request, messages.ERROR,
                             MESSAGES['ADMINS_ONLY'])
        return HttpResponseRedirect(wurl('workshift:view_semester',
                                         sem_url=semester.sem_url))

    edit_form = RegularWorkshiftForm(
        request.POST if "edit" in request.POST else None,
        instance=shift,
        semester=semester,
        )

    if "delete" in request.POST:
        instances = WorkshiftInstance.objects.filter(weekly_workshift=shift)
        info = InstanceInfo(
            title=shift.title,
            description=shift.workshift_type.description,
            pool=shift.pool,
            start_time=shift.start_time,
            end_time=shift.end_time,
            )
        info.save()
        for instance in instances:
            instance.weekly_workshift = None
            instance.info = info
            instance.closed = True
            instance.save()
        shift.delete()
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))
    elif edit_form.is_valid():
        shift = edit_form.save()
        return HttpResponseRedirect(wurl('workshift:view_shift',
                                         sem_url=semester.sem_url,
                                         pk=shift.pk))

    page_name = "Edit " + shift.title

    return render_to_response("edit_shift.html", {
        "page_name": page_name,
        "shift": shift,
        "edit_form": edit_form,
    }, context_instance=RequestContext(request))
Exemple #8
0
def pool_view(request, semester, pk, profile=None):
    pool = get_object_or_404(WorkshiftPool, semester=semester, pk=pk)
    if profile:
        if SignInForm.action_name in request.POST:
            f = SignInForm(request.POST, profile=profile)
            if f.is_valid():
                f.save()
                return HttpResponseRedirect(wurl("workshift:view_pool",
                                                    sem_url=semester.sem_url,
                                                    pk=pk))
            else:
                for error in f.errors.values():
                    messages.add_message(request, messages.ERROR, error)
        upcoming_pool_shifts = _pool_upcoming_vacant_shifts(pool, profile)
    else:
        upcoming_pool_shifts = None
    page_name = "{0} Pool".format(pool.title)
    shifts = RegularWorkshift.objects.filter(pool=pool, active=True)

    return render_to_response("view_pool.html", {
        "page_name": page_name,
        "pool": pool,
        "shifts": shifts,
        "upcoming_pool_shifts": upcoming_pool_shifts,
    }, context_instance=RequestContext(request))
Exemple #9
0
def edit_instance_view(request, semester, pk, profile=None):
    """
    View for a manager to edit the details of a particular WorkshiftInstance.
    """
    instance = get_object_or_404(WorkshiftInstance, pk=pk)
    managers = instance.pool.managers.filter(incumbent__user=request.user)

    if not request.user.is_superuser and not managers.count():
        messages.add_message(request, messages.ERROR,
                             MESSAGES['ADMINS_ONLY'])
        return HttpResponseRedirect(semester.get_view_url())

    page_name = "Edit " + instance.title

    edit_form = WorkshiftInstanceForm(
        request.POST if "edit" in request.POST else None,
        instance=instance,
        semester=semester,
        edit_hours=False,
        )

    if "delete" in request.POST:
        instance.delete()
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))
    elif edit_form.is_valid():
        instance = edit_form.save()
        return HttpResponseRedirect(instance.get_view_url())

    return render_to_response("edit_instance.html", {
        "page_name": page_name,
        "instance": instance,
        "edit_form": edit_form,
    }, context_instance=RequestContext(request))
Exemple #10
0
def fine_date_view(request, semester, profile=None):
    page_name = "Calculate Workshift Fines"

    fine_form = FineDateForm(
        request.POST or None,
        semester=semester,
        )
    if fine_form.is_valid():
        fined_members = fine_form.save(clear="clear" in request.POST)
        messages.add_message(
            request, messages.INFO,
            "Calculated workshift fines, {0} members will be fined."
            .format(len(fined_members)),
        )
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))

    pools = WorkshiftPool.objects.filter(semester=semester)
    pools = pools.order_by('-is_primary', 'title')
    workshifters = WorkshiftProfile.objects.filter(semester=semester)
    pool_hours = [workshifter.pool_hours.filter(pool__in=pools)
                  .order_by('-pool__is_primary', 'pool__title')
                  for workshifter in workshifters]

    return render_to_response("fine_date.html", {
        "page_name": page_name,
        "fine_form": fine_form,
        "pools": pools,
        "workshifters": zip(workshifters, pool_hours),
    }, context_instance=RequestContext(request))
Exemple #11
0
def add_workshifter_view(request, semester):
    """
    Add a new member workshift profile, for people who join mid-semester.
    """
    page_name = "Add Workshifter"

    existing = [
        i.user.pk for i in WorkshiftProfile.objects.filter(semester=semester)
        ]
    users = User.objects.exclude(pk__in=existing).exclude(is_active=False) \
      .exclude(userprofile__status=UserProfile.ALUMNUS)

    add_workshifter_forms = []
    for user in users:
        form = AddWorkshifterForm(
            request.POST or None,
            prefix="user-{0}".format(user.pk),
            user=user,
            semester=semester,
            )
        add_workshifter_forms.append(form)

    if add_workshifter_forms and \
      all(form.is_valid() for form in add_workshifter_forms):
        for form in add_workshifter_forms:
            form.save()
        messages.add_message(request, messages.INFO, "Workshifters added.")
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))

    return render_to_response("add_workshifter.html", {
        "page_name": page_name,
        "add_workshifter_forms": add_workshifter_forms,
    }, context_instance=RequestContext(request))
Exemple #12
0
def instance_view(request, semester, pk, profile=None):
    """
    View the details of a particular WorkshiftInstance.
    """
    instance = get_object_or_404(WorkshiftInstance, pk=pk)
    page_name = instance.title
    interact_forms = _get_forms(profile, instance)

    for form in [VerifyShiftForm, BlownShiftForm, SignInForm, SignOutForm]:
        if form.action_name in request.POST:
            f = form(request.POST, profile=profile)
            if f.is_valid():
                instance = f.save()
                return HttpResponseRedirect(wurl('workshift:view_instance',
                                                 sem_url=semester.sem_url,
                                                 pk=instance.pk))
            else:
                for error in f.errors.values():
                    messages.add_message(request, messages.ERROR, error)

    return render_to_response("view_instance.html", {
        "page_name": page_name,
        "instance": instance,
        "interact_forms": interact_forms,
    }, context_instance=RequestContext(request))
Exemple #13
0
def edit_shift_view(request, semester, pk, profile=None):
    """
    View for a manager to edit the details of a particular RegularWorkshift.
    """
    shift = get_object_or_404(RegularWorkshift, pk=pk)
    managers = shift.pool.managers.filter(incumbent__user=request.user)

    if not request.user.is_superuser and not managers.count():
        messages.add_message(request, messages.ERROR,
                             MESSAGES['ADMINS_ONLY'])
        return HttpResponseRedirect(semester.get_view_url())

    edit_form = RegularWorkshiftForm(
        request.POST if "edit" in request.POST else None,
        instance=shift,
        semester=semester,
        )

    if "delete" in request.POST:
        # Open instances are deleted automatically
        shift.delete()
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))
    elif edit_form.is_valid():
        shift = edit_form.save()
        return HttpResponseRedirect(shift.get_view_url())

    page_name = "Edit {0}".format(shift)

    return render_to_response("edit_shift.html", {
        "page_name": page_name,
        "shift": shift,
        "edit_form": edit_form,
    }, context_instance=RequestContext(request))
Exemple #14
0
def edit_instance_view(request, semester, pk, profile=None):
    """
    View for a manager to edit the details of a particular WorkshiftInstance.
    """
    instance = get_object_or_404(WorkshiftInstance, pk=pk)
    managers = instance.pool.managers.filter(incumbent__user=request.user)

    if not request.user.is_superuser and not managers.count():
        messages.add_message(request, messages.ERROR,
                             MESSAGES['ADMINS_ONLY'])
        return HttpResponseRedirect(semester.get_view_url())

    page_name = "Edit " + instance.title

    edit_form = WorkshiftInstanceForm(
        request.POST if "edit" in request.POST else None,
        instance=instance,
        semester=semester,
        edit_hours=False,
        )

    if "delete" in request.POST:
        instance.delete()
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))
    elif edit_form.is_valid():
        instance = edit_form.save()
        return HttpResponseRedirect(instance.get_view_url())

    return render_to_response("edit_instance.html", {
        "page_name": page_name,
        "instance": instance,
        "edit_form": edit_form,
    }, context_instance=RequestContext(request))
Exemple #15
0
def fine_date_view(request, semester, profile=None):
    page_name = "Calculate Workshift Fines"

    fine_form = FineDateForm(
        request.POST or None,
        semester=semester,
        )
    if fine_form.is_valid():
        fined_members = fine_form.save(clear="clear" in request.POST)
        messages.add_message(
            request, messages.INFO,
            "Calculated workshift fines, {0} members will be fined."
            .format(len(fined_members)),
        )
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))

    pools = WorkshiftPool.objects.filter(semester=semester)
    pools = pools.order_by('-is_primary', 'title')
    workshifters = WorkshiftProfile.objects.filter(semester=semester)
    pool_hours = [workshifter.pool_hours.filter(pool__in=pools)
                  .order_by('-pool__is_primary', 'pool__title')
                  for workshifter in workshifters]

    return render_to_response("fine_date.html", {
        "page_name": page_name,
        "fine_form": fine_form,
        "pools": pools,
        "workshifters": zip(workshifters, pool_hours),
    }, context_instance=RequestContext(request))
Exemple #16
0
def add_workshifter_view(request, semester):
    """
    Add a new member workshift profile, for people who join mid-semester.
    """
    page_name = "Add Workshifter"

    existing = [
        i.user.pk for i in WorkshiftProfile.objects.filter(semester=semester)
        ]
    users = User.objects.exclude(pk__in=existing, is_active=True)

    add_workshifter_forms = []
    for user in users:
        form = AddWorkshifterForm(
            request.POST or None,
            prefix="user-{0}".format(user.pk),
            user=user,
            semester=semester,
            )
        add_workshifter_forms.append(form)

    if add_workshifter_forms and \
      all(form.is_valid() for form in add_workshifter_forms):
        for form in add_workshifter_forms:
            form.save()
        messages.add_message(request, messages.INFO, "Workshifters added.")
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))

    return render_to_response("add_workshifter.html", {
        "page_name": page_name,
        "add_workshifter_forms": add_workshifter_forms,
    }, context_instance=RequestContext(request))
Exemple #17
0
def edit_shift_view(request, semester, pk, profile=None):
    """
    View for a manager to edit the details of a particular RegularWorkshift.
    """
    shift = get_object_or_404(RegularWorkshift, pk=pk)
    managers = shift.pool.managers.filter(incumbent__user=request.user)

    if not request.user.is_superuser and not managers.count():
        messages.add_message(request, messages.ERROR,
                             MESSAGES['ADMINS_ONLY'])
        return HttpResponseRedirect(semester.get_view_url())

    edit_form = RegularWorkshiftForm(
        request.POST if "edit" in request.POST else None,
        instance=shift,
        semester=semester,
        )

    if "delete" in request.POST:
        # Open instances are deleted automatically
        shift.delete()
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))
    elif edit_form.is_valid():
        shift = edit_form.save()
        return HttpResponseRedirect(shift.get_view_url())

    page_name = "Edit {0}".format(shift)

    return render_to_response("edit_shift.html", {
        "page_name": page_name,
        "shift": shift,
        "edit_form": edit_form,
    }, context_instance=RequestContext(request))
Exemple #18
0
def manage_view(request, semester, profile=None):
    """
    View all members' preferences. This view also includes forms to create an
    entire semester's worth of weekly workshifts.
    """
    page_name = "Manage Workshift"
    pools = WorkshiftPool.objects.filter(semester=semester)
    full_management = utils.can_manage(request.user, semester=semester)
    semester_form = None

    if not full_management:
        pools = pools.filter(managers__incumbent__user=request.user)
        if not pools.count():
            messages.add_message(request, messages.ERROR,
                                 MESSAGES['ADMINS_ONLY'])
            return HttpResponseRedirect(wurl('workshift:view_semester',
                                             sem_url=semester.sem_url))
    else:
        semester_form = FullSemesterForm(
            request.POST if "edit_semester" in request.POST else None,
            instance=semester,
            )

    if semester_form and semester_form.is_valid():
        semester = semester_form.save()
        messages.add_message(request, messages.INFO, "Semester successfully updated.")
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))

    pools = pools.order_by('-is_primary', 'title')
    workshifters = WorkshiftProfile.objects.filter(semester=semester)
    pool_hours = [workshifter.pool_hours.filter(pool__in=pools)
                  .order_by('-pool__is_primary', 'pool__title')
                  for workshifter in workshifters]

    return render_to_response("manage.html", {
        "page_name": page_name,
        "pools": pools,
        "full_management": full_management,
        "semester_form": semester_form,
        "workshifters": zip(workshifters, pool_hours),
    }, context_instance=RequestContext(request))
Exemple #19
0
def fill_shifts_view(request, semester):
    """
    Allows managers to quickly fill in the default workshifts for a few given
    workshift pools.
    """
    page_name = "Fill Shifts"

    fill_regular_shifts_form = None
    fill_social_shifts_form = None
    fill_humor_shifts_form = None
    fill_hi_shifts_form = None

    managers = Manager.objects.filter(incumbent__user=request.user)
    admin = request.user.is_superuser or request.user.is_staff or \
      managers.filter(workshift_manager=True)

    if admin:
        fill_regular_shifts_form = FillRegularShiftsForm(
            request.POST,
            semester=semester,
            )
        fill_humor_shifts_form = FillHumorShiftsForm(
            request.POST,
            semester=semester,
            )
    # XXX: BAD! We should filter by pool owners? By Manager bool flags? By
    # arbitrary django permissions?
    if admin or managers.filter(title="Social Manager"):
        fill_social_shifts_form = FillSocialShiftsForm(
            request.POST,
            semester=semester,
            )
    # XXX: See above
    if admin or managers.filter(title="Maintenance Manager"):
        fill_hi_shifts_form = FillHIShiftsForm(
            request.POST,
            semester=semester,
            )

    forms = [fill_regular_shifts_form, fill_social_shifts_form,
             fill_humor_shifts_form, fill_hi_shifts_form]

    for form in forms:
        if form and form.is_valid():
            form.save()
            message = "Created {} workshifts".format(form.shift_name)
            messages.add_message(request, messages.INFO, message)
            return HttpResponseRedirect(wurl('workshift:fill_shifts',
                                             sem_url=semester.sem_url))

    return render_to_response("fill_shifts.html", {
        "page_name": page_name,
        "forms": forms,
    }, context_instance=RequestContext(request))
Exemple #20
0
def start_semester_view(request):
    """
    Initiates a semester's worth of workshift, with the option to copy workshift
    types from the previous semester.
    """
    page_name = "Start Semester"
    year, season = utils.get_year_season()
    start_date, end_date = utils.get_semester_start_end(year, season)

    semester_form = SemesterForm(
        request.POST or None,
        initial={
            "year": year,
            "season": season,
            "start_date": start_date.strftime(date_formats[0]),
            "end_date": end_date.strftime(date_formats[0]),
            })

    pool_forms = []
    try:
        prev_semester = Semester.objects.all()[0]
    except IndexError:
        pass
    else:
        for pool in WorkshiftPool.objects.filter(semester=prev_semester):
            form = StartPoolForm(
                request.POST or None,
                initial={
                    "title": pool.title,
                    "hours": pool.hours,
                    },
                prefix="pool-{0}".format(pool.pk),
                )
            pool_forms.append(form)

    if semester_form.is_valid() and all(i.is_valid() for i in pool_forms):
        # And save this semester
        semester = semester_form.save()
        semester.workshift_managers = \
          [i.incumbent.user for i in Manager.objects.filter(workshift_manager=True)]
        semester.save()
        for pool_form in pool_forms:
            pool_form.save(semester=semester)
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))

    # TODO: Adding workshift pools? Should we do a separate page for that?

    return render_to_response("start_semester.html", {
        "page_name": page_name,
        "semester_form": semester_form,
        "pool_forms": pool_forms,
    }, context_instance=RequestContext(request))
Exemple #21
0
def start_semester_view(request):
    """
    Initiates a semester's worth of workshift, with the option to copy workshift
    types from the previous semester.
    """
    page_name = "Start Semester"
    year, season = utils.get_year_season()
    start_date, end_date = utils.get_semester_start_end(year, season)

    semester_form = SemesterForm(
        request.POST or None,
        initial={
            "year": year,
            "season": season,
            "start_date": start_date.strftime(date_formats[0]),
            "end_date": end_date.strftime(date_formats[0]),
            })

    pool_forms = []
    try:
        prev_semester = Semester.objects.all().order_by('end_date')[0]
    except IndexError:
        pass
    else:
        for pool in WorkshiftPool.objects.filter(semester=prev_semester):
            form = StartPoolForm(
                request.POST or None,
                initial={
                    "title": pool.title,
                    "hours": pool.hours,
                    },
                prefix="pool-{0}".format(pool.pk),
                )
            pool_forms.append(form)

    if semester_form.is_valid() and all(i.is_valid() for i in pool_forms):
        # And save this semester
        semester = semester_form.save()
        for pool_form in pool_forms:
            pool_form.save(semester=semester)
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))

    return render_to_response("start_semester.html", {
        "page_name": page_name,
        "semester_form": semester_form,
        "pool_forms": pool_forms,
        }, context_instance=RequestContext(request))
Exemple #22
0
def add_pool_view(request, semester):
    """
    View for the workshift manager to create new workshift pools (i.e. HI Hours).
    """
    page_name = "Add Workshift Pool"
    add_pool_form = PoolForm(
        request.POST or None,
        semester=semester,
        full_management=True,
        )
    if add_pool_form.is_valid():
        add_pool_form.save()
        messages.add_message(request, messages.INFO, "Workshift pool added.")
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))
    return render_to_response("add_pool.html", {
        "page_name": page_name,
        "add_pool_form": add_pool_form,
        }, context_instance=RequestContext(request))
Exemple #23
0
def add_pool_view(request, semester):
    """
    View for the workshift manager to create new workshift pools (i.e. HI Hours).
    """
    page_name = "Add Workshift Pool"
    add_pool_form = PoolForm(
        request.POST or None,
        semester=semester,
        full_management=True,
        )
    if add_pool_form.is_valid():
        add_pool_form.save()
        messages.add_message(request, messages.INFO, "Workshift pool added.")
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))
    return render_to_response("add_pool.html", {
        "page_name": page_name,
        "add_pool_form": add_pool_form,
        }, context_instance=RequestContext(request))
Exemple #24
0
def edit_type_view(request, pk):
    """
    View for a manager to edit the details of a particular WorkshiftType.
    """
    shift = get_object_or_404(WorkshiftType, pk=pk)
    edit_form = WorkshiftTypeForm(
        request.POST or None,
        instance=shift,
        )

    if edit_form.is_valid():
        shift = edit_form.save()
        return HttpResponseRedirect(wurl('workshift:view_type', pk=pk))

    page_name = "Edit " + shift.title

    return render_to_response("edit_type.html", {
        "page_name": page_name,
        "shift": shift,
        "edit_form": edit_form,
    }, context_instance=RequestContext(request))
Exemple #25
0
 def get_view_url(self):
     return wurl("workshift:profile", targetUsername=self.user.username, sem_url=self.semester.sem_url)
Exemple #26
0
 def get_edit_url(self):
     return wurl("workshift:manage", sem_url=self.sem_url)
Exemple #27
0
 def get_view_url(self):
     return wurl("workshift:view_semester", sem_url=self.sem_url)
Exemple #28
0
 def get_edit_url(self):
     return wurl("workshift:edit_type", pk=self.pk)
Exemple #29
0
 def get_view_url(self):
     return wurl("workshift:view_type", pk=self.pk)
Exemple #30
0
def preferences_view(request, semester, targetUsername, profile=None):
    """
    Show the user their preferences for the given semester.
    """
    # TODO: Change template to show descriptions in tooltip / ajax show box?
    wprofile = get_object_or_404(WorkshiftProfile, user__username=targetUsername)

    if wprofile.user != request.user and \
      not utils.can_manage(request.user, semester=semester):
        messages.add_message(request, messages.ERROR,
                             MESSAGES['ADMINS_ONLY'])
        return HttpResponseRedirect(semester.get_view_url())

    rating_forms = []
    for wtype in WorkshiftType.objects.filter(rateable=True):
        try:
            rating = wprofile.ratings.get(workshift_type=wtype)
        except WorkshiftRating.DoesNotExist:
            rating = WorkshiftRating(workshift_type=wtype)
        form = WorkshiftRatingForm(
            request.POST or None,
            prefix="rating-{0}".format(wtype.pk),
            instance=rating,
            profile=wprofile,
            )
        rating_forms.append(form)

    time_formset = TimeBlockFormSet(
        request.POST or None,
        prefix="time",
        profile=wprofile,
        )
    note_form = ProfileNoteForm(
        request.POST or None,
        instance=wprofile,
        prefix="note",
        )

    if all(i.is_valid() for i in rating_forms) and time_formset.is_valid() and \
      note_form.is_valid():
        for form in rating_forms:
            form.save()
        time_formset.save()
        instance = note_form.save()
        if wprofile.preference_save_time is None:
            wprofile.preference_save_time = now()
            wprofile.save()
        messages.add_message(request, messages.INFO, "Preferences saved.")
        return HttpResponseRedirect(wurl('workshift:preferences',
                                         sem_url=semester.sem_url,
                                         targetUsername=request.user.username))

    if wprofile == profile:
        page_name = "My Workshift Preferences"
    else:
        page_name = "{0}'s Workshift Preferences".format(
        wprofile.user.get_full_name())
    return render_to_response("preferences.html", {
        "page_name": page_name,
        "profile": wprofile,
        "rating_forms": rating_forms,
        "time_formset": time_formset,
        "note_form": note_form,
    }, context_instance=RequestContext(request))
Exemple #31
0
 def get_view_url(self):
     return wurl("workshift:view_shift",
                 pk=self.pk,
                 sem_url=self.pool.semester.sem_url)
Exemple #32
0
 def get_edit_url(self):
     return wurl("workshift:edit_shift", pk=self.pk, sem_url=self.pool.semester.sem_url)
Exemple #33
0
def view_semester(request, semester, profile=None):
    """
    Displays a table of the workshifts for the week, shift assignments,
    accumulated statistics (Down hours), reminders for any upcoming shifts, and
    links to sign off on shifts. Also links to the rest of the workshift pages.
    """
    template_dict = {}
    season_name = semester.get_season_display()
    template_dict["page_name"] = \
      "Workshift for {0} {1}".format(season_name, semester.year)

    template_dict["semester_percentage"] = int(
        (date.today() - semester.start_date).days /
        (semester.end_date - semester.start_date).days * 100
        )

    template_dict["profile"] = profile

    # We want a form for verification, a notification of upcoming shifts, and a
    # chart displaying the entire house's workshift for the day as well as
    # weekly shifts.
    #
    # The chart should have left and right arrows on the sides to switch the
    # day, with a dropdown menu to select the day from a calendar. Ideally,
    # switching days should use AJAX to appear more seemless to users.

    # Recent History
    day = date.today()
    if "day" in request.GET:
        try:
            day = date(*map(int, request.GET["day"].split("-")))
        except (TypeError, ValueError):
            pass

    template_dict["day"] = day
    if day > semester.start_date:
        template_dict["prev_day"] = (day - timedelta(days=1)).strftime("%Y-%m-%d")
    if day < semester.end_date:
        template_dict["next_day"] = (day + timedelta(days=1)).strftime("%Y-%m-%d")

    # Forms to interact with workshift
    if profile:
        for form in [VerifyShiftForm, BlownShiftForm, SignInForm, SignOutForm]:
            if form.action_name in request.POST:
                f = form(request.POST, profile=profile)
                if f.is_valid():
                    f.save()
                    return HttpResponseRedirect(
                        wurl("workshift:view_semester", sem_url=semester.sem_url) +
                        "?day={0}".format(day) if "day" in request.GET else "")
                else:
                    for error in f.errors.values():
                        messages.add_message(request, messages.ERROR, error)

    # Grab the shifts for just today, as well as week-long shifts
    last_sunday = day - timedelta(days=day.weekday() + 1)
    next_sunday = last_sunday + timedelta(weeks=1)

    day_shifts = WorkshiftInstance.objects.filter(date=day)
    day_shifts = [i for i in day_shifts if not i.week_long]
    week_shifts = WorkshiftInstance.objects.filter(
        date__gt=last_sunday, date__lte=next_sunday,
        )
    week_shifts = [i for i in week_shifts if i.week_long]

    template_dict["day_shifts"] = [(shift, _get_forms(profile, shift))
                                   for shift in day_shifts]
    template_dict["week_shifts"] = [(shift, _get_forms(profile, shift))
                                    for shift in week_shifts]

    return render_to_response("semester.html", template_dict,
                               context_instance=RequestContext(request))
Exemple #34
0
 def get_edit_url(self):
     return wurl("workshift:edit_instance", pk=self.pk, sem_url=self.semester.sem_url)
Exemple #35
0
 def get_view_url(self):
     return wurl("workshift:view_instance", pk=self.pk, sem_url=self.semester.sem_url)
Exemple #36
0
def assign_shifts_view(request, semester):
    """
    View all members' preferences. This view also includes forms to create an
    entire semester's worth of weekly workshifts.
    """
    page_name = "Assign Shifts"

    auto_assign_shifts_form = None
    random_assign_instances_form = None
    clear_assign_form = None

    if WorkshiftPool.objects.filter(semester=semester).count():
        auto_assign_shifts_form = AutoAssignShiftForm(
            request.POST if "auto_assign_shifts" in request.POST else None,
            semester=semester,
            )
        random_assign_instances_form = RandomAssignInstancesForm(
            request.POST if "random_assign_instances" in request.POST else None,
            semester=semester,
            )
        clear_assign_form = ClearAssignmentsForm(
            request.POST if "clear_assignments" in request.POST else None,
            semester=semester,
            )

    if auto_assign_shifts_form and auto_assign_shifts_form.is_valid():
        unassigned_profiles = auto_assign_shifts_form.save()
        message = "Assigned workshifters to regular workshifts."
        if unassigned_profiles:
            message += " The following workshifters were not given " \
              "complete assignments: "
            message += ", ".join(i.user.get_full_name() for i in unassigned_profiles)
        messages.add_message(request, messages.INFO, message)
        return HttpResponseRedirect(wurl('workshift:assign_shifts',
                                         sem_url=semester.sem_url))
    if random_assign_instances_form and random_assign_instances_form.is_valid():
        unassigned_profiles, unassigned_shifts = \
          random_assign_instances_form.save()
        message = "Assigned workshifters randomly to instances within {0}." \
          .format(random_assign_instances_form.cleaned_data["pool"])
        if unassigned_profiles:
            message += "The following workshifers were not given " \
              "complete assignments: "
            message += ", ".join(i.user.get_full_name() for i in unassigned_profiles)
        messages.add_message(request, messages.INFO, message)
        return HttpResponseRedirect(wurl('workshift:assign_shifts',
                                         sem_url=semester.sem_url))
    if clear_assign_form and clear_assign_form.is_valid():
        clear_assign_form.save()
        message = "Cleared all workshifters from their regular workshift " \
          "assignments"
        messages.add_message(request, messages.INFO, message)
        return HttpResponseRedirect(wurl('workshift:assign_shifts',
                                         sem_url=semester.sem_url))

    shifts = RegularWorkshift.objects.filter(
        pool__semester=semester,
        active=True,
        ).exclude(
            workshift_type__assignment=WorkshiftType.NO_ASSIGN,
            )

    assign_forms = []
    for shift in shifts:
        form = AssignShiftForm(
            request.POST if "individual_assign" in request.POST else None,
            prefix="shift-{0}".format(shift.pk),
            instance=shift,
            semester=semester,
            )
        assign_forms.append(form)
    if all(i.is_valid() for i in assign_forms):
        for form in assign_forms:
            form.save()
        messages.add_message(request, messages.INFO, "Workshift assignments saved.")
        return HttpResponseRedirect(wurl('workshift:assign_shifts',
                                         sem_url=semester.sem_url))
    return render_to_response("assign_shifts.html", {
        "page_name": page_name,
        "auto_assign_shifts_form": auto_assign_shifts_form,
        "random_assign_instances_form": random_assign_instances_form,
        "clear_assign_form": clear_assign_form,
        "assign_forms": assign_forms,
    }, context_instance=RequestContext(request))
Exemple #37
0
 def get_view_url(self):
     return wurl("workshift:view_type", pk=self.pk)
Exemple #38
0
 def get_view_url(self):
     return wurl("workshift:view_instance",
                 pk=self.pk,
                 sem_url=self.semester.sem_url)
Exemple #39
0
def assign_shifts_view(request, semester):
    """
    View all members' preferences. This view also includes forms to create an
    entire semester's worth of weekly workshifts.
    """
    page_name = "Assign Shifts"

    auto_assign_shifts_form = None
    random_assign_instances_form = None
    clear_assign_form = None

    if WorkshiftPool.objects.filter(semester=semester).count():
        auto_assign_shifts_form = AutoAssignShiftForm(
            request.POST if AutoAssignShiftForm.name in request.POST else None,
            semester=semester,
            )
        random_assign_instances_form = RandomAssignInstancesForm(
            request.POST if RandomAssignInstancesForm.name in request.POST else None,
            semester=semester,
            )
        clear_assign_form = ClearAssignmentsForm(
            request.POST if ClearAssignmentsForm.name in request.POST else None,
            semester=semester,
            )

    forms = [auto_assign_shifts_form, random_assign_instances_form,
             clear_assign_form]

    if auto_assign_shifts_form and auto_assign_shifts_form.is_valid():
        unassigned_profiles = auto_assign_shifts_form.save()
        message = "Assigned workshifters to regular workshifts."
        if unassigned_profiles:
            message += " The following workshifters were not given " \
              "complete assignments: "
            message += ", ".join(i.user.get_full_name() for i in unassigned_profiles)
        messages.add_message(request, messages.INFO, message)
        return HttpResponseRedirect(wurl('workshift:assign_shifts',
                                         sem_url=semester.sem_url))

    if random_assign_instances_form and random_assign_instances_form.is_valid():
        unassigned_profiles, unassigned_shifts = \
          random_assign_instances_form.save()
        message = "Assigned workshifters randomly to instances within {0}." \
          .format(random_assign_instances_form.cleaned_data["pool"])
        if unassigned_profiles:
            message += "The following workshifers were not given " \
              "complete assignments: "
            message += ", ".join(i.user.get_full_name() for i in unassigned_profiles)
        messages.add_message(request, messages.INFO, message)
        return HttpResponseRedirect(wurl('workshift:assign_shifts',
                                         sem_url=semester.sem_url))

    if clear_assign_form and clear_assign_form.is_valid():
        clear_assign_form.save()
        message = "Cleared all workshifters from their regular workshift " \
          "assignments"
        messages.add_message(request, messages.INFO, message)
        return HttpResponseRedirect(wurl('workshift:assign_shifts',
                                         sem_url=semester.sem_url))

    shifts = RegularWorkshift.objects.filter(
        pool__semester=semester,
        active=True,
        ).exclude(
            workshift_type__assignment=WorkshiftType.NO_ASSIGN,
            )

    assign_forms = []
    for shift in shifts:
        form = AssignShiftForm(
            request.POST if "individual_assign" in request.POST else None,
            prefix="shift-{0}".format(shift.pk),
            instance=shift,
            semester=semester,
            )
        assign_forms.append(form)

    if all(i.is_valid() for i in assign_forms):
        for form in assign_forms:
            form.save()
        messages.add_message(request, messages.INFO, "Workshift assignments saved.")
        return HttpResponseRedirect(wurl('workshift:assign_shifts',
                                         sem_url=semester.sem_url))

    return render_to_response("assign_shifts.html", {
        "page_name": page_name,
        "forms": forms,
        "assign_forms": assign_forms,
    }, context_instance=RequestContext(request))
Exemple #40
0
 def get_view_url(self):
     return wurl("workshift:view_shift", pk=self.pk, sem_url=self.pool.semester.sem_url)
Exemple #41
0
def manage_view(request, semester, profile=None):
    """
    View all members' preferences. This view also includes forms to create an
    entire semester's worth of weekly workshifts.
    """
    page_name = "Manage Workshift"
    pools = WorkshiftPool.objects.filter(semester=semester)
    full_management = utils.can_manage(request.user, semester=semester)
    edit_semester_form = None
    close_semester_form = None
    open_semester_form = None

    if not full_management:
        pools = pools.filter(managers__incumbent__user=request.user)
        if not pools.count():
            messages.add_message(request, messages.ERROR,
                                 MESSAGES['ADMINS_ONLY'])
            return HttpResponseRedirect(semester.get_view_url())
    else:
        edit_semester_form = FullSemesterForm(
            request.POST if "edit_semester" in request.POST else None,
            instance=semester,
            )
        if semester.current:
            close_semester_form = CloseSemesterForm(
                request.POST if "close_semester" in request.POST else None,
                semester=semester,
                )
        else:
            open_semester_form = OpenSemesterForm(
                request.POST if "open_semester" in request.POST else None,
                semester=semester
                )


    if edit_semester_form and edit_semester_form.is_valid():
        semester = edit_semester_form.save()
        messages.add_message(request, messages.INFO, "Semester successfully updated.")
        return HttpResponseRedirect(wurl('workshift:manage',
                                         sem_url=semester.sem_url))

    if close_semester_form and close_semester_form.is_valid():
        close_semester_form.save()
        messages.add_message(request, messages.INFO, "Semester closed.")
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))

    if open_semester_form and open_semester_form.is_valid():
        open_semester_form.save()
        messages.add_message(request, messages.INFO, "Semester reopened.")
        return HttpResponseRedirect(wurl("workshift:manage",
                                         sem_url=semester.sem_url))

    pools = pools.order_by('-is_primary', 'title')
    workshifters = WorkshiftProfile.objects.filter(semester=semester)
    pool_hours = [workshifter.pool_hours.filter(pool__in=pools)
                  .order_by('-pool__is_primary', 'pool__title')
                  for workshifter in workshifters]

    return render_to_response("manage.html", {
        "page_name": page_name,
        "pools": pools,
        "full_management": full_management,
        "edit_semester_form": edit_semester_form,
        "close_semester_form": close_semester_form,
        "open_semester_form": open_semester_form,
        "workshifters": zip(workshifters, pool_hours),
    }, context_instance=RequestContext(request))
Exemple #42
0
 def get_edit_url(self):
     return wurl(
         "workshift:edit_profile",
         targetUsername=self.user.username,
         sem_url=self.semester.sem_url,
     )
Exemple #43
0
 def get_view_url(self):
     return wurl("workshift:view_semester", sem_url=self.sem_url)
Exemple #44
0
 def get_view_url(self):
     return wurl(
         "workshift:profile",
         targetUsername=self.user.username,
         sem_url=self.semester.sem_url,
     )