diff --git a/CHANGELOG b/CHANGELOG
index 9ad7c30ef8..b24424362e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,9 @@
+* Add volume
+
Version 3.6.0 - 2015-04-20
* Bug fixes (see mercurial logs for details)
* Add support for PyPy
+
Version 3.4.0 - 2014-10-20
* Bug fixes (see mercurial logs for details)
diff --git a/product.py b/product.py
index 535b3a57e9..06627aad5f 100644
--- a/product.py
+++ b/product.py
@@ -2,7 +2,7 @@
# this repository contains the full copyright notices and license terms.
from trytond.model import fields
from trytond.pyson import Eval, Bool, Id
-from trytond.pool import PoolMeta
+from trytond.pool import PoolMeta, Pool
__all__ = ['Template']
__metaclass__ = PoolMeta
@@ -58,6 +58,23 @@ class Template:
depends=['type', 'width'])
width_digits = fields.Function(fields.Integer('Width Digits'),
'on_change_with_width_digits')
+ volume = fields.Float('Volume',
+ digits=(16, Eval('volume_digits', 2)),
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ 'readonly': (Bool(Eval('length'))
+ & Bool(Eval('height')) & Bool(Eval('width'))),
+ },
+ depends=['type', 'volume_digits'])
+ volume_uom = fields.Many2One('product.uom', 'Volume Uom',
+ domain=[('category', '=', Id('product', 'uom_cat_volume'))],
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ 'required': Bool(Eval('volume')),
+ },
+ depends=['type', 'volume'])
+ volume_digits = fields.Function(fields.Integer('Volume Digits'),
+ 'on_change_with_volume_digits')
weight = fields.Float('Weight',
digits=(16, Eval('weight_digits', 2)),
states={
@@ -101,6 +118,43 @@ class Template:
def default_width_digits():
return 2
+ @fields.depends('volume', 'volume_uom',
+ 'length', 'length_uom',
+ 'height', 'height_uom',
+ 'width', 'width_uom')
+ def on_change_with_volume(self):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ Uom = pool.get('product.uom')
+
+ if not all([self.volume_uom, self.length, self.length_uom,
+ self.height, self.height_uom, self.width, self.width_uom]):
+ if all([self.length, self.height, self.width]):
+ return
+ return self.volume
+
+ meter = Uom(ModelData.get_id('product', 'uom_meter'))
+ cubic_meter = Uom(ModelData.get_id('product', 'uom_cubic_meter'))
+
+ length = Uom.compute_qty(
+ self.length_uom, self.length, meter, round=False)
+ height = Uom.compute_qty(
+ self.height_uom, self.height, meter, round=False)
+ width = Uom.compute_qty(
+ self.width_uom, self.width, meter, round=False)
+
+ return Uom.compute_qty(
+ cubic_meter, length * height * width, self.volume_uom)
+
+ @fields.depends('volume_uom')
+ def on_change_with_volume_digits(self, name=None):
+ return (self.volume_uom.digits if self.volume_uom
+ else self.default_volume_digits())
+
+ @staticmethod
+ def default_volume_digits():
+ return 2
+
@fields.depends('weight_uom')
def on_change_with_weight_digits(self, name=None):
return (self.weight_uom.digits if self.weight_uom
diff --git a/view/template_form.xml b/view/template_form.xml
index ce01d7c8f2..f4b0cf1e93 100644
--- a/view/template_form.xml
+++ b/view/template_form.xml
@@ -13,6 +13,9 @@ this repository contains the full copyright notices and license terms. -->
+
+
+