Skip to content

Commit

Permalink
Merge pull request #667 from grzesiek2010/PYXFORM-616
Browse files Browse the repository at this point in the history
Add rows to parameters column for text type
  • Loading branch information
lindsay-stevens authored Nov 24, 2023
2 parents 2b80707 + 7f3a920 commit acbfc43
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 0 deletions.
19 changes: 19 additions & 0 deletions pyxform/xls2json.py
Original file line number Diff line number Diff line change
Expand Up @@ -1306,6 +1306,25 @@ def workbook_to_json(
parent_children_array.append(new_dict)
continue

if question_type == "text":
new_dict = row.copy()
parameters_generic.validate(parameters=parameters, allowed=("rows",))

if "rows" in parameters.keys():
try:
int(parameters["rows"])
except ValueError:
raise PyXFormError(
(ROW_FORMAT_STRING % row_number)
+ " Parameter rows must have an integer value."
)

new_dict["control"] = new_dict.get("control", {})
new_dict["control"].update({"rows": parameters["rows"]})

parent_children_array.append(new_dict)
continue

if question_type == "photo":
new_dict = row.copy()

Expand Down
66 changes: 66 additions & 0 deletions tests/test_parameters_rows.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
"""
Test text rows parameter.
"""
from tests.pyxform_test_case import PyxformTestCase


class TestParametersRows(PyxformTestCase):
def test_adding_rows_to_the_body_if_set_in_its_own_column(
self,
):
self.assertPyxformXform(
name="data",
md="""
| survey | | | | |
| | type | name | label | body::rows |
| | text | name | Name | 7 |
""",
xml__xpath_match=["/h:html/h:body/x:input[@ref='/data/name' and @rows='7']"],
)

def test_using_the_number_of_rows_specified_in_parameters_if_it_is_set_in_both_its_own_column_and_the_parameters_column(
self,
):
self.assertPyxformXform(
name="data",
md="""
| survey | | | | | |
| | type | name | label | body::rows | parameters |
| | text | name | Name | 7 | rows=8 |
""",
xml__xpath_match=["/h:html/h:body/x:input[@ref='/data/name' and @rows='8']"],
)

def test_adding_rows_to_the_body_if_set_in_parameters(
self,
):
self.assertPyxformXform(
name="data",
md="""
| survey | | | | |
| | type | name | label | parameters |
| | text | name | Name | rows=7 |
""",
xml__xpath_match=["/h:html/h:body/x:input[@ref='/data/name' and @rows='7']"],
)

def test_throwing_error_if_rows_set_in_parameters_but_the_value_is_not_an_integer(
self,
):
parameters = ("rows=", "rows=foo", "rows=7.5")
md = """
| survey | | | | |
| | type | name | label | parameters |
| | text | name | Name | {case} |
"""
for case in parameters:
with self.subTest(msg=case):
self.assertPyxformXform(
name="data",
md=md.format(case=case),
errored=True,
error__contains=[
"[row : 2] Parameter rows must have an integer value."
],
)

0 comments on commit acbfc43

Please sign in to comment.