[ADD] currency qweb field widget, postfix currency
authorXavier Morel <xmo@openerp.com>
Mon, 7 Oct 2013 14:53:46 +0000 (16:53 +0200)
committerXavier Morel <xmo@openerp.com>
Mon, 7 Oct 2013 14:53:46 +0000 (16:53 +0200)
bzr revid: xmo@openerp.com-20131007145346-a3hlb6xjdwroyvzb

openerp/addons/base/ir/ir_qweb.py
openerp/tests/addons/test_converter/ir.model.access.csv
openerp/tests/addons/test_converter/models.py
openerp/tests/addons/test_converter/tests/test_html.py

index 38c65aa..4c9c20e 100644 (file)
@@ -544,6 +544,20 @@ class ImageConverter(osv.AbstractModel):
 
         return '<img src="data:%s;base64,%s">' % (Image.MIME[image.format], value)
 
+class CurrencyConverter(osv.AbstractModel):
+    """ ``currency`` converter, has a mandatory option ``currency``.
+
+    The currency field is a (float) value, the linked ``currency`` is an m2o
+    to a ``res.currency`` indicating how to format the field.
+    """
+    _name = 'ir.qweb.field.currency'
+    _inherit = 'ir.qweb.field'
+
+    def record_to_html(self, cr, uid, field_name, record, column, options):
+        return u'<span class="oe_currency_value">{0}</span> {1}'.format(
+            record[field_name],
+            record[options['currency']].symbol)
+
 def get_field_type(column, options):
     """ Gets a t-field's effective type from the field's column and its options
     """
index 6693782..137589d 100644 (file)
@@ -1,3 +1,4 @@
 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
 access_converter_model,access_converter_model,model_test_converter_test_model,,1,1,1,1
 access_test_converter_test_model_sub,access_test_converter_test_model_sub,model_test_converter_test_model_sub,,1,1,1,1
+access_test_converter_currency,access_test_converter_currency,model_test_converter_currency,,1,1,1,1
index 99f32a5..4e1e0c6 100644 (file)
@@ -37,3 +37,11 @@ class test_model_sub(orm.Model):
         'name': fields.char()
     }
 
+
+class test_model_currency(orm.Model):
+    _name = 'test_converter.currency'
+
+    _columns = {
+        'value': fields.float(digits=(16, 55)),
+        'currency_id': fields.many2one('res.currency'),
+    }
index 5874fa7..641aed5 100644 (file)
@@ -1,10 +1,14 @@
 # -*- encoding: utf-8 -*-
+import json
 import os
+import xml.dom.minidom
 
 from openerp.tests import common
 
 directory = os.path.dirname(__file__)
 
+impl = xml.dom.minidom.getDOMImplementation()
+doc = impl.createDocument(None, None, None)
 
 class TestExport(common.TransactionCase):
     _model = None
@@ -69,6 +73,46 @@ class TestFloatExport(TestBasicExport):
         value = converter(42.01234)
         self.assertEqual(value, '42.01')
 
+class TestCurrencyExport(TestExport):
+    _model = 'test_converter.currency'
+
+    def setUp(self):
+        super(TestCurrencyExport, self).setUp()
+        self.Currency = self.registry('res.currency')
+
+    def create(self, model, context=None, **values):
+        return model.browse(
+            self.cr, self.uid,
+            model.create(self.cr, self.uid, values, context=context),
+            context=context)
+
+    def convert(self, obj):
+        converter = self.registry('ir.qweb.field.currency')
+        options = {'widget': 'currency', 'currency': 'currency_id'}
+        converted = converter.to_html(
+            self.cr, self.uid, 'value', obj, options,
+            doc.createElement('span'),
+            {'field': 'obj.value', 'field-options': json.dumps(options)},
+            '', {'obj': obj})
+        return converted
+
+    def test_currency_post(self):
+        currency = self.create(self.Currency, name="Test", symbol=u"test")
+        obj = self.create(self.Model, value=0.12, currency_id=currency.id)
+
+        converted = self.convert(obj)
+
+        self.assertEqual(
+            converted,
+            '<span data-oe-model="{obj._model._name}" data-oe-id="{obj.id}" '
+                  'data-oe-field="value" data-oe-type="currency" '
+                  'data-oe-translate="0" data-oe-expression="obj.value">'
+                      '<span class="oe_currency_value">0.12</span> '
+                      '{symbol}</span>'.format(
+                obj=obj,
+                symbol=currency.symbol.encode('utf-8')
+            ),)
+
 class TestTextExport(TestBasicExport):
     def test_text(self):
         converter = self.get_converter('text')
@@ -175,5 +219,6 @@ class TestHTMLExport(TestBasicExport):
         input = '<span>span</span>'
         value = converter(input)
         self.assertEqual(value, input)
+
 # o2m, m2m?
 # reference?