[Patchew-devel] [PATCH 08/17] mods: refactor construction of config editor HTML

Paolo Bonzini pbonzini at redhat.com
Thu May 2 11:17:55 UTC 2019


Refactor the Javascript config editor to work on the properties dictionary
that is retrieved by get_project_config.  The _build_*_scm functions
therefore no longer need to understand how properties are stored in the database.
---
 mod.py | 77 ++++++++++++++++++++--------------------------------------
 1 file changed, 27 insertions(+), 50 deletions(-)

diff --git a/mod.py b/mod.py
index 9e15064..4cf2e9f 100644
--- a/mod.py
+++ b/mod.py
@@ -49,29 +49,13 @@ class PatchewModule(object):
         data["module"] = self
         return Template(tmpl).render(Context(data))
 
-    def _build_map_scm(self, request, project, prefix, scm):
-        prefix = prefix + scm.name + "."
-        def _build_map_items():
-            r = {}
-            for p in project.get_properties().keys():
-                if not p.startswith(prefix):
-                    continue
-                name = p[len(prefix):]
-                name = name[:name.rfind(".")]
-                if name in r:
-                    continue
-                pref = prefix + name + "."
-                r[name] = {
-                          "name": name,
-                          "html": self._build_one(request, project,
-                                                  pref, scm.item)
-                          }
-            return list(r.values())
-
-        schema_html = self._build_one(request, project, prefix,
-                                      scm.item)
+    def _build_map_scm(self, request, project, prefix, config, scm):
+        schema_html = self._build_one(request, project, "", {}, scm.item)
         item = {"html": schema_html}
-        items = _build_map_items()
+        items = [{
+            "name": name,
+            "html": self._build_one(request, project, prefix + "." + name,
+                                    value, scm.item)} for name, value in config.items()]
         return self._render_template(request, project, TMPL_MAP,
                                      schema=scm,
                                      item_schema=scm.item,
@@ -79,9 +63,10 @@ class PatchewModule(object):
                                      items=items,
                                      item=item)
 
-    def _build_array_scm(self, request, project, prefix, scm):
+    def _build_array_scm(self, request, project, prefix, config, scm):
         members = [self._build_one(request, project,
-                                                prefix, x) for x in scm.members]
+                                   prefix + "." + x.name,
+                                   config.get(x.name), x) for x in scm.members]
         show_save_button = False
         for m in scm.members:
             if type(m) == StringSchema:
@@ -93,62 +78,54 @@ class PatchewModule(object):
                                      show_save_button=show_save_button,
                                      prefix=prefix)
 
-    def _build_string_scm(self, request, project, prefix, scm):
-        prop_name = prefix + scm.name
-        prop_value = project.get_property(prop_name)
+    def _build_string_scm(self, request, project, prefix, config, scm):
         return self._render_template(request, project, TMPL_STRING,
                                      schema=scm,
                                      name=scm.name,
                                      prefix=prefix,
-                                     value=prop_value)
+                                     value=config or '')
 
-    def _build_integer_scm(self, request, project, prefix, scm):
-        prop_name = prefix + scm.name
-        prop_value = project.get_property(prop_name)
+    def _build_integer_scm(self, request, project, prefix, config, scm):
         return self._render_template(request, project, TMPL_INTEGER,
                                      schema=scm,
                                      name=scm.name,
                                      prefix=prefix,
-                                     value=prop_value)
+                                     value=config or 0)
 
-    def _build_boolean_scm(self, request, project, prefix, scm):
-        prop_name = prefix + scm.name
-        prop_value = project.get_property(prop_name)
+    def _build_boolean_scm(self, request, project, prefix, config, scm):
         return self._render_template(request, project, TMPL_BOOLEAN,
                                      schema=scm,
                                      name=scm.name,
                                      prefix=prefix,
-                                     value=prop_value)
+                                     value=config or False)
 
-    def _build_enum_scm(self, request, project, prefix, scm):
-        prop_name = prefix + scm.name
-        prop_value = project.get_property(prop_name)
+    def _build_enum_scm(self, request, project, prefix, config, scm):
         return self._render_template(request, project, TMPL_ENUM,
                                      schema=scm,
                                      name=scm.name,
                                      prefix=prefix,
-                                     value=prop_value)
+                                     value=config)
 
-    def _build_one(self, request, project, prefix, scm):
+    def _build_one(self, request, project, prefix, config, scm):
         if type(scm) == MapSchema:
-            return self._build_map_scm(request, project, prefix, scm)
+            return self._build_map_scm(request, project, prefix, config, scm)
         elif type(scm) == StringSchema:
-            return self._build_string_scm(request, project, prefix, scm)
+            return self._build_string_scm(request, project, prefix, config, scm)
         elif type(scm) == IntegerSchema:
-            return self._build_integer_scm(request, project, prefix, scm)
+            return self._build_integer_scm(request, project, prefix, config, scm)
         elif type(scm) == BooleanSchema:
-            return self._build_boolean_scm(request, project, prefix, scm)
+            return self._build_boolean_scm(request, project, prefix, config, scm)
         elif type(scm) == EnumSchema:
-            return self._build_enum_scm(request, project, prefix, scm)
+            return self._build_enum_scm(request, project, prefix, config, scm)
         elif type(scm) == ArraySchema:
-            return self._build_array_scm(request, project, prefix, scm)
+            return self._build_array_scm(request, project, prefix, config, scm)
         assert False
 
     def build_config_html(self, request, project):
-        assert not isinstance(self.project_config_schema, StringSchema)
-        assert not isinstance(self.project_config_schema, IntegerSchema)
+        assert isinstance(self.project_config_schema, ArraySchema)
         scm = self.project_config_schema
-        return self._build_one(request, project, scm.name + ".", scm)
+        config = self.get_project_config(project)
+        return self._build_one(request, project, scm.name, config, scm)
 
     def _get_map_scm(self, project, prop_name, scm):
         prefix = prop_name + "."
-- 
2.21.0





More information about the Patchew-devel mailing list