From fe630f7f9363eb4a22a62a02143b4287c696c3e7 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Sep 2013 13:51:36 +0200 Subject: [PATCH] [ADD] type conversions for embedded fields bzr revid: xmo@openerp.com-20130918115136-iot7y18vytx9hvpu --- addons/website/view.py | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/addons/website/view.py b/addons/website/view.py index 38a1dc74c1f..d3b715159c1 100644 --- a/addons/website/view.py +++ b/addons/website/view.py @@ -55,12 +55,42 @@ class view(osv.osv): def extract_embedded_fields(self, cr, uid, arch, context=None): return arch.xpath('//*[@data-oe-model != "ir.ui.view"]') + def convert_embedded_field(self, cr, uid, el, column, context=None): + """ Converts the content of an embedded field to a value acceptable + for writing in the column + + :param etree._Element el: embedded field being saved + :param fields._column column: column object corresponding to the field + :return: converted value + """ + if isinstance(column, fields.html): + # FIXME: multiple children? + return html.tostring(el[0]) + elif isinstance(column, fields.integer): + return int(el.text_content()) + elif isinstance(column, fields.float): + return float(el.text_content()) + elif isinstance(column, (fields.char, fields.text, + fields.date, fields.datetime)): + return el.text_content() + # TODO: fields.selection + # TODO: fields.many2one + elif isinstance(column, fields.function): + # FIXME: special-case selection as in get_pg_type? + return self.convert_embedded_field( + cr, uid, el, getattr(fields, column._type), context=context) + # TODO?: fields.many2many, fields.one2many + # TODO?: fields.reference + else: + raise TypeError("Un-convertable column type %s" % column) + def save_embedded_field(self, cr, uid, el, context=None): - embedded_id = int(el.get('data-oe-id')) - # FIXME: type conversions - self.pool[el.get('data-oe-model')].write(cr, uid, embedded_id, { - # FIXME: ckeditor parser does not follow HTML5 parsing, breaks block-level links - el.get('data-oe-field'): el.text_content() + Model = self.pool[el.get('data-oe-model')] + field = el.get('data-oe-field') + + column = Model._all_columns[field].column + Model.write(cr, uid, int(el.get('data-oe-id')), { + field: self.convert_embedded_field(cr, uid, el, column, context=context) }, context=context) def to_field_ref(self, cr, uid, el, context=None):