diff --git a/addons/mrp/migrations/8.0.1.1/post-migrate.py b/addons/mrp/migrations/8.0.1.1/post-migrate.py
new file mode 100644
index 000000000000..d8e1cd22b2c4
--- /dev/null
+++ b/addons/mrp/migrations/8.0.1.1/post-migrate.py
@@ -0,0 +1,18 @@
+from openerp.openupgrade import openupgrade
+from openerp import pooler, SUPERUSER_ID
+
+def move_fields(cr, pool):
+ execute = openupgrade.logged_query
+ queries = [ """
+ UPDATE product_product
+ SET produce_delay=(SELECT pt.%s
+ FROM product_template
+ WHERE product_template.id=product_product.product_tmpl_id)
+ """ % openupgrade.get_legacy_name('produce_delay'),
+
+
+@openupgrade.migrate()
+def migrate(cr, version):
+ pool = pooler.get_pool(cr.dbname)
+ move_fields(cr, pool)
+
diff --git a/addons/product/__openerp__.py b/addons/product/__openerp__.py
index 83ecea958869..469941620e1a 100644
--- a/addons/product/__openerp__.py
+++ b/addons/product/__openerp__.py
@@ -25,7 +25,7 @@
'version': '1.1',
'author': 'OpenERP SA',
'category': 'Sales Management',
- 'depends': ['base', 'decimal_precision', 'mail'],
+ 'depends': ['base', 'decimal_precision', 'mail', 'report'],
'demo': [
'product_demo.xml',
'product_image_demo.xml',
diff --git a/addons/product/migrations/8.0.1.1/modified_data.xml b/addons/product/migrations/8.0.1.1/modified_data.xml
new file mode 100644
index 000000000000..144955bcda48
--- /dev/null
+++ b/addons/product/migrations/8.0.1.1/modified_data.xml
@@ -0,0 +1,24 @@
+
+
+
+ ['|',('company_id','=',False),('company_id','=',user.company_id.id)]
+
+ ['|',('company_id','=',user.company_id.id),('company_id','=',False)]
+
+
+
+ 1000
+
+ All
+
+ ['|',('company_id','=',user.company_id.id),('company_id','=',False)]
+
+ ['|',('company_id','=',user.company_id.id),('company_id','=',False)]
+
+ ['|',('company_id','=',user.company_id.id),('company_id','=',False)]
+
+
+
+
+
+
diff --git a/addons/product/migrations/8.0.1.1/openupgrade_analysis_WORK.txt b/addons/product/migrations/8.0.1.1/openupgrade_analysis_WORK.txt
new file mode 100644
index 000000000000..928d7c45b889
--- /dev/null
+++ b/addons/product/migrations/8.0.1.1/openupgrade_analysis_WORK.txt
@@ -0,0 +1,154 @@
+---Fields in module 'product'---
+product / product.attribute / name (char) : NEW required: required
+product / product.attribute / value_ids (one2many) : NEW relation: product.attribute.value
+product / product.attribute.line / attribute_id (many2one) : NEW relation: product.attribute, required: required
+product / product.attribute.line / product_tmpl_id (many2one) : NEW relation: product.template, required: required
+product / product.attribute.line / value_ids (many2many) : NEW relation: product.attribute.value
+product / product.attribute.price / price_extra (float) : NEW
+product / product.attribute.price / product_tmpl_id (many2one) : NEW relation: product.template, required: required
+product / product.attribute.price / value_id (many2one) : NEW relation: product.attribute.value, required: required
+product / product.attribute.value / attribute_id (many2one) : NEW relation: product.attribute, required: required
+product / product.attribute.value / name (char) : NEW required: required
+product / product.attribute.value / price_ids (one2many) : NEW relation: product.attribute.price
+product / product.attribute.value / product_ids (many2many) : NEW relation: product.product
+product / product.attribute.value / sequence (integer) : NEW
+
+## OK new model, will be handled by standard migration
+
+
+product / product.packaging / ul_container (many2one) : NEW relation: product.ul
+product / product.packaging / height (float) : DEL
+product / product.ul / height (float) : NEW
+product / product.packaging / length (float) : DEL
+product / product.ul / length (float) : NEW
+product / product.packaging / weight_ul (float) : DEL
+product / product.ul / weight (float) : NEW
+product / product.packaging / width (float) : DEL
+product / product.ul / width (float) : NEW
+## OK new relation ul_container handled by migration
+## OK the dimensions are weight must be moved to the related UL (through the ul field)
+
+
+product / product.price.history / company_id (many2one) : NEW relation: res.company, required: required, req_default: function
+product / product.price.history / cost (float) : NEW
+product / product.price.history / datetime (datetime) : NEW
+product / product.price.history / product_template_id (many2one): NEW relation: product.template, required: required
+# OK new fields -> nothing to do
+
+product / product.template / attribute_line_ids (one2many) : NEW relation: product.attribute.line
+product / product.product / attribute_value_ids (many2many): NEW relation: product.attribute.value
+# OK nothing to do
+
+
+product / product.supplierinfo / product_id (many2one) : DEL relation: product.template, required: required
+product / product.supplierinfo / product_tmpl_id (many2one) : NEW relation: product.template, required: required
+# OK seller_ids moved from product.product to product.template
+
+product / product.template / active (boolean) : NEW
+# OK: set to True if at least one variant is active
+
+product / product.template / color (integer) : NEW
+product / product.product / color (integer) : DEL
+## OK color moved up in template
+
+product / product.template / cost_method (selection) : module is now 'stock_account' ('product')
+product / product.template / cost_method (selection) : now a function
+product / product.template / cost_method (selection) : selection_keys is now '['average', 'real', 'standard']' ('['average', 'standard']')
+# moved in stock_account, now a fields.property
+
+product / product.template / image (binary) : NEW
+product / product.product / image (binary) : now afunction
+# OK need to move up to template
+
+product / product.product / image_variant (binary) : NEW
+# nothing to do
+
+product / product.template / message_ids (one2many) : NEW relation: mail.message
+product / product.template / message_last_post (datetime) : NEW
+# now product.template derives from mail template
+# TODO : move up messages -> they will still be on the product so why bother
+product / product.product / message_last_post (datetime) : NEW
+
+
+product / product.template / packaging (one2many) : NEW relation: product.packaging
+# OK moved from product.product
+
+product / product.template / produce_delay (float) : DEL
+# OK moved in mrp, defined on product.product
+
+product / product.template / product_variant_ids (one2many): NEW relation: product.product, required: required
+# nothing to do?
+
+product / product.template / standard_price (float) : now a function
+# nothing to do
+
+product / product.product / incoming_qty (float) : module is now 'stock' ('product')
+# function field nothing to do
+
+product / product.product / outgoing_qty (float) : module is now 'stock' ('product')
+product / product.product / price_extra (float) : now a function
+product / product.product / price_margin (float) : DEL
+product / product.product / qty_available (float) : module is now 'stock' ('product')
+product / product.product / variants (char) : DEL
+product / product.product / virtual_available (float) : module is now 'stock' ('product')
+
+
+
+---XML records in module 'product'---
+NEW ir.actions.act_window: product.product_template_action
+NEW ir.actions.act_window: product.product_variant_action
+NEW ir.actions.act_window: product.variants_template_action
+DEL ir.actions.act_window: product.product_normal_action_puchased
+DEL ir.actions.act_window: product.product_template_action_tree
+DEL ir.actions.act_window.view: product.open_view_product_form1
+DEL ir.actions.act_window.view: product.open_view_product_kanban1
+DEL ir.actions.act_window.view: product.open_view_product_tree1
+NEW ir.actions.report.xml: product.action_report_pricelist
+DEL ir.actions.report.xml: product.report_product_pricelist
+## ir.actions: the doc says we can safely ignore these
+
+NEW ir.model.access: product.access_product_attribute
+NEW ir.model.access: product.access_product_attribute_line
+NEW ir.model.access: product.access_product_attribute_line_sale_manager
+NEW ir.model.access: product.access_product_attribute_price
+NEW ir.model.access: product.access_product_attribute_price_sale_manager
+NEW ir.model.access: product.access_product_attribute_sale_manager
+NEW ir.model.access: product.access_product_attribute_value
+NEW ir.model.access: product.access_product_attribute_value_sale_manager
+NEW ir.model.access: product.access_product_price_history_employee
+## access rules: let them be for now
+
+
+NEW ir.ui.menu: product.menu_product_template_action
+NEW ir.ui.view: product.product_template_form_view_variant_button
+NEW ir.ui.view: product.product_template_kanban_view
+NEW ir.ui.view: product.product_template_kanban_view_variant_button
+NEW ir.ui.view: product.product_template_search_view
+NEW ir.ui.view: product.report_pricelist
+NEW ir.ui.view: product.variants_template_tree_view
+DEL ir.ui.view: product.product_variant_form_view
+DEL ir.ui.view: product.product_variant_tree_view
+DEL ir.ui.view_sc: product.ir_ui_view_sc_product0
+## ir.ui.* doc says we can ignore
+
+DEL process.node: product.process_node_product0
+DEL process.node: product.process_node_supplier0
+DEL process.process: product.process_process_productprocess0
+DEL process.transition: product.process_transition_supplierofproduct0
+## process addon removed -> nothing to do
+
+NEW product.uom: product.product_uom_floz
+NEW product.uom: product.product_uom_foot
+NEW product.uom: product.product_uom_gal
+NEW product.uom: product.product_uom_inch
+NEW product.uom: product.product_uom_lb
+NEW product.uom: product.product_uom_mile
+NEW product.uom: product.product_uom_oz
+NEW product.uom: product.product_uom_qt
+## great new stuff, std upgrade should work by itself
+
+DEL res.groups: product.group_costing_method
+DEL res.groups: product.group_product_variant
+## well... probably nothing to do either...
+
+## modified no update records listed in modified_data.xml
diff --git a/addons/product/migrations/8.0.1.1/post-migration.py b/addons/product/migrations/8.0.1.1/post-migration.py
new file mode 100644
index 000000000000..78177737001e
--- /dev/null
+++ b/addons/product/migrations/8.0.1.1/post-migration.py
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Author: Alexandre Fayolle
+# Copyright 2014 Camptocamp SA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp.openupgrade import openupgrade
+from openerp import pooler, SUPERUSER_ID
+
+def load_data(cr):
+ openupgrade.load_data(cr, 'product', 'migrations/8.0.1.1/modified_data.xml', mode='init')
+
+def move_fields(cr, pool):
+ execute = openupgrade.logged_query
+ queries = ["UPDATE product_supplierinfo "
+ "SET product_tmpl_id=(SELECT product_tmpl_id "
+ " FROM product_product "
+ " WHERE product_product.id=product_supplierinfo.%s) " \
+ % openupgrade.get_legacy_name('product_id'),
+ #
+ "UPDATE product_template as pt "
+ "SET color=(SELECT pp1.%s "
+ " FROM product_product as pp1 "
+ " WHERE pp1.product_tmpl_id=pt.id ORDER BY pp1.id LIMIT 1), "
+ " image=(SELECT pp2.image_variant "
+ " FROM product_product as pp2 "
+ " WHERE pp2.product_tmpl_id=pt.id ORDER BY pp2.id LIMIT 1)"
+ % (openupgrade.get_legacy_name('color'),
+ )
+ #
+
+ ]
+ for sql in queries:
+ execute(cr, sql)
+
+def copy_fields(cr, pool):
+ product_tmpl= pool['product.template']
+ product_obj= pool['product.product']
+ # copy the active field from product to template
+ ctx = {'active_test': False}
+ tmpl_ids = product_tmpl.search(cr, SUPERUSER_ID, [], context=ctx)
+ for template in product_tmpl.browse(cr, SUPERUSER_ID, tmpl_ids, context=ctx):
+ template.write({'active': any(variant.active
+ for variant in template.product_variant_ids)
+ })
+
+def migrate_packaging(cr, pool):
+ """create 1 product UL for each different product packaging dimension
+ and link it to the packagings
+ """
+ packaging_obj = pool['product.packaging']
+ ul_obj = pool['product.ul']
+ execute = openupgrade.logged_query
+ legacy_columns = dict((key, openupgrade.get_legacy_name(key))
+ for key in ('height', 'width',
+ 'length', 'weight_ul'))
+ execute(cr,
+ 'select ul, %(height)s, %(width)s, %(length)s, %(weight_ul)s '
+ 'from product_packaging' % legacy_columns)
+ for ul_id, height, width, length, weight in cr.fetchall():
+ ul_obj.write(cr, SUPERUSER_ID, [ul_id],
+ {'height': height,
+ 'width': width,
+ 'length': length,
+ 'weight': weight,
+ })
+
+@openupgrade.migrate()
+def migrate(cr, version):
+ pool = pooler.get_pool(cr.dbname)
+ move_fields(cr, pool)
+ copy_fields(cr, pool)
+ migrate_packaging(cr, pool)
+ load_data(cr)
+
diff --git a/addons/product/migrations/8.0.1.1/pre-migration.py b/addons/product/migrations/8.0.1.1/pre-migration.py
new file mode 100644
index 000000000000..f9ed9a211ded
--- /dev/null
+++ b/addons/product/migrations/8.0.1.1/pre-migration.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Author: Alexandre Fayolle
+# Copyright 2014 Camptocamp SA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp.openupgrade import openupgrade
+
+column_renames = {
+ # Using magic None value to trigger call to get_legacy_name()
+ 'product_supplierinfo': [
+ ('product_id', None),
+ ],
+ 'product_product': [
+ ('color', None),
+ ('image', 'image_variant'),
+ ],
+ 'product_template': [
+ ('produce_delay', None), # need to handle in mrp migration
+ ('cost_method', None), # need to handle in stock_account migration
+ ],
+ 'product_packaging': [
+ ('height', None),
+ ('length', None),
+ ('weight_ul', None),
+ ('width', None),
+ ]
+ }
+
+
+@openupgrade.migrate()
+def migrate(cr, version):
+ openupgrade.rename_columns(cr, column_renames)