diff --git a/aleksis/apps/stoelindeling/forms.py b/aleksis/apps/stoelindeling/forms.py index 8bae61c861976e8840d3f2d10d8f3be84c3ddb2d..e5f8c0edc2e0be6d8d7f6b43ec26f2669c409ebd 100644 --- a/aleksis/apps/stoelindeling/forms.py +++ b/aleksis/apps/stoelindeling/forms.py @@ -4,6 +4,7 @@ from django_select2.forms import ModelSelect2Widget from material import Layout, Row from aleksis.core.mixins import ExtensibleForm +from aleksis.core.models import Group from .models import Seat, SeatingPlan @@ -17,6 +18,16 @@ class SeatingPlanCreateForm(forms.ModelForm): ) ) + def __init__(self, *args, **kwargs): + self.request = kwargs.pop("request") + super().__init__(*args, **kwargs) + + qs = Group.objects.all() + if not self.request.user.has_perm("stoelindeling.view_seatingplan"): + qs = qs.filter(owners=self.request.user.person) + + self.fields["group"].queryset = qs + class Meta: model = SeatingPlan fields = ["group", "subject", "room"] diff --git a/aleksis/apps/stoelindeling/managers.py b/aleksis/apps/stoelindeling/managers.py index 4854d491c2ea7eda3c9619e0f298df9ef4f72875..e43aa64adab86551fbe4ff75e2c2c7249b39df3e 100644 --- a/aleksis/apps/stoelindeling/managers.py +++ b/aleksis/apps/stoelindeling/managers.py @@ -20,8 +20,8 @@ class SeatQuerySet(QuerySet): start_y = aggr["y__min"] or 0 end_x = aggr["x__max"] or 0 end_y = aggr["y__max"] or 0 - width = max(10, end_x - start_x) - height = max(10, end_y - start_y) + width = max(3, end_x - start_x) + height = max(3, end_y - start_y) end_x = start_x + width end_y = start_y + height diff --git a/aleksis/apps/stoelindeling/models.py b/aleksis/apps/stoelindeling/models.py index 6726b3b8a711a39804e3591ec7427ab13c48e55c..e87c2e1f8b5ca2ed7cfb02a2b37e4cd555815ae0 100644 --- a/aleksis/apps/stoelindeling/models.py +++ b/aleksis/apps/stoelindeling/models.py @@ -11,7 +11,9 @@ class SeatingPlan(ExtensibleModel): """Seating plan model.""" group = models.ForeignKey(Group, on_delete=models.CASCADE, verbose_name=_("Group")) - subject = models.ForeignKey(Subject, on_delete=models.CASCADE, verbose_name=_("Subject")) + subject = models.ForeignKey( + Subject, on_delete=models.CASCADE, verbose_name=_("Subject"), blank=True, null=True + ) room = models.ForeignKey(Room, on_delete=models.CASCADE, verbose_name=_("Room")) def get_all_seats(self) -> SeatQuerySet: diff --git a/aleksis/apps/stoelindeling/templates/stoelindeling/seating_plan/view.html b/aleksis/apps/stoelindeling/templates/stoelindeling/seating_plan/view.html index 7baef788fa963bdac84a8073c2213e9b7a9b0391..f0c8b9ac5a817481131c9bfe363b23368ae1a5c8 100644 --- a/aleksis/apps/stoelindeling/templates/stoelindeling/seating_plan/view.html +++ b/aleksis/apps/stoelindeling/templates/stoelindeling/seating_plan/view.html @@ -1,7 +1,7 @@ {# -*- engine:django -*- #} {% extends "core/base.html" %} -{% load i18n static %} +{% load i18n static rules %} {% block browser_title %}{% blocktrans %}Seating plan{% endblocktrans %}{% endblock %} diff --git a/aleksis/apps/stoelindeling/util/perms.py b/aleksis/apps/stoelindeling/util/perms.py index eb0ed1213028ec44cb259e8da1132a30f7380ee6..c55d09bf904f2dc618c9adcefbe982aba1fa516b 100644 --- a/aleksis/apps/stoelindeling/util/perms.py +++ b/aleksis/apps/stoelindeling/util/perms.py @@ -21,7 +21,7 @@ def get_allowed_seating_plans(user): user, "stoelindeling.view_seatingplan", SeatingPlan ).values_list("pk", flat=True) ) - | Q(owner=user.person) + | Q(group__owners=user.person) ) return qs diff --git a/aleksis/apps/stoelindeling/views.py b/aleksis/apps/stoelindeling/views.py index 48391321b2df19a2769888d06c4e2e4c1d0163f6..51b718935d482f2861e1dc57e52f4d5549c761a7 100644 --- a/aleksis/apps/stoelindeling/views.py +++ b/aleksis/apps/stoelindeling/views.py @@ -49,6 +49,11 @@ class SeatingPlanCreateView(PermissionRequiredMixin, AdvancedCreateView): success_url = reverse_lazy("seating_plans") success_message = _("The seating plan has been created.") + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs["request"] = self.request + return kwargs + @method_decorator(never_cache, name="dispatch") class SeatingPlanEditView(PermissionRequiredMixin, AdvancedEditView): @@ -58,7 +63,6 @@ class SeatingPlanEditView(PermissionRequiredMixin, AdvancedEditView): form_class = SeatingPlanForm permission_required = "stoelindeling.edit_seatingplan_rule" template_name = "stoelindeling/seating_plan/edit.html" - success_url = reverse_lazy("seating_plans") success_message = _("The seating plan has been saved.") def get_context_data(self, **kwargs): @@ -108,7 +112,7 @@ class SeatingPlanEditView(PermissionRequiredMixin, AdvancedEditView): Seat.objects.bulk_update(objects_to_update, ["x", "y", "seated"]) messages.success(self.request, _("The seating plan has been updated.")) - return redirect("edit_seating_plan", self.object.pk) + return redirect("seating_plan", self.object.pk) return super().form_invalid(form)