From dfc97bb24d97afa382b944849d1ec3ed84c233e4 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Mon, 16 Dec 2019 08:30:12 +0100 Subject: [PATCH] Migrate stock_reserve_rule to 13.0 --- stock_reserve_rule/__manifest__.py | 43 +++++++++---------- stock_reserve_rule/demo/product_demo.xml | 1 - .../demo/stock_inventory_demo.xml | 5 ++- stock_reserve_rule/models/stock_move.py | 3 +- stock_reserve_rule/models/stock_quant.py | 2 +- .../models/stock_reserve_rule.py | 23 +++------- stock_reserve_rule/tests/test_reserve_rule.py | 41 ++++++++---------- .../views/stock_reserve_rule_views.xml | 20 +++++---- 8 files changed, 63 insertions(+), 75 deletions(-) diff --git a/stock_reserve_rule/__manifest__.py b/stock_reserve_rule/__manifest__.py index 679ece206..80d6f7033 100644 --- a/stock_reserve_rule/__manifest__.py +++ b/stock_reserve_rule/__manifest__.py @@ -1,29 +1,26 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { - 'name': 'Stock Reservation Rules', - 'summary': 'Configure reservation rules by location', - 'version': '12.0.1.0.0', - 'author': "Camptocamp, Odoo Community Association (OCA)", - 'website': "https://github.com/OCA/stock-logistics-warehouse", - 'category': 'Stock Management', - 'depends': [ - 'stock', - 'product_packaging_type', # OCA/product-attribute + "name": "Stock Reservation Rules", + "summary": "Configure reservation rules by location", + "version": "13.0.1.0.0", + "author": "Camptocamp, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/stock-logistics-warehouse", + "category": "Stock Management", + "depends": ["stock", "product_packaging_type"], # OCA/product-attribute + "demo": [ + "demo/product_demo.xml", + "demo/stock_location_demo.xml", + "demo/stock_reserve_rule_demo.xml", + "demo/stock_inventory_demo.xml", + "demo/stock_picking_demo.xml", ], - 'demo': [ - 'demo/product_demo.xml', - 'demo/stock_location_demo.xml', - 'demo/stock_reserve_rule_demo.xml', - 'demo/stock_inventory_demo.xml', - 'demo/stock_picking_demo.xml', + "data": [ + "views/stock_reserve_rule_views.xml", + "security/ir.model.access.csv", + "security/stock_reserve_rule_security.xml", ], - 'data': [ - 'views/stock_reserve_rule_views.xml', - 'security/ir.model.access.csv', - 'security/stock_reserve_rule_security.xml', - ], - 'installable': True, - 'development_status': 'Alpha', - 'license': 'AGPL-3', + "installable": True, + "development_status": "Alpha", + "license": "AGPL-3", } diff --git a/stock_reserve_rule/demo/product_demo.xml b/stock_reserve_rule/demo/product_demo.xml index b4618d189..0d0190fb1 100644 --- a/stock_reserve_rule/demo/product_demo.xml +++ b/stock_reserve_rule/demo/product_demo.xml @@ -12,7 +12,6 @@ none - diff --git a/stock_reserve_rule/demo/stock_inventory_demo.xml b/stock_reserve_rule/demo/stock_inventory_demo.xml index 1ab318d57..41ebda18f 100644 --- a/stock_reserve_rule/demo/stock_inventory_demo.xml +++ b/stock_reserve_rule/demo/stock_inventory_demo.xml @@ -27,8 +27,11 @@ - + + + + diff --git a/stock_reserve_rule/models/stock_move.py b/stock_reserve_rule/models/stock_move.py index e7aca4c2e..3fb0b3c1b 100644 --- a/stock_reserve_rule/models/stock_move.py +++ b/stock_reserve_rule/models/stock_move.py @@ -84,8 +84,7 @@ class StockMove(models.Model): break need_zero = ( - float_compare(still_need, 0, precision_rounding=rounding) - != 1 + float_compare(still_need, 0, precision_rounding=rounding) != 1 ) if need_zero: # useless to eval the other rules when still_need <= 0 diff --git a/stock_reserve_rule/models/stock_quant.py b/stock_reserve_rule/models/stock_quant.py index bb78bd532..1236b6883 100644 --- a/stock_reserve_rule/models/stock_quant.py +++ b/stock_reserve_rule/models/stock_quant.py @@ -27,4 +27,4 @@ class StockQuant(models.Model): seen[location] = seen[location] | quant else: seen[location] = quant - return [(location, quants) for location, quants in seen.items()] + return [(loc, quants) for loc, quants in seen.items()] diff --git a/stock_reserve_rule/models/stock_reserve_rule.py b/stock_reserve_rule/models/stock_reserve_rule.py index 41a6a393c..2081962f4 100644 --- a/stock_reserve_rule/models/stock_reserve_rule.py +++ b/stock_reserve_rule/models/stock_reserve_rule.py @@ -1,9 +1,9 @@ # Copyright 2019 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import fields, models -from odoo.tools.safe_eval import safe_eval from odoo.osv import expression from odoo.tools.float_utils import float_compare +from odoo.tools.safe_eval import safe_eval def _default_sequence(record): @@ -33,8 +33,7 @@ class StockReserveRule(models.Model): sequence = fields.Integer(default=lambda s: _default_sequence(s)) active = fields.Boolean(default=True) company_id = fields.Many2one( - comodel_name="res.company", - default=lambda self: self.env.user.company_id.id, + comodel_name="res.company", default=lambda self: self.env.user.company_id.id ) location_id = fields.Many2one(comodel_name="stock.location", required=True) @@ -143,9 +142,7 @@ class StockReserveRuleRemoval(models.Model): def _eval_quant_domain(self, quants, domain): quant_domain = [("id", "in", quants.ids)] - return self.env["stock.quant"].search( - expression.AND([quant_domain, domain]) - ) + return self.env["stock.quant"].search(expression.AND([quant_domain, domain])) def _filter_quants(self, move, quants): domain = safe_eval(self.quant_domain) or [] @@ -206,7 +203,6 @@ class StockReserveRuleRemoval(models.Model): ( sum(quants.mapped("quantity")) - sum(quants.mapped("reserved_quantity")), - quants, location, ) for location, quants in quants_per_bin @@ -217,7 +213,7 @@ class StockReserveRuleRemoval(models.Model): # Propose the largest quants first, so we have as less operations # as possible. We take goods only if we empty the bin. rounding = fields.first(quants).product_id.uom_id.rounding - for location_quantity, quants, location in bins: + for location_quantity, location in bins: if location_quantity <= 0: continue @@ -253,9 +249,7 @@ class StockReserveRuleRemoval(models.Model): rounding = product.uom_id.rounding def is_greater_eq(value, other): - return ( - float_compare(value, other, precision_rounding=rounding) >= 0 - ) + return float_compare(value, other, precision_rounding=rounding) >= 0 for pack_quantity in packaging_quantities: # Get quants quantity on each loop because they may change. @@ -266,7 +260,6 @@ class StockReserveRuleRemoval(models.Model): ( sum(quants.mapped("quantity")) - sum(quants.mapped("reserved_quantity")), - quants, location, ) for location, quants in quants_per_bin @@ -274,12 +267,10 @@ class StockReserveRuleRemoval(models.Model): reverse=True, ) - for location_quantity, quants, location in bins: + for location_quantity, location in bins: if location_quantity <= 0: continue - enough_for_packaging = is_greater_eq( - location_quantity, pack_quantity - ) + enough_for_packaging = is_greater_eq(location_quantity, pack_quantity) asked_more_than_packaging = is_greater_eq(need, pack_quantity) if enough_for_packaging and asked_more_than_packaging: # compute how much packaging we can get diff --git a/stock_reserve_rule/tests/test_reserve_rule.py b/stock_reserve_rule/tests/test_reserve_rule.py index 732a436c9..124098890 100644 --- a/stock_reserve_rule/tests/test_reserve_rule.py +++ b/stock_reserve_rule/tests/test_reserve_rule.py @@ -101,9 +101,7 @@ class TestReserveRule(common.SavepointCase): return picking def _update_qty_in_location(self, location, product, quantity): - self.env["stock.quant"]._update_available_quantity( - product, location, quantity - ) + self.env["stock.quant"]._update_available_quantity(product, location, quantity) def _create_rule(self, rule_values, removal_values): rule_config = { @@ -113,6 +111,8 @@ class TestReserveRule(common.SavepointCase): } rule_config.update(rule_values) self.env["stock.reserve.rule"].create(rule_config) + # workaround for https://github.com/odoo/odoo/pull/41900 + self.env["stock.reserve.rule"].invalidate_cache() def _setup_packagings(self, product, packagings): """Create packagings on a product @@ -219,7 +219,7 @@ class TestReserveRule(common.SavepointCase): ], ) self.assertEqual(move.state, "partially_available") - self.assertEqual(move.reserved_availability, 300.) + self.assertEqual(move.reserved_availability, 300.0) def test_rule_fallback(self): reserve = self.env["stock.location"].create( @@ -254,7 +254,7 @@ class TestReserveRule(common.SavepointCase): ], ) self.assertEqual(move.state, "assigned") - self.assertEqual(move.reserved_availability, 400.) + self.assertEqual(move.reserved_availability, 400.0) def test_rule_domain(self): self._update_qty_in_location(self.loc_zone1_bin1, self.product1, 100) @@ -355,9 +355,9 @@ class TestReserveRule(common.SavepointCase): self.assertRecordValues( ml, [ - {"location_id": self.loc_zone1_bin2.id, "product_qty": 150.}, - {"location_id": self.loc_zone2_bin1.id, "product_qty": 50.}, - {"location_id": self.loc_zone3_bin1.id, "product_qty": 50.}, + {"location_id": self.loc_zone1_bin2.id, "product_qty": 150.0}, + {"location_id": self.loc_zone2_bin1.id, "product_qty": 50.0}, + {"location_id": self.loc_zone3_bin1.id, "product_qty": 50.0}, ], ) self.assertEqual(move.state, "assigned") @@ -389,8 +389,8 @@ class TestReserveRule(common.SavepointCase): self.assertRecordValues( ml, [ - {"location_id": self.loc_zone1_bin1.id, "product_qty": 50.}, - {"location_id": self.loc_zone2_bin1.id, "product_qty": 30.}, + {"location_id": self.loc_zone1_bin1.id, "product_qty": 50.0}, + {"location_id": self.loc_zone2_bin1.id, "product_qty": 30.0}, ], ) self.assertEqual(move.state, "assigned") @@ -424,8 +424,8 @@ class TestReserveRule(common.SavepointCase): self.assertRecordValues( ml, [ - {"location_id": self.loc_zone1_bin2.id, "product_qty": 60.}, - {"location_id": self.loc_zone2_bin1.id, "product_qty": 20.}, + {"location_id": self.loc_zone1_bin2.id, "product_qty": 60.0}, + {"location_id": self.loc_zone2_bin1.id, "product_qty": 20.0}, ], ) self.assertEqual(move.state, "assigned") @@ -433,10 +433,7 @@ class TestReserveRule(common.SavepointCase): def test_rule_packaging(self): self._setup_packagings( self.product1, - [ - ("Pallet", 500, self.pallet), - ("Retail Box", 50, self.retail_box), - ], + [("Pallet", 500, self.pallet), ("Retail Box", 50, self.retail_box)], ) self._update_qty_in_location(self.loc_zone1_bin1, self.product1, 40) self._update_qty_in_location(self.loc_zone1_bin2, self.product1, 510) @@ -470,9 +467,9 @@ class TestReserveRule(common.SavepointCase): self.assertRecordValues( ml, [ - {"location_id": self.loc_zone1_bin2.id, "product_qty": 500.}, - {"location_id": self.loc_zone2_bin1.id, "product_qty": 50.}, - {"location_id": self.loc_zone3_bin1.id, "product_qty": 40.}, + {"location_id": self.loc_zone1_bin2.id, "product_qty": 500.0}, + {"location_id": self.loc_zone2_bin1.id, "product_qty": 50.0}, + {"location_id": self.loc_zone3_bin1.id, "product_qty": 40.0}, ], ) self.assertEqual(move.state, "assigned") @@ -553,9 +550,9 @@ class TestReserveRule(common.SavepointCase): self.assertRecordValues( ml, [ - {"location_id": self.loc_zone1_bin2.id, "product_qty": 500.}, - {"location_id": self.loc_zone2_bin2.id, "product_qty": 50.}, - {"location_id": self.loc_zone3_bin1.id, "product_qty": 10.}, + {"location_id": self.loc_zone1_bin2.id, "product_qty": 500.0}, + {"location_id": self.loc_zone2_bin2.id, "product_qty": 50.0}, + {"location_id": self.loc_zone3_bin1.id, "product_qty": 10.0}, ], ) self.assertEqual(move.state, "assigned") diff --git a/stock_reserve_rule/views/stock_reserve_rule_views.xml b/stock_reserve_rule/views/stock_reserve_rule_views.xml index 6e8d36b26..68c81b262 100644 --- a/stock_reserve_rule/views/stock_reserve_rule_views.xml +++ b/stock_reserve_rule/views/stock_reserve_rule_views.xml @@ -7,17 +7,20 @@
-
+
@@ -74,7 +77,6 @@ Stock Reservation Rules stock.reserve.rule ir.actions.act_window - form