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)