From 0bdb0656eafa45b63e60624472de5639bc1804fe Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 14 Jan 2019 10:57:16 +0100 Subject: [PATCH] feeder: import boolean form's fields (fixes #13612) --- tests/conftest.py | 2 + tests/olap.model | 8 ++++ tests/test_wcs.py | 1 + wcs_olap/feeder.py | 117 ++++++++++++++++++++++++++------------------- 4 files changed, 80 insertions(+), 48 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index c87c619..d5514aa 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -91,6 +91,7 @@ formdef.fields = [ fields.StringField(id='1', label='1st field', type='string', anonymise=False, varname='field_string'), fields.ItemField(id='2', label='2nd field', type='item', items=['foo', 'bar', 'baz'], varname='field_item'), + fields.BoolField(id='3', label='3rd field', type='bool', varname='field_bool'), ] formdef.store() @@ -110,6 +111,7 @@ for i in range(50): else: formdata.data['2'] = 'baz' formdata.data['2_display'] = 'baz' + formdata.data['3'] = bool(i % 2) if i%3 == 0: formdata.jump_status('new') else: diff --git a/tests/olap.model b/tests/olap.model index 3aa1252..6a3d74e 100644 --- a/tests/olap.model +++ b/tests/olap.model @@ -249,6 +249,14 @@ "type" : "integer", "value" : "\"field_item\".id", "value_label" : "\"field_item\".label" + }, + { + "filter": true, + "label": "3rd field", + "name": "field_bool", + "type": "bool", + "value": "\"field_bool\"", + "value_label": "(case when \"field_bool\" IS NOT NULL then 'Oui' else 'Non' end)" } ], "fact_table" : "formdata_demande", diff --git a/tests/test_wcs.py b/tests/test_wcs.py index 99b9b9b..31f615a 100644 --- a/tests/test_wcs.py +++ b/tests/test_wcs.py @@ -67,6 +67,7 @@ schema = olap ('formdata_demande', 'json_data'), ('formdata_demande', 'status_id'), ('formdata_demande', 'field_field_item'), + ('formdata_demande', 'field_field_bool'), ('formdata_demande', 'function__receiver'), ('formdata_demande_field_field_item', 'id'), ('formdata_demande_field_field_item', 'label'), diff --git a/wcs_olap/feeder.py b/wcs_olap/feeder.py index 1ad6179..59b0459 100644 --- a/wcs_olap/feeder.py +++ b/wcs_olap/feeder.py @@ -536,35 +536,38 @@ class WcsFormdefFeeder(object): if self.formdef.schema.workflow: fields += self.formdef.schema.workflow.fields for field in fields: - if not field.type == 'item': - continue if field.anonymise is True: continue if not field.varname or '-' in field.varname: continue if field.varname in duplicated_varnames: continue - self.fields.append(field) - comment = (u'valeurs du champ « %s » du formulaire %s' - % (field.label, self.formdef.schema.name)) - table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname) - # create table and mapping - if field.items: - self.create_labeled_table(table_name, enumerate(field.items), - comment=comment) - self.items_mappings[field.varname] = dict( - (item, i) for i, item in enumerate(field.items)) - elif field.options: - options = enumerate(field.options) - self.create_labeled_table(table_name, [(i, o['label']) for i, o in options], - comment=comment) - self.items_mappings[field.varname] = dict((o['value'], i) for i, o in options) + if field.type == 'item': + comment = (u'valeurs du champ « %s » du formulaire %s' + % (field.label, self.formdef.schema.name)) + table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname) + # create table and mapping + if field.items: + self.create_labeled_table(table_name, enumerate(field.items), + comment=comment) + self.items_mappings[field.varname] = dict( + (item, i) for i, item in enumerate(field.items)) + elif field.options: + options = enumerate(field.options) + self.create_labeled_table(table_name, [(i, o['label']) for i, o in options], + comment=comment) + self.items_mappings[field.varname] = dict((o['value'], i) for i, o in options) + else: + # open item field, from data sources... + self.create_labeled_table(table_name, [], serial=True, comment=comment) + field_def = 'smallint REFERENCES %s (id)' % table_name + elif field.type == 'bool': + field_def = 'boolean' else: - # open item field, from data sources... - self.create_labeled_table(table_name, [], serial=True, comment=comment) - + continue + self.fields.append(field) at = 'field_%s' % field.varname - columns.append([at, 'smallint REFERENCES %s (id)' % table_name]) + columns.append([at, field_def]) comments[at] = field.label # add geolocation fields @@ -685,20 +688,23 @@ class WcsFormdefFeeder(object): for field in self.fields: v = None raw = None + if field.varname in data.fields: + raw = data.fields[field.varname] + elif field.varname in data.workflow.fields: + raw = data.workflow.fields[field.varname] + else: + raw = None if field.type == 'item': - if field.varname in data.fields: - raw = data.fields[field.varname] - elif field.varname in data.workflow.fields: - raw = data.workflow.fields[field.varname] - else: - raw = None # map items to sql id if field.items or field.options: v = self.items_mappings[field.varname].get(raw) else: v = raw and self.get_item_id(field, raw) + elif field.type == 'bool': + v = raw + # unstructured storage of field values - if field.varname and raw: + if field.varname and raw is not None: json_data[field.varname] = raw row['field_%s' % field.varname] = v @@ -852,32 +858,47 @@ class WcsFormdefFeeder(object): if self.formdef.schema.workflow: fields += self.formdef.schema.workflow.fields for field in fields: - if not field.type == 'item': - continue if field.anonymise is True: continue if not field.varname: continue if '-' in field.varname: continue - table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname) - cube['joins'].append({ - 'name': field.varname, - 'table': table_name, - 'master': 'field_%s' % field.varname, - 'detail': 'id', - }) - if not field.required: - cube['joins'][-1]['kind'] = 'full' - cube['dimensions'].append({ - 'name': field.varname, - 'label': field.label.lower(), - 'join': [field.varname], - 'type': 'integer', - 'value': '"%s".id' % field.varname, - 'value_label': '"%s".label' % field.varname, - 'filter': True, - }) + join = None + + if field.type == 'item': + table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname) + join = { + 'name': field.varname, + 'table': table_name, + 'master': 'field_%s' % field.varname, + 'detail': 'id', + } + if not field.required: + join['kind'] = 'full' + dimension = { + 'name': field.varname, + 'label': field.label.lower(), + 'join': [field.varname], + 'type': 'integer', + 'value': '"%s".id' % field.varname, + 'value_label': '"%s".label' % field.varname, + 'filter': True, + } + elif field.type == 'bool': + dimension = { + 'name': field.varname, + 'label': field.label.lower(), + 'type': 'bool', + 'value': '"%s"' % field.varname, + 'value_label': '(case when "%s" IS NOT NULL then \'Oui\' else \'Non\' end)' % field.varname, + 'filter': True, + } + else: + continue + if join: + cube['joins'].append(join) + cube['dimensions'].append(dimension) self.model['cubes'].append(cube) if self.do_feed: -- 2.20.1