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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
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))
def get_view_url(self): return wurl("workshift:profile", targetUsername=self.user.username, sem_url=self.semester.sem_url)
def get_edit_url(self): return wurl("workshift:manage", sem_url=self.sem_url)
def get_view_url(self): return wurl("workshift:view_semester", sem_url=self.sem_url)
def get_edit_url(self): return wurl("workshift:edit_type", pk=self.pk)
def get_view_url(self): return wurl("workshift:view_type", pk=self.pk)
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))
def get_view_url(self): return wurl("workshift:view_shift", pk=self.pk, sem_url=self.pool.semester.sem_url)
def get_edit_url(self): return wurl("workshift:edit_shift", pk=self.pk, sem_url=self.pool.semester.sem_url)
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))
def get_edit_url(self): return wurl("workshift:edit_instance", pk=self.pk, sem_url=self.semester.sem_url)
def get_view_url(self): return wurl("workshift:view_instance", pk=self.pk, sem_url=self.semester.sem_url)
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))
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))
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))
def get_edit_url(self): return wurl( "workshift:edit_profile", targetUsername=self.user.username, sem_url=self.semester.sem_url, )
def get_view_url(self): return wurl( "workshift:profile", targetUsername=self.user.username, sem_url=self.semester.sem_url, )