예제 #1
0
def section(request, sectionid):
    logged_in = request.user.is_authenticated
    if logged_in:
        the_profile = request.user.profile
        user_role = the_profile.role

    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN
    is_prof = logged_in and user_role == Profile.ACCESS_PROFESSOR
    can_see_students = logged_in and user_role in (Profile.ACCESS_ADMIN,
                                                   Profile.ACCESS_PROFESSOR)

    qs = Section.objects.filter(id=sectionid)
    if qs.count() < 1:
        return HttpResponse("No such section")
    the_section = qs.get()

    data = {
        'section': the_section,
        'can_edit': is_admin,
        'can_refresh_items': is_prof
        and the_section.professor == the_profile.professor,
        'can_see_students': can_see_students,
    }
    data.update(next_prev(request, 'sections', sectionid))
    if can_see_students:
        data.update(
            filtered_table2(
                name='secstuds',
                qs=SectionStudent.objects.filter(section=the_section),
                filter=SectionStudentFilter,
                table=StudentInSectionTable,
                request=request,
                self_url=reverse('schooladmin:section', args=[sectionid]),
                click_url=reverse('schooladmin:sectionstudent',
                                  args=[DUMMY_ID]),
            ))
    data.update(
        filtered_table2(
            name='secitems',
            qs=the_section.sectionreferenceitem_set,
            filter=SectionItemFilter,
            table=ReferenceItemsForSectionTable,
            request=request,
            self_url=reverse('schooladmin:section', args=[sectionid]),
            click_url=reverse('sis:secitem', args=[DUMMY_ID]),
        ))

    if not logged_in:
        data['user'] = {'home_template': "schooladmin/home_guest.html"}
    return render(request, 'schooladmin/section.html', data)
예제 #2
0
def course(request, courseid):
    logged_in = request.user.is_authenticated
    if logged_in:
        user_role = request.user.profile.role
    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN

    qs = Course.objects.filter(id=courseid)
    if qs.count() < 1:
        return HttpResponse("No such course")
    the_course = qs.get()

    data = {'course': the_course, 'can_edit': is_admin}
    data.update(next_prev(request, 'courses', courseid))
    data.update(
        filtered_table2(
            name='sections',
            qs=Section.objects.filter(course=the_course),
            filter=SectionFilter,
            table=SectionForClassTable,
            request=request,
            self_url=reverse('schooladmin:course', args=[courseid]),
            click_url=reverse('schooladmin:section', args=[DUMMY_ID]),
        ))
    data.update(
        filtered_table2(
            name='prereqs',
            qs=Course.objects.filter(a_prerequisite__course=the_course),
            filter=CourseFilter,
            table=CoursesTable,
            request=request,
            page_size=5,
            self_url=reverse('schooladmin:course', args=[courseid]),
            click_url=reverse('schooladmin:course', args=[DUMMY_ID]),
        ))
    data.update(
        filtered_table2(
            name='neededby',
            qs=Course.objects.filter(a_course__prerequisite=the_course),
            filter=CourseFilter,
            table=CoursesTable,
            request=request,
            page_size=10,
            self_url=reverse('schooladmin:course', args=[courseid]),
            click_url=reverse('schooladmin:course', args=[DUMMY_ID]),
        ))

    if not logged_in:
        data['user'] = {'home_template': "schooladmin/home_guest.html"}
    return render(request, 'schooladmin/course.html', data)
예제 #3
0
def semester(request, semester_id):
    logged_in = request.user.is_authenticated
    if logged_in:
        user_role = request.user.profile.role
    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN

    qs = Semester.objects.filter(id=semester_id)
    if qs.count() < 1:
        return HttpResponse("No such semester")
    the_semester = qs.get()

    data = {'semester': the_semester, 'can_add': is_admin}
    data.update(next_prev(request, 'semesters', semester_id))
    data.update(
        filtered_table2(
            name='sections',
            qs=Section.objects.filter(semester=the_semester),
            filter=SectionFilter,
            table=SectionsTable,
            request=request,
            self_url=reverse('schooladmin:semester', args=[semester_id]),
            click_url=reverse('schooladmin:section', args=[DUMMY_ID]),
        ))
    if logged_in and user_role in (Profile.ACCESS_ADMIN,
                                   Profile.ACCESS_PROFESSOR):
        data.update(
            filtered_table2(
                name='students',
                qs=the_semester.students_attending(),
                filter=StudentFilter,
                table=StudentsTable,
                request=request,
                self_url=reverse('schooladmin:semester', args=[semester_id]),
                click_url=reverse('schooladmin:student', args=[DUMMY_ID]),
            ))
    data.update(
        filtered_table2(
            name='professors',
            qs=the_semester.professors_teaching(),
            filter=UserFilter,
            table=UsersTable,
            request=request,
            self_url=reverse('schooladmin:semester', args=[semester_id]),
            click_url=reverse('schooladmin:professor', args=[DUMMY_ID]),
        ))

    if not logged_in:
        data['user'] = {'home_template': "schooladmin/home_guest.html"}
    return render(request, 'schooladmin/semester.html', data)
