From 53d004b6bc75efada4f129668e05ecfadde67889 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 18 Oct 2013 16:46:04 +0200 Subject: [PATCH 1/7] [FIX] test for qweb getting cr and uid bzr revid: xmo@openerp.com-20131018144604-z39ibj61x96foatc --- addons/website/tests/test_converter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/website/tests/test_converter.py b/addons/website/tests/test_converter.py index fb846342718..6aa04bf4d93 100644 --- a/addons/website/tests/test_converter.py +++ b/addons/website/tests/test_converter.py @@ -28,7 +28,7 @@ class TestConvertBack(common.TransactionCase): e.setAttribute('t-field', field_value) rendered = self.registry('website.qweb').render_tag_field( - e, {'field': field_value}, '', ir_qweb.QWebContext({ + e, {'field': field_value}, '', ir_qweb.QWebContext(self.cr, self.uid, { 'record': record, })) element = html.fromstring( From fbd72c436a1c6ce9437d74141f1646e222a3554d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 21 Oct 2013 10:28:40 +0200 Subject: [PATCH 2/7] [ADD] context to t-field conversion methods bzr revid: xmo@openerp.com-20131021082840-1tdbxhpy4ut1uoif --- addons/website/models/ir_qweb.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index f348bd7d9c3..dd7f8346e0f 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -39,12 +39,12 @@ class Field(orm.AbstractModel): _inherit = 'ir.qweb.field' def attributes(self, cr, uid, field_name, record, options, - source_element, g_att, t_att, qweb_context): + source_element, g_att, t_att, qweb_context, context=None): column = record._model._all_columns[field_name].column return itertools.chain( super(Field, self).attributes(cr, uid, field_name, record, options, source_element, g_att, t_att, - qweb_context), + qweb_context, context=context), [('data-oe-translate', 1 if column.translate else 0)] ) @@ -127,7 +127,7 @@ class Image(orm.AbstractModel): _inherit = ['website.qweb.field', 'ir.qweb.field.image'] def to_html(self, cr, uid, field_name, record, options, - source_element, t_att, g_att, qweb_context): + source_element, t_att, g_att, qweb_context, context=None): assert source_element.nodeName != 'img',\ "Oddly enough, the root tag of an image field can not be img. " \ "That is because the image goes into the tag, or it gets the " \ @@ -135,9 +135,9 @@ class Image(orm.AbstractModel): return super(Image, self).to_html( cr, uid, field_name, record, options, - source_element, t_att, g_att, qweb_context) + source_element, t_att, g_att, qweb_context, context=context) - def record_to_html(self, cr, uid, field_name, record, column, options=None): + def record_to_html(self, cr, uid, field_name, record, column, options=None, context=None): cls = '' if 'class' in options: cls = ' class="%s"' % werkzeug.utils.escape(options['class']) From 0a74b6ef77b8671dcb409d6e8057d9657993573d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 21 Oct 2013 11:15:42 +0200 Subject: [PATCH 3/7] [ADD] security rules for qweb.field.integer model bzr revid: xmo@openerp.com-20131021091542-m2e213pa6kq0bmqz --- addons/website/security/ir.model.access.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/website/security/ir.model.access.csv b/addons/website/security/ir.model.access.csv index 4fe9a0888b4..70d6877d313 100644 --- a/addons/website/security/ir.model.access.csv +++ b/addons/website/security/ir.model.access.csv @@ -5,6 +5,7 @@ access_website_converter_test,access_website_converter_test,model_website_conver access_website_converter_test_sub,access_website_converter_test_sub,model_website_converter_test_sub,,1,1,1,1 access_website_qweb,access_website_qweb,model_website_qweb,,0,0,0,0 access_website_qweb_field,access_website_qweb_field,model_website_qweb_field,,0,0,0,0 +access_website_qweb_field_integer,access_website_qweb_field_integer,model_website_qweb_field_integer,,0,0,0,0 access_website_qweb_field_float,access_website_qweb_field_float,model_website_qweb_field_float,,0,0,0,0 access_website_qweb_field_text,access_website_qweb_field_text,model_website_qweb_field_text,,0,0,0,0 access_website_qweb_field_selection,access_website_qweb_field_selection,model_website_qweb_field_selection,,0,0,0,0 From ff07f6dcdd537563030057bb9fbc8a0cc0b6fd81 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 21 Oct 2013 11:45:33 +0200 Subject: [PATCH 4/7] [ADD] decimal precision support to float t-field rendering bzr revid: xmo@openerp.com-20131021094533-e510uy6byck85xma --- addons/decimal_precision/decimal_precision.py | 29 +++++++- addons/decimal_precision/tests/__init__.py | 6 ++ .../tests/test_qweb_float.py | 66 +++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 addons/decimal_precision/tests/__init__.py create mode 100644 addons/decimal_precision/tests/test_qweb_float.py diff --git a/addons/decimal_precision/decimal_precision.py b/addons/decimal_precision/decimal_precision.py index b237f053ebb..5576038d54d 100644 --- a/addons/decimal_precision/decimal_precision.py +++ b/addons/decimal_precision/decimal_precision.py @@ -22,9 +22,9 @@ import openerp from openerp import SUPERUSER_ID from openerp import tools -from openerp.osv import osv, fields +from openerp.osv import orm, fields -class decimal_precision(osv.osv): +class decimal_precision(orm.Model): _name = 'decimal.precision' _columns = { 'name': fields.char('Usage', size=50, select=True, required=True), @@ -71,4 +71,29 @@ def get_precision(application): return (16, res) return change_digit +class DecimalPrecisionFloat(orm.AbstractModel): + """ Override qweb.field.float to add a `decimal_precision` domain option + and use that instead of the column's own value if it is specified + """ + _inherit = 'ir.qweb.field.float' + + + def precision(self, cr, uid, column, options=None, context=None): + dp = options and options.get('decimal_precision') + if dp: + return self.pool['decimal.precision'].precision_get( + cr, uid, dp) + + return super(DecimalPrecisionFloat, self).precision( + cr, uid, column, options=options, context=context) + +class DecimalPrecisionTestModel(orm.Model): + _name = 'decimal.precision.test' + + _columns = { + 'float': fields.float(), + 'float_2': fields.float(digits=(16, 2)), + 'float_4': fields.float(digits=(16, 4)), + } + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/decimal_precision/tests/__init__.py b/addons/decimal_precision/tests/__init__.py new file mode 100644 index 00000000000..feee24c8f15 --- /dev/null +++ b/addons/decimal_precision/tests/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +import test_qweb_float + +checks = [ + test_qweb_float +] diff --git a/addons/decimal_precision/tests/test_qweb_float.py b/addons/decimal_precision/tests/test_qweb_float.py new file mode 100644 index 00000000000..93334170f37 --- /dev/null +++ b/addons/decimal_precision/tests/test_qweb_float.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +from openerp.tests import common + +class TestFloatExport(common.TransactionCase): + def setUp(self): + super(TestFloatExport, self).setUp() + self.Model = self.registry('decimal.precision.test') + + def get_converter(self, name): + converter = self.registry('ir.qweb.field.float') + column = self.Model._all_columns[name].column + + return lambda value, options=None: converter.value_to_html( + self.cr, self.uid, value, column, options=options, context=None) + + def test_basic_float(self): + converter = self.get_converter('float') + self.assertEqual( + converter(42.0), + "42.0") + self.assertEqual( + converter(42.12345), + "42.12345") + + converter = self.get_converter('float_2') + self.assertEqual( + converter(42.0), + "42.00") + self.assertEqual( + converter(42.12345), + "42.12") + + converter = self.get_converter('float_4') + self.assertEqual( + converter(42.0), + '42.0000') + self.assertEqual( + converter(42.12345), + '42.1234') + + def test_precision_domain(self): + DP = self.registry('decimal.precision') + DP.create(self.cr, self.uid, { + 'name': 'A', + 'digits': 2, + }) + DP.create(self.cr, self.uid, { + 'name': 'B', + 'digits': 6, + }) + + converter = self.get_converter('float') + self.assertEqual( + converter(42.0, {'decimal_precision': 'A'}), + '42.00') + self.assertEqual( + converter(42.0, {'decimal_precision': 'B'}), + '42.000000') + + converter = self.get_converter('float_4') + self.assertEqual( + converter(42.12345, {'decimal_precision': 'A'}), + '42.12') + self.assertEqual( + converter(42.12345, {'decimal_precision': 'B'}), + '42.123450') From 9da0ead28dd46e8b482291f8e9760b000dcdad7c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 21 Oct 2013 17:26:51 +0200 Subject: [PATCH 5/7] [ADD] support for formatted date and datetime t-field in website bzr revid: xmo@openerp.com-20131021152651-ner2zggjfofb5rc4 --- addons/website/models/ir_qweb.py | 8 ++++++++ addons/website/security/ir.model.access.csv | 2 ++ 2 files changed, 10 insertions(+) diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index dd7f8346e0f..8de6ede6a50 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -69,6 +69,14 @@ class Float(orm.AbstractModel): value_from_string = float +class Date(orm.AbstractModel): + _name = 'website.qweb.field.date' + _inherit = ['website.qweb.field', 'ir.qweb.field.date'] + +class DateTime(orm.AbstractModel): + _name = 'website.qweb.field.datetime' + _inherit = ['website.qweb.field', 'ir.qweb.field.datetime'] + class Text(orm.AbstractModel): _name = 'website.qweb.field.text' _inherit = ['website.qweb.field', 'ir.qweb.field.text'] diff --git a/addons/website/security/ir.model.access.csv b/addons/website/security/ir.model.access.csv index 70d6877d313..431170e462b 100644 --- a/addons/website/security/ir.model.access.csv +++ b/addons/website/security/ir.model.access.csv @@ -7,6 +7,8 @@ access_website_qweb,access_website_qweb,model_website_qweb,,0,0,0,0 access_website_qweb_field,access_website_qweb_field,model_website_qweb_field,,0,0,0,0 access_website_qweb_field_integer,access_website_qweb_field_integer,model_website_qweb_field_integer,,0,0,0,0 access_website_qweb_field_float,access_website_qweb_field_float,model_website_qweb_field_float,,0,0,0,0 +access_website_qweb_field_date,access_website_qweb_field_date,model_website_qweb_field_date,,0,0,0,0 +access_website_qweb_field_datetime,access_website_qweb_field_datetime,model_website_qweb_field_datetime,,0,0,0,0 access_website_qweb_field_text,access_website_qweb_field_text,model_website_qweb_field_text,,0,0,0,0 access_website_qweb_field_selection,access_website_qweb_field_selection,model_website_qweb_field_selection,,0,0,0,0 access_website_qweb_field_many2one,access_website_qweb_field_many2one,model_website_qweb_field_many2one,,0,0,0,0 From 730d0c69fe19c406ee71f35b2d9cff0c308f777c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 22 Oct 2013 09:33:26 +0200 Subject: [PATCH 6/7] [IMP] ensure we don't unwittingly save wrongly formatted dates and datetimes bzr revid: xmo@openerp.com-20131022073326-gxmcfd60ytq2f1oc --- addons/website/models/ir_qweb.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index 8de6ede6a50..d21f6b9c1d9 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -73,10 +73,16 @@ class Date(orm.AbstractModel): _name = 'website.qweb.field.date' _inherit = ['website.qweb.field', 'ir.qweb.field.date'] + def from_html(self, cr, uid, model, column, element, context=None): + raise NotImplementedError("Can not parse and save localized dates") + class DateTime(orm.AbstractModel): _name = 'website.qweb.field.datetime' _inherit = ['website.qweb.field', 'ir.qweb.field.datetime'] + def from_html(self, cr, uid, model, column, element, context=None): + raise NotImplementedError("Can not parse and save localized datetimes") + class Text(orm.AbstractModel): _name = 'website.qweb.field.text' _inherit = ['website.qweb.field', 'ir.qweb.field.text'] From 1687668026138b3504af1cc69f4ab65a3cfd932f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 22 Oct 2013 10:54:50 +0200 Subject: [PATCH 7/7] [ADD] parsing of locale-formatted floats bzr revid: xmo@openerp.com-20131022085450-mhymubsywkonepjx --- addons/website/models/ir_qweb.py | 8 +++++++- addons/website/tests/test_converter.py | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index d21f6b9c1d9..3193cbc3c9e 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -67,7 +67,13 @@ class Float(orm.AbstractModel): _name = 'website.qweb.field.float' _inherit = ['website.qweb.field', 'ir.qweb.field.float'] - value_from_string = float + def from_html(self, cr, uid, model, column, element, context=None): + lang = self.user_lang(cr, uid, context=context) + + value = element.text_content().strip() + + return float(value.replace(lang.thousands_sep, '') + .replace(lang.decimal_point, '.')) class Date(orm.AbstractModel): _name = 'website.qweb.field.date' diff --git a/addons/website/tests/test_converter.py b/addons/website/tests/test_converter.py index 6aa04bf4d93..1086ec8e8d3 100644 --- a/addons/website/tests/test_converter.py +++ b/addons/website/tests/test_converter.py @@ -53,6 +53,7 @@ class TestConvertBack(common.TransactionCase): def test_float(self): self.field_roundtrip('float', 42.567890) + self.field_roundtrip('float', 324542.567890) def test_numeric(self): self.field_roundtrip('numeric', 42.77)