From 93c0e49a127421a86bd308e9dae11a3fa49056e9 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 01/11] [ADD] stock_archive_constraint: Allows to block archiving products and locations with associated stock.quant or stock.move --- stock_archive_constraint/README.rst | 91 ++++ stock_archive_constraint/__init__.py | 3 + stock_archive_constraint/__manifest__.py | 15 + stock_archive_constraint/i18n/es.po | 88 ++++ .../i18n/stock_archive_constraint.pot | 61 +++ 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 .../static/description/index.html | 437 ++++++++++++++++++ stock_archive_constraint/tests/__init__.py | 4 + .../tests/test_location_archive_constraint.py | 178 +++++++ 16 files changed, 1014 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/static/description/index.html 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..8bdac895a --- /dev/null +++ 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/__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..72b3e4f56 --- /dev/null +++ b/stock_archive_constraint/i18n/stock_archive_constraint.pot @@ -0,0 +1,61 @@ +# 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" +"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/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.

+
+
+
+ + 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 d3e8adca586c0eb018da6825248cdf6aeb00bc2e 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 02/11] [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 634946101b4aef5318fc55cb5c90b9229e40a334 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 03/11] [MIG] stock_archive_constraint: Migration to 13.0 --- stock_archive_constraint/README.rst | 14 ++--- stock_archive_constraint/__manifest__.py | 2 +- .../i18n/stock_archive_constraint.pot | 43 +++++++++------ stock_archive_constraint/readme/USAGE.rst | 4 +- .../static/description/index.html | 10 ++-- .../tests/test_location_archive_constraint.py | 55 ++++++++++--------- 6 files changed, 71 insertions(+), 57 deletions(-) diff --git a/stock_archive_constraint/README.rst b/stock_archive_constraint/README.rst index 8bdac895a..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| @@ -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 =========== @@ -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/__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/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 "" - 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/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.

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 cf73ba7754185b5e29838bbe78a0e05e8d336192 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 04/11] [IMP] stock_archive_constraint: black, isort, prettier --- 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 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 c48c667ae6076a7ca758b82b21dc633eeb6c38b4 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 05/11] [MIG] stock_archive_constraint: Migration to 14.0 --- stock_archive_constraint/README.rst | 10 +++++----- stock_archive_constraint/__manifest__.py | 2 +- .../i18n/stock_archive_constraint.pot | 20 ++++++++++++++++++- .../static/description/index.html | 6 +++--- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/stock_archive_constraint/README.rst b/stock_archive_constraint/README.rst index eddc13a84..3d18471de 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/13.0/stock_archive_constraint + :target: https://github.com/OCA/stock-logistics-warehouse/tree/14.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-13-0/stock-logistics-warehouse-13-0-stock_archive_constraint + :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-14-0/stock-logistics-warehouse-14-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/13.0 + :target: https://runbot.odoo-community.org/runbot/153/14.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/__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)", diff --git a/stock_archive_constraint/i18n/stock_archive_constraint.pot b/stock_archive_constraint/i18n/stock_archive_constraint.pot index c3f58e531..c75e5e81e 100644 --- a/stock_archive_constraint/i18n/stock_archive_constraint.pot +++ b/stock_archive_constraint/i18n/stock_archive_constraint.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,6 +13,18 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: stock_archive_constraint +#: model:ir.model.fields,field_description:stock_archive_constraint.field_product_product__display_name +#: model:ir.model.fields,field_description:stock_archive_constraint.field_stock_location__display_name +msgid "Display Name" +msgstr "" + +#. module: stock_archive_constraint +#: model:ir.model.fields,field_description:stock_archive_constraint.field_product_product__id +#: model:ir.model.fields,field_description:stock_archive_constraint.field_stock_location__id +msgid "ID" +msgstr "" + #. module: stock_archive_constraint #: model:ir.model,name:stock_archive_constraint.model_stock_location msgid "Inventory Locations" @@ -66,6 +78,12 @@ msgid "" "reservations." msgstr "" +#. module: stock_archive_constraint +#: model:ir.model.fields,field_description:stock_archive_constraint.field_product_product____last_update +#: model:ir.model.fields,field_description:stock_archive_constraint.field_stock_location____last_update +msgid "Last Modified on" +msgstr "" + #. module: stock_archive_constraint #: model:ir.model,name:stock_archive_constraint.model_product_product msgid "Product" diff --git a/stock_archive_constraint/static/description/index.html b/stock_archive_constraint/static/description/index.html index ba4b0f795..96ba2196c 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

