From c20f734c1c04d7cb3e11dacd5c0e077cefaa0455 Mon Sep 17 00:00:00 2001 From: Arnau Date: Thu, 8 Jan 2026 16:13:59 +0100 Subject: [PATCH 1/3] [ADD] base_tier_validation_confirm_auth --- base_tier_validation_confirm_auth/README.rst | 87 ++++ base_tier_validation_confirm_auth/__init__.py | 2 + .../__manifest__.py | 17 + .../models/__init__.py | 4 + .../models/res_users.py | 57 +++ .../models/tier_definition.py | 14 + .../models/tier_review.py | 12 + .../models/tier_validation.py | 40 ++ .../pyproject.toml | 3 + .../readme/CONFIGURE.md | 5 + .../readme/CONTRIBUTORS.md | 1 + .../readme/DESCRIPTION.md | 2 + .../static/description/index.html | 435 ++++++++++++++++++ .../tests/__init__.py | 1 + ..._tier_validation_authentication_confirm.py | 250 ++++++++++ .../views/tier_definition_view.xml | 13 + .../wizards/__init__.py | 1 + .../wizards/comment_wizard.py | 19 + 18 files changed, 963 insertions(+) create mode 100644 base_tier_validation_confirm_auth/README.rst create mode 100644 base_tier_validation_confirm_auth/__init__.py create mode 100644 base_tier_validation_confirm_auth/__manifest__.py create mode 100644 base_tier_validation_confirm_auth/models/__init__.py create mode 100644 base_tier_validation_confirm_auth/models/res_users.py create mode 100644 base_tier_validation_confirm_auth/models/tier_definition.py create mode 100644 base_tier_validation_confirm_auth/models/tier_review.py create mode 100644 base_tier_validation_confirm_auth/models/tier_validation.py create mode 100644 base_tier_validation_confirm_auth/pyproject.toml create mode 100644 base_tier_validation_confirm_auth/readme/CONFIGURE.md create mode 100644 base_tier_validation_confirm_auth/readme/CONTRIBUTORS.md create mode 100644 base_tier_validation_confirm_auth/readme/DESCRIPTION.md create mode 100644 base_tier_validation_confirm_auth/static/description/index.html create mode 100644 base_tier_validation_confirm_auth/tests/__init__.py create mode 100644 base_tier_validation_confirm_auth/tests/test_tier_validation_authentication_confirm.py create mode 100644 base_tier_validation_confirm_auth/views/tier_definition_view.xml create mode 100644 base_tier_validation_confirm_auth/wizards/__init__.py create mode 100644 base_tier_validation_confirm_auth/wizards/comment_wizard.py diff --git a/base_tier_validation_confirm_auth/README.rst b/base_tier_validation_confirm_auth/README.rst new file mode 100644 index 0000000000..6ba38c12e5 --- /dev/null +++ b/base_tier_validation_confirm_auth/README.rst @@ -0,0 +1,87 @@ +================================= +Base Tier Validation Confirm Auth +================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:dc29a5a30d78467106dfe713b562de411e73d395f4ee15536d189548d1e43631 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fserver--ux-lightgray.png?logo=github + :target: https://github.com/OCA/server-ux/tree/18.0/base_tier_validation_confirm_auth + :alt: OCA/server-ux +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-ux-18-0/server-ux-18-0-base_tier_validation_confirm_auth + :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/server-ux&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Allows to add an authentication check to tier validation, where the user +must confirm his authentication in order to approve or reject the tier +review. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to: + +1. Go to *Settings > Technical > Tier Validations > Tier Definition > + Select one tier definition*. +2. Mark "Require Authentication" field. + +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 +------- + +* ForgeFlow + +Contributors +------------ + +- Arnau Cruz arnau.cruz@forgeflow.com + +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/server-ux `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_tier_validation_confirm_auth/__init__.py b/base_tier_validation_confirm_auth/__init__.py new file mode 100644 index 0000000000..aee8895e7a --- /dev/null +++ b/base_tier_validation_confirm_auth/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/base_tier_validation_confirm_auth/__manifest__.py b/base_tier_validation_confirm_auth/__manifest__.py new file mode 100644 index 0000000000..5783b8b033 --- /dev/null +++ b/base_tier_validation_confirm_auth/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2026 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Base Tier Validation Confirm Auth", + "summary": "Authentication confirmation for base tiers.", + "version": "18.0.1.0.0", + "category": "Tools", + "website": "https://github.com/OCA/server-ux", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": ["base_tier_validation"], + "data": [ + "views/tier_definition_view.xml", + ], + "application": False, + "installable": True, +} diff --git a/base_tier_validation_confirm_auth/models/__init__.py b/base_tier_validation_confirm_auth/models/__init__.py new file mode 100644 index 0000000000..d4e0af9ca8 --- /dev/null +++ b/base_tier_validation_confirm_auth/models/__init__.py @@ -0,0 +1,4 @@ +from . import tier_definition +from . import tier_review +from . import tier_validation +from . import res_users diff --git a/base_tier_validation_confirm_auth/models/res_users.py b/base_tier_validation_confirm_auth/models/res_users.py new file mode 100644 index 0000000000..526d410937 --- /dev/null +++ b/base_tier_validation_confirm_auth/models/res_users.py @@ -0,0 +1,57 @@ +# Copyright 2026 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import json +from functools import wraps + +from odoo import _ +from odoo.exceptions import UserError +from odoo.http import request + + +def _jsonable(o): + try: + json.dumps(o) + except TypeError: + return False + else: + return True + + +def check_authentication(fn): + @wraps(fn) + def wrapped(self, *args, **kwargs): + if not request: + raise UserError(_("This method can only be accessed over HTTP")) + + if self.env.context.get("identity_checked"): + return fn(self, *args, **kwargs) + + ctx = self.env.context.copy() + ctx["identity_checked"] = True + + safe_context = {k: v for k, v in ctx.items() if _jsonable(v)} + + w = ( + self.sudo() + .env["res.users.identitycheck"] + .create( + { + "request": json.dumps( + [safe_context, self._name, self.ids, fn.__name__, args, kwargs] + ) + } + ) + ) + + return { + "type": "ir.actions.act_window", + "res_model": "res.users.identitycheck", + "res_id": w.id, + "name": _("Security Control"), + "target": "new", + "views": [(False, "form")], + } + + wrapped.__has_check_identity = True + return wrapped diff --git a/base_tier_validation_confirm_auth/models/tier_definition.py b/base_tier_validation_confirm_auth/models/tier_definition.py new file mode 100644 index 0000000000..67dc5334cf --- /dev/null +++ b/base_tier_validation_confirm_auth/models/tier_definition.py @@ -0,0 +1,14 @@ +# Copyright 2026 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class TierDefinition(models.Model): + _inherit = "tier.definition" + + require_authentication = fields.Boolean( + help="If enabled, the user will be asked to authenticate " + "himself in order to validate or reject the tier.", + default=False, + ) diff --git a/base_tier_validation_confirm_auth/models/tier_review.py b/base_tier_validation_confirm_auth/models/tier_review.py new file mode 100644 index 0000000000..fe8f0d849c --- /dev/null +++ b/base_tier_validation_confirm_auth/models/tier_review.py @@ -0,0 +1,12 @@ +# Copyright 2026 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class TierReview(models.Model): + _inherit = "tier.review" + + require_authentication = fields.Boolean( + related="definition_id.require_authentication", readonly=True + ) diff --git a/base_tier_validation_confirm_auth/models/tier_validation.py b/base_tier_validation_confirm_auth/models/tier_validation.py new file mode 100644 index 0000000000..9caea440dc --- /dev/null +++ b/base_tier_validation_confirm_auth/models/tier_validation.py @@ -0,0 +1,40 @@ +# Copyright 2026 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + +from .res_users import check_authentication + + +class TierValidation(models.AbstractModel): + _inherit = "tier.validation" + + require_authentication = fields.Boolean(compute="_compute_require_authentication") + + def _compute_require_authentication(self): + for rec in self: + require_authentication = rec.review_ids.filtered( + lambda r: r.status in ("waiting", "pending") + and (self.env.user in r.reviewer_ids) + ).mapped("require_authentication") + rec.require_authentication = True in require_authentication + + def validate_tier(self): + self.ensure_one() + if not self.has_comment and self.require_authentication: + return self._validate_tier_with_identity_check() + return super().validate_tier() + + def reject_tier(self): + self.ensure_one() + if not self.has_comment and self.require_authentication: + return self._reject_tier_with_identity_check() + return super().reject_tier() + + @check_authentication + def _validate_tier_with_identity_check(self): + return super().validate_tier() + + @check_authentication + def _reject_tier_with_identity_check(self): + return super().reject_tier() diff --git a/base_tier_validation_confirm_auth/pyproject.toml b/base_tier_validation_confirm_auth/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/base_tier_validation_confirm_auth/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/base_tier_validation_confirm_auth/readme/CONFIGURE.md b/base_tier_validation_confirm_auth/readme/CONFIGURE.md new file mode 100644 index 0000000000..887a1cfbac --- /dev/null +++ b/base_tier_validation_confirm_auth/readme/CONFIGURE.md @@ -0,0 +1,5 @@ +To configure this module, you need to: + +1. Go to *Settings \> Technical \> Tier Validations \> Tier + Definition \> Select one tier definition*. +2. Mark "Require Authentication" field. diff --git a/base_tier_validation_confirm_auth/readme/CONTRIBUTORS.md b/base_tier_validation_confirm_auth/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..629a347ae8 --- /dev/null +++ b/base_tier_validation_confirm_auth/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Arnau Cruz diff --git a/base_tier_validation_confirm_auth/readme/DESCRIPTION.md b/base_tier_validation_confirm_auth/readme/DESCRIPTION.md new file mode 100644 index 0000000000..18c2248d8c --- /dev/null +++ b/base_tier_validation_confirm_auth/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Allows to add an authentication check to tier validation, +where the user must confirm his authentication in order to approve or reject the tier review. diff --git a/base_tier_validation_confirm_auth/static/description/index.html b/base_tier_validation_confirm_auth/static/description/index.html new file mode 100644 index 0000000000..736b1443eb --- /dev/null +++ b/base_tier_validation_confirm_auth/static/description/index.html @@ -0,0 +1,435 @@ + + + + + +Base Tier Validation Confirm Auth + + + +
+

