From afef60e5a036b26a979b2e354e9abccd5345abc0 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Fri, 3 Apr 2020 11:41:37 +0200
Subject: [PATCH] Update forms

- Add ExtensibleForm
- Allow strings for layout nodes
- Add layouts
---
 aleksis/core/forms.py  | 46 ++++++++++++++++++++++++++++++++++++------
 aleksis/core/mixins.py |  4 ++--
 2 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index aa9d9f8fc..c4e7dd73f 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -55,7 +55,25 @@ PersonsAccountsFormSet = forms.modelformset_factory(
 )
 
 
-class EditPersonForm(forms.ModelForm):
+class EditPersonForm(ExtensibleForm):
+    layout = Layout(
+        Fieldset(
+            _("Base data"),
+            "short_name",
+            Row("user", "primary_group"),
+            "is_active",
+            Row("first_name", "additional_name", "last_name"),
+        ),
+        Fieldset(_("Address"), Row("street", "housenumber"), Row("postal_code", "place")),
+        Fieldset(_("Contact data"), "email", Row("phone_number", "mobile_number")),
+        Fieldset(
+            _("Advanced personal data"),
+            Row("sex", "date_of_birth"),
+            Row("photo", "photo_cropping"),
+            "guardians",
+        ),
+    )
+
     class Meta:
         model = Person
         fields = [
@@ -76,6 +94,8 @@ class EditPersonForm(forms.ModelForm):
             "sex",
             "photo",
             "photo_cropping",
+            "guardians",
+            "primary_group",
         ]
         widgets = {"user": Select2Widget}
 
@@ -105,10 +125,15 @@ class EditPersonForm(forms.ModelForm):
                 self.cleaned_data["user"] = new_user_obj
 
 
-class EditGroupForm(forms.ModelForm):
+class EditGroupForm(ExtensibleForm):
+    layout = Layout(
+        Fieldset(_("Common data"), "name", "short_name"),
+        Fieldset(_("Persons"), "members", "owners", "parent_groups"),
+    )
+
     class Meta:
         model = Group
-        fields = ["name", "short_name", "members", "owners", "parent_groups"]
+        exclude = []
         widgets = {
             "members": ModelSelect2MultipleWidget(
                 search_fields=[
@@ -130,13 +155,20 @@ class EditGroupForm(forms.ModelForm):
         }
 
 
-class EditSchoolForm(forms.ModelForm):
+class EditSchoolForm(ExtensibleForm):
+    layout = Layout(
+        Fieldset(_("School name"), "name", "name_official"),
+        Fieldset(_("School logo"), Row("logo", "logo_cropping")),
+    )
+
     class Meta:
         model = School
         fields = ["name", "name_official", "logo", "logo_cropping"]
 
 
-class EditTermForm(forms.ModelForm):
+class EditTermForm(ExtensibleForm):
+    layout = Layout("caption", Row("date_start", "date_end"))
+
     class Meta:
         model = SchoolTerm
         fields = ["caption", "date_start", "date_end"]
@@ -152,7 +184,9 @@ class AnnouncementForm(ExtensibleForm):
     valid_until_date = forms.DateField(label=_("Date"))
     valid_until_time = forms.TimeField(label=_("Time"))
 
-    persons = forms.ModelMultipleChoiceField(Person.objects.all(), label=_("Persons"), required=False)
+    persons = forms.ModelMultipleChoiceField(
+        Person.objects.all(), label=_("Persons"), required=False
+    )
     groups = forms.ModelMultipleChoiceField(Group.objects.all(), label=_("Groups"), required=False)
 
     layout = Layout(
diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index 12dfa55ec..8ba220c16 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -1,5 +1,5 @@
 from datetime import datetime
-from typing import Any, Callable, Optional
+from typing import Any, Callable, Optional, Union
 
 from django.contrib.contenttypes.models import ContentType
 from django.db import models
@@ -216,7 +216,7 @@ class ExtensibleForm(ModelForm, metaclass=_ExtensibleFormMetaclass):
     """
 
     @classmethod
-    def add_node_to_layout(cls, node: LayoutNode):
+    def add_node_to_layout(cls, node: Union[LayoutNode, str]):
         """
         Add a node to `layout` attribute
 
-- 
GitLab