[ADD] parsing of localized numeric fields

also decimal_precision support for float t-fields

bzr revid: xmo@openerp.com-20131022090705-54vu87fpgv0n3ka7
This commit is contained in:
Xavier Morel
2013-10-22 11:07:05 +02:00
6 changed files with 130 additions and 9 deletions
+27 -2
View File
@@ -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:
@@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
import test_qweb_float
checks = [
test_qweb_float
]
@@ -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')
+26 -6
View File
@@ -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)]
)
@@ -67,7 +67,27 @@ 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'
_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'
@@ -127,7 +147,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 +155,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'])
@@ -5,7 +5,10 @@ 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_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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
5 access_website_converter_test_sub access_website_converter_test_sub model_website_converter_test_sub 1 1 1 1
6 access_website_qweb access_website_qweb model_website_qweb 0 0 0 0
7 access_website_qweb_field access_website_qweb_field model_website_qweb_field 0 0 0 0
8 access_website_qweb_field_integer access_website_qweb_field_integer model_website_qweb_field_integer 0 0 0 0
9 access_website_qweb_field_float access_website_qweb_field_float model_website_qweb_field_float 0 0 0 0
10 access_website_qweb_field_date access_website_qweb_field_date model_website_qweb_field_date 0 0 0 0
11 access_website_qweb_field_datetime access_website_qweb_field_datetime model_website_qweb_field_datetime 0 0 0 0
12 access_website_qweb_field_text access_website_qweb_field_text model_website_qweb_field_text 0 0 0 0
13 access_website_qweb_field_selection access_website_qweb_field_selection model_website_qweb_field_selection 0 0 0 0
14 access_website_qweb_field_many2one access_website_qweb_field_many2one model_website_qweb_field_many2one 0 0 0 0
+2 -1
View File
@@ -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(
@@ -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)