From 35ec623834f3a7c8a6dcd1977a75e3618a7fba35 Mon Sep 17 00:00:00 2001 From: Jordi Ballester Alomar Date: Wed, 28 Nov 2018 12:56:38 +0100 Subject: [PATCH] Fixes, and add migration script --- .../migrations/11.0.2.0.0/post-migration.py | 50 +++++++++++++++++++ mrp_multi_level/models/product_product.py | 10 +++- mrp_multi_level/models/product_template.py | 12 ++++- .../views/product_mrp_area_views.xml | 46 +++++++++-------- .../views/product_product_views.xml | 2 +- .../views/product_template_views.xml | 8 +-- mrp_multi_level/wizards/mrp_multi_level.py | 28 +++++------ 7 files changed, 113 insertions(+), 43 deletions(-) create mode 100644 mrp_multi_level/migrations/11.0.2.0.0/post-migration.py diff --git a/mrp_multi_level/migrations/11.0.2.0.0/post-migration.py b/mrp_multi_level/migrations/11.0.2.0.0/post-migration.py new file mode 100644 index 000000000..6bf508127 --- /dev/null +++ b/mrp_multi_level/migrations/11.0.2.0.0/post-migration.py @@ -0,0 +1,50 @@ +# Copyright 2019 Eficent Business and IT Consulting Services, S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import logging +from odoo import api, SUPERUSER_ID + +_logger = logging.getLogger(__name__) + +__name__ = "Upgrade to 11.0.2.0.0" + + +def _migrate_product_to_product_mrp_area(env): + _logger.info("Migrating product parameters to Product MRP Areas") + env.cr.execute(""" + SELECT DISTINCT mrp_area.id, pr.id, pr.mrp_applicable, pr.mrp_exclude, + pr.mrp_inspection_delay, pr.mrp_maximum_order_qty, + pr.mrp_minimum_order_qty, pr.mrp_minimum_stock, pr.mrp_nbr_days, + pr.mrp_qty_multiple, pr.mrp_transit_delay, pr.mrp_verified, pr.active + FROM product_product AS pr + CROSS JOIN mrp_area + LEFT JOIN product_template AS pt + ON pt.id = pr.product_tmpl_id + WHERE pr.mrp_exclude = False + AND pt.type = 'product' + """) + product_mrp_area_model = env['product.mrp.area'] + for mrp_area_id, product_id, mrp_applicable, mrp_exclude,\ + mrp_inspection_delay, mrp_maximum_order_qty, mrp_minimum_order_qty, \ + mrp_minimum_stock, mrp_nbr_days, mrp_qty_multiple, mrp_transit_delay,\ + mrp_verified, active in env.cr.fetchall(): + product_mrp_area_model.create({ + 'mrp_area_id': mrp_area_id, + 'product_id': product_id, + 'mrp_applicable': mrp_applicable, + 'mrp_exclude': mrp_exclude, + 'mrp_inspection_delay': mrp_inspection_delay, + 'mrp_maximum_order_qty': mrp_maximum_order_qty, + 'mrp_minimum_order_qty': mrp_minimum_order_qty, + 'mrp_minimum_stock': mrp_minimum_stock, + 'mrp_nbr_days': mrp_nbr_days, + 'mrp_qty_multiple': mrp_qty_multiple, + 'mrp_transit_delay': mrp_transit_delay, + 'mrp_verified': mrp_verified, + 'active': active, + }) + + +def migrate(cr, version): + with api.Environment.manage(): + env = api.Environment(cr, SUPERUSER_ID, {}) + _migrate_product_to_product_mrp_area(env) diff --git a/mrp_multi_level/models/product_product.py b/mrp_multi_level/models/product_product.py index e20078512..1f003bf11 100644 --- a/mrp_multi_level/models/product_product.py +++ b/mrp_multi_level/models/product_product.py @@ -1,7 +1,7 @@ # Copyright 2016 Ucamco - Wim Audenaert # Copyright 2016-18 Eficent Business and IT Consulting Services S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - +import ast from odoo import api, fields, models @@ -41,11 +41,19 @@ class Product(models.Model): self.ensure_one() action = self.env.ref('mrp_multi_level.product_mrp_area_action') result = action.read()[0] + ctx = ast.literal_eval(result.get('context')) + if not ctx: + ctx = {} + mrp_areas = self.env['mrp.area'].search([]) + if len(mrp_areas) == 1: + ctx.update({'default_mrp_area_id': mrp_areas[0].id}) area_ids = self.mrp_area_ids.ids + ctx.update({'default_product_id': self.id}) if self.mrp_area_count != 1: result['domain'] = [('id', 'in', area_ids)] else: res = self.env.ref('mrp_multi_level.product_mrp_area_form', False) result['views'] = [(res and res.id or False, 'form')] result['res_id'] = area_ids[0] + result['context'] = ctx return result diff --git a/mrp_multi_level/models/product_template.py b/mrp_multi_level/models/product_template.py index 48e43ba97..ed4ccaead 100644 --- a/mrp_multi_level/models/product_template.py +++ b/mrp_multi_level/models/product_template.py @@ -1,6 +1,6 @@ # Copyright 2018 Eficent Business and IT Consulting Services S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - +import ast from odoo import api, fields, models @@ -28,12 +28,22 @@ class ProductTemplate(models.Model): self.ensure_one() action = self.env.ref('mrp_multi_level.product_mrp_area_action') result = action.read()[0] + ctx = ast.literal_eval(result.get('context')) + mrp_areas = self.env['mrp.area'].search([]) + if 'context' not in result: + result['context'] = {} + if len(mrp_areas) == 1: + ctx.update({'default_mrp_area_id': mrp_areas[0].id}) mrp_area_ids = self.with_context( active_test=False).mrp_area_ids.ids + if len(self.product_variant_ids) == 1: + variant = self.product_variant_ids[0] + ctx.update({'default_product_id': variant.id}) if len(mrp_area_ids) != 1: result['domain'] = [('id', 'in', mrp_area_ids)] else: res = self.env.ref('mrp_multi_level.product_mrp_area_form', False) result['views'] = [(res and res.id or False, 'form')] result['res_id'] = mrp_area_ids[0] + result['context'] = ctx return result diff --git a/mrp_multi_level/views/product_mrp_area_views.xml b/mrp_multi_level/views/product_mrp_area_views.xml index aeb2eed4d..11c8d02a0 100644 --- a/mrp_multi_level/views/product_mrp_area_views.xml +++ b/mrp_multi_level/views/product_mrp_area_views.xml @@ -59,28 +59,30 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mrp_multi_level/views/product_product_views.xml b/mrp_multi_level/views/product_product_views.xml index 65014f376..ad24d4863 100644 --- a/mrp_multi_level/views/product_product_views.xml +++ b/mrp_multi_level/views/product_product_views.xml @@ -1,7 +1,7 @@ - + view.product.mrp.area.product.form product.product diff --git a/mrp_multi_level/views/product_template_views.xml b/mrp_multi_level/views/product_template_views.xml index 843413d55..1a5e9ddd5 100644 --- a/mrp_multi_level/views/product_template_views.xml +++ b/mrp_multi_level/views/product_template_views.xml @@ -8,10 +8,10 @@
diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index 5ace1b235..2143d0ca5 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -531,7 +531,7 @@ class MultiLevelMrp(models.TransientModel): product_mrp_area.mrp_minimum_stock - \ product_mrp_area - last_qty cm = self.create_move( - product_mrp_area_id=product_mrp_area.id, + product_mrp_area_id=product_mrp_area, mrp_date=last_date, mrp_qty=qtytoorder, name=name) @@ -562,7 +562,7 @@ class MultiLevelMrp(models.TransientModel): (product_mrp_area.mrp_nbr_days, ) qtytoorder = product_mrp_area.mrp_minimum_stock - onhand - last_qty cm = self.create_move( - product_mrp_area_id=product_mrp_area.id, mrp_date=last_date, + product_mrp_area_id=product_mrp_area, mrp_date=last_date, mrp_qty=qtytoorder, name=name) qty_ordered = cm['qty_ordered'] onhand += qty_ordered @@ -748,18 +748,18 @@ class MultiLevelMrp(models.TransientModel): for move in moves: qoh = qoh + move.mrp_qty move.running_availability = qoh - - nbr_actions = product_mrp_area.mrp_move_ids.filtered( - lambda m: m.mrp_action != 'none') - horizon_4w = fields.Date.to_string( - date.today() + timedelta(weeks=4)) - nbr_actions_4w = nbr_actions.filtered( - lambda m: m.mrp_action_date < horizon_4w) - if nbr_actions: - product_mrp_area.write({ - 'nbr_mrp_actions': len(nbr_actions), - 'nbr_mrp_actions_4w': len(nbr_actions_4w), - }) + # TODO: Possible clean up needed here + # nbr_actions = product_mrp_area.mrp_move_ids.filtered( + # lambda m: m.mrp_action != 'none') + # horizon_4w = fields.Date.to_string( + # date.today() + timedelta(weeks=4)) + # nbr_actions_4w = nbr_actions.filtered( + # lambda m: m.mrp_action_date < horizon_4w) + # if nbr_actions: + # product_mrp_area.write({ + # 'nbr_mrp_actions': len(nbr_actions), + # 'nbr_mrp_actions_4w': len(nbr_actions_4w), + # }) logger.info('END MRP FINAL PROCESS') @api.multi