from collections import OrderedDict from django.contrib.auth.decorators import login_required from django.shortcuts import render from django.utils.translation import gettext_lazy as _ from biscuit.apps.cambro.models import Room from biscuit.core.decorators import admin_required from biscuit.core.models import Group, Person from .models import LessonPeriod, TimePeriod @login_required @admin_required def timetable(request): context = {} lesson_periods = LessonPeriod.objects.all() filter_descs = [] if 'group' in request.GET: lesson_periods = lesson_periods.filter( lesson__groups__pk__contains=int(request.GET['group'])) filter_descs.append(_('Group: %s') % Group.objects.get( pk=int(request.GET['group'])).name) if 'teacher' in request.GET: lesson_periods = lesson_periods.filter( lesson__teachers__pk__contains=int(request.GET['teacher'])) filter_descs.append(_('Teacher: %s') % Person.objects.get( pk=int(request.GET['teacher'])).name) if 'room' in request.GET: lesson_periods = lesson_periods.filter( room__pk=int(request.GET['room'])) filter_descs.append(_('Room: %s') % Room.objects.get( pk=int(request.GET['room'])).name) per_day = {} period_min, period_max = None, None for lesson_period in lesson_periods: per_day.setdefault(lesson_period.period.weekday, {})[lesson_period.period.period] = lesson_period # Expand min and max lesson to later fill in empty lessons if period_min is None or period_min > lesson_period.period.period: period_min = lesson_period.period.period if period_max is None or period_max < lesson_period.period.period: period_max = lesson_period.period.period # Fill in empty lessons for weekday_num in range(min(per_day.keys()), max(per_day.keys()) + 1): # Fill in empty weekdays if weekday_num not in per_day.keys(): per_day[weekday_num] = {} # Fill in empty lessons on this workday for period_num in range(period_min, period_max + 1): if period_num not in per_day[weekday_num].keys(): per_day[weekday_num][period_num] = None # Order this weekday by periods per_day[weekday_num] = OrderedDict( sorted(per_day[weekday_num].items())) context['lesson_periods'] = OrderedDict(sorted(per_day.items())) context['filter_descs'] = ', '.join(filter_descs) context['periods'] = TimePeriod.get_times_dict() context['weekdays'] = dict(TimePeriod.WEEKDAY_CHOICES) return render(request, 'chronos/tt_week.html', context)