changeset e7e5c2445e25 in modules/stock_package_shipping:default
details: 
https://hg.tryton.org/modules/stock_package_shipping?cmd=changeset;node=e7e5c2445e25
description:
        Allow updating dimensions on package

        issue9846
        review304891002
diffstat:

 CHANGELOG             |   1 +
 setup.py              |   2 +-
 stock.py              |  51 ++++++++++++++++++++++++++++++++++++++++++++++++---
 view/package_form.xml |  16 +++++++++++++++-
 4 files changed, 65 insertions(+), 5 deletions(-)

diffs (133 lines):

diff -r 591fbe106448 -r e7e5c2445e25 CHANGELOG
--- a/CHANGELOG Sat Feb 27 14:38:53 2021 +0100
+++ b/CHANGELOG Mon Mar 01 09:08:18 2021 +0100
@@ -1,3 +1,4 @@
+* Allow updating dimensions on package
 * Add configuration option to store label in filestore
 * Manage supplier shipment returns
 
diff -r 591fbe106448 -r e7e5c2445e25 setup.py
--- a/setup.py  Sat Feb 27 14:38:53 2021 +0100
+++ b/setup.py  Mon Mar 01 09:08:18 2021 +0100
@@ -60,7 +60,7 @@
 if local_version:
     version += '+' + '.'.join(local_version)
 
-requires = []
+requires = ['python-sql >= 0.4']
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res)(\W|$)', dep):
         requires.append(get_require_version('trytond_%s' % dep))
diff -r 591fbe106448 -r e7e5c2445e25 stock.py
--- a/stock.py  Sat Feb 27 14:38:53 2021 +0100
+++ b/stock.py  Mon Mar 01 09:08:18 2021 +0100
@@ -1,5 +1,6 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
+from sql import Column
 
 from trytond.config import config
 from trytond.i18n import gettext
@@ -20,8 +21,8 @@
     file_id = store_prefix = None
 
 
-class PackageType(metaclass=PoolMeta):
-    __name__ = 'stock.package.type'
+class DimensionsMixin(object):
+    __slots__ = ()
 
     length = fields.Float('Length', digits=(16, Eval('length_digits', 2)),
         depends=['length_digits'])
@@ -88,7 +89,11 @@
         return 2
 
 
-class Package(metaclass=PoolMeta):
+class PackageType(DimensionsMixin, metaclass=PoolMeta):
+    __name__ = 'stock.package.type'
+
+
+class Package(DimensionsMixin, metaclass=PoolMeta):
     __name__ = 'stock.package'
 
     shipping_reference = fields.Char('Shipping Reference',
@@ -101,12 +106,52 @@
     shipping_label_id = fields.Char("Shipping Label ID", readonly=True)
 
     @classmethod
+    def __register__(cls, module_name):
+        pool = Pool()
+        PackageType = pool.get('stock.package.type')
+        cursor = Transaction().connection.cursor()
+        table = cls.__table__()
+        package_type = PackageType.__table__()
+        table_h = cls.__table_handler__(module_name)
+        dimension_columns = [
+            'length', 'length_uom',
+            'height', 'height_uom',
+            'width', 'width_uom']
+        dimension_exists = any(
+            table_h.column_exist(c) for c in dimension_columns)
+
+        super().__register__(module_name)
+
+        # Migration from 5.8: Update dimensions on package from package_type
+        if not dimension_exists:
+            columns = []
+            values = []
+            for c in dimension_columns:
+                columns.append(Column(table, c))
+                values.append(package_type.select(
+                        Column(package_type, c),
+                        where=package_type.id == table.type))
+            cursor.execute(*table.update(
+                    columns=columns,
+                    values=values))
+
+    @classmethod
     def search_rec_name(cls, name, clause):
         domain = super(Package, cls).search_rec_name(name, clause)
         return ['OR', domain,
             ('shipping_reference',) + tuple(clause[1:]),
             ]
 
+    @fields.depends('type')
+    def on_change_type(self):
+        if self.type:
+            self.length = self.type.length
+            self.length_uom = self.type.length_uom
+            self.height = self.type.height
+            self.height_uom = self.type.height_uom
+            self.width = self.type.width
+            self.width_uom = self.type.width_uom
+
     @classmethod
     def copy(cls, packages, default=None):
         if default is None:
diff -r 591fbe106448 -r e7e5c2445e25 view/package_form.xml
--- a/view/package_form.xml     Sat Feb 27 14:38:53 2021 +0100
+++ b/view/package_form.xml     Mon Mar 01 09:08:18 2021 +0100
@@ -2,7 +2,21 @@
 <!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
 this repository contains the full copyright notices and license terms. -->
 <data>
-    <xpath expr="/form/field[@name='children']" position="after">
+    <xpath expr="//field[@name='children']" position="after">
+        <separator string="Dimensions" id="dimensions" colspan="4"/>
+        <label name="length"/>
+        <field name="length"/>
+        <label name="length_uom"/>
+        <field name="length_uom"/>
+        <label name="height"/>
+        <field name="height"/>
+        <label name="height_uom"/>
+        <field name="height_uom"/>
+        <label name="width"/>
+        <field name="width"/>
+        <label name="width_uom"/>
+        <field name="width_uom"/>
+        <separator string="Shipping" id="shipping" colspan="4"/>
         <label name="shipping_reference"/>
         <field name="shipping_reference"/>
         <label name="shipping_label"/>

Reply via email to