예제 #4
0
def semesters(request):
    logged_in = request.user.is_authenticated
    if logged_in:
        user_role = request.user.profile.role
    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN

    data = {'can_add': is_admin}

    qs = Semester.objects.all()
    if request.method == 'POST':
        if request.POST.get('active') is not None:
            qs = Semester.active_semesters()
        elif request.POST.get('upcoming') is not None:
            qs = Semester.objects.filter(
                date_started__gte=datetime.now().date())

    data.update(
        filtered_table2(
            name='semesters',
            qs=qs,
            filter=SemesterFilter,
            table=SemestersTable,
            request=request,
            scrollable=True,
            self_url=reverse('schooladmin:semesters'),
            click_url=reverse('schooladmin:semester', args=[DUMMY_ID]),
        ))
    if not logged_in:
        data['user'] = {'home_template': "schooladmin/home_guest.html"}
    return render(request, 'schooladmin/semesters.html', data)
예제 #5
0
def professor_items(request, userid):
    logged_in = request.user.is_authenticated
    qs = User.objects.filter(id=userid)
    if qs.count() < 1:
        return HttpResponse("No such user")
    the_user = qs.get()

    if the_user.profile.role != Profile.ACCESS_PROFESSOR:
        return users.user(request, userid)

    data = {
        'auser': the_user,
    }
    data.update(
        filtered_table2(
            name='items',
            qs=the_user.profile.professor.referenceitem_set,
            filter=ItemFilter,
            table=ProfReferenceItemsTable,
            request=request,
            self_url=reverse('schooladmin:professor_items', args=[userid]),
            click_url=reverse('schooladmin:professor_item',
                              args=[userid, DUMMY_ID]),
        ))

    if not logged_in:
        data['user'] = {'home_template': "schooladmin/home_guest.html"}
    return render(request, 'schooladmin/professor_items.html', data)
예제 #6
0
def secitems(request):
    the_user = request.user

    the_semester = Semester.current_semester()
    if request.method == 'POST':
        the_id = request.POST.get('semester', the_semester.id)
        the_semester = Semester.objects.get(id=the_id)

    data = {
        'auser': the_user,
        'semester': the_semester,
        'semesters': the_user.profile.student.semesters.all(),
    }

    data.update(
        filtered_table2(
            name='secitems',
            qs=the_user.profile.student.section_reference_items_for(
                the_semester),
            filter=SectionItemFilter,
            table=SectionReferenceItemsTable,
            request=request,
            self_url=reverse('student:secitems'),
            click_url=reverse('sis:secitem', args=[DUMMY_ID]),
        ))

    return render(request, 'student/items.html', data)
