changeset c43a5ec13cf7 in modules/purchase:default
details: https://hg.tryton.org/modules/purchase?cmd=changeset;node=c43a5ec13cf7
description:
        Prevent domain error when copy products with product suppliers on 
variants

        issue9017
        review315221002V
diffstat:

 product.py |  54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 54 insertions(+), 0 deletions(-)

diffs (71 lines):

diff -r 0c64a201a7c4 -r c43a5ec13cf7 product.py
--- a/product.py        Sat Apr 25 23:53:51 2020 +0200
+++ b/product.py        Fri May 01 20:31:02 2020 +0200
@@ -85,6 +85,31 @@
                             name, gettext('purchase.msg_change_purchase_uom'))
         super(Template, cls).write(*args)
 
+    @classmethod
+    def copy(cls, templates, default=None):
+        pool = Pool()
+        ProductSupplier = pool.get('purchase.product_supplier')
+        if default is None:
+            default = {}
+        else:
+            default = default.copy()
+
+        copy_suppliers = 'product_suppliers' not in default
+        default.setdefault('product_suppliers', None)
+        new_templates = super().copy(templates, default)
+        if copy_suppliers:
+            old2new = {}
+            to_copy = []
+            for template, new_template in zip(templates, new_templates):
+                to_copy.extend(
+                    ps for ps in template.product_suppliers if not ps.product)
+                old2new[template.id] = new_template.id
+            if to_copy:
+                ProductSupplier.copy(to_copy, {
+                        'template': lambda d: old2new[d['template']],
+                        })
+        return new_templates
+
 
 class Product(metaclass=PoolMeta):
     __name__ = 'product.product'
@@ -181,6 +206,35 @@
                         prices[product.id], currency, round=False)
         return prices
 
+    @classmethod
+    def copy(cls, products, default=None):
+        pool = Pool()
+        ProductSupplier = pool.get('purchase.product_supplier')
+        if default is None:
+            default = {}
+        else:
+            default = default.copy()
+
+        copy_suppliers = 'product_suppliers' not in default
+        if 'template' in default:
+            default.setdefault('product_suppliers', None)
+        new_products = super().copy(products, default)
+        if 'template' in default and copy_suppliers:
+            template2new = {}
+            product2new = {}
+            to_copy = []
+            for product, new_product in zip(products, new_products):
+                if product.product_suppliers:
+                    to_copy.extend(product.product_suppliers)
+                    template2new[product.template.id] = new_product.template.id
+                    product2new[product.id] = new_product.id
+            if to_copy:
+                ProductSupplier.copy(to_copy, {
+                        'product': lambda d: product2new[d['product']],
+                        'template': lambda d: template2new[d['template']],
+                        })
+        return new_products
+
 
 class ProductSupplier(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
     'Product Supplier'

Reply via email to