From 78a1caeaf737aaadaad114e06a3e386f0811b63c Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Mon, 2 Mar 2020 13:33:24 +0100 Subject: [PATCH] Create module stock_location_children --- stock_location_children/__init__.py | 1 + stock_location_children/__manifest__.py | 15 ++++ stock_location_children/models/__init__.py | 1 + .../models/stock_location.py | 27 +++++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 3 + stock_location_children/tests/__init__.py | 1 + .../tests/test_stock_location_children.py | 77 +++++++++++++++++++ 8 files changed, 126 insertions(+) create mode 100644 stock_location_children/__init__.py create mode 100644 stock_location_children/__manifest__.py create mode 100644 stock_location_children/models/__init__.py create mode 100644 stock_location_children/models/stock_location.py create mode 100644 stock_location_children/readme/CONTRIBUTORS.rst create mode 100644 stock_location_children/readme/DESCRIPTION.rst create mode 100644 stock_location_children/tests/__init__.py create mode 100644 stock_location_children/tests/test_stock_location_children.py diff --git a/stock_location_children/__init__.py b/stock_location_children/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/stock_location_children/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/stock_location_children/__manifest__.py b/stock_location_children/__manifest__.py new file mode 100644 index 000000000..614b259b3 --- /dev/null +++ b/stock_location_children/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +{ + "name": "Stock location children", + "summary": "Add relation between stock location and all its children", + "version": "13.0.1.0.0", + "development_status": "Alpha", + "category": "Warehouse Management", + "website": "https://github.com/OCA/stock-logistics-warehouse", + "author": "Camptocamp, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["stock"], +} diff --git a/stock_location_children/models/__init__.py b/stock_location_children/models/__init__.py new file mode 100644 index 000000000..88493e35d --- /dev/null +++ b/stock_location_children/models/__init__.py @@ -0,0 +1 @@ +from . import stock_location diff --git a/stock_location_children/models/stock_location.py b/stock_location_children/models/stock_location.py new file mode 100644 index 000000000..2821105c8 --- /dev/null +++ b/stock_location_children/models/stock_location.py @@ -0,0 +1,27 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo import api, fields, models + + +class StockLocation(models.Model): + + _inherit = 'stock.location' + + children_ids = fields.Many2many( + 'stock.location', + 'stock_location_children_ids', + 'parent_id', + 'children_id', + compute='_compute_children_ids', + store=True, + help='All the children (multi-level) stock location of this location', + ) + + @api.depends('child_ids', 'child_ids.children_ids') + def _compute_children_ids(self): + for loc in self: + if not loc.child_ids.mapped('child_ids'): + all_children = loc.child_ids + else: + all_children = loc.child_ids | loc.child_ids.children_ids + loc.children_ids = all_children diff --git a/stock_location_children/readme/CONTRIBUTORS.rst b/stock_location_children/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..e31e2f0c4 --- /dev/null +++ b/stock_location_children/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Akim Juillerat diff --git a/stock_location_children/readme/DESCRIPTION.rst b/stock_location_children/readme/DESCRIPTION.rst new file mode 100644 index 000000000..6dd2b549b --- /dev/null +++ b/stock_location_children/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module adds a `children_ids` field on `stock.location` in order to compute +and store all the children for a `stock.location` and not only its first level +children as is the case for `child_ids`. diff --git a/stock_location_children/tests/__init__.py b/stock_location_children/tests/__init__.py new file mode 100644 index 000000000..0bd71126f --- /dev/null +++ b/stock_location_children/tests/__init__.py @@ -0,0 +1 @@ +from . import test_stock_location_children diff --git a/stock_location_children/tests/test_stock_location_children.py b/stock_location_children/tests/test_stock_location_children.py new file mode 100644 index 000000000..12d8af11c --- /dev/null +++ b/stock_location_children/tests/test_stock_location_children.py @@ -0,0 +1,77 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo.tests import SavepointCase + + +class TestStockLocationChildren(SavepointCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + ref = cls.env.ref + cls.stock_input = ref("stock.stock_location_company") + cls.stock_location = ref("stock.stock_location_stock") + cls.stock_shelf_1 = ref("stock.stock_location_components") + cls.stock_shelf_2 = ref("stock.stock_location_14") + cls.stock_shelf_2_refrigerator = ref( + "stock.location_refrigerator_small" + ) + + def test_location_children(self): + self.assertFalse(self.stock_shelf_2_refrigerator.child_ids) + self.assertEqual( + self.stock_shelf_2.child_ids, + self.stock_shelf_2_refrigerator + ) + self.assertEqual( + self.stock_shelf_2.child_ids, + self.stock_shelf_2.children_ids + ) + self.assertFalse(self.stock_shelf_1.child_ids) + self.assertFalse(self.stock_shelf_1.children_ids) + self.assertEqual( + self.stock_location.child_ids, + self.stock_shelf_1 | self.stock_shelf_2 + ) + self.assertEqual( + self.stock_location.children_ids, + self.stock_shelf_1 | self.stock_shelf_2 | self.stock_shelf_2_refrigerator + ) + + def test_create_write_location(self): + refrigerator_drawer = self.env['stock.location'].create({ + 'name': 'Refrigerator drawer', + 'location_id': self.stock_shelf_2_refrigerator.id + }) + self.assertEqual( + self.stock_shelf_2_refrigerator.child_ids, + refrigerator_drawer + ) + self.assertEqual( + self.stock_shelf_2_refrigerator.children_ids, + refrigerator_drawer + ) + self.assertEqual( + self.stock_shelf_2.children_ids, + self.stock_shelf_2_refrigerator | refrigerator_drawer + ) + self.assertEqual( + self.stock_location.children_ids, + self.stock_shelf_1 | self.stock_shelf_2 | + self.stock_shelf_2_refrigerator | refrigerator_drawer + ) + refrigerator_drawer.location_id = self.stock_input + self.assertFalse(self.stock_shelf_2_refrigerator.child_ids) + self.assertEqual( + self.stock_shelf_2.child_ids, + self.stock_shelf_2_refrigerator + ) + self.assertEqual( + self.stock_shelf_2.child_ids, + self.stock_shelf_2.children_ids + ) + self.assertEqual( + self.stock_location.children_ids, + self.stock_shelf_1 | self.stock_shelf_2 | self.stock_shelf_2_refrigerator + )