예제 #7
0
def professors(request):
    logged_in = request.user.is_authenticated
    if logged_in:
        user_role = request.user.profile.role
    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN

    data = {
        'can_add': is_admin,
    }
    if not logged_in:
        data['user'] = {'home_template': "schooladmin/home_guest.html"}

    now = datetime.now().date()
    qs = User.objects.all().filter(profile__role=Profile.ACCESS_PROFESSOR)
    if request.method == 'POST':
        if request.POST.get('teaching-current') is not None:
            qs = qs.filter(profile__professor__id__in=Subquery(
                Section.objects.filter(semester__date_started__lte=now,
                                       semester__date_ended__gte=now).values(
                                           'professor__id')))
            the_sem_qs = Semester.objects.filter(date_started__lte=now,
                                                 date_ended__gte=now)
            if the_sem_qs.count() < 1:
                messages.error(request, f'No current semester.')
            else:
                messages.info(
                    request, f'{qs.count()} professors teaching in ' +
                    f'{the_sem_qs[0].name}')

        if request.POST.get('teaching-upcoming') is not None:
            qs = qs.filter(profile__professor__id__in=Subquery(
                Section.objects.filter(
                    semester__date_registration_opens__lte=now,
                    semester__date_registration_closes__gte=now).values(
                        'professor__id')))
            the_sem_qs = Semester.objects.filter(
                date_registration_opens__lte=now,
                date_registration_closes__gte=now)
            if the_sem_qs.count() < 1:
                messages.error(request, f'No semester open for registration.')
            else:
                messages.info(
                    request, f'{qs.count()} professors teaching in ' +
                    f'{the_sem_qs[0].name}')

    data.update(
        filtered_table2(
            name='professors',
            qs=qs,
            filter=ProfessorFilter,
            table=ProfessorsTable,
            request=request,
            scrollable=True,
            self_url=reverse('schooladmin:professors'),
            click_url=reverse('schooladmin:professor', args=[DUMMY_ID]),
        ))

    return render(request, 'schooladmin/professors.html', data)
예제 #8
0
def history(request):
    the_user = request.user
    student = the_user.profile.student
    ssects = student.sectionstudent_set.all().order_by(
        'section__semester', 'section__course__name')
    semesters = []
    accumulating_sem = {
        'semester': None,
    }
    for ssect in ssects:
        if ssect.section.semester != accumulating_sem['semester']:
            if accumulating_sem['semester'] is not None:
                semesters.append(accumulating_sem)
            accumulating_sem = {
                'semester':
                ssect.section.semester,
                'gpa':
                student.semesterstudent_set.get(
                    semester=ssect.section.semester).gpa,
                'sections': [],
                'credits_earned':
                student.semesterstudent_set.get(
                    semester=ssect.section.semester).credits_earned,
            }
        accumulating_sem['sections'].append(ssect)

    data = {
        'auser': the_user,
        'semesters': semesters,
    }

    remaining = the_user.profile.student.requirements_met_list()
    stats = remaining.filter(met=False).aggregate(
        remaining_course_count=Count('id'),
        remaining_credit_count=Sum('credits_earned'))
    if stats['remaining_credit_count'] is None:
        stats['remaining_credit_count'] = 0

    data.update(stats)

    data.update(
        filtered_table2(
            name='majorcourses',
            qs=remaining,
            filter=RequirementsCourseFilter,
            table=MajorCoursesMetTable,
            request=request,
            self_url=reverse('student:history'),
            click_url=reverse('schooladmin:course', args=[DUMMY_ID]),
        ))
    return render(request, 'student/history.html', data)
예제 #9
0
def usermessages(request):
    the_user = request.user

    sentFilter = FullSentMessageFilter
    receivedFilter = FullReceivedMessageFilter
    receivedTable = MessageReceivedTable
    if the_user.profile.role == Profile.ACCESS_STUDENT:
        sentFilter = SentMessageFilter
        receivedFilter = ReceivedMessageFilter
        receivedTable = StudentMessageReceivedTable

    data = {
        'auser': the_user,
    }
    data.update(
        filtered_table2(
            name='received',
            qs=the_user.profile.sent_to.all(),
            filter=receivedFilter,
            table=receivedTable,
            request=request,
            scrollable=True,
            self_url=reverse('sis:messages'),
            click_url=reverse('sis:message', args=[DUMMY_ID]),
        ))
    data.update(
        filtered_table2(
            name='sent',
            qs=the_user.profile.sent_by.all(),
            filter=sentFilter,
            table=MessageSentTable,
            request=request,
            scrollable=True,
            self_url=reverse('sis:messages'),
            click_url=reverse('sis:message', args=[DUMMY_ID]),
        ))

    return render(request, 'sis/messages.html', data)
예제 #10
0
def userslist(request):
    return render(
        request, 'schooladmin/users.html',
        filtered_table2(
            name='users',
            qs=User.objects.exclude(
                profile__role=Profile.ACCESS_NONE).exclude(~Exists(
                    Profile.objects.filter(
                        user__username=OuterRef('username')))),
            filter=UserFilter,
            table=FullUsersTable,
            request=request,
            scrollable=True,
            self_url=reverse('schooladmin:users'),
            click_url=reverse('schooladmin:user', args=[DUMMY_ID]),
        ))