Base Tier Validation Confirm Auth

+ + +

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

Allows to add an authentication check to tier validation, where the user +must confirm his authentication in order to approve or reject the tier +review.

+

Table of contents

+ +
+

Configuration

+

To configure this module, you need to:

+
    +
  1. Go to Settings > Technical > Tier Validations > Tier Definition > +Select one tier definition.
  2. +
  3. Mark “Require Authentication” field.
  4. +
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • ForgeFlow
  • +
+
+ +
+

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/server-ux project on GitHub.

+

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

+
+
+
+ + diff --git a/base_tier_validation_confirm_auth/tests/__init__.py b/base_tier_validation_confirm_auth/tests/__init__.py new file mode 100644 index 0000000000..2cab50552b --- /dev/null +++ b/base_tier_validation_confirm_auth/tests/__init__.py @@ -0,0 +1 @@ +from . import test_tier_validation_authentication_confirm diff --git a/base_tier_validation_confirm_auth/tests/test_tier_validation_authentication_confirm.py b/base_tier_validation_confirm_auth/tests/test_tier_validation_authentication_confirm.py new file mode 100644 index 0000000000..ee40527345 --- /dev/null +++ b/base_tier_validation_confirm_auth/tests/test_tier_validation_authentication_confirm.py @@ -0,0 +1,250 @@ +# Copyright 2026 ForgeFlow S.L. +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from unittest.mock import MagicMock, patch + +from odoo.tests import Form, tagged + +from odoo.addons.base_tier_validation.tests.common import CommonTierValidation + + +@tagged("post_install", "-at_install") +class TierTierValidationAuthenticationConfirm(CommonTierValidation): + @classmethod + def setUpClass(cls): + super().setUpClass() + + def test_01_authentication_confirmation_and_comment(self): + # Set user password for validation + self.test_user_1.password = "test_user_1" + + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + "require_authentication": True, + } + ) + # Request validation + review = test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(review) + + # Let _compute_can_review assign status 'pending' instead of waiting + review.flush_recordset() + record = test_record.with_user(self.test_user_1.id) + res = record.validate_tier() + ctx = res.get("context") + wizard = Form(self.env["comment.wizard"].with_context(**ctx)) + wizard.comment = "Test Comment" + wiz = wizard.save() + + # Mock requests to avoid errors outside HTTP request + with patch( + "odoo.addons.base_tier_validation_confirm_auth.models.res_users.request", + MagicMock(), + ): + res = wiz.add_comment() + + self.assertEqual(res["res_model"], "res.users.identitycheck") + identity_wiz_id = res["res_id"] + identity_wiz = ( + self.env["res.users.identitycheck"] + .sudo() + .browse(identity_wiz_id) + .with_user(self.test_user_1) + ) + identity_wiz.sudo().write({"password": "test_user_1"}) + + # Mock requests to avoid errors outside HTTP request + with ( + patch("odoo.addons.base.models.res_users.request", MagicMock()), + patch( + "odoo.addons.base_tier_validation_confirm_auth.models.res_users.request", + MagicMock(), + ), + ): + identity_wiz.sudo().run_check() + + self.assertTrue(review.status == "approved") + self.assertTrue(review.done_by == self.test_user_1) + self.assertTrue(review.comment == "Test Comment") + + def test_02_authentication_confirmation_without_comment(self): + # Set user password for validation + self.test_user_1.password = "test_user_1" + + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + + # Create tier definition with no comment + require authentication + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": False, + "require_authentication": True, + } + ) + + # Request validation + review = test_record.with_user(self.test_user_2).request_validation() + self.assertTrue(review) + record = test_record.with_user(self.test_user_1) + + # Mock requests to avoid errors outside HTTP request + with patch( + "odoo.addons.base_tier_validation_confirm_auth.models.res_users.request", + MagicMock(), + ): + res = record.validate_tier() + + # Identity confirmation wizard + self.assertEqual(res["res_model"], "res.users.identitycheck") + identity_wiz_id = res["res_id"] + identity_wiz = ( + self.env["res.users.identitycheck"] + .sudo() + .browse(identity_wiz_id) + .with_user(self.test_user_1) + ) + identity_wiz.sudo().write({"password": "test_user_1"}) + + # Mock requests to avoid errors outside HTTP request + with ( + patch("odoo.addons.base.models.res_users.request", MagicMock()), + patch( + "odoo.addons.base_tier_validation_confirm_auth.models.res_users.request", + MagicMock(), + ), + ): + identity_wiz.sudo().run_check() + + self.assertTrue(review.status == "approved") + self.assertTrue(review.done_by == self.test_user_1) + + def test_03_authentication_confirmation_reject_with_comment(self): + # Set user password for validation + self.test_user_1.password = "test_user_1" + + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + "require_authentication": True, + } + ) + # Request validation + review = test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(review) + + # Let _compute_can_review assign status 'pending' instead of waiting + review.flush_recordset() + record = test_record.with_user(self.test_user_1.id) + res = record.reject_tier() + ctx = res.get("context") + wizard = Form(self.env["comment.wizard"].with_context(**ctx)) + wizard.comment = "Test Comment" + wiz = wizard.save() + + # Mock requests to avoid errors outside HTTP request + with patch( + "odoo.addons.base_tier_validation_confirm_auth.models.res_users.request", + MagicMock(), + ): + res = wiz.add_comment() + + # Identity confirmation wizard + self.assertEqual(res["res_model"], "res.users.identitycheck") + identity_wiz_id = res["res_id"] + identity_wiz = ( + self.env["res.users.identitycheck"] + .sudo() + .browse(identity_wiz_id) + .with_user(self.test_user_1) + ) + identity_wiz.sudo().write({"password": "test_user_1"}) + + # Mock requests to avoid errors outside HTTP request + with ( + patch("odoo.addons.base.models.res_users.request", MagicMock()), + patch( + "odoo.addons.base_tier_validation_confirm_auth.models.res_users.request", + MagicMock(), + ), + ): + identity_wiz.sudo().run_check() + + self.assertTrue(review.status == "rejected") + self.assertTrue(review.done_by == self.test_user_1) + self.assertTrue(review.comment == "Test Comment") + + def test_04_authentication_confirmation_reject_without_comment(self): + # Set user password for validation + self.test_user_1.password = "test_user_1" + + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + + # Create tier definition with no comment + require authentication + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": False, + "require_authentication": True, + } + ) + + # Request validation + review = test_record.with_user(self.test_user_2).request_validation() + self.assertTrue(review) + record = test_record.with_user(self.test_user_1) + + # Mock requests to avoid errors outside HTTP request + with patch( + "odoo.addons.base_tier_validation_confirm_auth.models.res_users.request", + MagicMock(), + ): + res = record.reject_tier() + + # Identity confirmation wizard + self.assertEqual(res["res_model"], "res.users.identitycheck") + identity_wiz_id = res["res_id"] + identity_wiz = ( + self.env["res.users.identitycheck"] + .sudo() + .browse(identity_wiz_id) + .with_user(self.test_user_1) + ) + identity_wiz.sudo().write({"password": "test_user_1"}) + + # Mock requests to avoid errors outside HTTP request + with ( + patch("odoo.addons.base.models.res_users.request", MagicMock()), + patch( + "odoo.addons.base_tier_validation_confirm_auth.models.res_users.request", + MagicMock(), + ), + ): + identity_wiz.sudo().run_check() + + self.assertTrue(review.status == "rejected") + self.assertTrue(review.done_by == self.test_user_1) diff --git a/base_tier_validation_confirm_auth/views/tier_definition_view.xml b/base_tier_validation_confirm_auth/views/tier_definition_view.xml new file mode 100644 index 0000000000..24df48b423 --- /dev/null +++ b/base_tier_validation_confirm_auth/views/tier_definition_view.xml @@ -0,0 +1,13 @@ + + + + tier.definition.form + tier.definition + + + + + + + + diff --git a/base_tier_validation_confirm_auth/wizards/__init__.py b/base_tier_validation_confirm_auth/wizards/__init__.py new file mode 100644 index 0000000000..2484d9e0ab --- /dev/null +++ b/base_tier_validation_confirm_auth/wizards/__init__.py @@ -0,0 +1 @@ +from . import comment_wizard diff --git a/base_tier_validation_confirm_auth/wizards/comment_wizard.py b/base_tier_validation_confirm_auth/wizards/comment_wizard.py new file mode 100644 index 0000000000..d1e9023343 --- /dev/null +++ b/base_tier_validation_confirm_auth/wizards/comment_wizard.py @@ -0,0 +1,19 @@ +# Copyright 2026 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + +from ..models.res_users import check_authentication + + +class CommentWizard(models.TransientModel): + _inherit = "comment.wizard" + + def add_comment(self): + if any(review.require_authentication for review in self.review_ids): + return self._add_comment_with_identity_check() + return super().add_comment() + + @check_authentication + def _add_comment_with_identity_check(self): + return super().add_comment() From 003a562de7640e933ac64bdbc261d46664c07d38 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Thu, 5 Feb 2026 09:36:47 +0000 Subject: [PATCH 2/3] [UPD] Update base_tier_validation_confirm_auth.pot --- .../base_tier_validation_confirm_auth.pot | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 base_tier_validation_confirm_auth/i18n/base_tier_validation_confirm_auth.pot diff --git a/base_tier_validation_confirm_auth/i18n/base_tier_validation_confirm_auth.pot b/base_tier_validation_confirm_auth/i18n/base_tier_validation_confirm_auth.pot new file mode 100644 index 0000000000..d5254235dc --- /dev/null +++ b/base_tier_validation_confirm_auth/i18n/base_tier_validation_confirm_auth.pot @@ -0,0 +1,61 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation_confirm_auth +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.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: base_tier_validation_confirm_auth +#: model:ir.model,name:base_tier_validation_confirm_auth.model_comment_wizard +msgid "Comment Wizard" +msgstr "" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model.fields,help:base_tier_validation_confirm_auth.field_tier_definition__require_authentication +#: model:ir.model.fields,help:base_tier_validation_confirm_auth.field_tier_review__require_authentication +msgid "" +"If enabled, the user will be asked to authenticate himself in order to " +"validate or reject the tier." +msgstr "" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model.fields,field_description:base_tier_validation_confirm_auth.field_tier_definition__require_authentication +#: model:ir.model.fields,field_description:base_tier_validation_confirm_auth.field_tier_review__require_authentication +#: model:ir.model.fields,field_description:base_tier_validation_confirm_auth.field_tier_validation__require_authentication +msgid "Require Authentication" +msgstr "" + +#. module: base_tier_validation_confirm_auth +#. odoo-python +#: code:addons/base_tier_validation_confirm_auth/models/res_users.py:0 +msgid "Security Control" +msgstr "" + +#. module: base_tier_validation_confirm_auth +#. odoo-python +#: code:addons/base_tier_validation_confirm_auth/models/res_users.py:0 +msgid "This method can only be accessed over HTTP" +msgstr "" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model,name:base_tier_validation_confirm_auth.model_tier_definition +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model,name:base_tier_validation_confirm_auth.model_tier_review +msgid "Tier Review" +msgstr "" + +#. module: base_tier_validation_confirm_auth +#: model:ir.model,name:base_tier_validation_confirm_auth.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" From 8579fca1f68dbbfc57e970bb95799934c89d209c Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 5 Feb 2026 09:41:10 +0000 Subject: [PATCH 3/3] [BOT] post-merge updates --- README.md | 1 + base_tier_validation_confirm_auth/README.rst | 8 +++-- .../static/description/icon.png | Bin 0 -> 10254 bytes .../static/description/index.html | 28 +++++++++++------- setup/_metapackage/pyproject.toml | 3 +- 5 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 base_tier_validation_confirm_auth/static/description/icon.png diff --git a/README.md b/README.md index 6de8cc4240..909404abaf 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ addon | version | maintainers | summary [base_substate](base_substate/) | 18.0.1.0.1 | | Base Sub State [base_technical_features](base_technical_features/) | 18.0.1.0.2 | | Access to technical features without activating debug mode [base_tier_validation](base_tier_validation/) | 18.0.3.1.2 | LoisRForgeFlow | Implement a validation process based on tiers. +[base_tier_validation_confirm_auth](base_tier_validation_confirm_auth/) | 18.0.1.0.0 | | Authentication confirmation for base tiers. [base_tier_validation_correction](base_tier_validation_correction/) | 18.0.1.0.0 | kittiu | Correct tier.review data after it has been created. [base_tier_validation_formula](base_tier_validation_formula/) | 18.0.1.0.0 | | Formulas for Base tier validation [base_tier_validation_forward](base_tier_validation_forward/) | 18.0.2.0.1 | kittiu | Forward option for base tiers diff --git a/base_tier_validation_confirm_auth/README.rst b/base_tier_validation_confirm_auth/README.rst index 6ba38c12e5..109d86c10d 100644 --- a/base_tier_validation_confirm_auth/README.rst +++ b/base_tier_validation_confirm_auth/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ================================= Base Tier Validation Confirm Auth ================================= @@ -7,13 +11,13 @@ Base Tier Validation Confirm Auth !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:dc29a5a30d78467106dfe713b562de411e73d395f4ee15536d189548d1e43631 + !! source digest: sha256:0ddbbecda7996075b55be022b81821bfe09ed00649279f7cdb2a8297227e901a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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 +.. |badge2| image:: https://img.shields.io/badge/license-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%2Fserver--ux-lightgray.png?logo=github diff --git a/base_tier_validation_confirm_auth/static/description/icon.png b/base_tier_validation_confirm_auth/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11 GIT binary patch literal 10254 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 -Base Tier Validation Confirm Auth +README.rst -
-

