From 58d7de49e97d0f2ff10840a9057ee6d8258a841b Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Fri, 1 Jan 2021 15:27:49 +0100
Subject: [PATCH] Refactor preference_layout_builder to a class named
 PreferenceLayout

---
 aleksis/core/util/forms.py | 47 ++++++++++++++++++++------------------
 aleksis/core/views.py      |  5 ++--
 2 files changed, 27 insertions(+), 25 deletions(-)

diff --git a/aleksis/core/util/forms.py b/aleksis/core/util/forms.py
index 7a0442449..edacfa9ab 100644
--- a/aleksis/core/util/forms.py
+++ b/aleksis/core/util/forms.py
@@ -3,30 +3,33 @@ from collections import OrderedDict
 from material import Layout, Row
 
 
-def preference_layout_builder(form_base_class, section=None):
+class PreferenceLayout(Layout):
     """
-    Return a django-material Layout object for the given form_base_class.
+    Create a django-material Layout object for the given form_base_class.
 
     :param form_base_class: A Form class used as the base. Must have a ``registry` attribute
     :param section: A section where the layout builder will load preferences
     """
-    registry = form_base_class.registry
-    if section:
-        # Try to use section param
-        preferences_obj = registry.preferences(section=section)
-
-    else:
-        # display all preferences in the form
-        preferences_obj = registry.preferences()
-
-    rows = OrderedDict()
-
-    for preference in preferences_obj:
-        row_name = preference.get("row", preference.identifier())
-        rows.setdefault(row_name, [])
-        rows[row_name].append(preference.identifier())
-
-    rows_material = []
-    for fields in rows.values():
-        rows_material.append(Row(*fields))
-    return Layout(*rows_material)
+
+    def __init__(self, form_base_class, section=None):
+
+        registry = form_base_class.registry
+        if section:
+            # Try to use section param
+            preferences_obj = registry.preferences(section=section)
+
+        else:
+            # display all preferences in the form
+            preferences_obj = registry.preferences()
+
+        rows = OrderedDict()
+
+        for preference in preferences_obj:
+            row_name = preference.get("row", preference.identifier())
+            rows.setdefault(row_name, [])
+            rows[row_name].append(preference.identifier())
+
+        rows_material = []
+        for fields in rows.values():
+            rows_material.append(Row(*fields))
+        super().__init__(*rows_material)
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index 93bc5e5de..fb7f4513e 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -75,7 +75,7 @@ from .tables import (
 from .util import messages
 from .util.apps import AppConfig
 from .util.core_helpers import objectgetter_optional
-from .util.forms import preference_layout_builder
+from .util.forms import PreferenceLayout
 
 
 @permission_required("core.view_dashboard")
@@ -547,8 +547,7 @@ def preferences(
     form_class = preference_form_builder(form_class, instance=instance, section=section)
 
     # Get layout
-    layout = preference_layout_builder(form_class, section=section)
-    form_class.layout = layout
+    form_class.layout = PreferenceLayout(form_class, section=section)
 
     if request.method == "POST":
         form = form_class(request.POST, request.FILES or None)
-- 
GitLab