Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allowing xml-internal question type. #383

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pyxform/question_type_dictionary.py
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,7 @@ def generate_new_dict():
"xml-external": {
# Only effect is to add an external instance.
},
"xml-internal": {},
"start-geopoint": {
"control": {"tag": "action"},
"bind": {"type": "geopoint"},
Expand Down
103 changes: 103 additions & 0 deletions pyxform/tests_v1/test_xml_internal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# -*- coding: utf-8 -*-
"""
Test for the xml-internal question
"""
from pyxform.tests_v1.pyxform_test_case import PyxformTestCase


class XmlInternalTest(PyxformTestCase):
def should_add_instances_for_xml_interna(self):
md = """
| survey | | | | | |
| | type | name | label | hint |appearance |
| | xml-internal | states | | | |
| | xml-internal | yes_no | | | |
| choices | | | | | |
| | list_name | name | label | | |
| | yes_no | yes | Yes | | |
| | states | VA | Virginia | | |
| | states | IN | India | | |
| | fruits | apple | Apple | | |
| | fruits | banana | Banana | | |
"""
survey = self.md_to_pyxform_survey(md_raw=md)
survey_xml = survey._to_pretty_xml()

self.assertContains(survey_xml, '<instance id="yes_no">', 1)
self.assertContains(survey_xml, '<instance id="states">', 1)
self.assertContains(survey_xml, '<instance id="fruits">', 1)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fruits isn't used anywhere so I wouldn't expect it be generated. I think this is existing behavior so maybe we don't need to change it here?


self.assertPyxformXform(
md=md,
model__contains=[
'<instance id="yes_no">',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The two assertion blocks seem redundant to me. Perhaps it's best to go with the first variant so the count can be verified.

'<instance id="states">',
'<instance id="fruits">',
],
)

def should_add_single_instance_with_choice_filter(self):
md = """
| survey | | | | | |
| | type | name | label | choice_filter | appearance |
| | xml-internal | states | | | |
| | xml-internal | yes_no | | | |
| | select_one states | state | The state | state!='VA' | |
| choices | | | | | |
| | list_name | name | label | | |
| | yes_no | yes | Yes | | |
| | states | VA | Virginia | | |
| | states | IN | India | | |
| | fruits | apple | Apple | | |
| | fruits | banana | Banana | | |
"""
survey = self.md_to_pyxform_survey(md_raw=md)
survey_xml = survey._to_pretty_xml()

self.assertContains(survey_xml, '<instance id="yes_no">', 1)
self.assertContains(survey_xml, '<instance id="states">', 1)
self.assertContains(survey_xml, '<instance id="fruits">', 1)

self.assertPyxformXform(
md=md,
model__contains=[
'<instance id="yes_no">',
'<instance id="states">',
'<instance id="fruits">',
],
)

def should_add_single_instance_with_select(self):
md = """
| survey | | | | | |
| | type | name | label | hint |appearance |
| | begin_group | tablelist1 | Table_Y_N | |table-list minimal |
| | select_one yes_no | options1a | Q1 | first row! | |
| | select_one yes_no | options1b | Q2 | | |
| | end_group | | | | |
| | xml-internal | states | | | |
| | select_one states | state | The state | | |
| | xml-internal | yes_no | | | |
| choices | | | | | |
| | list_name | name | label | | |
| | yes_no | yes | Yes | | |
| | states | VA | Virginia | | |
| | states | IN | India | | |
| | fruits | apple | Apple | | |
| | fruits | banana | Banana | | |
"""
survey = self.md_to_pyxform_survey(md_raw=md)
survey_xml = survey._to_pretty_xml()

self.assertContains(survey_xml, '<instance id="yes_no">', 1)
self.assertContains(survey_xml, '<instance id="states">', 1)
self.assertContains(survey_xml, '<instance id="fruits">', 1)

self.assertPyxformXform(
md=md,
model__contains=[
'<instance id="yes_no">',
'<instance id="states">',
'<instance id="fruits">',
],
)
3 changes: 3 additions & 0 deletions pyxform/xls2json.py
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,9 @@ def workbook_to_json(
question_type = row.get(constants.TYPE)
question_name = row.get(constants.NAME)

if question_type == "xml-internal":
json_dict["choices"] = choices

if not question_type:
# if name and label are also missing,
# then its a comment row, and we skip it with warning
Expand Down