From 23728b3e52cd45caf9982df5cd0a1f22a812743a Mon Sep 17 00:00:00 2001 From: JD2701 Date: Wed, 29 Apr 2020 08:40:42 +0200 Subject: [PATCH 1/4] add lang_header arg in export def. lang_header can be used for specify the language for header values in excel/csv export (you can have _xml header values and _default values for submits datas). If not set, lng arg override lang_header value. --- src/formpack/pack.py | 5 +++-- src/formpack/reporting/export.py | 12 ++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/formpack/pack.py b/src/formpack/pack.py index fb02c1da..0f756533 100644 --- a/src/formpack/pack.py +++ b/src/formpack/pack.py @@ -337,7 +337,7 @@ def to_json(self, **kwargs): def export(self, lang=UNSPECIFIED_TRANSLATION, group_sep='/', hierarchy_in_labels=False, versions=-1, multiple_select="both", force_index=False, copy_fields=(), title=None, - tag_cols_for_header=None): + tag_cols_for_header=None, lang_header=-1): """ Create an export for given versions of the form """ @@ -348,7 +348,8 @@ def export(self, lang=UNSPECIFIED_TRANSLATION, group_sep='/', hierarchy_in_label version_id_keys=self.version_id_keys(versions), title=title, multiple_select=multiple_select, force_index=force_index, copy_fields=copy_fields, - tag_cols_for_header=tag_cols_for_header) + tag_cols_for_header=tag_cols_for_header, + lang_header=lang_header) def autoreport(self, versions=-1): """ diff --git a/src/formpack/reporting/export.py b/src/formpack/reporting/export.py index 829e4891..58b75581 100644 --- a/src/formpack/reporting/export.py +++ b/src/formpack/reporting/export.py @@ -27,7 +27,7 @@ def __init__(self, formpack, form_versions, lang=UNSPECIFIED_TRANSLATION, group_sep="/", hierarchy_in_labels=False, version_id_keys=[], multiple_select="both", copy_fields=(), force_index=False, - title="submissions", tag_cols_for_header=None): + title="submissions", tag_cols_for_header=None, lang_header=-1): """ :param formpack: FormPack @@ -44,10 +44,13 @@ def __init__(self, formpack, form_versions, lang=UNSPECIFIED_TRANSLATION, :param force_index: bool. :param title: string :param tag_cols_for_header: list + :param lang_header: string, False (`constants.UNSPECIFIED_TRANSLATION`), or + None (`constants.UNTRANSLATED`), if not set, default value equal lang arg. """ self.formpack = formpack self.lang = lang + self.lang_header = self.lang if lang_header == -1 else lang_header self.group_sep = group_sep self.title = title self.versions = form_versions @@ -76,7 +79,7 @@ def __init__(self, formpack, form_versions, lang=UNSPECIFIED_TRANSLATION, # this deals with merging all form versions headers and labels params = ( lang, group_sep, hierarchy_in_labels, multiple_select, - tag_cols_for_header, + tag_cols_for_header, self.lang_header, ) res = self.get_fields_labels_tags_for_all_versions(*params) self.sections, self.labels, self.tags = res @@ -157,7 +160,8 @@ def get_fields_labels_tags_for_all_versions(self, group_sep="/", hierarchy_in_labels=False, multiple_select="both", - tag_cols_for_header=None): + tag_cols_for_header=None, + lang_header=UNSPECIFIED_TRANSLATION): """ Return 3 mappings containing field, labels, and tags by section This is needed because when making an export for several @@ -199,7 +203,7 @@ def get_fields_labels_tags_for_all_versions(self, for field in all_fields: section_fields.setdefault(field.section.name, []).append(field) section_labels.setdefault(field.section.name, []).append( - field.get_labels(lang, group_sep, + field.get_labels(lang_header, group_sep, hierarchy_in_labels, multiple_select) ) From 6e54c9a927b8be7cb1ad62f600cd7952c26a7651 Mon Sep 17 00:00:00 2001 From: JD2701 Date: Thu, 30 Apr 2020 09:23:36 +0200 Subject: [PATCH 2/4] change arg name lang_header to header_lang --- src/formpack/pack.py | 7 ++++--- src/formpack/reporting/export.py | 12 ++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/formpack/pack.py b/src/formpack/pack.py index 0f756533..3bcd27e9 100644 --- a/src/formpack/pack.py +++ b/src/formpack/pack.py @@ -337,7 +337,8 @@ def to_json(self, **kwargs): def export(self, lang=UNSPECIFIED_TRANSLATION, group_sep='/', hierarchy_in_labels=False, versions=-1, multiple_select="both", force_index=False, copy_fields=(), title=None, - tag_cols_for_header=None, lang_header=-1): + header_lang=-1, + tag_cols_for_header=None): """ Create an export for given versions of the form """ @@ -348,8 +349,8 @@ def export(self, lang=UNSPECIFIED_TRANSLATION, group_sep='/', hierarchy_in_label version_id_keys=self.version_id_keys(versions), title=title, multiple_select=multiple_select, force_index=force_index, copy_fields=copy_fields, - tag_cols_for_header=tag_cols_for_header, - lang_header=lang_header) + header_lang=header_lang, + tag_cols_for_header=tag_cols_for_header) def autoreport(self, versions=-1): """ diff --git a/src/formpack/reporting/export.py b/src/formpack/reporting/export.py index 58b75581..94b0253a 100644 --- a/src/formpack/reporting/export.py +++ b/src/formpack/reporting/export.py @@ -27,7 +27,7 @@ def __init__(self, formpack, form_versions, lang=UNSPECIFIED_TRANSLATION, group_sep="/", hierarchy_in_labels=False, version_id_keys=[], multiple_select="both", copy_fields=(), force_index=False, - title="submissions", tag_cols_for_header=None, lang_header=-1): + title="submissions", tag_cols_for_header=None, header_lang=-1): """ :param formpack: FormPack @@ -44,13 +44,13 @@ def __init__(self, formpack, form_versions, lang=UNSPECIFIED_TRANSLATION, :param force_index: bool. :param title: string :param tag_cols_for_header: list - :param lang_header: string, False (`constants.UNSPECIFIED_TRANSLATION`), or + :param header_lang: string, False (`constants.UNSPECIFIED_TRANSLATION`), or None (`constants.UNTRANSLATED`), if not set, default value equal lang arg. """ self.formpack = formpack self.lang = lang - self.lang_header = self.lang if lang_header == -1 else lang_header + self.header_lang = self.lang if header_lang == -1 else header_lang self.group_sep = group_sep self.title = title self.versions = form_versions @@ -79,7 +79,7 @@ def __init__(self, formpack, form_versions, lang=UNSPECIFIED_TRANSLATION, # this deals with merging all form versions headers and labels params = ( lang, group_sep, hierarchy_in_labels, multiple_select, - tag_cols_for_header, self.lang_header, + tag_cols_for_header, self.header_lang, ) res = self.get_fields_labels_tags_for_all_versions(*params) self.sections, self.labels, self.tags = res @@ -161,7 +161,7 @@ def get_fields_labels_tags_for_all_versions(self, hierarchy_in_labels=False, multiple_select="both", tag_cols_for_header=None, - lang_header=UNSPECIFIED_TRANSLATION): + header_lang=UNSPECIFIED_TRANSLATION): """ Return 3 mappings containing field, labels, and tags by section This is needed because when making an export for several @@ -203,7 +203,7 @@ def get_fields_labels_tags_for_all_versions(self, for field in all_fields: section_fields.setdefault(field.section.name, []).append(field) section_labels.setdefault(field.section.name, []).append( - field.get_labels(lang_header, group_sep, + field.get_labels(header_lang, group_sep, hierarchy_in_labels, multiple_select) ) From 4ee322d305fadbf8dd0abffa3e2c16f07f999945 Mon Sep 17 00:00:00 2001 From: JD2701 Date: Thu, 30 Apr 2020 19:38:16 +0200 Subject: [PATCH 3/4] add 6 tests for the new arg header_lang - https://github.com/kobotoolbox/formpack/pull/215 --- tests/test_exports.py | 114 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/tests/test_exports.py b/tests/test_exports.py index 0448bbf6..0ed8c745 100644 --- a/tests/test_exports.py +++ b/tests/test_exports.py @@ -1300,6 +1300,9 @@ def test_xlsx(self): fp.export(**options).to_xlsx(xls, submissions) assert xls.isfile() + def test_jdu(self): + assert 1 == 1 + def test_xlsx_long_sheet_names_and_invalid_chars(self): title, schemas, submissions = build_fixture('long_names') fp = FormPack(schemas, title) @@ -1337,6 +1340,8 @@ def test_xlsx_with_tag_headers(self): row_values = [cell.value for cell in sheet.row(1)] assert row_values == ['#beneficiary', '', ''] + + def test_force_index(self): title, schemas, submissions = customer_satisfaction @@ -2040,3 +2045,112 @@ def test_geojson_invalid(self): "type": "Polygon" } ) + + #https://github.com/kobotoolbox/formpack/pull/215 + def test_header_label_list_label(self): + title, schemas, submissions = customer_satisfaction + fp = FormPack(schemas, title) + options = {'header_lang': None, 'lang' : None} + exported = fp.export(**options).to_dict(submissions) + expected = OrderedDict({ + "Customer Satisfaction": { + 'fields': ["Restaurant name", + "Did you enjoy your dining experience?"], + 'data': [ + ["Felipes", "Yes"], + ["Dunkin Donuts", "No"], + ["McDonalds", "No"] + ] + } + }) + self.assertEqual(exported, expected) + + def test_header_key_list_key(self): + title, schemas, submissions = customer_satisfaction + fp = FormPack(schemas, title) + options = {'header_lang': False, 'lang' : False} + exported = fp.export(**options).to_dict(submissions) + expected = OrderedDict({ + "Customer Satisfaction": { + 'fields': ["restaurant_name", + "customer_enjoyment"], + 'data': [ + ["Felipes", "yes"], + ["Dunkin Donuts", "no"], + ["McDonalds", "no"] + ] + } + }) + self.assertEqual(exported, expected) + + def test_header_key_list_label(self): + title, schemas, submissions = customer_satisfaction + fp = FormPack(schemas, title) + options = {'header_lang': False, 'lang' : None} + exported = fp.export(**options).to_dict(submissions) + expected = OrderedDict({ + "Customer Satisfaction": { + 'fields': ["restaurant_name", + "customer_enjoyment"], + 'data': [ + ["Felipes", "Yes"], + ["Dunkin Donuts", "No"], + ["McDonalds", "No"] + ] + } + }) + self.assertEqual(exported, expected) + + def test_header_Label_list_key(self): + title, schemas, submissions = customer_satisfaction + fp = FormPack(schemas, title) + options = {'header_lang': None, 'lang' : False} + exported = fp.export(**options).to_dict(submissions) + expected = OrderedDict({ + "Customer Satisfaction": { + 'fields': ["Restaurant name", + "Did you enjoy your dining experience?"], + 'data': [ + ["Felipes", "yes"], + ["Dunkin Donuts", "no"], + ["McDonalds", "no"] + ] + } + }) + self.assertEqual(exported, expected) + + def test_header_label_no_lang(self): + title, schemas, submissions = customer_satisfaction + fp = FormPack(schemas, title) + options = {'header_lang': None} + exported = fp.export(**options).to_dict(submissions) + expected = OrderedDict({ + "Customer Satisfaction": { + 'fields': ["Restaurant name", + "Did you enjoy your dining experience?"], + 'data': [ + ["Felipes", "yes"], + ["Dunkin Donuts", "no"], + ["McDonalds", "no"] + ] + } + }) + self.assertEqual(exported, expected) + + def test_header_key_no_lang(self): + title, schemas, submissions = customer_satisfaction + fp = FormPack(schemas, title) + options = {'header_lang': False} + exported = fp.export(**options).to_dict(submissions) + expected = OrderedDict({ + "Customer Satisfaction": { + 'fields': ["restaurant_name", + "customer_enjoyment"], + 'data': [ + ["Felipes", "yes"], + ["Dunkin Donuts", "no"], + ["McDonalds", "no"] + ] + } + }) + self.assertEqual(exported, expected) From 1a7c359c0d1f94ea734bc101328c505b17a4e3df Mon Sep 17 00:00:00 2001 From: Jonathan Durand <38976316+jdugh@users.noreply.github.com> Date: Thu, 15 Apr 2021 19:21:40 +0200 Subject: [PATCH 4/4] remove useless line --- tests/test_exports.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/test_exports.py b/tests/test_exports.py index 0ed8c745..a3b63ca7 100644 --- a/tests/test_exports.py +++ b/tests/test_exports.py @@ -1300,8 +1300,6 @@ def test_xlsx(self): fp.export(**options).to_xlsx(xls, submissions) assert xls.isfile() - def test_jdu(self): - assert 1 == 1 def test_xlsx_long_sheet_names_and_invalid_chars(self): title, schemas, submissions = build_fixture('long_names') @@ -1340,8 +1338,6 @@ def test_xlsx_with_tag_headers(self): row_values = [cell.value for cell in sheet.row(1)] assert row_values == ['#beneficiary', '', ''] - - def test_force_index(self): title, schemas, submissions = customer_satisfaction