From bc2c52e8384487ff7e16cb62fc8aa5608b695e30 Mon Sep 17 00:00:00 2001 From: "Dr. Gareth S. Bestor" Date: Mon, 3 Mar 2025 17:19:03 +1300 Subject: [PATCH] Add support for new form type 'image-description', which provides a translatable string description for survey and choice option images. Add associated tests. Add additional error test for 'big-image' without a corresponding 'image' for choice options. --- pyxform/aliases.py | 2 + pyxform/constants.py | 2 +- pyxform/json_form_schema.json | 10 ++ pyxform/survey.py | 9 ++ pyxform/survey_element.py | 10 ++ pyxform/validators/pyxform/choices.py | 13 ++ .../big-image_choice_missing_image.xlsx | Bin 0 -> 14954 bytes .../big-image_survey_missing_image.xlsx | Bin 0 -> 10884 bytes ...mage-description_choice_missing_image.xlsx | Bin 0 -> 14930 bytes ...mage-description_survey_missing_image.xlsx | Bin 0 -> 10890 bytes tests/example_xls/image-description.xlsx | Bin 0 -> 15070 bytes .../image-description_translated.xlsx | Bin 0 -> 19198 bytes .../example_xls/media-image-description.xlsx | Bin 0 -> 15078 bytes .../media-image-description_translated.xlsx | Bin 0 -> 19214 bytes .../image-description.xml | 89 +++++++++++++ .../image-description_translated.xml | 121 +++++++++++++++++ .../media-image-description.xml | 89 +++++++++++++ .../media-image-description_translated.xml | 122 ++++++++++++++++++ tests/xform_test_case/test_bugs.py | 16 +++ .../xform_test_case/test_xform_conversion.py | 4 + 20 files changed, 486 insertions(+), 1 deletion(-) create mode 100644 tests/bug_example_xls/big-image_choice_missing_image.xlsx create mode 100644 tests/bug_example_xls/big-image_survey_missing_image.xlsx create mode 100644 tests/bug_example_xls/image-description_choice_missing_image.xlsx create mode 100644 tests/bug_example_xls/image-description_survey_missing_image.xlsx create mode 100644 tests/example_xls/image-description.xlsx create mode 100644 tests/example_xls/image-description_translated.xlsx create mode 100644 tests/example_xls/media-image-description.xlsx create mode 100644 tests/example_xls/media-image-description_translated.xlsx create mode 100644 tests/test_expected_output/image-description.xml create mode 100644 tests/test_expected_output/image-description_translated.xml create mode 100644 tests/test_expected_output/media-image-description.xml create mode 100644 tests/test_expected_output/media-image-description_translated.xml diff --git a/pyxform/aliases.py b/pyxform/aliases.py index 17cfa5c6..86496a1a 100644 --- a/pyxform/aliases.py +++ b/pyxform/aliases.py @@ -96,6 +96,7 @@ "big-image": "media::big-image", "audio": "media::audio", "video": "media::video", + "image-description": "media::image-description", "count": "control::jr:count", "repeat_count": "control::jr:count", "jr:count": "control::jr:count", @@ -142,6 +143,7 @@ "big-image": "media::big-image", "audio": "media::audio", "video": "media::video", + "image-description": "media::image-description", } # Note that most of the type aliasing happens in all.xls _type_alias_map = { diff --git a/pyxform/constants.py b/pyxform/constants.py index 793d1e05..8f485937 100644 --- a/pyxform/constants.py +++ b/pyxform/constants.py @@ -166,5 +166,5 @@ class EntityColumns(StrEnum): "xmlns:orx": "http://openrosa.org/xforms", "xmlns:odk": "http://www.opendatakit.org/xforms", } -SUPPORTED_MEDIA_TYPES = {"image", "big-image", "audio", "video"} +SUPPORTED_MEDIA_TYPES = {"image", "big-image", "audio", "video", "image-description"} OR_OTHER_CHOICE = {NAME: "other", LABEL: "Other"} diff --git a/pyxform/json_form_schema.json b/pyxform/json_form_schema.json index b2321b1e..9b6f49a8 100644 --- a/pyxform/json_form_schema.json +++ b/pyxform/json_form_schema.json @@ -170,6 +170,16 @@ "type" : "string", "description" : "A key value pair where the key is a language, and the value is the content uri in that language." } + }, + "image-description" : + { + "type" : ["object", "string"], + "description" : "Optional string description of the image; eg to use for accessibility." + "additionalProperties": + { + "type" : "string", + "description" : "A key value pair where the key is a language, and the value is the content in that language." + } } } }, diff --git a/pyxform/survey.py b/pyxform/survey.py index 50ecafe9..4cb75996 100644 --- a/pyxform/survey.py +++ b/pyxform/survey.py @@ -1096,6 +1096,15 @@ def itext(self) -> DetachableElement: toParseString=output_inserted, ) ) + elif media_type == "image-description": + itext_nodes.append( + node( + "value", + value, + form=media_type, + toParseString=output_inserted, + ) + ) elif value != "-": itext_nodes.append( node( diff --git a/pyxform/survey_element.py b/pyxform/survey_element.py index 3312e229..094e7440 100644 --- a/pyxform/survey_element.py +++ b/pyxform/survey_element.py @@ -530,6 +530,16 @@ def xml_label_and_hint(self, survey: "Survey") -> list["DetachableElement"]: "To use big-image, you must also specify an image for the survey element named {self.name}." ) + # image-description must be associated with an image + if ( + self.media is not None + and "image" not in self.media + and "image-description" in self.media + ): + raise PyXFormError( + "To use image-description, you must also specify an image for the survey element named {self.name}." + ) + return result def xml_bindings( diff --git a/pyxform/validators/pyxform/choices.py b/pyxform/validators/pyxform/choices.py index 3b347c35..b218514e 100644 --- a/pyxform/validators/pyxform/choices.py +++ b/pyxform/validators/pyxform/choices.py @@ -22,6 +22,11 @@ "If this is intentional, use the setting 'allow_choice_duplicates'. " "Learn more: https://xlsform.org/#choice-names." ) +MISSING_IMAGE = ( + "[row : {row}] On the 'choices' sheet, an 'image' has not been specified. " + "Choices with 'big-image' or 'image-description' require a corresponding image. " + "Learn more: https://xlsform.org/en/#the-choices-worksheet" +) def validate_headers( @@ -55,6 +60,14 @@ def validate_choice_list( else: seen_options.add(name) + # Check the option's media, if specified, is mutually consistent + if "media" in option: + media = option["media"] + if "image" not in media and ( + "big-image" in media or "image-description" in media + ): + duplicate_errors.append(MISSING_IMAGE.format(row=option["__row"])) + if 0 < len(duplicate_errors): raise PyXFormError("\n".join(duplicate_errors)) diff --git a/tests/bug_example_xls/big-image_choice_missing_image.xlsx b/tests/bug_example_xls/big-image_choice_missing_image.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..963f7313f36efa7240ae65c5abf21e9fe880c6d1 GIT binary patch literal 14954 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 literal 0 HcmV?d00001 diff --git a/tests/bug_example_xls/big-image_survey_missing_image.xlsx b/tests/bug_example_xls/big-image_survey_missing_image.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a0b945555a6bf18ea510d6342a6e492aa33cdb46 GIT binary patch literal 10884 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 literal 0 HcmV?d00001 diff --git a/tests/example_xls/image-description.xlsx b/tests/example_xls/image-description.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c2e93cbf3ebbbb12b729be06057b29240d2a335d GIT binary patch literal 15070 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 N>mOWMcba0Hpu` literal 0 HcmV?d00001 diff --git a/tests/test_expected_output/image-description.xml b/tests/test_expected_output/image-description.xml new file mode 100644 index 00000000..e6e883ab --- /dev/null +++ b/tests/test_expected_output/image-description.xml @@ -0,0 +1,89 @@ + + + + image-description + + + + + whale + jr://images/a.jpg + whale silhouette + + + frog + jr://images/b.jpg + frog silhouette + + + crocodile + jr://images/c.jpg + crocodile silhouette + + + eagle + jr://images/d.jpg + eagle silhouette + + + What is your name + jr://images/small.jpg + small car + + + + + + + + + + + + + + + + animals-0 + a + + + animals-1 + b + + + animals-2 + c + + + animals-3 + d + + + + + + + + + + + + + diff --git a/tests/test_expected_output/image-description_translated.xml b/tests/test_expected_output/image-description_translated.xml new file mode 100644 index 00000000..f7517179 --- /dev/null +++ b/tests/test_expected_output/image-description_translated.xml @@ -0,0 +1,121 @@ + + + + image-description_translated + + + + + whale + jr://images/a.jpg + whale silhouette + + + frog + jr://images/b.jpg + frog silhouette + + + crocodile + jr://images/c.jpg + crocodile silhouette + + + eagle + jr://images/d.jpg + eagle silhouette + + + What is your name + jr://images/small.jpg + small car + + + Pick your favorite animal + + + + + baleine + jr://images/a.jpg + silhouette de baleine + + + grenouille + jr://images/b.jpg + silhouette de grenouille + + + crocodile + jr://images/c.jpg + silhouette de crocodile + + + aigle + jr://images/d.jpg + silhouette d'aigle + + + Quel est ton nom + jr://images/small.jpg + petite voiture + + + Choisissez votre animal préféré + + + + + + + + + + + + + + + + animals-0 + a + + + animals-1 + b + + + animals-2 + c + + + animals-3 + d + + + + + + + + + + + + diff --git a/tests/test_expected_output/media-image-description.xml b/tests/test_expected_output/media-image-description.xml new file mode 100644 index 00000000..49b7b23a --- /dev/null +++ b/tests/test_expected_output/media-image-description.xml @@ -0,0 +1,89 @@ + + + + media-image-description + + + + + whale + jr://images/a.jpg + whale silhouette + + + frog + jr://images/b.jpg + frog silhouette + + + crocodile + jr://images/c.jpg + crocodile silhouette + + + eagle + jr://images/d.jpg + eagle silhouette + + + What is your name + jr://images/small.jpg + small car + + + + + + + + + + + + + + + + animals-0 + a + + + animals-1 + b + + + animals-2 + c + + + animals-3 + d + + + + + + + + + + + + + diff --git a/tests/test_expected_output/media-image-description_translated.xml b/tests/test_expected_output/media-image-description_translated.xml new file mode 100644 index 00000000..52f64a26 --- /dev/null +++ b/tests/test_expected_output/media-image-description_translated.xml @@ -0,0 +1,122 @@ + + + + media-image-description_translated + + + + + whale + jr://images/a.jpg + whale silhouette + + + frog + jr://images/b.jpg + frog silhouette + + + crocodile + jr://images/c.jpg + crocodile silhouette + + + eagle + jr://images/d.jpg + eagle silhouette + + + What is your name + jr://images/small.jpg + small car + + + Pick your favorite animal + + + + + baleine + jr://images/a.jpg + silhouette de baleine + + + grenouille + jr://images/b.jpg + silhouette de grenouille + + + crocodile + jr://images/c.jpg + silhouette de crocodile + + + aigle + jr://images/d.jpg + silhouette d'aigle + + + Quel est ton nom + jr://images/small.jpg + petite voiture + + + Choisissez votre animal préféré + + + + + + + + + + + + + + + + animals-0 + a + + + animals-1 + b + + + animals-2 + c + + + animals-3 + d + + + + + + + + + + + + + diff --git a/tests/xform_test_case/test_bugs.py b/tests/xform_test_case/test_bugs.py index c5db20d1..a628f700 100644 --- a/tests/xform_test_case/test_bugs.py +++ b/tests/xform_test_case/test_bugs.py @@ -31,6 +31,22 @@ def test_conversion_raises(self): ), ("duplicate_columns.xlsx", "Duplicate column header: label"), ("calculate_without_calculation.xls", "[row : 34] Missing calculation."), + ( + "big-image_survey_missing_image.xlsx", + "To use big-image, you must also specify an image for the survey element", + ), + ( + "big-image_choice_missing_image.xlsx", + "On the 'choices' sheet, an 'image' has not been specified.", + ), + ( + "image-description_survey_missing_image.xlsx", + "To use image-description, you must also specify an image for the survey element", + ), + ( + "image-description_choice_missing_image.xlsx", + "On the 'choices' sheet, an 'image' has not been specified.", + ), ) for i, (case, err_msg) in enumerate(cases): with self.subTest(msg=f"{i}: {case}"): diff --git a/tests/xform_test_case/test_xform_conversion.py b/tests/xform_test_case/test_xform_conversion.py index 8e67451e..2784dfe5 100644 --- a/tests/xform_test_case/test_xform_conversion.py +++ b/tests/xform_test_case/test_xform_conversion.py @@ -26,6 +26,10 @@ def test_conversion_vs_expected(self): ("xlsform_spec_test.xlsx", True), ("xml_escaping.xls", True), ("default_time_demo.xls", True), + ("image-description.xlsx", False), + ("media-image-description.xlsx", False), + ("image-description_translated.xlsx", False), + ("media-image-description_translated.xlsx", False), ) for i, (case, set_name) in enumerate(cases): with self.subTest(msg=f"{i}: {case}"):