예제 #11
0
def test_majors(request):
    the_user = request.user
    the_major = the_user.profile.student.major

    if request.method == 'POST':
        major_form = MajorSelectForm(request.POST)
        if major_form.is_valid():
            the_major = major_form.cleaned_data.get('major')
        else:
            messages.error(request, "Something went wrong")
    else:
        major_form = MajorSelectForm(initial={
            'major': the_major,
        })

    data = {
        'auser': the_user,
        'major': the_major,
        'major_form': major_form,
    }
    candidate_remaining = the_user.profile.student.requirements_met_list(
        major=the_major)
    stats = candidate_remaining.filter(met=False).aggregate(
        remaining_course_count=Count('id'),
        remaining_credit_count=Sum('credits_earned'))
    if stats['remaining_credit_count'] is None:
        stats['remaining_credit_count'] = 0
    data.update(stats)

    data.update(
        filtered_table2(
            name='majorcourses',
            qs=candidate_remaining,
            filter=RequirementsCourseFilter,
            table=MajorCoursesMetTable,
            request=request,
            self_url=reverse('student:test_majors'),
            click_url=reverse('schooladmin:course', args=[DUMMY_ID]),
        ))

    return render(request, 'student/test_majors.html', data)
예제 #12
0
def sections(request):
    logged_in = request.user.is_authenticated
    if logged_in:
        user_role = request.user.profile.role
    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN

    data = {
        'can_add': is_admin,
    }
    data.update(
        filtered_table2(
            name='sections',
            qs=Section.objects.all(),
            filter=SectionFilter,
            table=SectionsTable,
            request=request,
            scrollable=True,
            self_url=reverse('schooladmin:sections'),
            click_url=reverse('schooladmin:section', args=[DUMMY_ID]),
        ))
    if not logged_in:
        data['user'] = {'home_template': "schooladmin/home_guest.html"}
    return render(request, 'schooladmin/sections.html', data)
예제 #13
0
def students(request):
    logged_in = request.user.is_authenticated
    if logged_in:
        user_role = request.user.profile.role
    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN

    qs = User.objects.all().filter(profile__role=Profile.ACCESS_STUDENT)
    if request.method == 'POST':
        if request.POST.get('attending-current') is not None:
            qs = qs.filter(
                profile__student__semesters__date_started__lte=datetime.now(
                ).date(),
                profile__student__semesters__date_ended__gte=datetime.now(
                ).date())
        if request.POST.get('attending-upcoming') is not None:
            qs = qs.filter(
                profile__student__semesters__date_registration_opens__lte=
                datetime.now().date(),
                profile__student__semesters__date_registration_closes__gte=
                datetime.now().date())

    data = {
        'can_add': is_admin,
    }
    data.update(
        filtered_table2(
            name='students',
            qs=qs,
            filter=StudentFilter,
            table=StudentsTable,
            request=request,
            scrollable=True,
            self_url=reverse('schooladmin:students'),
            click_url=reverse('schooladmin:student', args=[DUMMY_ID]),
        ))
    return render(request, 'schooladmin/students.html', data)
예제 #14
0
def user(request, userid):
    qs = User.objects.filter(id=userid)
    if qs.count() < 1:
        return HttpResponse("No such user")
    the_user = qs.get()

    logged_in = request.user.is_authenticated
    if logged_in:
        user_role = request.user.profile.role
    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN

    if is_admin and request.method == 'POST':
        if request.POST.get('disbutton'):
            the_user.is_active = False
            the_user.save()
            messages.success(
                request,
                f'User {the_user.get_full_name()} has been disabled from login.'
            )
        elif request.POST.get('enabutton'):
            the_user.is_active = True
            the_user.save()
            messages.success(
                request,
                f'User {the_user.get_full_name()} has been enabled for login.')
        return redirect('schooladmin:users')

    if the_user.profile.role == Profile.ACCESS_STUDENT:
        if logged_in and (is_admin or user_role == Profile.ACCESS_PROFESSOR):
            return student(request, userid)
        else:
            return HttpResponse("Unauthorized")
    elif the_user.profile.role == Profile.ACCESS_PROFESSOR:
        return professor(request, userid)

    data = {
        'auser': the_user,
        'show_all': is_admin,
    }

    data.update(next_prev(request, 'users', userid))

    if is_admin:
        data.update(
            filtered_table2(
                name='received',
                qs=the_user.profile.sent_to.all(),
                filter=FullReceivedMessageFilter,
                table=MessageReceivedTable,
                request=request,
                wrap_list=False,
                self_url=reverse('schooladmin:user', args=[userid]),
                click_url=reverse('sis:viewmessage', args=[DUMMY_ID]),
            ))
        data.update(
            filtered_table2(
                name='sent',
                qs=the_user.profile.sent_by.all(),
                filter=FullSentMessageFilter,
                table=MessageSentTable,
                request=request,
                wrap_list=False,
                self_url=reverse('schooladmin:user', args=[userid]),
                click_url=reverse('sis:viewmessage', args=[DUMMY_ID]),
            ))

    return render(request, 'schooladmin/user.html', data)
