From 705d41d5c2a0d870df15a9e8fa4d4d4b1224a393 Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Wed, 6 Apr 2022 21:32:26 +0200 Subject: [PATCH] Show seating plans in register object overview --- .../alsijil/class_register/lesson.html | 18 ++++++ .../partials/lesson/tabs/seating_plan.html | 63 +++++++++++++++++++ aleksis/apps/alsijil/views.py | 20 +++++- 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html index 08af12a75..6de367aee 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html @@ -7,6 +7,10 @@ {% block extra_head %} {{ block.super }} <link rel="stylesheet" href="{% static 'css/alsijil/lesson.css' %}"/> + + {% if with_seating_plan %} + <link rel="stylesheet" href="{% static "css/stoelindeling/seating_plan.css" %}"> + {% endif %} {% endblock %} {% block nav_content %} @@ -25,6 +29,14 @@ </a> </li> {% endif %} + {% if with_seating_plan %} + <li class="tab"> + <a href="#seating-plan"> + <i class="material-icons">event_seat</i> + {% trans "Seating plan" %} + </a> + </li> + {% endif %} {% if prev_lesson %} {% has_perm "alsijil.view_lessondocumentation_rule" user prev_lesson as can_view_prev_lesson_documentation %} {% if prev_lesson.get_lesson_documentation and can_view_prev_lesson_documentation %} @@ -125,6 +137,12 @@ </div> {% endif %} + {% if with_seating_plan %} + <div class="col s12 no-padding" id="seating-plan"> + {% include "alsijil/partials/lesson/tabs/seating_plan.html" %} + </div> + {% endif %} + <div class="col s12 no-padding" id="more"> {% include "alsijil/partials/lesson/tabs/more.html" %} </div> diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html b/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html new file mode 100644 index 000000000..2b759f8e8 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html @@ -0,0 +1,63 @@ +{% load i18n material_form_internal material_form time_helpers rules %} + + +{% if seating_plan %} + <div class="card no-mobile-card"> + <div class="card-content"> + <div class="card-title margin-bottom"> + {% blocktrans with group=seating_plan.group room=seating_plan.room %}Seating plan for {{ group }} in + {{ room }}{% endblocktrans %} + </div> + {% if seating_plan_parent %} + <figure class="alert primary"> + <i class="material-icons left">info</i> + {% blocktrans with child_group=first_group %} + This seating plan is taken from the parent group of {{ child_group }}. + If you want, you can take it over for your group and then customize it. + {% endblocktrans %} + </figure> + {% endif %} + + <div class="row margin-bottom no-padding"> + <div class="col s12 no-padding"> + {% has_perm "stoelindeling.edit_seatingplan_rule" user seating_plan.group as can_edit %} + {% has_perm "stoelindeling.copy_seatingplan_rule" user seating_plan.group as can_copy %} + + {% if can_edit %} + <a class="btn orange waves-effect waves-light" + href="{% url "edit_seating_plan" seating_plan.pk %}?next={{ back_url }}#seating-plan"> + <i class="material-icons left">edit</i> + {% trans "Edit seating plan" %} + </a> + {% endif %} + {% if can_copy and seating_plan_parent %} + <a class="btn orange waves-effect waves-light" + href="{% url "copy_seating_plan" seating_plan.pk %}?next={{ back_url }}#seating-plan"> + <i class="material-icons left">content_copy</i> + {% trans "Copy plan and edit" %} + </a> + {% endif %} + </div> + </div> + + <div class="row"> + <div class="col s12"> + {% include "stoelindeling/seating_plan/render.html" %} + </div> + </div> + </div> + </div> +{% else %} + <div class="container"> + <div class="card"> + <div class="card-content"> + <div class="card-title"> + <i class="material-icons left small orange-text">warning</i> + {% trans "There is no seating plan for this lesson." %} + + {# FIXME OPTIONS: 1. Create for this group and subject, 2. Create for parent group#} + </div> + </div> + </div> + </div> +{% endif %} diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index 2d8968207..c999356fc 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -3,6 +3,7 @@ from copy import deepcopy from datetime import date, datetime, timedelta from typing import Any, Dict, Optional +from django.apps import apps from django.core.exceptions import PermissionDenied from django.db.models import Count, Exists, FilteredRelation, OuterRef, Prefetch, Q, Sum from django.db.models.expressions import Case, When @@ -185,6 +186,11 @@ def register_object( ) if not blocked_because_holidays: + groups = register_object.get_groups().all() + if groups: + first_group = groups.first() + context["first_group"] = first_group + # Group roles show_group_roles = request.user.person.preferences[ "alsijil__group_roles_in_lesson_view" @@ -192,10 +198,22 @@ def register_object( "alsijil.view_assigned_grouproles_for_register_object_rule", register_object ) if show_group_roles: - groups = register_object.get_groups().all() group_roles = GroupRole.objects.with_assignments(date_of_lesson, groups) context["group_roles"] = group_roles + with_seating_plan = ( + apps.is_installed("aleksis.apps.stoelindeling") + and groups + and request.user.has_perm("stoelindeling.view_seatingplan", first_group) + ) + context["with_seating_plan"] = with_seating_plan + + if with_seating_plan: + seating_plan = register_object.seating_plan + context["seating_plan"] = register_object.seating_plan + if seating_plan and seating_plan.group != first_group: + context["seating_plan_parent"] = True + # Create or get lesson documentation object; can be empty when first opening lesson lesson_documentation = register_object.get_or_create_lesson_documentation(wanted_week) context["has_documentation"] = bool(lesson_documentation.topic) -- GitLab