From f159e23a5be052cfe894216a2a2fcc17094ca154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Fri, 27 Nov 2020 09:32:49 +0100 Subject: [PATCH 1/9] [ADD] stock_archive_constraint: Allows to block archiving products and locations with associated stock.quant or stock.move --- stock_archive_constraint/README.rst | 0 stock_archive_constraint/__init__.py | 3 + stock_archive_constraint/__manifest__.py | 15 ++ stock_archive_constraint/i18n/es.po | 88 +++++++++ .../i18n/stock_archive_constraint.pot | 63 +++++++ stock_archive_constraint/models/__init__.py | 5 + .../models/product_product.py | 52 +++++ .../models/product_template.py | 12 ++ .../models/stock_location.py | 60 ++++++ .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 2 + stock_archive_constraint/readme/USAGE.rst | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes stock_archive_constraint/tests/__init__.py | 4 + .../tests/test_location_archive_constraint.py | 178 ++++++++++++++++++ 15 files changed, 488 insertions(+) create mode 100644 stock_archive_constraint/README.rst create mode 100644 stock_archive_constraint/__init__.py create mode 100644 stock_archive_constraint/__manifest__.py create mode 100644 stock_archive_constraint/i18n/es.po create mode 100644 stock_archive_constraint/i18n/stock_archive_constraint.pot create mode 100644 stock_archive_constraint/models/__init__.py create mode 100644 stock_archive_constraint/models/product_product.py create mode 100644 stock_archive_constraint/models/product_template.py create mode 100644 stock_archive_constraint/models/stock_location.py create mode 100644 stock_archive_constraint/readme/CONTRIBUTORS.rst create mode 100644 stock_archive_constraint/readme/DESCRIPTION.rst create mode 100644 stock_archive_constraint/readme/USAGE.rst create mode 100644 stock_archive_constraint/static/description/icon.png create mode 100644 stock_archive_constraint/tests/__init__.py create mode 100644 stock_archive_constraint/tests/test_location_archive_constraint.py diff --git a/stock_archive_constraint/README.rst b/stock_archive_constraint/README.rst new file mode 100644 index 000000000..e69de29bb diff --git a/stock_archive_constraint/__init__.py b/stock_archive_constraint/__init__.py new file mode 100644 index 000000000..83e553ac4 --- /dev/null +++ b/stock_archive_constraint/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/stock_archive_constraint/__manifest__.py b/stock_archive_constraint/__manifest__.py new file mode 100644 index 000000000..9632f204c --- /dev/null +++ b/stock_archive_constraint/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2020 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Stock archive constraint", + "version": "12.0.1.0.0", + "license": "AGPL-3", + "website": "https://github.com/stock-logistics-warehouse", + "author": "Tecnativa, Odoo Community Association (OCA)", + "development_status": "Production/Stable", + "category": "Warehouse", + "depends": ["stock"], + "installable": True, + "maintainers": ["victoralmau"], +} diff --git a/stock_archive_constraint/i18n/es.po b/stock_archive_constraint/i18n/es.po new file mode 100644 index 000000000..7a95b8cc2 --- /dev/null +++ b/stock_archive_constraint/i18n/es.po @@ -0,0 +1,88 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * stock_archive_constraint +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-01-08 09:03+0000\n" +"PO-Revision-Date: 2021-01-08 10:06+0100\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 2.3\n" + +#. module: stock_archive_constraint +#: model:ir.model,name:stock_archive_constraint.model_stock_location +msgid "Inventory Locations" +msgstr "Ubicaciones de inventario" + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/stock_location.py:41 +#, python-format +msgid "" +"It is not possible to archive location '%s' which has associated picking " +"lines." +msgstr "" +"No es posible archivar la ubicación '%s' que tiene líneas de albaranes " +"asociadas." + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/stock_location.py:24 +#, python-format +msgid "" +"It is not possible to archive location '%s' which has associated stock " +"quantities." +msgstr "" +"No es posible archivar la ubicación '%s' que tiene asociadas cantidades " +"de stock." + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/stock_location.py:58 +#, python-format +msgid "" +"It is not possible to archive location '%s' which has associated stock " +"reservations." +msgstr "" +"No es posible archivar la ubicación '%s' que tiene reservas de stock " +"asociadas." + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/product_product.py:36 +#, python-format +msgid "" +"It is not possible to archive product '%s' which has associated picking " +"lines." +msgstr "" +"No es posible archivar el producto '%s' que tiene líneas de albaranes " +"asociadas." + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/product_product.py:22 +#, python-format +msgid "" +"It is not possible to archive product '%s' which has associated stock " +"quantities." +msgstr "" +"No es posible archivar el producto '%s' que tiene asociadas cantidades " +"de stock." + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/product_product.py:50 +#, python-format +msgid "" +"It is not possible to archive product '%s' which has associated stock " +"reservations." +msgstr "" +"No es posible archivar el producto '%s' que tiene reservas de stock " +"asociadas." + +#. module: stock_archive_constraint +#: model:ir.model,name:stock_archive_constraint.model_product_product +msgid "Product" +msgstr "Producto" diff --git a/stock_archive_constraint/i18n/stock_archive_constraint.pot b/stock_archive_constraint/i18n/stock_archive_constraint.pot new file mode 100644 index 000000000..258a518fc --- /dev/null +++ b/stock_archive_constraint/i18n/stock_archive_constraint.pot @@ -0,0 +1,63 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * stock_archive_constraint +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-01-08 09:03+0000\n" +"PO-Revision-Date: 2021-01-08 09:03+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: stock_archive_constraint +#: model:ir.model,name:stock_archive_constraint.model_stock_location +msgid "Inventory Locations" +msgstr "" + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/stock_location.py:41 +#, python-format +msgid "It is not possible to archive location '%s' which has associated picking lines." +msgstr "" + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/stock_location.py:24 +#, python-format +msgid "It is not possible to archive location '%s' which has associated stock quantities." +msgstr "" + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/stock_location.py:58 +#, python-format +msgid "It is not possible to archive location '%s' which has associated stock reservations." +msgstr "" + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/product_product.py:36 +#, python-format +msgid "It is not possible to archive product '%s' which has associated picking lines." +msgstr "" + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/product_product.py:22 +#, python-format +msgid "It is not possible to archive product '%s' which has associated stock quantities." +msgstr "" + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/product_product.py:50 +#, python-format +msgid "It is not possible to archive product '%s' which has associated stock reservations." +msgstr "" + +#. module: stock_archive_constraint +#: model:ir.model,name:stock_archive_constraint.model_product_product +msgid "Product" +msgstr "" + diff --git a/stock_archive_constraint/models/__init__.py b/stock_archive_constraint/models/__init__.py new file mode 100644 index 000000000..1b6574480 --- /dev/null +++ b/stock_archive_constraint/models/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2020 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import product_product +from . import stock_location diff --git a/stock_archive_constraint/models/product_product.py b/stock_archive_constraint/models/product_product.py new file mode 100644 index 000000000..896b03d1d --- /dev/null +++ b/stock_archive_constraint/models/product_product.py @@ -0,0 +1,52 @@ +# Copyright 2020 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, models +from odoo.exceptions import ValidationError + + +class ProductProduct(models.Model): + _inherit = "product.product" + + @api.constrains("active") + def _check_active_stock_archive_constraint_stock_quant(self): + res = self.env['stock.quant'].search( + [ + ('location_id.usage', 'in', ('internal', 'transit')), + ('product_id', 'in', self.filtered(lambda x: not x.active).ids), + ('quantity', '!=', 0.0) + ], limit=1 + ) + if res: + raise ValidationError( + _("It is not possible to archive product '%s' which has " + "associated stock quantities." % res[0].product_id.display_name) + ) + + @api.constrains("active") + def _check_active_stock_archive_constraint_stock_move(self): + res = self.env['stock.move'].search( + [ + ('product_id', 'in', self.filtered(lambda x: not x.active).ids), + ('state', 'not in', ('done', 'cancel')) + ], limit=1 + ) + if res: + raise ValidationError( + _("It is not possible to archive product '%s' which has " + "associated picking lines." % res[0].product_id.display_name) + ) + + @api.constrains("active") + def _check_active_stock_archive_constraint_stock_move_line(self): + res = self.env['stock.move.line'].search( + [ + ('product_id', 'in', self.filtered(lambda x: not x.active).ids), + ('state', 'not in', ('done', 'cancel')) + ], limit=1 + ) + if res: + raise ValidationError( + _("It is not possible to archive product '%s' which has " + "associated stock reservations." % res[0].product_id.display_name) + ) diff --git a/stock_archive_constraint/models/product_template.py b/stock_archive_constraint/models/product_template.py new file mode 100644 index 000000000..d6813c9f4 --- /dev/null +++ b/stock_archive_constraint/models/product_template.py @@ -0,0 +1,12 @@ +# Copyright 2020 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, models + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + @api.constrains("active") + def _check_active_stock_archive_constraint(self): + self.product_variant_ids._check_active_stock_archive_constraint() diff --git a/stock_archive_constraint/models/stock_location.py b/stock_archive_constraint/models/stock_location.py new file mode 100644 index 000000000..59aea7cbc --- /dev/null +++ b/stock_archive_constraint/models/stock_location.py @@ -0,0 +1,60 @@ +# Copyright 2020 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, models +from odoo.exceptions import ValidationError + + +class StockLocation(models.Model): + _inherit = "stock.location" + + @api.constrains("active") + def _check_active_stock_archive_constraint_stock_quant(self): + res = self.env['stock.quant'].search( + [ + '&', + ('location_id.usage', 'in', ('internal', 'transit')), + '|', + ('location_id', 'in', self.filtered(lambda x: not x.active).ids), + ('location_id', 'child_of', self.filtered(lambda x: not x.active).ids), + ], limit=1 + ) + if res: + raise ValidationError( + _("It is not possible to archive location '%s' which has " + "associated stock quantities." % res[0].display_name) + ) + + @api.constrains("active") + def _check_active_stock_archive_constraint_stock_move(self): + res = self.env['stock.move'].search( + [ + '&', + ('state', 'not in', ('done', 'cancel')), + '|', + ('location_id', 'in', self.filtered(lambda x: not x.active).ids), + ('location_id', 'child_of', self.filtered(lambda x: not x.active).ids) + ], limit=1 + ) + if res: + raise ValidationError( + _("It is not possible to archive location '%s' which has " + "associated picking lines." % res[0].display_name) + ) + + @api.constrains("active") + def _check_active_stock_archive_constraint_stock_move_line(self): + res = self.env['stock.move.line'].search( + [ + '&', + ('state', 'not in', ('done', 'cancel')), + '|', + ('location_id', 'in', self.filtered(lambda x: not x.active).ids), + ('location_id', 'child_of', self.filtered(lambda x: not x.active).ids) + ], limit=1 + ) + if res: + raise ValidationError( + _("It is not possible to archive location '%s' which has " + "associated stock reservations." % res[0].display_name) + ) diff --git a/stock_archive_constraint/readme/CONTRIBUTORS.rst b/stock_archive_constraint/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..48848770a --- /dev/null +++ b/stock_archive_constraint/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `Tecnativa `_: + + * Carlos Daudén + * Víctor Martínez diff --git a/stock_archive_constraint/readme/DESCRIPTION.rst b/stock_archive_constraint/readme/DESCRIPTION.rst new file mode 100644 index 000000000..ccdf56f17 --- /dev/null +++ b/stock_archive_constraint/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +Allows to block archiving products with associated stock.quant or stock.move. +Allows to block archiving locations with associated stock.quant or stock.move. diff --git a/stock_archive_constraint/readme/USAGE.rst b/stock_archive_constraint/readme/USAGE.rst new file mode 100644 index 000000000..240a02124 --- /dev/null +++ b/stock_archive_constraint/readme/USAGE.rst @@ -0,0 +1,2 @@ +#. Go to Settings,> Users> Edit a user and check the "Manage Multiple Stock Locations" permission +#. Go to Inventory> Settings> Locations and disable one diff --git a/stock_archive_constraint/static/description/icon.png b/stock_archive_constraint/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/stock_archive_constraint/tests/__init__.py b/stock_archive_constraint/tests/__init__.py new file mode 100644 index 000000000..6712ad66e --- /dev/null +++ b/stock_archive_constraint/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2020 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from . import test_location_archive_constraint diff --git a/stock_archive_constraint/tests/test_location_archive_constraint.py b/stock_archive_constraint/tests/test_location_archive_constraint.py new file mode 100644 index 000000000..a1ffe4580 --- /dev/null +++ b/stock_archive_constraint/tests/test_location_archive_constraint.py @@ -0,0 +1,178 @@ +# Copyright 2020 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo.tests.common import SavepointCase, Form +from odoo.exceptions import ValidationError + + +class TestLocationArchiveConstraint(SavepointCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.product_1 = cls._create_product(cls, 'Product 1') + cls.product_2 = cls._create_product(cls, 'Product 2') + stock_location_stock = cls.env.ref('stock.stock_location_stock') + cls.stock_location = cls._create_stock_location( + cls, "%s (Copy)" % (stock_location_stock.name) + ) + cls.stock_location_child = cls._create_stock_location( + cls, "%s (Child)" % (cls.stock_location.name) + ) + cls.stock_location_child.location_id = cls.stock_location + + def _create_product(self, name): + product_form = Form(self.env['product.product']) + product_form.name = name + product_form.type = 'product' + return product_form.save() + + def _create_stock_location(self, name): + stock_location_form = Form(self.env['stock.location']) + stock_location_form.name = name + stock_location_form.usage = self.env.ref('stock.stock_location_stock').usage + return stock_location_form.save() + + def _create_stock_inventory(self, location_id, product_id, qty): + stock_inventory_form = Form(self.env['stock.inventory']) + stock_inventory_form.name = 'INV: %s' % product_id.display_name + stock_inventory_form.filter = 'product' + stock_inventory_form.product_id = product_id + stock_inventory_form.location_id = location_id + stock_inventory = stock_inventory_form.save() + stock_inventory.action_start() + for line_id in stock_inventory.line_ids: + line_id.product_qty = qty + stock_inventory.action_validate() + + def _create_stock_move(self, location_id, location_dest_id, product_id, qty): + stock_move_form = Form(self.env['stock.move']) + stock_move_form.name = product_id.display_name + stock_move_form.location_id = location_id + stock_move_form.location_dest_id = location_dest_id + stock_move_form.product_id = product_id + stock_move_form.product_uom_qty = qty + stock_move = stock_move_form.save() + stock_move._action_done() + + def _create_stock_move_line(self, location_id, location_dest_id, product_id, qty): + stock_move_line_form = Form(self.env['stock.move.line']) + stock_move_line_form.location_id = location_id + stock_move_line_form.location_dest_id = location_dest_id + stock_move_line_form.product_id = product_id + stock_move_line_form.product_uom_qty = qty + stock_move_line_form.qty_done = qty + stock_move_line_form.state = 'done' + stock_move_line_form.save() + + def _create_stock_picking(self, location_id, location_dest_id, product_id, qty): + stock_picking_form = Form(self.env['stock.picking']) + stock_picking_form.picking_type_id = self.env.ref('stock.picking_type_in') + with stock_picking_form.move_ids_without_package.new() as line: + line.product_id = product_id + line.product_uom_qty = qty + stock_picking = stock_picking_form.save() + stock_picking.write({ + 'location_id': location_id.id, + 'location_dest_id': location_dest_id.id, + }) + stock_picking.action_confirm() + for line in stock_picking.move_ids_without_package: + line.quantity_done = line.product_uom_qty + stock_picking.button_validate() + + def test_archive_product_ok(self): + self.product_1.active = False + self.assertFalse(self.product_1.active) + self.product_2.active = False + self.assertFalse(self.product_2.active) + + def test_archive_unarchive_product(self): + self.product_1.active = False + self.assertFalse(self.product_1.active) + self.product_1.active = True + self.assertTrue(self.product_1.active) + + def test_archive_product_with_stock_move_in(self): + self._create_stock_move( + self.env.ref('stock.stock_location_suppliers'), + self.stock_location, self.product_2, 20.00 + ) + self.product_1.active = False + self.assertFalse(self.product_1.active) + with self.assertRaises(ValidationError): + self.product_2.active = False + + def test_archive_product_with_stock_move_line_in(self): + self._create_stock_move_line( + self.env.ref('stock.stock_location_suppliers'), + self.stock_location, self.product_2, 20.00 + ) + self.product_1.active = False + self.assertFalse(self.product_1.active) + with self.assertRaises(ValidationError): + self.product_2.active = False + + def test_archive_product_with_stock_picking_in(self): + self._create_stock_picking( + self.env.ref('stock.stock_location_suppliers'), + self.stock_location, self.product_2, 20.00 + ) + self.product_1.active = False + self.assertFalse(self.product_1.active) + with self.assertRaises(ValidationError): + self.product_2.active = False + + def test_archive_product_with_stock_picking_in_out(self): + self._create_stock_picking( + self.env.ref('stock.stock_location_suppliers'), + self.stock_location, self.product_2, 20.00 + ) + self._create_stock_picking( + self.stock_location, + self.env.ref('stock.stock_location_customers'), self.product_2, 20.00 + ) + self.product_1.active = False + self.assertFalse(self.product_1.active) + self.product_2.active = False + self.assertFalse(self.product_2.active) + + def test_archive_product_stock_location(self): + self._create_stock_inventory(self.stock_location, self.product_2, 20.00) + self.product_1.active = False + self.assertFalse(self.product_1.active) + with self.assertRaises(ValidationError): + self.product_2.active = False + + def test_archive_product_stock_location_child(self): + self._create_stock_inventory(self.stock_location_child, self.product_2, 20.00) + self.product_1.active = False + self.assertFalse(self.product_1.active) + with self.assertRaises(ValidationError): + self.product_2.active = False + + def test_archive_unarchive_stock_location(self): + self.stock_location.active = False + self.assertFalse(self.stock_location.active) + self.stock_location.active = True + self.assertTrue(self.stock_location.active) + + def test_archive_stock_location_ok(self): + self.stock_location.active = False + self.assertFalse(self.stock_location.active) + + def test_archive_stock_location(self): + self._create_stock_inventory(self.stock_location, self.product_2, 20.00) + with self.assertRaises(ValidationError): + self.stock_location.active = False + + def test_archive_unarchive_stock_location_child(self): + self.stock_location_child.active = False + self.assertFalse(self.stock_location_child.active) + self.stock_location_child.active = True + self.assertTrue(self.stock_location_child.active) + + def test_archive_stock_location_child(self): + self._create_stock_inventory(self.stock_location_child, self.product_2, 20.00) + with self.assertRaises(ValidationError): + self.stock_location.active = False From c3e68e42c894c3dd003bb08f2395c907e386a0ee Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 20 Jan 2021 15:36:37 +0000 Subject: [PATCH 2/9] [UPD] Update stock_archive_constraint.pot --- stock_archive_constraint/i18n/stock_archive_constraint.pot | 2 -- 1 file changed, 2 deletions(-) diff --git a/stock_archive_constraint/i18n/stock_archive_constraint.pot b/stock_archive_constraint/i18n/stock_archive_constraint.pot index 258a518fc..72b3e4f56 100644 --- a/stock_archive_constraint/i18n/stock_archive_constraint.pot +++ b/stock_archive_constraint/i18n/stock_archive_constraint.pot @@ -6,8 +6,6 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-08 09:03+0000\n" -"PO-Revision-Date: 2021-01-08 09:03+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" From ef8357a62c427bdc9e4e550a242c795c810428e3 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 20 Jan 2021 16:41:43 +0000 Subject: [PATCH 3/9] [UPD] README.rst --- stock_archive_constraint/README.rst | 91 ++++ .../static/description/index.html | 437 ++++++++++++++++++ 2 files changed, 528 insertions(+) create mode 100644 stock_archive_constraint/static/description/index.html diff --git a/stock_archive_constraint/README.rst b/stock_archive_constraint/README.rst index e69de29bb..8bdac895a 100644 --- a/stock_archive_constraint/README.rst +++ b/stock_archive_constraint/README.rst @@ -0,0 +1,91 @@ +======================== +Stock archive constraint +======================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github + :target: https://github.com/OCA/stock-logistics-warehouse/tree/12.0/stock_archive_constraint + :alt: OCA/stock-logistics-warehouse +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-12-0/stock-logistics-warehouse-12-0-stock_archive_constraint + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/153/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Allows to block archiving products with associated stock.quant or stock.move. +Allows to block archiving locations with associated stock.quant or stock.move. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +#. Go to Settings,> Users> Edit a user and check the "Manage Multiple Stock Locations" permission +#. Go to Inventory> Settings> Locations and disable one + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_: + + * Carlos Daudén + * Víctor Martínez + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_archive_constraint/static/description/index.html b/stock_archive_constraint/static/description/index.html new file mode 100644 index 000000000..b4ccce537 --- /dev/null +++ b/stock_archive_constraint/static/description/index.html @@ -0,0 +1,437 @@ + + + + + + +Stock archive constraint + + + +
+