Base Tier Validation Confirm Auth

+
+ + +Odoo Community Association + +
+

Base Tier Validation Confirm Auth

-

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

Allows to add an authentication check to tier validation, where the user must confirm his authentication in order to approve or reject the tier review.

@@ -387,7 +392,7 @@

Base Tier Validation Confirm Auth

-

Configuration

+

Configuration

To configure this module, you need to:

  1. Go to Settings > Technical > Tier Validations > Tier Definition > @@ -396,7 +401,7 @@

    Configuration

-

Bug Tracker

+

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 @@ -404,21 +409,21 @@

Bug Tracker

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

+
diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 783a37c809..01b983f84a 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-server-ux" -version = "18.0.20260121.0" +version = "18.0.20260205.0" dependencies = [ "odoo-addon-announcement==18.0.*", "odoo-addon-barcode_action==18.0.*", @@ -15,6 +15,7 @@ dependencies = [ "odoo-addon-base_substate==18.0.*", "odoo-addon-base_technical_features==18.0.*", "odoo-addon-base_tier_validation==18.0.*", + "odoo-addon-base_tier_validation_confirm_auth==18.0.*", "odoo-addon-base_tier_validation_correction==18.0.*", "odoo-addon-base_tier_validation_formula==18.0.*", "odoo-addon-base_tier_validation_forward==18.0.*",