From c46b8b2fb03458fa5907b088d118bdb24e09f517 Mon Sep 17 00:00:00 2001 From: bobslee Date: Thu, 11 Jan 2024 15:26:36 +0100 Subject: [PATCH] Improve load methods for components and `gridRow`, with is_form arg. Improve the load methods for components and `gridRow`, by passing whether it applies to a Form `is_form`, otherwise it's obtained as a Builder. Ensure an empty form `gridRow` doesn't appear in a grid's `rows` property, made possible by the other `is_form` change. --- CHANGELOG.md | 9 +++++++++ formiodata/builder.py | 2 +- formiodata/components/button.py | 2 +- formiodata/components/columns.py | 10 ++++++++-- formiodata/components/component.py | 6 +++--- formiodata/components/fieldset.py | 10 ++++++++-- formiodata/components/grid_base.py | 4 ++-- formiodata/components/panel.py | 10 ++++++++-- formiodata/components/table.py | 10 ++++++++-- formiodata/components/tabs.py | 10 ++++++++-- formiodata/form.py | 8 +++++++- pyproject.toml | 2 +- 12 files changed, 64 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdfe929..e475048 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 1.2.5 + +Improve the load methods for components and `gridRow`, by passing +whether it applies to a Form `is_form`, otherwise it's obtained as a +Builder. + +Ensure an empty form `gridRow` doesn't appear in a grid's `rows` +property, made possible by the other `is_form` change. + ## 1.2.4 Implementation of "simple" validation required. diff --git a/formiodata/builder.py b/formiodata/builder.py index fda3a95..82e3398 100644 --- a/formiodata/builder.py +++ b/formiodata/builder.py @@ -81,7 +81,7 @@ def _load_components(self, components, parent=None): if 'type' in component: component_obj = self.get_component_object(component) # start and traverse from toplevel - component_obj.load(component_owner=self, parent=None, data=None) + component_obj.load(component_owner=self, parent=None, data=None, is_form=False) self.components[component_obj.key] = component_obj def get_component_class(self, component): diff --git a/formiodata/components/button.py b/formiodata/components/button.py index b60562e..0485838 100644 --- a/formiodata/components/button.py +++ b/formiodata/components/button.py @@ -10,6 +10,6 @@ class buttonComponent(Component): def is_form_component(self): return False - def load_data(self, data): + def load_data(self, data, is_form=False): # just bypass this pass diff --git a/formiodata/components/columns.py b/formiodata/components/columns.py index 0a29558..6ba065e 100644 --- a/formiodata/components/columns.py +++ b/formiodata/components/columns.py @@ -6,13 +6,19 @@ class columnsComponent(layoutComponentBase): - def load_data(self, data): + def load_data(self, data, is_form=False): for column in self.raw['columns']: for component in column['components']: # Only determine and load class if component type. if 'type' in component: component_obj = self.builder.get_component_object(component) - component_obj.load(self.child_component_owner, parent=self, data=data, all_data=self._all_data) + component_obj.load( + self.child_component_owner, + parent=self, + data=data, + all_data=self._all_data, + is_form=is_form, + ) @property def rows(self): diff --git a/formiodata/components/component.py b/formiodata/components/component.py index 0e944f4..71934c0 100644 --- a/formiodata/components/component.py +++ b/formiodata/components/component.py @@ -50,14 +50,14 @@ def __init__(self, raw, builder, **kwargs): self.html_component = "" self.defaultValue = self.raw.get('defaultValue') - def load(self, component_owner, parent=None, data=None, all_data=None): + def load(self, component_owner, parent=None, data=None, all_data=None, is_form=False): self.component_owner = component_owner if parent: self.parent = parent self._all_data = all_data - self.load_data(data) + self.load_data(data, is_form=is_form) self.builder.component_ids[self.id] = self @@ -67,7 +67,7 @@ def load(self, component_owner, parent=None, data=None, all_data=None): builder_path_key = '.'.join(builder_path_keys) self.builder.components_path_key[builder_path_key] = self - def load_data(self, data): + def load_data(self, data, is_form=False): if self.input and data: try: self.value = data[self.key] diff --git a/formiodata/components/fieldset.py b/formiodata/components/fieldset.py index 0f8d1fb..3dbf232 100644 --- a/formiodata/components/fieldset.py +++ b/formiodata/components/fieldset.py @@ -6,9 +6,15 @@ class fieldsetComponent(layoutComponentBase): - def load_data(self, data): + def load_data(self, data, is_form=False): for component in self.raw.get('components', []): # Only determine and load class if component type. if 'type' in component: component_obj = self.builder.get_component_object(component) - component_obj.load(self.child_component_owner, parent=self, data=data, all_data=self._all_data) + component_obj.load( + self.child_component_owner, + parent=self, + data=data, + all_data=self._all_data, + is_form=is_form, + ) diff --git a/formiodata/components/grid_base.py b/formiodata/components/grid_base.py index bf0b214..9a7edde 100644 --- a/formiodata/components/grid_base.py +++ b/formiodata/components/grid_base.py @@ -55,7 +55,7 @@ def create_component_objects(self, parent, data): component_obj.load(component_owner=parent, parent=parent, data=data, all_data=self._all_data) parent.components[component_obj.key] = component_obj - def load_data(self, data): + def load_data(self, data, is_form=False): # Always instantiate child components, even if no data. # This makes it exist both in the builder and in the form. self.create_component_objects(self, data) @@ -65,7 +65,7 @@ def load_data(self, data): self._load_rows(data[self.key]) self.value = data[self.key] self.raw_value = data[self.key] - elif not self.initEmpty: + elif not self.initEmpty and not is_form: self.rows = [self.gridRow(self, None)] def _load_rows(self, data): diff --git a/formiodata/components/panel.py b/formiodata/components/panel.py index daa2ae4..8e5992d 100644 --- a/formiodata/components/panel.py +++ b/formiodata/components/panel.py @@ -6,12 +6,18 @@ class panelComponent(layoutComponentBase): - def load_data(self, data): + def load_data(self, data, is_form=False): for component in self.raw.get('components', []): # Only determine and load class if component type. if 'type' in component: component_obj = self.builder.get_component_object(component) - component_obj.load(self.child_component_owner, parent=self, data=data, all_data=self._all_data) + component_obj.load( + self.child_component_owner, + parent=self, + data=data, + all_data=self._all_data, + is_form=is_form, + ) @property def title(self): diff --git a/formiodata/components/table.py b/formiodata/components/table.py index 5aa30aa..0e25116 100644 --- a/formiodata/components/table.py +++ b/formiodata/components/table.py @@ -9,7 +9,7 @@ def __init__(self, raw, builder, **kwargs): self.rows = [] super().__init__(raw, builder, **kwargs) - def load_data(self, data): + def load_data(self, data, is_form=False): self.rows = [] for data_row in self.raw.get('rows', []): @@ -21,7 +21,13 @@ def load_data(self, data): # Only determine and load class if component type. if 'type' in component: component_obj = self.builder.get_component_object(component) - component_obj.load(self.child_component_owner, parent=self, data=data, all_data=self._all_data) + component_obj.load( + self.child_component_owner, + parent=self, + data=data, + all_data=self._all_data, + is_form=is_form, + ) components.append(component_obj) row.append({'column': col, 'components': components}) diff --git a/formiodata/components/tabs.py b/formiodata/components/tabs.py index 3781750..ab2062f 100644 --- a/formiodata/components/tabs.py +++ b/formiodata/components/tabs.py @@ -6,7 +6,7 @@ class tabsComponent(layoutComponentBase): - def load_data(self, data): + def load_data(self, data, is_form=False): self.tabs = [] for data_tab in self.raw.get('components', []): @@ -16,7 +16,13 @@ def load_data(self, data): # Only determine and load class if component type. if 'type' in component: component_obj = self.builder.get_component_object(component) - component_obj.load(self.child_component_owner, parent=self, data=data, all_data=self._all_data) + component_obj.load( + self.child_component_owner, + parent=self, + data=data, + all_data=self._all_data, + is_form=is_form, + ) tab['components'].append(component_obj) self.tabs.append(tab) diff --git a/formiodata/form.py b/formiodata/form.py index c8142b0..8b31dfb 100644 --- a/formiodata/form.py +++ b/formiodata/form.py @@ -73,7 +73,13 @@ def load_components(self): for key, component in self.builder.components.items(): # New object, don't affect the Builder component component_obj = self.builder.get_component_object(component.raw) - component_obj.load(component_owner=self, parent=None, data=self.form, all_data=self.form) + component_obj.load( + component_owner=self, + parent=None, + data=self.form, + all_data=self.form, + is_form=True, + ) self.components[key] = component_obj self.component_ids[component_obj.id] = component_obj diff --git a/pyproject.toml b/pyproject.toml index 2bde3cd..803fb2e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "formio-data" -version = "1.2.4" +version = "1.2.5" homepage = "https://github.com/novacode-nl/python-formio-data" description = "formio.js JSON-data API" readme = "README.md"