Stock archive constraint

+ + +

Production/Stable License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

+

Allows to block archiving products with associated stock.quant or stock.move. +Allows to block archiving locations with associated stock.quant or stock.move.

+

Table of contents

+ +
+

Usage

+
    +
  1. Go to Settings,> Users> Edit a user and check the “Manage Multiple Stock Locations” permission
  2. +
  3. Go to Inventory> Settings> Locations and disable one
  4. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:

    +
    +
      +
    • Carlos Daudén
    • +
    • Víctor Martínez
    • +
    +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

victoralmau

+

This module is part of the OCA/stock-logistics-warehouse project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From 55b491e3aff26c847c72f30840dde4496404c551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Thu, 21 Jan 2021 08:05:05 +0100 Subject: [PATCH 4/9] [IMP] stock_archive_constraint: black, isort, prettier --- .../models/product_product.py | 47 +++++++------ .../models/stock_location.py | 63 +++++++++-------- .../tests/test_location_archive_constraint.py | 68 +++++++++++-------- 3 files changed, 102 insertions(+), 76 deletions(-) diff --git a/stock_archive_constraint/models/product_product.py b/stock_archive_constraint/models/product_product.py index 896b03d1d..d639e8c5e 100644 --- a/stock_archive_constraint/models/product_product.py +++ b/stock_archive_constraint/models/product_product.py @@ -10,43 +10,52 @@ class ProductProduct(models.Model): @api.constrains("active") def _check_active_stock_archive_constraint_stock_quant(self): - res = self.env['stock.quant'].search( + res = self.env["stock.quant"].search( [ - ('location_id.usage', 'in', ('internal', 'transit')), - ('product_id', 'in', self.filtered(lambda x: not x.active).ids), - ('quantity', '!=', 0.0) - ], limit=1 + ("location_id.usage", "in", ("internal", "transit")), + ("product_id", "in", self.filtered(lambda x: not x.active).ids), + ("quantity", "!=", 0.0), + ], + limit=1, ) if res: raise ValidationError( - _("It is not possible to archive product '%s' which has " - "associated stock quantities." % res[0].product_id.display_name) + _( + "It is not possible to archive product '%s' which has " + "associated stock quantities." % res[0].product_id.display_name + ) ) @api.constrains("active") def _check_active_stock_archive_constraint_stock_move(self): - res = self.env['stock.move'].search( + res = self.env["stock.move"].search( [ - ('product_id', 'in', self.filtered(lambda x: not x.active).ids), - ('state', 'not in', ('done', 'cancel')) - ], limit=1 + ("product_id", "in", self.filtered(lambda x: not x.active).ids), + ("state", "not in", ("done", "cancel")), + ], + limit=1, ) if res: raise ValidationError( - _("It is not possible to archive product '%s' which has " - "associated picking lines." % res[0].product_id.display_name) + _( + "It is not possible to archive product '%s' which has " + "associated picking lines." % res[0].product_id.display_name + ) ) @api.constrains("active") def _check_active_stock_archive_constraint_stock_move_line(self): - res = self.env['stock.move.line'].search( + res = self.env["stock.move.line"].search( [ - ('product_id', 'in', self.filtered(lambda x: not x.active).ids), - ('state', 'not in', ('done', 'cancel')) - ], limit=1 + ("product_id", "in", self.filtered(lambda x: not x.active).ids), + ("state", "not in", ("done", "cancel")), + ], + limit=1, ) if res: raise ValidationError( - _("It is not possible to archive product '%s' which has " - "associated stock reservations." % res[0].product_id.display_name) + _( + "It is not possible to archive product '%s' which has " + "associated stock reservations." % res[0].product_id.display_name + ) ) diff --git a/stock_archive_constraint/models/stock_location.py b/stock_archive_constraint/models/stock_location.py index 59aea7cbc..3152db12f 100644 --- a/stock_archive_constraint/models/stock_location.py +++ b/stock_archive_constraint/models/stock_location.py @@ -10,51 +10,60 @@ class StockLocation(models.Model): @api.constrains("active") def _check_active_stock_archive_constraint_stock_quant(self): - res = self.env['stock.quant'].search( + res = self.env["stock.quant"].search( [ - '&', - ('location_id.usage', 'in', ('internal', 'transit')), - '|', - ('location_id', 'in', self.filtered(lambda x: not x.active).ids), - ('location_id', 'child_of', self.filtered(lambda x: not x.active).ids), - ], limit=1 + "&", + ("location_id.usage", "in", ("internal", "transit")), + "|", + ("location_id", "in", self.filtered(lambda x: not x.active).ids), + ("location_id", "child_of", self.filtered(lambda x: not x.active).ids), + ], + limit=1, ) if res: raise ValidationError( - _("It is not possible to archive location '%s' which has " - "associated stock quantities." % res[0].display_name) + _( + "It is not possible to archive location '%s' which has " + "associated stock quantities." % res[0].display_name + ) ) @api.constrains("active") def _check_active_stock_archive_constraint_stock_move(self): - res = self.env['stock.move'].search( + res = self.env["stock.move"].search( [ - '&', - ('state', 'not in', ('done', 'cancel')), - '|', - ('location_id', 'in', self.filtered(lambda x: not x.active).ids), - ('location_id', 'child_of', self.filtered(lambda x: not x.active).ids) - ], limit=1 + "&", + ("state", "not in", ("done", "cancel")), + "|", + ("location_id", "in", self.filtered(lambda x: not x.active).ids), + ("location_id", "child_of", self.filtered(lambda x: not x.active).ids), + ], + limit=1, ) if res: raise ValidationError( - _("It is not possible to archive location '%s' which has " - "associated picking lines." % res[0].display_name) + _( + "It is not possible to archive location '%s' which has " + "associated picking lines." % res[0].display_name + ) ) @api.constrains("active") def _check_active_stock_archive_constraint_stock_move_line(self): - res = self.env['stock.move.line'].search( + res = self.env["stock.move.line"].search( [ - '&', - ('state', 'not in', ('done', 'cancel')), - '|', - ('location_id', 'in', self.filtered(lambda x: not x.active).ids), - ('location_id', 'child_of', self.filtered(lambda x: not x.active).ids) - ], limit=1 + "&", + ("state", "not in", ("done", "cancel")), + "|", + ("location_id", "in", self.filtered(lambda x: not x.active).ids), + ("location_id", "child_of", self.filtered(lambda x: not x.active).ids), + ], + limit=1, ) if res: raise ValidationError( - _("It is not possible to archive location '%s' which has " - "associated stock reservations." % res[0].display_name) + _( + "It is not possible to archive location '%s' which has " + "associated stock reservations." % res[0].display_name + ) ) diff --git a/stock_archive_constraint/tests/test_location_archive_constraint.py b/stock_archive_constraint/tests/test_location_archive_constraint.py index a1ffe4580..3298732b2 100644 --- a/stock_archive_constraint/tests/test_location_archive_constraint.py +++ b/stock_archive_constraint/tests/test_location_archive_constraint.py @@ -1,18 +1,17 @@ # Copyright 2020 Tecnativa - Víctor Martínez # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from odoo.tests.common import SavepointCase, Form from odoo.exceptions import ValidationError +from odoo.tests.common import Form, SavepointCase class TestLocationArchiveConstraint(SavepointCase): - @classmethod def setUpClass(cls): super().setUpClass() - cls.product_1 = cls._create_product(cls, 'Product 1') - cls.product_2 = cls._create_product(cls, 'Product 2') - stock_location_stock = cls.env.ref('stock.stock_location_stock') + cls.product_1 = cls._create_product(cls, "Product 1") + cls.product_2 = cls._create_product(cls, "Product 2") + stock_location_stock = cls.env.ref("stock.stock_location_stock") cls.stock_location = cls._create_stock_location( cls, "%s (Copy)" % (stock_location_stock.name) ) @@ -22,21 +21,21 @@ class TestLocationArchiveConstraint(SavepointCase): cls.stock_location_child.location_id = cls.stock_location def _create_product(self, name): - product_form = Form(self.env['product.product']) + product_form = Form(self.env["product.product"]) product_form.name = name - product_form.type = 'product' + product_form.type = "product" return product_form.save() def _create_stock_location(self, name): - stock_location_form = Form(self.env['stock.location']) + stock_location_form = Form(self.env["stock.location"]) stock_location_form.name = name - stock_location_form.usage = self.env.ref('stock.stock_location_stock').usage + stock_location_form.usage = self.env.ref("stock.stock_location_stock").usage return stock_location_form.save() def _create_stock_inventory(self, location_id, product_id, qty): - stock_inventory_form = Form(self.env['stock.inventory']) - stock_inventory_form.name = 'INV: %s' % product_id.display_name - stock_inventory_form.filter = 'product' + stock_inventory_form = Form(self.env["stock.inventory"]) + stock_inventory_form.name = "INV: %s" % product_id.display_name + stock_inventory_form.filter = "product" stock_inventory_form.product_id = product_id stock_inventory_form.location_id = location_id stock_inventory = stock_inventory_form.save() @@ -46,7 +45,7 @@ class TestLocationArchiveConstraint(SavepointCase): stock_inventory.action_validate() def _create_stock_move(self, location_id, location_dest_id, product_id, qty): - stock_move_form = Form(self.env['stock.move']) + stock_move_form = Form(self.env["stock.move"]) stock_move_form.name = product_id.display_name stock_move_form.location_id = location_id stock_move_form.location_dest_id = location_dest_id @@ -56,26 +55,25 @@ class TestLocationArchiveConstraint(SavepointCase): stock_move._action_done() def _create_stock_move_line(self, location_id, location_dest_id, product_id, qty): - stock_move_line_form = Form(self.env['stock.move.line']) + stock_move_line_form = Form(self.env["stock.move.line"]) stock_move_line_form.location_id = location_id stock_move_line_form.location_dest_id = location_dest_id stock_move_line_form.product_id = product_id stock_move_line_form.product_uom_qty = qty stock_move_line_form.qty_done = qty - stock_move_line_form.state = 'done' + stock_move_line_form.state = "done" stock_move_line_form.save() def _create_stock_picking(self, location_id, location_dest_id, product_id, qty): - stock_picking_form = Form(self.env['stock.picking']) - stock_picking_form.picking_type_id = self.env.ref('stock.picking_type_in') + stock_picking_form = Form(self.env["stock.picking"]) + stock_picking_form.picking_type_id = self.env.ref("stock.picking_type_in") with stock_picking_form.move_ids_without_package.new() as line: line.product_id = product_id line.product_uom_qty = qty stock_picking = stock_picking_form.save() - stock_picking.write({ - 'location_id': location_id.id, - 'location_dest_id': location_dest_id.id, - }) + stock_picking.write( + {"location_id": location_id.id, "location_dest_id": location_dest_id.id} + ) stock_picking.action_confirm() for line in stock_picking.move_ids_without_package: line.quantity_done = line.product_uom_qty @@ -95,8 +93,10 @@ class TestLocationArchiveConstraint(SavepointCase): def test_archive_product_with_stock_move_in(self): self._create_stock_move( - self.env.ref('stock.stock_location_suppliers'), - self.stock_location, self.product_2, 20.00 + self.env.ref("stock.stock_location_suppliers"), + self.stock_location, + self.product_2, + 20.00, ) self.product_1.active = False self.assertFalse(self.product_1.active) @@ -105,8 +105,10 @@ class TestLocationArchiveConstraint(SavepointCase): def test_archive_product_with_stock_move_line_in(self): self._create_stock_move_line( - self.env.ref('stock.stock_location_suppliers'), - self.stock_location, self.product_2, 20.00 + self.env.ref("stock.stock_location_suppliers"), + self.stock_location, + self.product_2, + 20.00, ) self.product_1.active = False self.assertFalse(self.product_1.active) @@ -115,8 +117,10 @@ class TestLocationArchiveConstraint(SavepointCase): def test_archive_product_with_stock_picking_in(self): self._create_stock_picking( - self.env.ref('stock.stock_location_suppliers'), - self.stock_location, self.product_2, 20.00 + self.env.ref("stock.stock_location_suppliers"), + self.stock_location, + self.product_2, + 20.00, ) self.product_1.active = False self.assertFalse(self.product_1.active) @@ -125,12 +129,16 @@ class TestLocationArchiveConstraint(SavepointCase): def test_archive_product_with_stock_picking_in_out(self): self._create_stock_picking( - self.env.ref('stock.stock_location_suppliers'), - self.stock_location, self.product_2, 20.00 + self.env.ref("stock.stock_location_suppliers"), + self.stock_location, + self.product_2, + 20.00, ) self._create_stock_picking( self.stock_location, - self.env.ref('stock.stock_location_customers'), self.product_2, 20.00 + self.env.ref("stock.stock_location_customers"), + self.product_2, + 20.00, ) self.product_1.active = False self.assertFalse(self.product_1.active) From e2e5d7ed1d00fef2834cbd0cb55b76e8c97b726f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Thu, 21 Jan 2021 08:06:14 +0100 Subject: [PATCH 5/9] [MIG] stock_archive_constraint: Migration to 13.0 --- stock_archive_constraint/README.rst | 4 +- stock_archive_constraint/__manifest__.py | 2 +- stock_archive_constraint/readme/USAGE.rst | 4 +- .../tests/test_location_archive_constraint.py | 55 ++++++++++--------- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/stock_archive_constraint/README.rst b/stock_archive_constraint/README.rst index 8bdac895a..15145bdcb 100644 --- a/stock_archive_constraint/README.rst +++ b/stock_archive_constraint/README.rst @@ -36,8 +36,8 @@ Allows to block archiving locations with associated stock.quant or stock.move. Usage ===== -#. Go to Settings,> Users> Edit a user and check the "Manage Multiple Stock Locations" permission -#. Go to Inventory> Settings> Locations and disable one +#. Go to Settings > Users > Edit a user and check the "Manage Multiple Stock Locations" permission +#. Go to Inventory > Settings > Locations and disable one Bug Tracker =========== diff --git a/stock_archive_constraint/__manifest__.py b/stock_archive_constraint/__manifest__.py index 9632f204c..3b9806b86 100644 --- a/stock_archive_constraint/__manifest__.py +++ b/stock_archive_constraint/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock archive constraint", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "license": "AGPL-3", "website": "https://github.com/stock-logistics-warehouse", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/stock_archive_constraint/readme/USAGE.rst b/stock_archive_constraint/readme/USAGE.rst index 240a02124..65f800d9d 100644 --- a/stock_archive_constraint/readme/USAGE.rst +++ b/stock_archive_constraint/readme/USAGE.rst @@ -1,2 +1,2 @@ -#. Go to Settings,> Users> Edit a user and check the "Manage Multiple Stock Locations" permission -#. Go to Inventory> Settings> Locations and disable one +#. Go to Settings > Users > Edit a user and check the "Manage Multiple Stock Locations" permission +#. Go to Inventory > Settings > Locations and disable one diff --git a/stock_archive_constraint/tests/test_location_archive_constraint.py b/stock_archive_constraint/tests/test_location_archive_constraint.py index 3298732b2..9b1f25dbb 100644 --- a/stock_archive_constraint/tests/test_location_archive_constraint.py +++ b/stock_archive_constraint/tests/test_location_archive_constraint.py @@ -1,4 +1,4 @@ -# Copyright 2020 Tecnativa - Víctor Martínez +# Copyright 2021 Tecnativa - Víctor Martínez # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo.exceptions import ValidationError @@ -9,6 +9,7 @@ class TestLocationArchiveConstraint(SavepointCase): @classmethod def setUpClass(cls): super().setUpClass() + cls.company = cls.env.ref("base.main_company") cls.product_1 = cls._create_product(cls, "Product 1") cls.product_2 = cls._create_product(cls, "Product 2") stock_location_stock = cls.env.ref("stock.stock_location_stock") @@ -32,17 +33,15 @@ class TestLocationArchiveConstraint(SavepointCase): stock_location_form.usage = self.env.ref("stock.stock_location_stock").usage return stock_location_form.save() - def _create_stock_inventory(self, location_id, product_id, qty): - stock_inventory_form = Form(self.env["stock.inventory"]) - stock_inventory_form.name = "INV: %s" % product_id.display_name - stock_inventory_form.filter = "product" - stock_inventory_form.product_id = product_id - stock_inventory_form.location_id = location_id - stock_inventory = stock_inventory_form.save() - stock_inventory.action_start() - for line_id in stock_inventory.line_ids: - line_id.product_qty = qty - stock_inventory.action_validate() + def _create_stock_quant(self, location_id, product_id, qty): + self.env["stock.quant"].create( + { + "company_id": self.company.id, + "location_id": location_id.id, + "product_id": product_id.id, + "quantity": qty, + } + ) def _create_stock_move(self, location_id, location_dest_id, product_id, qty): stock_move_form = Form(self.env["stock.move"]) @@ -55,14 +54,18 @@ class TestLocationArchiveConstraint(SavepointCase): stock_move._action_done() def _create_stock_move_line(self, location_id, location_dest_id, product_id, qty): - stock_move_line_form = Form(self.env["stock.move.line"]) - stock_move_line_form.location_id = location_id - stock_move_line_form.location_dest_id = location_dest_id - stock_move_line_form.product_id = product_id - stock_move_line_form.product_uom_qty = qty - stock_move_line_form.qty_done = qty - stock_move_line_form.state = "done" - stock_move_line_form.save() + self.env["stock.move.line"].create( + { + "company_id": self.company.id, + "location_id": location_id.id, + "location_dest_id": location_dest_id.id, + "product_id": product_id.id, + "product_uom_qty": qty, + "product_uom_id": product_id.uom_id.id, + "qty_done": qty, + "state": "done", + } + ) def _create_stock_picking(self, location_id, location_dest_id, product_id, qty): stock_picking_form = Form(self.env["stock.picking"]) @@ -146,14 +149,14 @@ class TestLocationArchiveConstraint(SavepointCase): self.assertFalse(self.product_2.active) def test_archive_product_stock_location(self): - self._create_stock_inventory(self.stock_location, self.product_2, 20.00) + self._create_stock_quant(self.stock_location, self.product_2, 20.00) self.product_1.active = False self.assertFalse(self.product_1.active) with self.assertRaises(ValidationError): self.product_2.active = False def test_archive_product_stock_location_child(self): - self._create_stock_inventory(self.stock_location_child, self.product_2, 20.00) + self._create_stock_quant(self.stock_location_child, self.product_2, 20.00) self.product_1.active = False self.assertFalse(self.product_1.active) with self.assertRaises(ValidationError): @@ -170,9 +173,9 @@ class TestLocationArchiveConstraint(SavepointCase): self.assertFalse(self.stock_location.active) def test_archive_stock_location(self): - self._create_stock_inventory(self.stock_location, self.product_2, 20.00) + self._create_stock_quant(self.stock_location, self.product_2, 20.00) with self.assertRaises(ValidationError): - self.stock_location.active = False + self.stock_location.with_context(do_not_check_quant=True).active = False def test_archive_unarchive_stock_location_child(self): self.stock_location_child.active = False @@ -181,6 +184,6 @@ class TestLocationArchiveConstraint(SavepointCase): self.assertTrue(self.stock_location_child.active) def test_archive_stock_location_child(self): - self._create_stock_inventory(self.stock_location_child, self.product_2, 20.00) + self._create_stock_quant(self.stock_location_child, self.product_2, 20.00) with self.assertRaises(ValidationError): - self.stock_location.active = False + self.stock_location.with_context(do_not_check_quant=True).active = False From 90e97cf4e04cc3c804596cbc4eacf6cbd4e5cd20 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 15 Feb 2021 14:01:16 +0000 Subject: [PATCH 6/9] [UPD] Update stock_archive_constraint.pot --- .../i18n/stock_archive_constraint.pot | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/stock_archive_constraint/i18n/stock_archive_constraint.pot b/stock_archive_constraint/i18n/stock_archive_constraint.pot index 72b3e4f56..c3f58e531 100644 --- a/stock_archive_constraint/i18n/stock_archive_constraint.pot +++ b/stock_archive_constraint/i18n/stock_archive_constraint.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * stock_archive_constraint +# * stock_archive_constraint # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,43 +19,54 @@ msgid "Inventory Locations" msgstr "" #. module: stock_archive_constraint -#: code:addons/stock_archive_constraint/models/stock_location.py:41 +#: code:addons/stock_archive_constraint/models/stock_location.py:0 #, python-format -msgid "It is not possible to archive location '%s' which has associated picking lines." +msgid "" +"It is not possible to archive location '%s' which has associated picking " +"lines." msgstr "" #. module: stock_archive_constraint -#: code:addons/stock_archive_constraint/models/stock_location.py:24 +#: code:addons/stock_archive_constraint/models/stock_location.py:0 #, python-format -msgid "It is not possible to archive location '%s' which has associated stock quantities." +msgid "" +"It is not possible to archive location '%s' which has associated stock " +"quantities." msgstr "" #. module: stock_archive_constraint -#: code:addons/stock_archive_constraint/models/stock_location.py:58 +#: code:addons/stock_archive_constraint/models/stock_location.py:0 #, python-format -msgid "It is not possible to archive location '%s' which has associated stock reservations." +msgid "" +"It is not possible to archive location '%s' which has associated stock " +"reservations." msgstr "" #. module: stock_archive_constraint -#: code:addons/stock_archive_constraint/models/product_product.py:36 +#: code:addons/stock_archive_constraint/models/product_product.py:0 #, python-format -msgid "It is not possible to archive product '%s' which has associated picking lines." +msgid "" +"It is not possible to archive product '%s' which has associated picking " +"lines." msgstr "" #. module: stock_archive_constraint -#: code:addons/stock_archive_constraint/models/product_product.py:22 +#: code:addons/stock_archive_constraint/models/product_product.py:0 #, python-format -msgid "It is not possible to archive product '%s' which has associated stock quantities." +msgid "" +"It is not possible to archive product '%s' which has associated stock " +"quantities." msgstr "" #. module: stock_archive_constraint -#: code:addons/stock_archive_constraint/models/product_product.py:50 +#: code:addons/stock_archive_constraint/models/product_product.py:0 #, python-format -msgid "It is not possible to archive product '%s' which has associated stock reservations." +msgid "" +"It is not possible to archive product '%s' which has associated stock " +"reservations." msgstr "" #. module: stock_archive_constraint #: model:ir.model,name:stock_archive_constraint.model_product_product msgid "Product" msgstr "" - From 2d2016c1b0b44ead2fcca3fa2dab2fc33fc8100d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 15 Feb 2021 14:38:04 +0000 Subject: [PATCH 7/9] [UPD] README.rst --- stock_archive_constraint/README.rst | 10 +++++----- stock_archive_constraint/static/description/index.html | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/stock_archive_constraint/README.rst b/stock_archive_constraint/README.rst index 15145bdcb..eddc13a84 100644 --- a/stock_archive_constraint/README.rst +++ b/stock_archive_constraint/README.rst @@ -14,13 +14,13 @@ Stock archive constraint :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github - :target: https://github.com/OCA/stock-logistics-warehouse/tree/12.0/stock_archive_constraint + :target: https://github.com/OCA/stock-logistics-warehouse/tree/13.0/stock_archive_constraint :alt: OCA/stock-logistics-warehouse .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-12-0/stock-logistics-warehouse-12-0-stock_archive_constraint + :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-13-0/stock-logistics-warehouse-13-0-stock_archive_constraint :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/153/12.0 + :target: https://runbot.odoo-community.org/runbot/153/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,7 +45,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -86,6 +86,6 @@ Current `maintainer `__: |maintainer-victoralmau| -This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub. +This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_archive_constraint/static/description/index.html b/stock_archive_constraint/static/description/index.html index b4ccce537..ba4b0f795 100644 --- a/stock_archive_constraint/static/description/index.html +++ b/stock_archive_constraint/static/description/index.html @@ -367,7 +367,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Production/Stable License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

