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
+
+
+

+
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
+
+
+
+
+- Go to Settings,> Users> Edit a user and check the “Manage Multiple Stock Locations” permission
+- Go to Inventory> Settings> Locations and disable one
+
+
+
+
+
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.
+
+
+
+
+
+
+
+Tecnativa:
+
+
+- Carlos Daudén
+- Víctor Martínez
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+

+
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:
+

+
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. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

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

+

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

+

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
-
-Tecnativa:
+
- Carlos Daudén
- Víctor Martínez
+- César A. Sánchez
-
-
@@ -428,7 +428,7 @@ mission is to support the collaborative development of Odoo features and
promote its widespread use.
Current maintainer:

-
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