general: factor field value assignment into a set_value method (#51207)

This commit is contained in:
Frédéric Péters 2021-02-17 08:53:23 +01:00
parent 09706c3b40
commit 3afa844086
6 changed files with 28 additions and 69 deletions

View File

@ -154,12 +154,13 @@ class CardPage(FormPage):
key = 'user'
id = '_user'
label = _('User (email or UUID)')
store_display_value = None
store_structured_value = None
def convert_value_from_str(self, x):
return x
def set_value(self, data, value):
data['_user'] = value
# skip non-data fields
csv_fields = [x for x in self.formdef.get_all_fields() if isinstance(x, fields.WidgetField)]
if self.formdef.user_support == 'optional':
@ -271,18 +272,7 @@ class CardPage(FormPage):
# skip unsupported field types
if field.convert_value_from_str is None:
continue
field_id = str(field.id)
data_line[field_id] = field.convert_value_from_str(value)
if field.store_display_value:
display_value = field.store_display_value(data_line, field_id)
data_line['%s_display' % field_id] = display_value
if value and field.store_structured_value:
structured_value = field.store_structured_value(data_line, field_id)
if structured_value:
if isinstance(structured_value, dict) and structured_value.get('id'):
# in case of list field, override id
data_line[field_id] = str(structured_value.get('id'))
data_line['%s_structured' % field_id] = structured_value
field.set_value(data_line, field.convert_value_from_str(value))
data_lines.append(data_line)
if incomplete_lines:

View File

@ -560,6 +560,26 @@ class Field(object):
return True
return False
def set_value(self, data, value):
data['%s' % self.id] = value
if self.store_display_value:
display_value = self.store_display_value(data, self.id)
if display_value:
data['%s_display' % self.id] = display_value
elif '%s_display' % self.id in data:
del data['%s_display' % self.id]
if self.store_structured_value and value:
structured_value = self.store_structured_value(data, self.id)
if structured_value:
if isinstance(structured_value, dict) and structured_value.get('id'):
# in case of list field, override id
data['%s' % self.id] = str(structured_value.get('id'))
data['%s_structured' % self.id] = structured_value
elif '%s_structured' % self.id in data:
del data['%s_structured' % self.id]
elif self.store_structured_value and '%s_structured' % self.id in data:
del data['%s_structured' % self.id]
def __repr__(self):
return '<%s %s %r>' % (self.__class__.__name__, self.id, self.label and self.label[:64])

View File

@ -1076,9 +1076,7 @@ class FormData(StorableObject):
def anonymise(self):
for field in self.formdef.get_all_fields():
if field.anonymise:
self.data[field.id] = None
if field.store_display_value:
self.data['%s_display' % field.id] = None
field.set_value(self.data, None)
self.anonymised = datetime.datetime.now()
self.user_id = None

View File

@ -768,18 +768,7 @@ class FormDef(StorableObject):
d[field.id] = widget.parse()
if d.get(field.id) is not None and field.convert_value_from_str:
d[field.id] = field.convert_value_from_str(d[field.id])
if d.get(field.id) is not None and field.store_display_value:
display_value = field.store_display_value(d, field.id)
if display_value is not None:
d['%s_display' % field.id] = display_value
elif '%s_display' % field.id in d:
del d['%s_display' % field.id]
if d.get(field.id) is not None and field.store_structured_value:
structured_value = field.store_structured_value(d, field.id)
if structured_value is not None:
d['%s_structured' % field.id] = structured_value
elif '%s_structured' % field.id in d:
del d['%s_structured' % field.id]
field.set_value(d, d[field.id])
if getattr(widget, 'cleanup', None):
widget.cleanup()
return d

View File

@ -179,23 +179,7 @@ class SetBackofficeFieldsWorkflowStatusItem(WorkflowStatusItem):
)
continue
formdata.data['%s' % field['field_id']] = new_value
if formdef_field.store_display_value:
display_value = formdef_field.store_display_value(formdata.data, formdef_field.id)
if display_value:
formdata.data['%s_display' % formdef_field.id] = display_value
elif '%s_display' % formdef_field.id in formdata.data:
del formdata.data['%s_display' % formdef_field.id]
if formdef_field.store_structured_value and formdata.data.get(formdef_field.id):
structured_value = formdef_field.store_structured_value(formdata.data, formdef_field.id)
if structured_value:
if isinstance(structured_value, dict) and structured_value.get('id'):
# in case of list field, override id
formdata.data['%s' % formdef_field.id] = str(structured_value.get('id'))
formdata.data['%s_structured' % formdef_field.id] = structured_value
elif '%s_structured' % formdef_field.id in formdata.data:
del formdata.data['%s_structured' % formdef_field.id]
formdef_field.set_value(formdata.data, new_value)
# store formdata everytime so substitution cache is invalidated,
# and backoffice field values can be used in subsequent fields.
formdata.store()

View File

@ -512,29 +512,7 @@ class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
old_value = value # noqa: F841, copy value for debug
value = field.convert_value_from_anything(value)
formdata.data['%s' % field.id] = value
if value is None:
if field.store_display_value:
formdata.data['%s_display' % field.id] = None
if field.store_structured_value:
formdata.data['%s_structured' % field.id] = None
return
if field.store_display_value:
display_value = field.store_display_value(formdata.data, field.id)
if display_value:
formdata.data['%s_display' % field.id] = display_value
elif '%s_display' % field.id in formdata.data:
del formdata.data['%s_display' % field.id]
if field.store_structured_value:
structured_value = field.store_structured_value(formdata.data, field.id)
if structured_value:
if isinstance(structured_value, dict) and structured_value.get('id'):
# in case of list field, override id
formdata.data['%s' % field.id] = str(structured_value.get('id'))
formdata.data['%s_structured' % field.id] = structured_value
elif '%s_structured' % field.id in formdata.data:
del formdata.data['%s_structured' % field.id]
field.set_value(formdata.data, value)
def mappings_export_to_xml(self, parent, charset, include_id=False):
container = ET.SubElement(parent, 'mappings')