Skip to content

Commit

Permalink
Release 1.2.4 and minor changes:
Browse files Browse the repository at this point in the history
- README validation_errors
- Some code cleanup, renaming and formatting.
  • Loading branch information
bobslee committed Oct 24, 2023
1 parent 2d4c90f commit 1ec40ec
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 31 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# Changelog

## 1.2.4

Implementation of "simple" validation required.

For a Form object the validation errors can be retrieved by the new
`validation_errors()` method.

The new component method `validation_errors()` can be extended and
returns either a dictionary or a list (for grid components) with the
validation errors.

## 1.2.3

Improve the `datetimeComponent` to properly parse a date with a custom format, when the `enableTime` (new property) is False.
Expand Down
21 changes: 18 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ For information about the formio.js project, see https://github.com/formio/formi
## Introduction

**python-formio-data** is a Python package, which loads and transforms
formio.js **Builder JSON** and **Form JSON** into **usable Python objects**. It's main
aim is to provide easy access to a Form its components/fields, also
formio.js **Builder JSON** and **Form JSON** into **usable Python objects**.\
It's main aim is to provide easy access to a Form its components/fields, also
captured as **Python objects**, which makes this API very versatile and usable.

**Notes about terms:**
Expand Down Expand Up @@ -147,6 +147,21 @@ Datetime: datetime.datetime(2021, 5, 8, 11, 41, 5, 919943), Fahrenheit: 131
>> print(form.data.firstname.value)
'Bob'

###################
# validation errors
###################

>> print(form.validation_errors())
{
'companyName': 'Company Name is required',
'editgridActivities': [
{'description': 'Description is required'},
{}, # no validation error (row 2)
{}, # no validation error (row 3)
{'description': 'Description is required', 'startDate': 'Start Date is required'}
]
}

#############################
# component path (properties)
#############################
Expand Down Expand Up @@ -241,7 +256,7 @@ self.assertEqual(custom_editgrid.type, 'custom_editgrid')

**Note:**

Internet access is recommended for running the `filecStorageUrlComponentTestCase`, because this also tests the URL Storage (type).\
Internet access is recommended for running the `fileStorageUrlComponentTestCase`, because this also tests the URL Storage (type).\
If no internet access, this test won't fail and a WARNING shall be logged regarding a ConnectionError.

### Run all unittests
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "formio-data"
version = "1.2.3"
version = "1.2.4"
homepage = "https://github.com/novacode-nl/python-formio-data"
description = "formio.js JSON-data API"
readme = "README.md"
Expand Down
7 changes: 3 additions & 4 deletions tests/test_conditional_visibility_json_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from formiodata.form import Form



class ConditionalVisibilityJsonLogicTestCase(ConditionalVisibilityTestHelpers, unittest.TestCase):
def setUp(self):
super(ConditionalVisibilityJsonLogicTestCase, self).setUp()
Expand All @@ -17,14 +16,14 @@ def setUp(self):
self.hide_secret_form_json = readfile('data', 'test_conditional_visibility_json_logic_hide_secret.json')
self.show_secret_form_json = readfile('data', 'test_conditional_visibility_json_logic_show_secret.json')

def test_conditionally_shown_form_elements_have_default_state_in_builder(self):
def test_conditionally_shown_components_have_default_state_in_builder(self):
builder = Builder(self.builder_json)

self.assertVisible(builder.input_components['username'])
self.assertVisible(builder.input_components['password'])
self.assertNotVisible(builder.input_components['secret'])

def test_conditionally_shown_form_elements_toggle_on_condition_being_met(self):
def test_conditionally_shown_components_toggle_on_condition_being_met(self):
builder = Builder(self.builder_json)

hide_secret_form = Form(self.hide_secret_form_json, builder)
Expand All @@ -37,7 +36,7 @@ def test_conditionally_shown_form_elements_toggle_on_condition_being_met(self):
self.assertVisible(show_secret_form.input_components['password'])
self.assertVisible(show_secret_form.input_components['secret'])

def test_conditionally_shown_form_elements_do_not_render_when_hidden(self):
def test_conditionally_shown_components_do_not_render_when_hidden(self):
builder = Builder(self.builder_json)

hide_secret_form = Form(self.hide_secret_form_json, builder)
Expand Down
30 changes: 10 additions & 20 deletions tests/test_conditional_visibility_nested_json_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,14 @@ def setUp(self):
self.hide_global_secret_only_form_json = readfile('data', 'test_conditional_visibility_nested_json_logic_hide_global_secret_only.json')
self.show_global_secret_only_form_json = readfile('data', 'test_conditional_visibility_nested_json_logic_show_global_secret_only.json')


def test_conditionally_shown_top_level_form_elements_have_default_state_in_builder(self):
def test_conditionally_shown_top_level_components_have_default_state_in_builder(self):
builder = Builder(self.builder_json)

self.assertVisible(builder.input_components['username'])
self.assertVisible(builder.input_components['password'])
self.assertNotVisible(builder.input_components['secret'])


def test_conditionally_shown_form_elements_in_panel_have_default_state_in_builder(self):
def test_conditionally_shown_components_in_panel_have_default_state_in_builder(self):
builder = Builder(self.builder_json)

self.assertVisible(builder.input_components['username1'])
Expand All @@ -38,8 +36,7 @@ def test_conditionally_shown_form_elements_in_panel_have_default_state_in_builde
self.assertVisible(builder.input_components['password2'])
self.assertNotVisible(builder.input_components['secret2'])


def test_conditionally_shown_top_level_form_elements_toggle_on_condition_being_met(self):
def test_conditionally_shown_top_level_components_toggle_on_condition_being_met(self):
builder = Builder(self.builder_json)

hide_secret_form = Form(self.hide_secret_form_json, builder)
Expand All @@ -52,8 +49,7 @@ def test_conditionally_shown_top_level_form_elements_toggle_on_condition_being_m
self.assertVisible(show_secret_form.input_components['password'])
self.assertVisible(show_secret_form.input_components['secret'])


def test_conditionally_shown_form_elements_in_panel_toggle_on_condition_being_met(self):
def test_conditionally_shown_components_in_panel_toggle_on_condition_being_met(self):
builder = Builder(self.builder_json)

hide_secret_form = Form(self.hide_secret_form_json, builder)
Expand All @@ -74,8 +70,7 @@ def test_conditionally_shown_form_elements_in_panel_toggle_on_condition_being_me
self.assertVisible(show_secret_form.input_components['password2'])
self.assertVisible(show_secret_form.input_components['secret2'])


def test_conditionally_shown_form_elements_in_data_grid_toggle_on_local_row_condition_met(self):
def test_conditionally_shown_components_in_data_grid_toggle_on_local_row_condition_met(self):
builder = Builder(self.builder_json)

hide_secret_form = Form(self.hide_secret_form_json, builder)
Expand Down Expand Up @@ -108,8 +103,7 @@ def test_conditionally_shown_form_elements_in_data_grid_toggle_on_local_row_cond
self.assertVisible(show_secret_second_row.input_components['secret3'])
self.assertVisible(show_secret_second_row.input_components['globalSecret'])


def test_conditionally_shown_form_elements_in_data_grid_toggle_on_global_data_condition_met(self):
def test_conditionally_shown_components_in_data_grid_toggle_on_global_data_condition_met(self):
builder = Builder(self.builder_json)

show_global_secret_only_form = Form(self.show_global_secret_only_form_json, builder)
Expand Down Expand Up @@ -142,8 +136,7 @@ def test_conditionally_shown_form_elements_in_data_grid_toggle_on_global_data_co
self.assertVisible(hide_global_secret_only_second_row.input_components['secret3'])
self.assertNotVisible(hide_global_secret_only_second_row.input_components['globalSecret'])


def test_conditionally_shown_top_level_form_elements_do_not_render_when_hidden(self):
def test_conditionally_shown_top_level_components_do_not_render_when_hidden(self):
builder = Builder(self.builder_json)

hide_secret_form = Form(self.hide_secret_form_json, builder)
Expand All @@ -158,8 +151,7 @@ def test_conditionally_shown_top_level_form_elements_do_not_render_when_hidden(s
self.assertEqual('<p>secret</p>', show_secret_form.input_components['password'].html_component)
self.assertEqual('<p>Secret message</p>', show_secret_form.input_components['secret'].html_component)


def test_conditionally_shown_form_elements_in_panel_do_not_render_when_hidden(self):
def test_conditionally_shown_components_in_panel_do_not_render_when_hidden(self):
builder = Builder(self.builder_json)

hide_secret_form = Form(self.hide_secret_form_json, builder)
Expand All @@ -182,8 +174,7 @@ def test_conditionally_shown_form_elements_in_panel_do_not_render_when_hidden(se
self.assertEqual('<p>secret</p>', show_secret_form.input_components['password2'].html_component)
self.assertEqual('<p>Secret message</p>', show_secret_form.input_components['secret2'].html_component)


def test_conditionally_shown_form_elements_for_local_row_condition_in_data_grid_do_not_render_when_hidden(self):
def test_conditionally_shown_components_for_local_row_condition_in_data_grid_do_not_render_when_hidden(self):
builder = Builder(self.builder_json)

hide_secret_form = Form(self.hide_secret_form_json, builder)
Expand Down Expand Up @@ -234,8 +225,7 @@ def test_conditionally_shown_form_elements_for_local_row_condition_in_data_grid_
show_secret_datagrid.html_component
)


def test_conditionally_shown_form_elements_for_global_data_condition_in_data_grid_do_not_render_when_hidden(self):
def test_conditionally_shown_components_for_global_data_condition_in_data_grid_do_not_render_when_hidden(self):
builder = Builder(self.builder_json)

show_global_secret_only_form = Form(self.show_global_secret_only_form_json, builder)
Expand Down
6 changes: 3 additions & 3 deletions tests/test_conditional_visibility_simple.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def setUp(self):
self.show_selectboxes_form_json = readfile('data', 'test_conditional_visibility_simple_show_selectboxes.json')
self.show_textfield_form_json = readfile('data', 'test_conditional_visibility_simple_show_textfield.json')

def test_conditionally_shown_form_elements_have_default_state_in_builder(self):
def test_conditionally_shown_components_have_default_state_in_builder(self):
builder = Builder(self.builder_json)

self.assertVisible(builder.input_components['textField'])
Expand All @@ -26,7 +26,7 @@ def test_conditionally_shown_form_elements_have_default_state_in_builder(self):
self.assertNotVisible(builder.input_components['sales'])
self.assertNotVisible(builder.input_components['technology'])

def test_conditionally_shown_form_elements_toggle_on_condition_being_met(self):
def test_conditionally_shown_components_toggle_on_condition_being_met(self):
builder = Builder(self.builder_json)

hide_password_form = Form(self.hide_password_form_json, builder)
Expand All @@ -44,7 +44,7 @@ def test_conditionally_shown_form_elements_toggle_on_condition_being_met(self):
self.assertVisible(show_selectboxes_form.input_components['technology'])
self.assertNotVisible(show_selectboxes_form.input_components['sales'])

def test_conditionally_shown_form_elements_do_not_render_when_hidden(self):
def test_conditionally_shown_components_do_not_render_when_hidden(self):
builder = Builder(self.builder_json)

hide_password_form = Form(self.hide_password_form_json, builder)
Expand Down

0 comments on commit 1ec40ec

Please sign in to comment.