예제 #15
0
def professor(request, userid):
    logged_in = request.user.is_authenticated
    if logged_in:
        user_role = request.user.profile.role
    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN

    qs = User.objects.filter(id=userid)
    if qs.count() < 1:
        return HttpResponse("No such user")
    the_prof = qs[0]

    if is_admin and request.method == 'POST':
        if request.POST.get('disbutton'):
            the_prof.is_active = False
            the_prof.save()
        elif request.POST.get('enabutton'):
            the_prof.is_active = True
            the_prof.save()
        return redirect('schooladmin:users')

    data = {'auser': the_prof, 'can_edit': is_admin}

    data.update(next_prev(request, 'professors', userid, fallback='users'))

    data.update(
        filtered_table2(
            name='semesters',
            qs=the_prof.profile.professor.semesters_teaching(),
            filter=SemesterFilter,
            table=SemestersSummaryTable,
            request=request,
            self_url=reverse('schooladmin:professor', args=[userid]),
            click_url=reverse('schooladmin:semester', args=[DUMMY_ID]),
        ))

    data.update(
        filtered_table2(
            name='sections',
            qs=the_prof.profile.professor.section_set,
            filter=SectionFilter,
            table=SectionsTable,
            request=request,
            self_url=reverse('schooladmin:professor', args=[userid]),
            click_url=reverse('schooladmin:section', args=[DUMMY_ID]),
        ))

    data.update(
        filtered_table2(
            name='items',
            qs=the_prof.profile.professor.referenceitem_set,
            filter=ItemFilter,
            table=ProfReferenceItemsTable,
            request=request,
            self_url=reverse('schooladmin:professor', args=[userid]),
            click_url=reverse('schooladmin:professor_item',
                              args=[userid, DUMMY_ID]),
        ))
    if is_admin:
        data.update(
            filtered_table2(
                name='received',
                qs=the_prof.profile.sent_to.filter(time_archived__isnull=True),
                filter=ReceivedMessageFilter,
                table=MessageReceivedTable,
                request=request,
                wrap_list=False,
                self_url=reverse('schooladmin:professor', args=[userid]),
                click_url=reverse('sis:viewmessage', args=[DUMMY_ID]),
            ))
        data.update(
            filtered_table2(
                name='sent',
                qs=the_prof.profile.sent_by.filter(time_archived__isnull=True),
                filter=SentMessageFilter,
                table=MessageSentTable,
                request=request,
                wrap_list=False,
                self_url=reverse('schooladmin:professor', args=[userid]),
                click_url=reverse('sis:viewmessage', args=[DUMMY_ID]),
            ))

    if not logged_in:
        data['user'] = {'home_template': "schooladmin/home_guest.html"}
    return render(request, 'schooladmin/professor.html', data)