@@ -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 7df982f36503cb536b6dbaec636f9957ef9ca9ef Mon Sep 17 00:00:00 2001 From: Cesar Andres Sanchez Date: Wed, 13 Jul 2022 22:33:48 +0200 Subject: [PATCH 06/11] [MIG] stock_archive_constraint: Migration to 15.0 --- stock_archive_constraint/README.rst | 15 ++-- stock_archive_constraint/__manifest__.py | 2 +- stock_archive_constraint/i18n/es.po | 89 +++++++++---------- .../i18n/stock_archive_constraint.pot | 44 +++------ .../models/product_product.py | 15 ++-- .../models/stock_location.py | 15 ++-- .../readme/CONTRIBUTORS.rst | 5 +- .../static/description/index.html | 14 +-- .../tests/test_location_archive_constraint.py | 6 +- 9 files changed, 97 insertions(+), 108 deletions(-) diff --git a/stock_archive_constraint/README.rst b/stock_archive_constraint/README.rst index 3d18471de..ddf4ba45b 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/14.0/stock_archive_constraint + :target: https://github.com/OCA/stock-logistics-warehouse/tree/15.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-14-0/stock-logistics-warehouse-14-0-stock_archive_constraint + :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-15-0/stock-logistics-warehouse-15-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/14.0 + :target: https://runbot.odoo-community.org/runbot/153/15.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. @@ -62,8 +62,9 @@ Contributors * `Tecnativa `_: - * Carlos Daudén - * Víctor Martínez + * Carlos Daudén + * Víctor Martínez + * César A. Sánchez Maintainers ~~~~~~~~~~~ @@ -86,6 +87,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/__manifest__.py b/stock_archive_constraint/__manifest__.py index 3bbd429bd..2760b5fd6 100644 --- a/stock_archive_constraint/__manifest__.py +++ b/stock_archive_constraint/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock archive constraint", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "license": "AGPL-3", "website": "https://github.com/OCA/stock-logistics-warehouse", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/stock_archive_constraint/i18n/es.po b/stock_archive_constraint/i18n/es.po index 7a95b8cc2..26e9fcbea 100644 --- a/stock_archive_constraint/i18n/es.po +++ b/stock_archive_constraint/i18n/es.po @@ -4,18 +4,17 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 15.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" +"POT-Creation-Date: 2022-07-27 19:55+0000\n" +"PO-Revision-Date: 2022-07-27 19:55+0000\n" +"Last-Translator: \n" "Language-Team: \n" -"Language: es\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" +"Content-Transfer-Encoding: \n" "Plural-Forms: \n" -"X-Generator: Poedit 2.3\n" #. module: stock_archive_constraint #: model:ir.model,name:stock_archive_constraint.model_stock_location @@ -23,63 +22,63 @@ msgid "Inventory Locations" msgstr "Ubicaciones de inventario" #. 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." +"It is not possible to archive location '%(display_name)s' which has " +"associated picking lines." msgstr "" -"No es posible archivar la ubicación '%s' que tiene líneas de albaranes " +"No es posible archivar la ubicación '%(display_name)s' que tiene líneas de " +"albarán asociadas." + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/stock_location.py:0 +#, python-format +msgid "" +"It is not possible to archive location '%(display_name)s' which has " +"associated stock quantities." +msgstr "" +"No es posible archivar la ubicación '%(display_name)s' que tiene cantidades " +"asociadas de stock." + +#. module: stock_archive_constraint +#: code:addons/stock_archive_constraint/models/stock_location.py:0 +#, python-format +msgid "" +"It is not possible to archive location '%(display_name)s' which has " +"associated stock reservations." +msgstr "" +"No es posible archivar la ubicación '%(display_name)s' que tiene reservas " "asociadas." #. module: stock_archive_constraint -#: code:addons/stock_archive_constraint/models/stock_location.py:24 +#: code:addons/stock_archive_constraint/models/product_product.py:0 #, python-format msgid "" -"It is not possible to archive location '%s' which has associated stock " -"quantities." +"It is not possible to archive product '%(display_name)s' which has " +"associated picking lines." msgstr "" -"No es posible archivar la ubicación '%s' que tiene asociadas cantidades " -"de stock." +"No es posible archivar el producto '%(display_name)s' que tiene lineas de " +"albarán asociadas." #. module: stock_archive_constraint -#: code:addons/stock_archive_constraint/models/stock_location.py:58 +#: code:addons/stock_archive_constraint/models/product_product.py:0 #, python-format msgid "" -"It is not possible to archive location '%s' which has associated stock " -"reservations." +"It is not possible to archive product '%(display_name)s' which has " +"associated stock quantities." msgstr "" -"No es posible archivar la ubicación '%s' que tiene reservas de stock " -"asociadas." +"No es posible archivar el producto '%(display_name)s' que tiene cantidades " +"asociadas de stock." #. 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." +"It is not possible to archive product '%(display_name)s' which has " +"associated stock reservations." 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 " +"No es posible archivar el producto '%(display_name)s' que tiene reservas " "asociadas." #. module: stock_archive_constraint diff --git a/stock_archive_constraint/i18n/stock_archive_constraint.pot b/stock_archive_constraint/i18n/stock_archive_constraint.pot index c75e5e81e..24cf7a5fc 100644 --- a/stock_archive_constraint/i18n/stock_archive_constraint.pot +++ b/stock_archive_constraint/i18n/stock_archive_constraint.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,18 +13,6 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" -#. module: stock_archive_constraint -#: model:ir.model.fields,field_description:stock_archive_constraint.field_product_product__display_name -#: model:ir.model.fields,field_description:stock_archive_constraint.field_stock_location__display_name -msgid "Display Name" -msgstr "" - -#. module: stock_archive_constraint -#: model:ir.model.fields,field_description:stock_archive_constraint.field_product_product__id -#: model:ir.model.fields,field_description:stock_archive_constraint.field_stock_location__id -msgid "ID" -msgstr "" - #. module: stock_archive_constraint #: model:ir.model,name:stock_archive_constraint.model_stock_location msgid "Inventory Locations" @@ -34,54 +22,48 @@ msgstr "" #: 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." +"It is not possible to archive location '%(display_name)s' which has " +"associated picking lines." msgstr "" #. module: stock_archive_constraint #: 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." +"It is not possible to archive location '%(display_name)s' which has " +"associated stock quantities." msgstr "" #. module: stock_archive_constraint #: 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." +"It is not possible to archive location '%(display_name)s' which has " +"associated stock reservations." msgstr "" #. module: stock_archive_constraint #: 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." +"It is not possible to archive product '%(display_name)s' which has " +"associated picking lines." msgstr "" #. module: stock_archive_constraint #: 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." +"It is not possible to archive product '%(display_name)s' which has " +"associated stock quantities." msgstr "" #. module: stock_archive_constraint #: 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." -msgstr "" - -#. module: stock_archive_constraint -#: model:ir.model.fields,field_description:stock_archive_constraint.field_product_product____last_update -#: model:ir.model.fields,field_description:stock_archive_constraint.field_stock_location____last_update -msgid "Last Modified on" +"It is not possible to archive product '%(display_name)s' which has " +"associated stock reservations." msgstr "" #. module: stock_archive_constraint diff --git a/stock_archive_constraint/models/product_product.py b/stock_archive_constraint/models/product_product.py index d639e8c5e..7453754e1 100644 --- a/stock_archive_constraint/models/product_product.py +++ b/stock_archive_constraint/models/product_product.py @@ -21,9 +21,10 @@ class ProductProduct(models.Model): 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 '%(display_name)s' which has " + "associated stock quantities." ) + % {"display_name": res.product_id.display_name} ) @api.constrains("active") @@ -38,9 +39,10 @@ class ProductProduct(models.Model): 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 '%(display_name)s' which has " + "associated picking lines." ) + % {"display_name": res.product_id.display_name} ) @api.constrains("active") @@ -55,7 +57,8 @@ class ProductProduct(models.Model): 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 '%(display_name)s' which has " + "associated stock reservations." ) + % {"display_name": res.product_id.display_name} ) diff --git a/stock_archive_constraint/models/stock_location.py b/stock_archive_constraint/models/stock_location.py index 3152db12f..d78a9a18e 100644 --- a/stock_archive_constraint/models/stock_location.py +++ b/stock_archive_constraint/models/stock_location.py @@ -23,9 +23,10 @@ class StockLocation(models.Model): 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 '%(display_name)s' which has " + "associated stock quantities." ) + % {"display_name": res.display_name} ) @api.constrains("active") @@ -43,9 +44,10 @@ class StockLocation(models.Model): 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 '%(display_name)s' which has " + "associated picking lines." ) + % {"display_name": res.display_name} ) @api.constrains("active") @@ -63,7 +65,8 @@ class StockLocation(models.Model): 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 '%(display_name)s' which has " + "associated stock reservations." ) + % {"display_name": res.display_name} ) diff --git a/stock_archive_constraint/readme/CONTRIBUTORS.rst b/stock_archive_constraint/readme/CONTRIBUTORS.rst index 48848770a..7c20a15bf 100644 --- a/stock_archive_constraint/readme/CONTRIBUTORS.rst +++ b/stock_archive_constraint/readme/CONTRIBUTORS.rst @@ -1,4 +1,5 @@ * `Tecnativa `_: - * Carlos Daudén - * Víctor Martínez + * Carlos Daudén + * Víctor Martínez + * César A. Sánchez diff --git a/stock_archive_constraint/static/description/index.html b/stock_archive_constraint/static/description/index.html index 96ba2196c..6f370933f 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

