diff --git a/biscuit/apps/alsijil/forms.py b/biscuit/apps/alsijil/forms.py index 6a84fdbaedd87f98c85cfb09854bb908b54dbcd8..be77cd06cae20c11b602af70b6716bd2bd33bfe7 100644 --- a/biscuit/apps/alsijil/forms.py +++ b/biscuit/apps/alsijil/forms.py @@ -2,7 +2,8 @@ from django import forms from django.db.models import Count from django.utils.translation import ugettext_lazy as _ -from biscuit.core.models import Group +from biscuit.apps.chronos.models import Room +from biscuit.core.models import Group, Person from .models import LessonDocumentation, PersonalNote @@ -33,6 +34,14 @@ class SelectForm(forms.Form): group = forms.ModelChoiceField( queryset=Group.objects.annotate(lessons_count=Count('lessons')).filter(lessons_count__gt=0), label=_('Group'), required=False) + teacher = forms.ModelChoiceField( + queryset=Person.objects.annotate(lessons_count=Count( + 'lessons')).filter(lessons_count__gt=0), + label=_('Teacher'), required=False) + room = forms.ModelChoiceField( + queryset=Room.objects.annotate(lessons_count=Count( + 'lesson_periods')).filter(lessons_count__gt=0), + label=_('Room'), required=False) PersonalNoteFormSet = forms.modelformset_factory( diff --git a/biscuit/apps/alsijil/menus.py b/biscuit/apps/alsijil/menus.py index 32c08208ee3042ed6b6cf3d967516f083cb1699c..b5389356179362399cdb1e844eb4ae715943bcb8 100644 --- a/biscuit/apps/alsijil/menus.py +++ b/biscuit/apps/alsijil/menus.py @@ -15,7 +15,7 @@ MENUS = { }, { 'name': _('Current week'), - 'url': 'group_week', + 'url': 'week_view', 'validators': ['menu_generator.validators.is_authenticated'] } ] diff --git a/biscuit/apps/alsijil/templates/alsijil/group_week.html b/biscuit/apps/alsijil/templates/alsijil/week_view.html similarity index 97% rename from biscuit/apps/alsijil/templates/alsijil/group_week.html rename to biscuit/apps/alsijil/templates/alsijil/week_view.html index 5edeec5976088075dfea04fe37ef6dace76e7311..48150c4efd39bd539d8ab5c1a195c48c445096d0 100644 --- a/biscuit/apps/alsijil/templates/alsijil/group_week.html +++ b/biscuit/apps/alsijil/templates/alsijil/week_view.html @@ -22,7 +22,7 @@ {% endif %} </div> - {% if group %} + {% if group or teacher or room %} <div class="row"> <div class="col-md-7"> <div class="card"> @@ -115,7 +115,7 @@ <div class="card-body"> <p> {% blocktrans %} - You must select a group to see the week summary. + You must select a group, a teacher or a room to see the week summary. {% endblocktrans %} </p> </div> diff --git a/biscuit/apps/alsijil/urls.py b/biscuit/apps/alsijil/urls.py index a87e088bc02a1360c7ac04f753fa6d295d6f3006..14dad5414ed7c76f8beb58c472dd47d69dcb2f35 100644 --- a/biscuit/apps/alsijil/urls.py +++ b/biscuit/apps/alsijil/urls.py @@ -7,9 +7,9 @@ urlpatterns = [ path('lesson', views.lesson, name='lesson'), path('lesson/<int:year>/<int:week>/<int:period_id>', views.lesson, name='lesson_by_week_and_period'), - path('group/week', views.group_week, name='group_week'), - path('group/week/<int:year>/<int:week>', views.group_week, - name='group_week_by_week'), + path('week', views.week_view, name='week_view'), + path('week/<int:year>/<int:week>', views.week_view, + name='week_view_by_week'), path('print/group/<int:id_>', views.full_register_group, name='full_register_group') ] diff --git a/biscuit/apps/alsijil/views.py b/biscuit/apps/alsijil/views.py index ec8096f497a85fb8342fbe51f0af5fb8ef190355..8f27bb203500723dc43afbdbca33e3e3b1023da5 100644 --- a/biscuit/apps/alsijil/views.py +++ b/biscuit/apps/alsijil/views.py @@ -11,7 +11,7 @@ from django.urls import reverse from django.utils.translation import ugettext as _ from django.views.decorators.cache import cache_page -from biscuit.apps.chronos.models import LessonPeriod, TimePeriod +from biscuit.apps.chronos.models import LessonPeriod, Room, TimePeriod from biscuit.apps.chronos.util import CalendarWeek, current_lesson_periods from biscuit.core.models import Group, Person @@ -90,7 +90,7 @@ def lesson(request: HttpRequest, year: Optional[int] = None, week: Optional[int] @login_required -def group_week(request: HttpRequest, year: Optional[int] = None, week: Optional[int] = None) -> HttpResponse: +def week_view(request: HttpRequest, year: Optional[int] = None, week: Optional[int] = None) -> HttpResponse: context = {} if year and week: @@ -98,18 +98,7 @@ def group_week(request: HttpRequest, year: Optional[int] = None, week: Optional[ else: wanted_week = CalendarWeek() - if request.GET.get('group', None): - # Use requested group - group = Group.objects.get(pk=request.GET['group']) - elif hasattr(request, 'user') and hasattr(request.user, 'person'): - # Try to select group from owned groups of user - group = request.user.person.owner_of.first() - else: - group = None - - if group: - # Get all lesson periods for the selected group - lesson_periods = LessonPeriod.objects.annotate( + lesson_periods = LessonPeriod.objects.annotate( has_documentation=Exists(LessonDocumentation.objects.filter( ~Q(topic__exact=''), lesson_period=OuterRef('pk'), @@ -124,10 +113,34 @@ def group_week(request: HttpRequest, year: Optional[int] = None, week: Optional[ 'lesson__groups', 'lesson__teachers', 'substitutions' ).extra( select={'_week': wanted_week.week} - ).filter( - Q(lesson__groups=group) | Q(lesson__groups__parent_groups=group) - ).distinct() + ) + + teacher = None + group = None + room = None + + if request.GET.get('group', None) or request.GET.get('teacher', None) or request.GET.get('room', None): + # Incrementally filter lesson periods by GET parameters + if 'group' in request.GET and request.GET['group']: + group = Group.objects.get(pk=request.GET['group']) + lesson_periods = lesson_periods.filter( + Q(lesson__groups__pk=int(request.GET['group'])) | Q(lesson__groups__parent_groups__pk=int(request.GET['group']))) + if 'teacher' in request.GET and request.GET['teacher']: + teacher = Person.objects.get(pk=request.GET['teacher']) + lesson_periods = lesson_periods.filter( + Q(substitutions__teachers__pk=int(request.GET['teacher']), substitutions__week=wanted_week.week) | Q(lesson__teachers__pk=int(request.GET['teacher']))) + if 'room' in request.GET and request.GET['room']: + room = Room.objects.get(pk=request.GET['room']) + lesson_periods = lesson_periods.filter( + room__pk=int(request.GET['room'])) + elif hasattr(request, 'user') and hasattr(request.user, 'person'): + group = request.user.person.owner_of.first() + lesson_periods = lesson_periods.filter( + Q(lesson__groups=group) | Q(lesson__groups__parent_groups=group)) + else: + lesson_periods = None + if lesson_periods: # Aggregate all personal notes for this group and week persons = Person.objects.filter( is_active=True @@ -153,28 +166,26 @@ def group_week(request: HttpRequest, year: Optional[int] = None, week: Optional[ )) ) else: - lesson_periods = None persons = None # Add a form to filter the view select_form = SelectForm(request.GET or None) - - context['current_head'] = str(wanted_week) context['week'] = wanted_week context['group'] = group + context['teacher'] = teacher + context['room'] = room context['lesson_periods'] = lesson_periods context['persons'] = persons context['select_form'] = select_form week_prev = wanted_week - 1 week_next = wanted_week + 1 - context['url_prev'] = '%s?%s' % (reverse('group_week_by_week', args=[week_prev.year, week_prev.week]), request.GET.urlencode()) - context['url_next'] = '%s?%s' % (reverse('group_week_by_week', args=[week_next.year, week_next.week]), request.GET.urlencode()) - + context['url_prev'] = '%s?%s' % (reverse('week_view_by_week', args=[week_prev.year, week_prev.week]), request.GET.urlencode()) + context['url_next'] = '%s?%s' % (reverse('week_view_by_week', args=[week_next.year, week_next.week]), request.GET.urlencode()) - return render(request, 'alsijil/group_week.html', context) + return render(request, 'alsijil/week_view.html', context) @login_required