예제 #16
0
def student(request, userid):
    logged_in = request.user.is_authenticated
    if logged_in:
        user_role = request.user.profile.role
    is_admin = logged_in and user_role == Profile.ACCESS_ADMIN

    qs = User.objects.filter(id=userid)
    if qs.count() < 1:
        return HttpResponse("No such user")
    the_user = qs.get()

    if the_user.profile.role != Profile.ACCESS_STUDENT:
        return user(request, userid)

    if request.method == 'POST':
        if request.POST.get('disbutton'):
            the_user.is_active = False
            the_user.save()
        elif request.POST.get('enabutton'):
            the_user.is_active = True
            the_user.save()
        return redirect('schooladmin:users')

    data = {
        'auser': the_user,
        'can_edit': is_admin,
    }
    data.update(next_prev(request, 'students', userid, fallback='users'))

    data.update(
        filtered_table2(
            name='semesters',
            qs=the_user.profile.student.semesterstudent_set.all(),
            filter=SemesterStudentFilter,
            table=SemesterStudentSummaryTable,
            request=request,
            self_url=reverse('schooladmin:student', args=[userid]),
        ))

    data.update(
        filtered_table2(
            name='history',
            qs=the_user.profile.student.course_history(),
            filter=SectionStudentFilter,
            table=StudentHistoryTable,
            request=request,
            self_url=reverse('schooladmin:student', args=[userid]),
            click_url=reverse('schooladmin:sectionstudent', args=[DUMMY_ID]),
        ))

    data.update(
        filtered_table2(
            name='remaining',
            qs=the_user.profile.student.remaining_required_courses(),
            filter=CourseFilter,
            table=CoursesTable,
            request=request,
            self_url=reverse('schooladmin:student', args=[userid]),
            click_url=reverse('schooladmin:course', args=[DUMMY_ID]),
        ))
    data.update(
        filtered_table2(
            name='majorcourses',
            qs=the_user.profile.student.requirements_met_list(),
            filter=CourseFilter,
            table=MajorCoursesMetTable,
            request=request,
            click_url=reverse('schooladmin:course', args=[DUMMY_ID]),
        ))
    if is_admin:
        data.update(
            filtered_table2(
                name='received',
                qs=the_user.profile.sent_to.filter(time_archived__isnull=True),
                filter=ReceivedMessageFilter,
                table=MessageReceivedTable,
                request=request,
                wrap_list=False,
                self_url=reverse('schooladmin:student', args=[userid]),
                click_url=reverse('sis:viewmessage', args=[DUMMY_ID]),
            ))
        data.update(
            filtered_table2(
                name='sent',
                qs=the_user.profile.sent_by.filter(time_archived__isnull=True),
                filter=SentMessageFilter,
                table=MessageSentTable,
                request=request,
                wrap_list=False,
                self_url=reverse('schooladmin:student', args=[userid]),
                click_url=reverse('sis:viewmessage', args=[DUMMY_ID]),
            ))

    return render(request, 'schooladmin/student.html', data)
예제 #17
0
def major(request, majorid):
    the_user = request.user
    logged_in = request.user.is_authenticated
    is_admin = logged_in and the_user.profile.role == Profile.ACCESS_ADMIN

    include_students = logged_in and the_user.profile.role in (Profile.ACCESS_ADMIN,
                                                               Profile.ACCESS_PROFESSOR)

    qs = Major.objects.filter(id=majorid)
    if qs.count() < 1:
        messages.error(request, "Something went wrong.")
        return HttpResponse("No such major", reason="Invalid Data", status=404)

    the_major = qs.get()

    data = {
        'major': the_major,
        'permit_edit': is_admin,
        'permit_new_course': is_admin,
        'include_students': include_students,
    }
    data.update(next_prev(request, 'majors', majorid))
    data.update(
        filtered_table2(
            name='profs',
            qs=User.objects.all().filter(profile__professor__major=the_major),
            filter=UserFilter,
            table=UsersTable,
            request=request,
            self_url=reverse('sis:major', args=[majorid]),
            click_url=reverse('schooladmin:professor', args=[DUMMY_ID]),
        ))

    data.update(
        filtered_table2(
            name='required',
            qs=Course.objects.filter(required_by=the_major),
            filter=CourseFilter,
            table=CoursesTable,
            request=request,
            self_url=reverse('sis:major', args=[majorid]),
            click_url=reverse('schooladmin:course', args=[DUMMY_ID]),
        ))

    data.update(
        filtered_table2(
            name='offered',
            qs=Course.objects.filter(major=the_major),
            filter=CourseFilter,
            table=CoursesForMajorTable,
            request=request,
            self_url=reverse('sis:major', args=[majorid]),
            click_url=reverse('schooladmin:course', args=[DUMMY_ID]),
        ))

    if include_students:
        data.update(
            filtered_table2(
                name='students',
                qs=User.objects.all().filter(profile__student__major=the_major),
                filter=UserFilter,
                table=StudentInMajorTable,
                request=request,
                self_url=reverse('sis:major', args=[majorid]),
                click_url=reverse('schooladmin:student', args=[DUMMY_ID]),
            ))

    if not logged_in:
        data['user'] = {'home_template': "schooladmin/home_guest.html"}
    return render(request, 'sis/major.html', data)