@@ -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.

@@ -408,16 +408,16 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

Contributors

-

Maintainers

@@ -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.

diff --git a/stock_archive_constraint/tests/test_location_archive_constraint.py b/stock_archive_constraint/tests/test_location_archive_constraint.py index 9b1f25dbb..c2708f17a 100644 --- a/stock_archive_constraint/tests/test_location_archive_constraint.py +++ b/stock_archive_constraint/tests/test_location_archive_constraint.py @@ -2,10 +2,10 @@ # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo.exceptions import ValidationError -from odoo.tests.common import Form, SavepointCase +from odoo.tests.common import Form, TransactionCase -class TestLocationArchiveConstraint(SavepointCase): +class TestLocationArchiveConstraint(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -24,7 +24,7 @@ class TestLocationArchiveConstraint(SavepointCase): def _create_product(self, name): product_form = Form(self.env["product.product"]) product_form.name = name - product_form.type = "product" + product_form.detailed_type = "product" return product_form.save() def _create_stock_location(self, name): From ec2fd46762060d6e47b0791438ec8dc6d5375f87 Mon Sep 17 00:00:00 2001 From: sergio-teruel Date: Thu, 1 Dec 2022 13:01:26 +0100 Subject: [PATCH 07/11] [IMP] stock_archive_constraint: Tests more resilient when other modules have been installed --- stock_archive_constraint/README.rst | 15 ++++--- stock_archive_constraint/__manifest__.py | 2 +- .../models/product_product.py | 12 ++++++ .../models/stock_location.py | 12 ++++++ .../static/description/index.html | 40 ++++++++++--------- .../tests/test_location_archive_constraint.py | 3 ++ 6 files changed, 58 insertions(+), 26 deletions(-) diff --git a/stock_archive_constraint/README.rst b/stock_archive_constraint/README.rst index ddf4ba45b..8ec807930 100644 --- a/stock_archive_constraint/README.rst +++ b/stock_archive_constraint/README.rst @@ -2,10 +2,13 @@ Stock archive constraint ======================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:5eb5e8d43aa1267d1be15f4d09a53a775c2fef3234784461f39c4b4c806c90cd + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Stock archive constraint .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-15-0/stock-logistics-warehouse-15-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/15.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-warehouse&target_branch=15.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|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. @@ -44,7 +47,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 +If you spotted it first, help us to smash it by providing a detailed and welcomed `feedback `_. Do not contact contributors directly about support or help with technical issues. diff --git a/stock_archive_constraint/__manifest__.py b/stock_archive_constraint/__manifest__.py index 2760b5fd6..9c85eca64 100644 --- a/stock_archive_constraint/__manifest__.py +++ b/stock_archive_constraint/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Stock archive constraint", - "version": "15.0.1.0.0", + "version": "15.0.1.0.1", "license": "AGPL-3", "website": "https://github.com/OCA/stock-logistics-warehouse", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/stock_archive_constraint/models/product_product.py b/stock_archive_constraint/models/product_product.py index 7453754e1..49a488674 100644 --- a/stock_archive_constraint/models/product_product.py +++ b/stock_archive_constraint/models/product_product.py @@ -3,13 +3,21 @@ from odoo import _, api, models from odoo.exceptions import ValidationError +from odoo.tools import config class ProductProduct(models.Model): _inherit = "product.product" + def _skip_check_archive_constraint_condition(self): + return config["test_enable"] and not self.env.context.get( + "test_stock_archive_constraint" + ) + @api.constrains("active") def _check_active_stock_archive_constraint_stock_quant(self): + if self._skip_check_archive_constraint_condition(): + return res = self.env["stock.quant"].search( [ ("location_id.usage", "in", ("internal", "transit")), @@ -29,6 +37,8 @@ class ProductProduct(models.Model): @api.constrains("active") def _check_active_stock_archive_constraint_stock_move(self): + if self._skip_check_archive_constraint_condition(): + return res = self.env["stock.move"].search( [ ("product_id", "in", self.filtered(lambda x: not x.active).ids), @@ -47,6 +57,8 @@ class ProductProduct(models.Model): @api.constrains("active") def _check_active_stock_archive_constraint_stock_move_line(self): + if self._skip_check_archive_constraint_condition(): + return res = self.env["stock.move.line"].search( [ ("product_id", "in", self.filtered(lambda x: not x.active).ids), diff --git a/stock_archive_constraint/models/stock_location.py b/stock_archive_constraint/models/stock_location.py index d78a9a18e..04ae12afe 100644 --- a/stock_archive_constraint/models/stock_location.py +++ b/stock_archive_constraint/models/stock_location.py @@ -3,13 +3,21 @@ from odoo import _, api, models from odoo.exceptions import ValidationError +from odoo.tools import config class StockLocation(models.Model): _inherit = "stock.location" + def _skip_check_archive_constraint_condition(self): + return config["test_enable"] and not self.env.context.get( + "test_stock_archive_constraint" + ) + @api.constrains("active") def _check_active_stock_archive_constraint_stock_quant(self): + if self._skip_check_archive_constraint_condition(): + return res = self.env["stock.quant"].search( [ "&", @@ -31,6 +39,8 @@ class StockLocation(models.Model): @api.constrains("active") def _check_active_stock_archive_constraint_stock_move(self): + if self._skip_check_archive_constraint_condition(): + return res = self.env["stock.move"].search( [ "&", @@ -52,6 +62,8 @@ class StockLocation(models.Model): @api.constrains("active") def _check_active_stock_archive_constraint_stock_move_line(self): + if self._skip_check_archive_constraint_condition(): + return res = self.env["stock.move.line"].search( [ "&", diff --git a/stock_archive_constraint/static/description/index.html b/stock_archive_constraint/static/description/index.html index 6f370933f..f5d387b5f 100644 --- a/stock_archive_constraint/static/description/index.html +++ b/stock_archive_constraint/static/description/index.html @@ -1,20 +1,20 @@ - + - + Stock archive constraint