From 402fb8ab76002104acfe165dd1e7308ad82dfa93 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 20 Mar 2022 16:03:18 +0100
Subject: [PATCH] Fix some bugs

---
 aleksis/apps/stoelindeling/forms.py                   | 11 +++++++++++
 aleksis/apps/stoelindeling/managers.py                |  4 ++--
 aleksis/apps/stoelindeling/models.py                  |  4 +++-
 .../templates/stoelindeling/seating_plan/view.html    |  2 +-
 aleksis/apps/stoelindeling/util/perms.py              |  2 +-
 aleksis/apps/stoelindeling/views.py                   |  8 ++++++--
 6 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/aleksis/apps/stoelindeling/forms.py b/aleksis/apps/stoelindeling/forms.py
index 8bae61c..e5f8c0e 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 4854d49..e43aa64 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 6726b3b..e87c2e1 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 7baef78..f0c8b9a 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 eb0ed12..c55d09b 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 4839132..51b7189 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)
 
-- 
GitLab