+

Production/Stable License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runbot

Allows to block archiving products with associated stock.quant or stock.move. Allows to block archiving locations with associated stock.quant or stock.move.

Table of contents

@@ -386,8 +386,8 @@ Allows to block archiving locations with associated stock.quant or stock.move.

Usage

    -
  1. Go to Settings,> Users> Edit a user and check the “Manage Multiple Stock Locations” permission
  2. -
  3. Go to Inventory> Settings> Locations and disable one
  4. +
  5. Go to Settings > Users > Edit a user and check the “Manage Multiple Stock Locations” permission
  6. +
  7. Go to Inventory > Settings > Locations and disable one
@@ -395,7 +395,7 @@ Allows to block archiving locations with associated stock.quant or stock.move.Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -428,7 +428,7 @@ mission is to support the collaborative development of Odoo features and promote its widespread use.

Current maintainer:

victoralmau

-

This module is part of the OCA/stock-logistics-warehouse project on GitHub.

+

This module is part of the OCA/stock-logistics-warehouse project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From 88ae9bc1d70d83c053f79418b4d8264cd2b3b166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=A7al=20Isern?= Date: Thu, 12 Aug 2021 15:20:51 +0200 Subject: [PATCH 8/9] [IMP] stock_archive_constraint: black, isort, prettier --- .../odoo/addons/stock_archive_constraint | 1 + setup/stock_archive_constraint/setup.py | 6 ++++++ stock_archive_constraint/__manifest__.py | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) create mode 120000 setup/stock_archive_constraint/odoo/addons/stock_archive_constraint create mode 100644 setup/stock_archive_constraint/setup.py diff --git a/setup/stock_archive_constraint/odoo/addons/stock_archive_constraint b/setup/stock_archive_constraint/odoo/addons/stock_archive_constraint new file mode 120000 index 000000000..06320188a --- /dev/null +++ b/setup/stock_archive_constraint/odoo/addons/stock_archive_constraint @@ -0,0 +1 @@ +../../../../stock_archive_constraint \ No newline at end of file diff --git a/setup/stock_archive_constraint/setup.py b/setup/stock_archive_constraint/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/stock_archive_constraint/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/stock_archive_constraint/__manifest__.py b/stock_archive_constraint/__manifest__.py index 3b9806b86..549ff4b8d 100644 --- a/stock_archive_constraint/__manifest__.py +++ b/stock_archive_constraint/__manifest__.py @@ -5,7 +5,7 @@ "name": "Stock archive constraint", "version": "13.0.1.0.0", "license": "AGPL-3", - "website": "https://github.com/stock-logistics-warehouse", + "website": "https://github.com/OCA/stock-logistics-warehouse", "author": "Tecnativa, Odoo Community Association (OCA)", "development_status": "Production/Stable", "category": "Warehouse", From e758ae942046a11d91a3a1bb7b608239c085cea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=A7al=20Isern?= Date: Thu, 12 Aug 2021 15:45:59 +0200 Subject: [PATCH 9/9] [MIG] stock_archive_constraint: Migration to 14.0 --- stock_archive_constraint/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock_archive_constraint/__manifest__.py b/stock_archive_constraint/__manifest__.py index 549ff4b8d..3bbd429bd 100644 --- a/stock_archive_constraint/__manifest__.py +++ b/stock_archive_constraint/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock archive constraint", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "license": "AGPL-3", "website": "https://github.com/OCA/stock-logistics-warehouse", "author": "Tecnativa, Odoo Community Association (OCA)",