feeder: import boolean form's fields (fixes #13612)

This commit is contained in:
Benjamin Dauvergne 2019-01-14 10:57:16 +01:00
parent 43675b93f2
commit bd7bc69468
4 changed files with 80 additions and 48 deletions

View File

@ -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:

View File

@ -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",

View File

@ -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'),

View File

@ -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: