Skip to content

Commit

Permalink
✨ [#5074] Transform data for selectboxes based on openForms.transform…
Browse files Browse the repository at this point in the history
…Data
  • Loading branch information
stevenbal committed Feb 4, 2025
1 parent 3f79ba2 commit a14f140
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
12 changes: 12 additions & 0 deletions src/openforms/forms/models/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from openforms.authentication.registry import register as authentication_register
from openforms.config.models import GlobalConfiguration
from openforms.data_removal.constants import RemovalMethods
from openforms.formio.datastructures import FormioConfigurationWrapper
from openforms.formio.validators import variable_key_validator
from openforms.payments.fields import PaymentBackendChoiceField
from openforms.payments.registry import register as payment_register
Expand Down Expand Up @@ -609,6 +610,17 @@ def iter_components(self, recursive=True):
for form_step in self.formstep_set.select_related("form_definition"):
yield from form_step.iter_components(recursive=recursive)

def get_total_configuration(self) -> FormioConfigurationWrapper:
"""
Return the total joined FormIO configuration of all FormSteps belonging to this Form
"""
raw_configs = self.formstep_set.select_related("form_definition").values_list(
"form_definition__configuration", flat=True
)
configs = [FormioConfigurationWrapper(config) for config in raw_configs]
configuration = sum(configs, FormioConfigurationWrapper({"components": []}))
return configuration

@transaction.atomic
def restore_old_version(
self, form_version_uuid: str, user: User | None = None
Expand Down
27 changes: 26 additions & 1 deletion src/openforms/submissions/models/submission_value_variable.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

import logging
from dataclasses import dataclass, field
from datetime import date, datetime, time
from typing import TYPE_CHECKING, Any, Literal, overload
Expand All @@ -11,6 +12,8 @@
from django.utils.functional import empty
from django.utils.translation import gettext_lazy as _

from glom import glom

from openforms.formio.service import FormioData
from openforms.forms.models.form_variable import FormVariable
from openforms.typing import DataMapping, JSONEncodable, JSONObject, JSONSerializable
Expand All @@ -19,11 +22,14 @@
from openforms.variables.service import VariablesRegistry, get_static_variables

from ..constants import SubmissionValueVariableSources
from ..transform_data import TRANSFORM_DATA_MAPPING
from .submission import Submission

if TYPE_CHECKING:
from .submission_step import SubmissionStep

logger = logging.getLogger(__name__)


class ValueEncoder(DjangoJSONEncoder):
def default(self, obj: JSONEncodable | JSONSerializable) -> JSONEncodable:
Expand Down Expand Up @@ -94,6 +100,8 @@ def get_data(
)

formio_data = FormioData()
configuration = self.submission.form.get_total_configuration()

for variable_key, variable in submission_variables.items():
if (
variable.value is None
Expand All @@ -104,7 +112,24 @@ def get_data(
continue

if variable.source != SubmissionValueVariableSources.sensitive_data_cleaner:
formio_data[variable_key] = variable.value
component_configuration = configuration[variable.key]

if glom(
component_configuration, "openForms.transformData", default=None
):
transform_function = TRANSFORM_DATA_MAPPING.get(
component_configuration["type"]
)
if not transform_function:
logger.warning(
"Incorrect configuration, component of type `%s` has `openForms.transformData` "
"set to true, but no transform function is defined in TRANSFORM_DATA_MAPPING",
component_configuration["type"],
)
transform_function = lambda value: value
formio_data[variable_key] = transform_function(variable.value)
else:
formio_data[variable_key] = variable.value
return formio_data if as_formio_data else formio_data.data

def get_variables_in_submission_step(
Expand Down
8 changes: 8 additions & 0 deletions src/openforms/submissions/transform_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
def transform_selectboxes_data(value: dict[str, bool] | None) -> list[str] | None:
if value:
return sorted([key for key, value in value.items() if value])


TRANSFORM_DATA_MAPPING = {
"selectboxes": transform_selectboxes_data,
}

0 comments on commit a14f140

Please sign in to comment.