feeder: import boolean form's fields (fixes #13612)
This commit is contained in:
parent
43675b93f2
commit
bd7bc69468
|
@ -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:
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue