diff --git a/stock_inventory_discrepancy/tests/test_inventory_discrepancy.py b/stock_inventory_discrepancy/tests/test_inventory_discrepancy.py index e613617a604d..9632b4fce140 100644 --- a/stock_inventory_discrepancy/tests/test_inventory_discrepancy.py +++ b/stock_inventory_discrepancy/tests/test_inventory_discrepancy.py @@ -155,7 +155,7 @@ def test_discrepancy_validation_always(self): with self.assertRaises(UserError): wiz.button_apply() # Apply the wizard with a stock manager will apply the adjustment - wiz.with_user(self.user_2).button_apply() + wiz.with_user(self.manager).button_apply() self.assertEqual(self.quant_line1.quantity, 3) self.assertEqual(self.quant_line2.quantity, 4.1) diff --git a/stock_inventory_restriction/README.rst b/stock_inventory_restriction/README.rst new file mode 100644 index 000000000000..6210ebd3fee7 --- /dev/null +++ b/stock_inventory_restriction/README.rst @@ -0,0 +1,78 @@ +=========================== +Stock Inventory Restriction +=========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4a64dbd297fa1ac7f51333495dda73e693688e2a0e608e84850c55c48d35529f + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |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/18.0/stock_inventory_restriction + :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-18-0/stock-logistics-warehouse-18-0-stock_inventory_restriction + :alt: Translate me on Weblate +.. |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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Restrict modification and validation of inventories to assigned users +(only inventory managers still have full access). + +**Table of contents** + +.. contents:: + :local: + +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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Akretion + +Contributors +------------ + +- Benoît GUILLOT +- Sébastien Alix + +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. + +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_inventory_restriction/__init__.py b/stock_inventory_restriction/__init__.py new file mode 100644 index 000000000000..0650744f6bc6 --- /dev/null +++ b/stock_inventory_restriction/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/stock_inventory_restriction/__manifest__.py b/stock_inventory_restriction/__manifest__.py new file mode 100644 index 000000000000..208363182057 --- /dev/null +++ b/stock_inventory_restriction/__manifest__.py @@ -0,0 +1,18 @@ +# Copyright 2022 Akretion (https://www.akretion.com). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + "name": "Stock Inventory Restriction", + "summary": "Restrict inventory modifications to assigned users", + "version": "18.0.1.0.0", + "development_status": "Beta", + "author": "Akretion, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/stock-logistics-warehouse", + "category": "Warehouse", + "depends": ["stock_inventory"], + "data": [ + "security/ir_rule.xml", + ], + "license": "AGPL-3", + "installable": True, + "application": False, +} diff --git a/stock_inventory_restriction/models/__init__.py b/stock_inventory_restriction/models/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stock_inventory_restriction/pyproject.toml b/stock_inventory_restriction/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/stock_inventory_restriction/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/stock_inventory_restriction/readme/CONTRIBUTORS.md b/stock_inventory_restriction/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..b0e2a2aa1342 --- /dev/null +++ b/stock_inventory_restriction/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Benoît GUILLOT \ +- Sébastien Alix \ diff --git a/stock_inventory_restriction/readme/DESCRIPTION.md b/stock_inventory_restriction/readme/DESCRIPTION.md new file mode 100644 index 000000000000..835eacd7927e --- /dev/null +++ b/stock_inventory_restriction/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Restrict modification and validation of inventories to assigned users +(only inventory managers still have full access). diff --git a/stock_inventory_restriction/security/ir_rule.xml b/stock_inventory_restriction/security/ir_rule.xml new file mode 100644 index 000000000000..63fc442cc751 --- /dev/null +++ b/stock_inventory_restriction/security/ir_rule.xml @@ -0,0 +1,52 @@ + + + + + Stock inventory user manager rule + + + + + + + [(1, "=", 1)] + + + + Stock inventory user rule + + + + + + + [("responsible_id", "=", user.id), ("responsible_id", "!=", False)] + + + + Stock inventory line user manager rule + + + + + + + [(1, "=", 1)] + + + + Stock inventory line user rule + + + + + + + [("current_inventory_id.responsible_id", "=", user.id), ("current_inventory_id.responsible_id", "!=", False)] + + diff --git a/stock_inventory_restriction/static/description/index.html b/stock_inventory_restriction/static/description/index.html new file mode 100644 index 000000000000..22f141b682fe --- /dev/null +++ b/stock_inventory_restriction/static/description/index.html @@ -0,0 +1,425 @@ + + + + + +Stock Inventory Restriction + + + +
+

Stock Inventory Restriction

+ + +

Beta License: AGPL-3 OCA/stock-logistics-warehouse Translate me on Weblate Try me on Runboat

+

Restrict modification and validation of inventories to assigned users +(only inventory managers still have full access).

+

Table of contents

+ +
+

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 to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

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.

+

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_inventory_restriction/tests/__init__.py b/stock_inventory_restriction/tests/__init__.py new file mode 100644 index 000000000000..25e5b5ff84f4 --- /dev/null +++ b/stock_inventory_restriction/tests/__init__.py @@ -0,0 +1 @@ +from . import test_inventory_user diff --git a/stock_inventory_restriction/tests/test_inventory_user.py b/stock_inventory_restriction/tests/test_inventory_user.py new file mode 100644 index 000000000000..fc38476b775d --- /dev/null +++ b/stock_inventory_restriction/tests/test_inventory_user.py @@ -0,0 +1,81 @@ +# Copyright 2022 Akretion (https://www.akretion.com). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import Command, fields +from odoo.exceptions import AccessError +from odoo.tests.common import TransactionCase + +from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT + + +class TestStockInventoryUser(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT)) + cls.inventory_model = cls.env["stock.inventory"] + cls.res_users_model = cls.env["res.users"] + + cls.company = cls.env.ref("base.main_company") + cls.grp_stock_manager = cls.env.ref("stock.group_stock_manager") + cls.grp_stock_user = cls.env.ref("stock.group_stock_user") + cls.location = cls.env.ref("stock.warehouse0").lot_stock_id + + cls.manager = cls.res_users_model.create( + { + "name": "Test Stock Manager", + "login": "manager_1", + "email": "example@yourcompany.com", + "company_id": cls.company.id, + "company_ids": [Command.link(cls.company.id)], + "groups_id": [Command.set(cls.grp_stock_manager.ids)], + } + ) + cls.user = cls.res_users_model.create( + { + "name": "Test Stock User", + "login": "user_1", + "email": "example@yourcompany.com", + "company_id": cls.company.id, + "company_ids": [Command.link(cls.company.id)], + "groups_id": [Command.set(cls.grp_stock_user.ids)], + } + ) + cls.user_2 = cls.res_users_model.create( + { + "name": "Test Stock User 2", + "login": "user_2", + "email": "example@yourcompany.com", + "company_id": cls.company.id, + "company_ids": [Command.link(cls.company.id)], + "groups_id": [Command.set(cls.grp_stock_user.ids)], + } + ) + + def test_inventory_user(self): + inventory = self.inventory_model.with_user(self.manager).create( + { + "responsible_id": self.user.id, + "location_ids": [Command.set(self.location.ids)], + } + ) + # Assigned user can update its inventory + inventory.with_user(self.user).write( + {"location_ids": [Command.set(self.location.ids)]} + ) + # Other users cannot + with self.assertRaises(AccessError): + inventory.with_user(self.user_2).write({"location_ids": [Command.clear()]}) + # Start inventory and check quants access + inventory.action_state_to_in_progress() + self.assertTrue(inventory.stock_quant_ids) + quant = fields.first(inventory.stock_quant_ids) + self.assertEqual(quant.user_id, self.user) + # Users cannot modify inventoried quants of other users + with self.assertRaises(AccessError): + quant.with_user(self.user_2).action_set_inventory_quantity() + # Working with the expected user + quant.with_user(self.user).action_set_inventory_quantity() + quant.action_clear_inventory_quantity() + # Working with the stock manager too + quant.with_user(self.manager).action_set_inventory_quantity()