Skip to content

Commit

Permalink
Merge pull request #4683 from open-formulieren/fix/4656-uploads-in-re…
Browse files Browse the repository at this point in the history
…peating-groups-cause-500

[#4656] Make parent's serializer context available to the children (FileSerializer)
  • Loading branch information
sergei-maertens committed Sep 20, 2024
2 parents ff04630 + 4b50efe commit 1966602
Show file tree
Hide file tree
Showing 3 changed files with 158 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/openforms/formio/components/vanilla.py
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,11 @@ def run_child_validation(self, data):
# conditional.when values resolve, as these look like `editgridparent.child`.
data = FormioData({**self.root.initial_data, self.field_name: item}).data
nested_serializer = self._build_child(data=data)

# this is explicitly bound to the parent because we need to have access to the
# context of the parent in the children
nested_serializer.bind(field_name=self.field_name, parent=self)

try:
result.append(nested_serializer.run_validation(item))
except serializers.ValidationError as e:
Expand Down
44 changes: 44 additions & 0 deletions src/openforms/formio/tests/validation/test_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from rest_framework.settings import api_settings

from openforms.config.models import GlobalConfiguration
from openforms.formio.typing.vanilla import EditGridComponent
from openforms.submissions.tests.factories import (
SubmissionFactory,
TemporaryFileUploadFactory,
Expand Down Expand Up @@ -186,6 +187,49 @@ def test_file_max_files(self):
error = extract_error(errors, component["key"])
self.assertEqual(error.code, "max_length")

@tag("gh-4656")
def test_file_nested_in_editgrid(self):
submission = SubmissionFactory.create()
temporary_file_uploads = TemporaryFileUploadFactory.create_batch(
2, submission=submission
)
component: EditGridComponent = { # type: ignore
"type": "editgrid",
"key": "parent",
"label": "Repeating group",
"components": [
{
"type": "file",
"key": "foo",
"label": "Test",
"storage": "url",
"url": "",
"useConfigFiletypes": False,
"filePattern": "",
"file": {"allowedTypesLabels": []},
"multiple": True,
"maxNumberOfFiles": 2,
}
],
}

is_valid, _ = validate_formio_data(
component,
data={
"parent": [
{
"foo": [
SubmittedFileFactory.create(temporary_upload=file)
for file in temporary_file_uploads
]
}
]
},
submission=submission,
)

self.assertTrue(is_valid)


class FileValidationTests(TestCase):
def test_different_data(self):
Expand Down
109 changes: 109 additions & 0 deletions src/openforms/submissions/tests/test_submission_step_validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
from rest_framework.reverse import reverse
from rest_framework.test import APITestCase

from openforms.formio.tests.factories import (
SubmittedFileFactory,
TemporaryFileUploadFactory,
)
from openforms.forms.tests.factories import (
FormFactory,
FormStepFactory,
Expand Down Expand Up @@ -449,3 +453,108 @@ def test_validate_selectboxes_with_dynamic_values_source(self):
self.assertTrue(
all(name.startswith("data.selectboxes") for name in error_names)
)

def test_validate_step_with_nested_files_in_columns(self):
temporary_file_upload = TemporaryFileUploadFactory.create()
file = SubmittedFileFactory.create(temporary_upload=temporary_file_upload)
submission = temporary_file_upload.submission
form_step = FormStepFactory.create(
form=submission.form,
form_definition__configuration={
"components": [
{
"type": "columns",
"key": "columns",
"label": "Columns",
"columns": [
{
"size": 6,
"components": [
{
"key": "fileUpload1",
"file": {
"name": "",
"type": [],
"allowedTypesLabels": [],
},
"type": "file",
"label": "File Upload 1",
},
],
},
{
"size": 6,
"components": [
{
"key": "fileUpload2",
"file": {
"name": "",
"type": [],
"allowedTypesLabels": [],
},
"type": "file",
"label": "File Upload 2",
},
],
},
],
}
]
},
)

self._add_submission_to_session(submission)
response = self.client.post(
reverse(
"api:submission-steps-validate",
kwargs={
"submission_uuid": submission.uuid,
"step_uuid": form_step.uuid,
},
),
{"data": {"columns": [{"fileUpload1": [file], "fileUpload2": [file]}]}},
)

self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

def test_validate_step_with_nested_files_in_fieldset(self):
temporary_file_upload = TemporaryFileUploadFactory.create()
file = SubmittedFileFactory.create(temporary_upload=temporary_file_upload)
submission = temporary_file_upload.submission
form_step = FormStepFactory.create(
form=submission.form,
form_definition__configuration={
"components": [
{
"key": "fieldset",
"type": "fieldset",
"components": [
{
"key": "fileUpload1",
"file": {
"name": "",
"type": [],
"allowedTypesLabels": [],
},
"type": "file",
"label": "File Upload 1",
},
],
},
]
},
)

self._add_submission_to_session(submission)
response = self.client.post(
reverse(
"api:submission-steps-validate",
kwargs={
"submission_uuid": submission.uuid,
"step_uuid": form_step.uuid,
},
),
{"data": {"fieldset": [{"fileUpload1": [file]}]}},
)

self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

0 comments on commit 1966602

Please sign in to comment.