diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py index fb831301e4bae0138026271ecff80581d72cfb81..418686aea991a489558c2aa911149516b6a09335 100644 --- a/aleksis/apps/alsijil/preferences.py +++ b/aleksis/apps/alsijil/preferences.py @@ -3,7 +3,7 @@ from django.utils.translation import gettext as _ from dynamic_preferences.preferences import Section from dynamic_preferences.types import BooleanPreference -from aleksis.core.registries import site_preferences_registry +from aleksis.core.registries import person_preferences_registry, site_preferences_registry alsijil = Section("alsijil", verbose_name=_("Class register")) @@ -92,3 +92,20 @@ class GroupOwnersCanAssignRolesToParents(BooleanPreference): verbose_name = _( "Allow group owners to assign group roles to the parents of the group's members" ) + + +@person_preferences_registry.register +class ShowGroupRolesInWeekView(BooleanPreference): + section = alsijil + name = "group_roles_in_week_view" + default = True + verbose_name = _("Show assigned group roles in week view") + help_text = _("Only week view of groups") + + +@person_preferences_registry.register +class ShowGroupRolesInLessonView(BooleanPreference): + section = alsijil + name = "group_roles_in_lesson_view" + default = True + verbose_name = _("Show assigned group roles in lesson view") diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html index 021f227eb261ed757200b485660ee0cd9f23b5c5..24780eba16318c05d925d57aed87637caa9c2a85 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html @@ -64,12 +64,17 @@ <div class="row"> <div class="col s12"> <ul class="tabs"> - <li class="tab col s6"> + <li class="tab col"> <a class="active" href="#week-overview">{% trans "Lesson documentations" %}</a> </li> - <li class="tab col s6"> - <a class="active" href="#personal-notes">{% trans "Personal notes" %}</a> + <li class="tab col"> + <a href="#personal-notes">{% trans "Personal notes" %}</a> </li> + {% if group_roles %} + <li class="tab col"> + <a href="#group-roles">{% trans "Group roles" %}</a> + </li> + {% endif %} </ul> </div> <div class="col s12" id="week-overview"> @@ -283,6 +288,11 @@ </a> {% endif %} </h5> + <p> + {% for assignment in person.person.group_roles.all %} + {% include "alsijil/group_role/chip.html" with role=assignment.role small=assignment.date_range %} + {% endfor %} + </p> <p class="card-text"> {% trans "Absent" %}: {{ person.person.absences_count }} ({{ person.person.unexcused_count }} {% trans "unexcused" %}) @@ -315,6 +325,11 @@ </div> </div> </div> + {% if group_roles %} + <div class="col s12" id="group-roles"> + {% include "alsijil/group_role/partials/assigned_roles.html" with roles=group_roles group=group back_url=back_url %} + </div> + {% endif %} </div> {% else %} <div class="card red darken-1"> diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/chip.html b/aleksis/apps/alsijil/templates/alsijil/group_role/chip.html index f50fc10e965c92762451a985dc30c28d78c64b08..c952c289480824422943d6f104509dd0d310633e 100644 --- a/aleksis/apps/alsijil/templates/alsijil/group_role/chip.html +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/chip.html @@ -3,4 +3,7 @@ <div class="chip white-text {{ role.colour|default:"black" }}"> <i class="material-icons left">{{ role.icon|default:"assignment_ind" }}</i> {{ role.name }} + {% if small %} + <small>({{ small }})</small> + {% endif %} </div> \ No newline at end of file diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index f83f2cfac818b733c3724c2d358f3b20c26782f9..f5b3faf4e003fd7c20abf45755f93a5713e82edb 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -242,8 +242,13 @@ def week_view( # Add a form to filter the view if type_: initial = {type_.value: instance} + back_url = reverse( + "week_view_by_week", args=[wanted_week.year, wanted_week.week, type_.value, instance.pk] + ) else: initial = {} + back_url = reverse("week_view_by_week", args=[wanted_week.year, wanted_week.week]) + context["back_url"] = back_url select_form = SelectForm(request, request.POST or None, initial=initial) if request.method == "POST": @@ -264,6 +269,14 @@ def week_view( else: group = None + # Group roles + show_group_roles = ( + group and request.user.person.preferences["alsijil__group_roles_in_week_view"] + ) + if show_group_roles: + group_roles = GroupRole.objects.with_assignments(wanted_week, [group]) + context["group_roles"] = group_roles + extra_marks = ExtraMark.objects.all() if lesson_periods_query_exists: @@ -305,63 +318,70 @@ def week_view( else: persons_qs = persons_qs.filter(member_of__lessons__lesson_periods__in=lesson_periods_pk) - persons_qs = ( - persons_qs.distinct() - .prefetch_related( + persons_qs = persons_qs.distinct().prefetch_related( + Prefetch( + "personal_notes", + queryset=PersonalNote.objects.filter( + week=wanted_week.week, + year=wanted_week.year, + lesson_period__in=lesson_periods_pk, + ), + ), + "member_of__owners", + ) + + # Annotate group roles + if show_group_roles: + persons_qs = persons_qs.prefetch_related( Prefetch( - "personal_notes", - queryset=PersonalNote.objects.filter( - week=wanted_week.week, - year=wanted_week.year, - lesson_period__in=lesson_periods_pk, - ), + "group_roles", + queryset=GroupRoleAssignment.objects.in_week(wanted_week).for_group(group), ), - "member_of__owners", ) - .annotate( - absences_count=Count( - "personal_notes", - filter=Q( - personal_notes__lesson_period__in=lesson_periods_pk, - personal_notes__week=wanted_week.week, - personal_notes__year=wanted_week.year, - personal_notes__absent=True, - ), - distinct=True, - ), - unexcused_count=Count( - "personal_notes", - filter=Q( - personal_notes__lesson_period__in=lesson_periods_pk, - personal_notes__week=wanted_week.week, - personal_notes__year=wanted_week.year, - personal_notes__absent=True, - personal_notes__excused=False, - ), - distinct=True, - ), - tardiness_sum=Subquery( - Person.objects.filter( - pk=OuterRef("pk"), - personal_notes__lesson_period__in=lesson_periods_pk, - personal_notes__week=wanted_week.week, - personal_notes__year=wanted_week.year, - ) - .distinct() - .annotate(tardiness_sum=Sum("personal_notes__late")) - .values("tardiness_sum") + + persons_qs = persons_qs.annotate( + absences_count=Count( + "personal_notes", + filter=Q( + personal_notes__lesson_period__in=lesson_periods_pk, + personal_notes__week=wanted_week.week, + personal_notes__year=wanted_week.year, + personal_notes__absent=True, ), - tardiness_count=Count( - "personal_notes", - filter=Q( - personal_notes__lesson_period__in=lesson_periods_pk, - personal_notes__week=wanted_week.week, - personal_notes__year=wanted_week.year, - ) - & ~Q(personal_notes__late=0), - distinct=True, + distinct=True, + ), + unexcused_count=Count( + "personal_notes", + filter=Q( + personal_notes__lesson_period__in=lesson_periods_pk, + personal_notes__week=wanted_week.week, + personal_notes__year=wanted_week.year, + personal_notes__absent=True, + personal_notes__excused=False, ), - ) + distinct=True, + ), + tardiness_sum=Subquery( + Person.objects.filter( + pk=OuterRef("pk"), + personal_notes__lesson_period__in=lesson_periods_pk, + personal_notes__week=wanted_week.week, + personal_notes__year=wanted_week.year, + ) + .distinct() + .annotate(tardiness_sum=Sum("personal_notes__late")) + .values("tardiness_sum") + ), + tardiness_count=Count( + "personal_notes", + filter=Q( + personal_notes__lesson_period__in=lesson_periods_pk, + personal_notes__week=wanted_week.week, + personal_notes__year=wanted_week.year, + ) + & ~Q(personal_notes__late=0), + distinct=True, + ), ) for extra_mark in extra_marks: