def all_quick(request): monday = getMonday(date.today()) sunday = monday + timedelta(days=6) templateData = getTemplateData(request, advisor=None, unassigned=False, monday=monday) return render(request, "enrichmentmanager/assign_all.html", templateData)
def getTemplateData(request, advisor, unassigned, monday): sunday = monday + timedelta(days=6) slots = EnrichmentSlot.objects.filter(date__gte=monday).filter(date__lte=sunday).order_by('date') if advisor: students = Student.objects.filter(advisor=advisor) else: students = Student.objects.all() #This can probably be done directly on the DB server if unassigned: unassignedStudentIDs = set() for student in students: if student.id in unassignedStudentIDs: continue if student.lockout: continue for slot in slots: try: EnrichmentSignup.objects.get(student=student, slot=slot) except EnrichmentSignup.DoesNotExist: unassignedStudentIDs.add(student.id) #This is ineffecient, but it guarantees that I get a QuerySet back out, as opposed to working on a list later on students = Student.objects.filter(id__in=unassignedStudentIDs) students = students.order_by('academic_student__last_name', 'academic_student__first_name') slotChoices = {} for slot in slots: slotChoices[slot] = EnrichmentOption.objects.filter(slot=slot).prefetch_related('teacher').order_by('teacher__academic_teacher__last_name', 'teacher__academic_teacher__first_name').all() #This is an extra query if we're grabbing the unassigned set relatedSignups = {} for enrichmentSignup in EnrichmentSignup.objects.filter(slot__in=slots, student__in=students).prefetch_related('student', 'slot'): key = "slot_{slot_id}_{student_id}".format(slot_id=enrichmentSignup.slot.id, student_id=enrichmentSignup.student.id) relatedSignups[key] = enrichmentSignup.enrichment_option.id slotOptions = EnrichmentSlot.objects.filter(date__gte=date.today()) weekOptions = set() for slotOption in slotOptions: weekOptions.add(getMonday(slotOption.date)) data = { 'currentDate': date(monday.year, monday.month, monday.day), 'slots': slots, 'students': students, 'advisors': Teacher.objects.exclude(student=None).order_by('academic_teacher__last_name', 'academic_teacher__first_name').all(), 'weekOptions': sorted(weekOptions), 'currentAdvisor': advisor, 'slotChoices': slotChoices, 'relatedSignups': relatedSignups, } return data
def unassigned_explicit(request, year, month, day): year, month, day = map(int, (year, month, day)) monday = getMonday(date(year, month, day)) sunday = monday + timedelta(days=6) templateData = getTemplateData(request, advisor=None, unassigned=True, monday=monday) return render(request, "enrichmentmanager/assign_unassigned.html", templateData)
def advisor_quick(request): #Get our next date nextDate = EnrichmentSlot.objects.filter(date__gte=date.today()).aggregate(Min('date'))['date__min'] monday = getMonday(nextDate) sunday = monday + timedelta(days=6) currentUser = request.user #TODO: Handle case of advisor not found advisor = Teacher.objects.get(academic_teacher__email=currentUser.email) templateData = getTemplateData(request, advisor=advisor, unassigned=False, monday=monday) return render(request, "enrichmentmanager/assign_advisor.html", templateData)
def advisor_explicit(request, advisor, year, month, day): year, month, day = map(int, (year, month, day)) monday = getMonday(date(year, month, day)) sunday = monday + timedelta(days=6) if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path)) advisor = Teacher.objects.get(pk=advisor) if request.user.email == advisor.email and request.user.has_perm("enrichmentmanager.can_view_own_advisees"): templateData = getTemplateData(request, advisor=advisor, unassigned=False, monday=monday) return render(request, "enrichmentmanager/assign_advisor.html", templateData) elif request.user.has_perm("enrichmentmanager.can_view_other_advisees"): templateData = getTemplateData(request, advisor=advisor, unassigned=False, monday=monday) return render(request, "enrichmentmanager/assign_advisor.html", templateData) return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
def all_explicit(request, year, month, day): year, month, day = map(int, (year, month, day)) monday = getMonday(date(year, month, day)) sunday = monday + timedelta(days=6) templateData = getTemplateData(request, advisor=None, unassigned=False, monday=monday) templateData['allowSlotSort'] = True #This is horrible ineffecient, but it does solve the quick reassignment issue... if request.GET.get("sort"): def getKey(student): option = EnrichmentOption.objects.filter(slot__id=request.GET['sort'], students=student).first() if option: return (option.teacher.last_name, option.teacher.first_name) return ("", "") templateData['students'] = sorted(templateData['students'], key=getKey) return render(request, "enrichmentmanager/assign_all.html", templateData)