fields: add detailed field value support to block fields (#44816)

This commit is contained in:
Frédéric Péters 2020-07-04 21:22:16 +02:00
parent 1bd794a71f
commit 96fe2e3fc7
2 changed files with 25 additions and 20 deletions

View File

@ -603,6 +603,23 @@ class WidgetField(Field):
def get_csv_heading(self):
return [self.label]
def get_value_info(self, data):
# return the selected value and an optional dictionary that will be
# passed to get_view_value() to provide additional details.
value_details = {}
if self.id not in data:
value = None
else:
if self.store_display_value and ('%s_display' % self.id) in data:
value = data['%s_display' % self.id]
value_details['value_id'] = data[self.id]
else:
value = data[self.id]
if value is None or value == '':
value = None
return (value, value_details)
def get_view_value(self, value, **kwargs):
return str(value) if value else ''
@ -2653,17 +2670,22 @@ class BlockField(WidgetField):
r = TemplateIO(html=True)
for i, row_value in enumerate(value['data']):
for field in self.block.fields:
if not hasattr(field, 'get_value_info'):
# inert field
continue
css_classes = ['field', 'field-type-%s' % field.key]
if field.extra_css_class:
css_classes.append(field.extra_css_class)
r += htmltext('<div class="%s">' % ' '.join(css_classes))
r += htmltext('<span class="label">%s</span> ') % field.label
sub_value = row_value.get(field.id)
sub_value, sub_value_details = field.get_value_info(row_value)
if sub_value is None:
r += htmltext('<div class="value"><i>%s</i></div>') % _('Not set')
else:
r += htmltext('<div class="value">')
r += field.get_view_value(sub_value, parent_field=self, parent_field_index=i)
kwargs = {'parent_field': self, 'parent_field_index': i}
kwargs.update(**sub_value_details)
r += field.get_view_value(sub_value, **kwargs)
r += htmltext('</div>')
r += htmltext('</div>\n')
return r.getvalue()

View File

@ -1139,23 +1139,6 @@ class FormData(StorableObject):
if fields is None:
fields = self.formdef.fields
def get_value_info(f):
# return the selected value and an optional dictionary that will be
# passed to get_view_value() to provide additional details.
value_details = {}
if f.id not in self.data:
value = None
else:
if f.store_display_value and ('%s_display' % f.id) in self.data:
value = self.data['%s_display' % f.id]
value_details['value_id'] = self.data[f.id]
else:
value = self.data[f.id]
if value is None or value == '':
value = None
return (value, value_details)
on_page = False
current_page_fields = []
pages = []
@ -1181,7 +1164,7 @@ class FormData(StorableObject):
if not f.include_in_summary_page:
continue
value, value_details = get_value_info(f)
value, value_details = f.get_value_info(self.data)
if value is None and not (f.required and include_unset_required_fields):
continue