misc: add open document representation of fields (#36627)

This commit is contained in:
Frédéric Péters 2020-02-08 10:31:14 +01:00
parent 9bd888c708
commit 0441839f27
1 changed files with 94 additions and 0 deletions

View File

@ -39,6 +39,7 @@ from .qommon import _, N_, force_str
from .qommon import evalutils
from .qommon.form import *
from .qommon.misc import localstrftime, strftime, date_format, ellipsize, xml_node_text, get_as_datetime
from .qommon.ods import NS as OD_NS, clean_text as od_clean_text
from .qommon.template import Template, TemplateError
from .qommon import get_cfg, get_logger
@ -177,6 +178,7 @@ class Field(object):
prefill = None
store_display_value = None
store_structured_value = None
get_opendocument_node_value = None
condition = None
# flag a field for removal by AnonymiseWorkflowStatusItem
@ -792,6 +794,15 @@ class StringField(WidgetField):
return htmltext(force_str(urlize(value, nofollow=True, autoescape=True)))
return str(value)
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
if value.startswith('http://') or value.startswith('https://'):
node = ET.Element('{%s}a' % OD_NS['text'])
node.attrib['{%s}href' % OD_NS['xlink']] = value
else:
node = ET.Element('{%s}span' % OD_NS['text'])
node.text = od_clean_text(force_text(value))
return node
def get_rst_view_value(self, value, indent=''):
return indent + str(value or '')
@ -863,6 +874,25 @@ class TextField(WidgetField):
except:
return ''
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
if self.pre:
p = ET.Element('{%s}p' % OD_NS['text'])
line_break = '<nsa:line-break xmlns:nsa="%(ns)s"/>' % {'ns': OD_NS['text']}
as_node = ET.fromstring(str(htmlescape(value)).replace('\n', line_break))
p.text = as_node.text
p.tail = as_node.tail
for child in as_node.getchildren():
p.append(child)
return p
else:
paragraphs = []
for paragraph in value.splitlines():
if paragraph.strip():
p = ET.Element('{%s}p' % OD_NS['text'])
p.text = paragraph
paragraphs.append(p)
return paragraphs
def get_view_short_value(self, value, max_len = 30):
return ellipsize(str(value), max_len)
@ -884,6 +914,12 @@ class EmailField(WidgetField):
def get_rst_view_value(self, value, indent=''):
return indent + value
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
a = ET.Element('{%s}a' % OD_NS['text'])
a.text = od_clean_text(value)
a.attrib['{%s}href' % OD_NS['xlink']] = 'mailto:' + a.text
return a
register_field_class(EmailField)
@ -913,6 +949,11 @@ class BoolField(WidgetField):
else:
return ''
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
span = ET.Element('{%s}span' % OD_NS['text'])
span.text = od_clean_text(self.get_view_value(value))
return span
def convert_value_from_anything(self, value):
if isinstance(value, str):
return self.convert_value_from_str(value)
@ -1093,6 +1134,19 @@ class FileField(WidgetField):
t += htmltext('</div>')
return t.getvalue()
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
show_link = True
if value.has_redirect_url():
is_in_backoffice = bool(get_request() and get_request().is_in_backoffice())
show_link = bool(value.get_redirect_url(backoffice=is_in_backoffice))
if show_link and formdata:
node = ET.Element('{%s}a' % OD_NS['text'])
node.attrib['{%s}href' % OD_NS['xlink']] = '%sdownload?f=%s' % (formdata.get_url(), self.id)
else:
node = ET.Element('{%s}span' % OD_NS['text'])
node.text = od_clean_text(force_text(value))
return node
def get_csv_value(self, value, **kwargs):
return [str(value) if value else '']
@ -1271,6 +1325,11 @@ class DateField(WidgetField):
except TypeError:
return value
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
span = ET.Element('{%s}span' % OD_NS['text'])
span.text = od_clean_text(self.get_view_value(value))
return span
def get_json_value(self, value):
try:
return strftime('%Y-%m-%d', value)
@ -1450,6 +1509,11 @@ class ItemField(WidgetField):
return value
return htmltext('<a href="%s">' % carddata.get_url(backoffice=True)) + htmltext('%s</a>') % value
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
span = ET.Element('{%s}span' % OD_NS['text'])
span.text = od_clean_text(force_text(value))
return span
def add_to_view_form(self, form, value = None):
real_value = value
label_value = ''
@ -1676,6 +1740,11 @@ class ItemsField(WidgetField):
pass
return ''
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
span = ET.Element('{%s}span' % OD_NS['text'])
span.text = od_clean_text(self.get_view_value(value))
return span
def stats(self, values):
return item_items_stats(self, values)
@ -2049,6 +2118,31 @@ class TableField(WidgetField):
values.append('')
return values
def get_opendocument_node_value(self, value, formdata=None, **kwargs):
table = ET.Element('{%s}table' % OD_NS['table'])
ET.SubElement(table, '{%s}table-column' % OD_NS['table'])
for col in self.columns:
ET.SubElement(table, '{%s}table-column' % OD_NS['table'])
row = ET.SubElement(table, '{%s}table-row' % OD_NS['table'])
ET.SubElement(row, '{%s}table-cell' % OD_NS['table'])
for col in self.columns:
table_cell = ET.SubElement(row, '{%s}table-cell' % OD_NS['table'])
cell_value = ET.SubElement(table_cell, '{%s}p' % OD_NS['text'])
cell_value.text = col
for i, row_label in enumerate(self.rows):
row = ET.SubElement(table, '{%s}table-row' % OD_NS['table'])
table_cell = ET.SubElement(row, '{%s}table-cell' % OD_NS['table'])
cell_value = ET.SubElement(table_cell, '{%s}p' % OD_NS['text'])
cell_value.text = row_label
for j, col in enumerate(self.columns):
table_cell = ET.SubElement(row, '{%s}table-cell' % OD_NS['table'])
cell_value = ET.SubElement(table_cell, '{%s}p' % OD_NS['text'])
try:
cell_value.text = value[i][j]
except IndexError:
pass
return table
register_field_class(TableField)