From a4e012eab6c7e7f95be834fa100c3d7ba1243787 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Thu, 29 Oct 2020 16:53:49 +0700 Subject: [PATCH 01/22] [14.0][ADD] base_tier_validation_server_action --- base_tier_validation_server_action/README.rst | 97 ++++ .../__init__.py | 3 + .../__manifest__.py | 20 + .../data/cron_data.xml | 17 + .../base_tier_validation_server_action.pot | 83 ++++ .../models/__init__.py | 4 + .../models/tier_definition.py | 59 +++ .../models/tier_review.py | 16 + .../readme/CONFIGURE.rst | 7 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 445 ++++++++++++++++++ .../tests/__init__.py | 3 + .../tests/test_tier_validation.py | 179 +++++++ .../tests/tier_validation_tester.py | 28 ++ .../views/tier_definition_view.xml | 25 + 17 files changed, 988 insertions(+) create mode 100644 base_tier_validation_server_action/README.rst create mode 100644 base_tier_validation_server_action/__init__.py create mode 100644 base_tier_validation_server_action/__manifest__.py create mode 100644 base_tier_validation_server_action/data/cron_data.xml create mode 100644 base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot create mode 100644 base_tier_validation_server_action/models/__init__.py create mode 100644 base_tier_validation_server_action/models/tier_definition.py create mode 100644 base_tier_validation_server_action/models/tier_review.py create mode 100644 base_tier_validation_server_action/readme/CONFIGURE.rst create mode 100644 base_tier_validation_server_action/readme/CONTRIBUTORS.rst create mode 100644 base_tier_validation_server_action/readme/DESCRIPTION.rst create mode 100644 base_tier_validation_server_action/static/description/icon.png create mode 100644 base_tier_validation_server_action/static/description/index.html create mode 100644 base_tier_validation_server_action/tests/__init__.py create mode 100644 base_tier_validation_server_action/tests/test_tier_validation.py create mode 100644 base_tier_validation_server_action/tests/tier_validation_tester.py create mode 100644 base_tier_validation_server_action/views/tier_definition_view.xml diff --git a/base_tier_validation_server_action/README.rst b/base_tier_validation_server_action/README.rst new file mode 100644 index 000000000..fc6005eac --- /dev/null +++ b/base_tier_validation_server_action/README.rst @@ -0,0 +1,97 @@ +==================================== +Base Tier Validation - Server Action +==================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |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/14.0/base_tier_validation_server_action + :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-14-0/server-ux-14-0-base_tier_validation_server_action + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/250/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module add option to call "Server Action" when a tier definition is validate. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +On each Tier Definition + +* Choose server action you want to call as soon this definition is validated +* Select "Auto Validate", if you want this definition to get validated by cron job based on "if pass condition" criteria, + * If no user specified, use job's system user to validate + * If 1 user matched as reviewer, use the user to validate + * If > 1 user matched as reviewer, do not auto validate + +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 +~~~~~~~ + +* Ecosoft + +Contributors +~~~~~~~~~~~~ + +* Kitti U. + +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-kittiu| image:: https://github.com/kittiu.png?size=40px + :target: https://github.com/kittiu + :alt: kittiu + +Current `maintainer `__: + +|maintainer-kittiu| + +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_server_action/__init__.py b/base_tier_validation_server_action/__init__.py new file mode 100644 index 000000000..31660d6a9 --- /dev/null +++ b/base_tier_validation_server_action/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/base_tier_validation_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py new file mode 100644 index 000000000..54fe11d8e --- /dev/null +++ b/base_tier_validation_server_action/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Base Tier Validation - Server Action", + "summary": "Add option to call server action when a tier is validated", + "version": "14.0.1.0.0", + "development_status": "Alpha", + "maintainers": ["kittiu"], + "category": "Tools", + "website": "https://github.com/OCA/server-ux", + "author": "Ecosoft, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["base_tier_validation"], + "data": [ + "data/cron_data.xml", + "views/tier_definition_view.xml", + ], +} diff --git a/base_tier_validation_server_action/data/cron_data.xml b/base_tier_validation_server_action/data/cron_data.xml new file mode 100644 index 000000000..27256a5a2 --- /dev/null +++ b/base_tier_validation_server_action/data/cron_data.xml @@ -0,0 +1,17 @@ + + + + Automatic Tier Validation + 1 + hours + -1 + + + + model._cron_auto_tier_validation() + code + + diff --git a/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot b/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot new file mode 100644 index 000000000..1466a608f --- /dev/null +++ b/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot @@ -0,0 +1,83 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation_server_action +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__auto_validate +msgid "Auto Validate" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__auto_validate_domain +msgid "Auto Validate Domain" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.actions.server,name:base_tier_validation_server_action.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation_server_action.ir_cron_auto_tier_validation +#: model:ir.cron,name:base_tier_validation_server_action.ir_cron_auto_tier_validation +msgid "Automatic Tier Validation" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_review__display_name +msgid "Display Name" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_review__id +msgid "ID" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_review____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__server_action_id +msgid "Post Review Action" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__server_action_id +msgid "Server action triggered as soon as this step is approved" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model,name:base_tier_validation_server_action.model_tier_definition +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model,name:base_tier_validation_server_action.model_tier_review +msgid "Tier Review" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__auto_validate +msgid "" +"Use schedule job to auto validate if condition is met.\n" +"- If no user specified, use job's system user to validate\n" +"- If 1 user matched as reviewer, use the user to validate\n" +"- If > 1 user matched as reviewer, do not auto validate" +msgstr "" + +#. module: base_tier_validation_server_action +#: model_terms:ir.ui.view,arch_db:base_tier_validation_server_action.tier_definition_view_form +msgid "if pass condition" +msgstr "" diff --git a/base_tier_validation_server_action/models/__init__.py b/base_tier_validation_server_action/models/__init__.py new file mode 100644 index 000000000..d1a2d26ac --- /dev/null +++ b/base_tier_validation_server_action/models/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import tier_definition +from . import tier_review diff --git a/base_tier_validation_server_action/models/tier_definition.py b/base_tier_validation_server_action/models/tier_definition.py new file mode 100644 index 000000000..67fa35c1f --- /dev/null +++ b/base_tier_validation_server_action/models/tier_definition.py @@ -0,0 +1,59 @@ +# Copyright 2020 Ecosoft (http://ecosoft.co.th) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import logging +from ast import literal_eval + +from odoo import api, fields, models + +_logger = logging.getLogger(__name__) + + +class TierDefinition(models.Model): + _inherit = "tier.definition" + + server_action_id = fields.Many2one( + comodel_name="ir.actions.server", + string="Post Review Action", + domain=[("usage", "=", "ir_actions_server")], + help="Server action triggered as soon as this step is approved", + ) + auto_validate = fields.Boolean( + string="Auto Validate", + help="Use schedule job to auto validate if condition is met.\n" + "- If no user specified, use job's system user to validate\n" + "- If 1 user matched as reviewer, use the user to validate\n" + "- If > 1 user matched as reviewer, do not auto validate", + ) + auto_validate_domain = fields.Char() + + def _evaluate_review(self, review): + doc = self.env[review.model].browse(review.res_id) + domain = review.definition_id.auto_validate_domain or "[]" + return doc.filtered_domain(literal_eval(domain)) + + @api.model + def _cron_auto_tier_validation(self): + reviews = self.env["tier.review"].search( + [("status", "=", "pending"), ("definition_id.auto_validate", "=", True)] + ) + for review in reviews: + doc = self._evaluate_review(review) + if not doc: + continue + try: + reviewer = review.reviewer_ids or self.env.user + if len(reviewer) > 1: + _logger.warning( + "Cannot auto tier validate {}: " + "too many reviewers".format(doc) + ) + continue + review_doc = doc.with_user(reviewer) + if review_doc.can_review: + sequences = review_doc._get_sequences_to_approve(reviewer) + if review.sequence in sequences: + review_doc._validate_tier(review) + review_doc._update_counter() + _logger.info("Auto tier validate on %s" % review_doc) + except Exception as e: + _logger.error("Cannot auto tier validate {}: {}".format(doc, e)) diff --git a/base_tier_validation_server_action/models/tier_review.py b/base_tier_validation_server_action/models/tier_review.py new file mode 100644 index 000000000..adee19bf4 --- /dev/null +++ b/base_tier_validation_server_action/models/tier_review.py @@ -0,0 +1,16 @@ +# Copyright 2020 Ecosoft (http://ecosoft.co.th) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class TierReview(models.Model): + _inherit = "tier.review" + + @api.constrains("status") + def _trigger_server_action(self): + for rec in self.filtered(lambda l: l.status == "approved"): + if not rec.definition_id.server_action_id: + continue + ctx = {"active_model": rec.model, "active_id": rec.res_id} + rec.definition_id.server_action_id.with_context(ctx).run() diff --git a/base_tier_validation_server_action/readme/CONFIGURE.rst b/base_tier_validation_server_action/readme/CONFIGURE.rst new file mode 100644 index 000000000..d4f0b476e --- /dev/null +++ b/base_tier_validation_server_action/readme/CONFIGURE.rst @@ -0,0 +1,7 @@ +On each Tier Definition + +* Choose server action you want to call as soon this definition is validated +* Select "Auto Validate", if you want this definition to get validated by cron job based on "if pass condition" criteria, + * If no user specified, use job's system user to validate + * If 1 user matched as reviewer, use the user to validate + * If > 1 user matched as reviewer, do not auto validate diff --git a/base_tier_validation_server_action/readme/CONTRIBUTORS.rst b/base_tier_validation_server_action/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..6ce956d96 --- /dev/null +++ b/base_tier_validation_server_action/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Kitti U. diff --git a/base_tier_validation_server_action/readme/DESCRIPTION.rst b/base_tier_validation_server_action/readme/DESCRIPTION.rst new file mode 100644 index 000000000..367b878ae --- /dev/null +++ b/base_tier_validation_server_action/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module add option to call "Server Action" when a tier definition is validate. diff --git a/base_tier_validation_server_action/static/description/icon.png b/base_tier_validation_server_action/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/base_tier_validation_server_action/static/description/index.html b/base_tier_validation_server_action/static/description/index.html new file mode 100644 index 000000000..f1c81fbc4 --- /dev/null +++ b/base_tier_validation_server_action/static/description/index.html @@ -0,0 +1,445 @@ + + + + + + +Base Tier Validation - Server Action + + + +
+

Base Tier Validation - Server Action

+ + +

Alpha License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runbot

+

This module add option to call “Server Action” when a tier definition is validate.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Configuration

+

On each Tier Definition

+
    +
  • Choose server action you want to call as soon this definition is validated
  • +
  • +
    Select “Auto Validate”, if you want this definition to get validated by cron job based on “if pass condition” criteria,
    +
      +
    • If no user specified, use job’s system user to validate
    • +
    • If 1 user matched as reviewer, use the user to validate
    • +
    • If > 1 user matched as reviewer, do not auto validate
    • +
    +
    +
    +
  • +
+
+
+

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

+
    +
  • Ecosoft
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

Current maintainer:

+

kittiu

+

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_server_action/tests/__init__.py b/base_tier_validation_server_action/tests/__init__.py new file mode 100644 index 000000000..f39596410 --- /dev/null +++ b/base_tier_validation_server_action/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_tier_validation diff --git a/base_tier_validation_server_action/tests/test_tier_validation.py b/base_tier_validation_server_action/tests/test_tier_validation.py new file mode 100644 index 000000000..8356d5634 --- /dev/null +++ b/base_tier_validation_server_action/tests/test_tier_validation.py @@ -0,0 +1,179 @@ +# Copyright 2020 Ecosoft (http://ecosoft.co.th) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +from odoo_test_helper import FakeModelLoader + +from odoo.tests import common +from odoo.tests.common import tagged + + +@tagged("post_install", "-at_install") +class TierTierValidation(common.SavepointCase): + @classmethod + def setUpClass(cls): + super(TierTierValidation, cls).setUpClass() + + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.loader.backup_registry() + from .tier_validation_tester import TierValidationTester + + cls.loader.update_registry((TierValidationTester,)) + cls.test_model = cls.env[TierValidationTester._name] + cls.tester_model = cls.env["ir.model"].search( + [("model", "=", "tier.validation.tester")] + ) + + # Access record: + cls.env["ir.model.access"].create( + { + "name": "access.tester", + "model_id": cls.tester_model.id, + "perm_read": 1, + "perm_write": 1, + "perm_create": 1, + "perm_unlink": 1, + } + ) + + # Create users: + cls.group_system = cls.env.ref("base.group_system") + group_ids = cls.group_system.ids + cls.test_user_1 = cls.env["res.users"].create( + {"name": "John", "login": "test1", "groups_id": [(6, 0, group_ids)]} + ) + cls.test_user_2 = cls.env["res.users"].create( + {"name": "Mike", "login": "test2"} + ) + cls.test_user_3 = cls.env["res.users"].create( + {"name": "John Wick", "login": "test3", "groups_id": [(6, 0, group_ids)]} + ) + + # Create tier definitions: + cls.tier_def_obj = cls.env["tier.definition"] + cls.tier_def_obj.create( + { + "model_id": cls.tester_model.id, + "review_type": "individual", + "reviewer_id": cls.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "sequence": 30, + } + ) + + cls.test_record = cls.test_model.create({"test_field": 2.5}) + + @classmethod + def tearDownClass(cls): + cls.loader.restore_registry() + super(TierTierValidation, cls).tearDownClass() + + def test_1_auto_validation(self): + # 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, + "sequence": 20, + "approve_sequence": True, + "auto_validate": True, + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "sequence": 10, + "approve_sequence": True, + "auto_validate": True, + "auto_validate_domain": "[('test_field', '>', 3)]", + } + ) + # Request validation + test_record.with_user(self.test_user_2).request_validation() + record = test_record.with_user(self.test_user_1) + record.invalidate_cache() + # Auto validate, 1st tier, not auto validated + self.tier_def_obj._cron_auto_tier_validation() + self.assertEqual( + record.review_ids.mapped("status"), ["pending", "pending", "pending"] + ) + # Manual validate 2nd tier -> OK + record.validate_tier() + self.assertEqual( + record.review_ids.mapped("status"), ["approved", "pending", "pending"] + ) + # Auto validate, 2nd tier -> OK + self.tier_def_obj._cron_auto_tier_validation() + self.assertEqual( + record.review_ids.mapped("status"), ["approved", "approved", "pending"] + ) + # Auto validate, 3rd tier -> Not pass validate domain + self.tier_def_obj._cron_auto_tier_validation() + self.assertEqual( + record.review_ids.mapped("status"), ["approved", "approved", "pending"] + ) + # Manual validate 3rd tier -> OK + record.validate_tier() + self.assertEqual( + record.review_ids.mapped("status"), ["approved", "approved", "approved"] + ) + + def test_2_auto_validation_exception(self): + # 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_group_id": self.group_system.id, + "sequence": 20, + "approve_sequence": True, + "auto_validate": True, + } + ) + # Request validation + test_record.with_user(self.test_user_2).request_validation() + record = test_record.with_user(self.test_user_1) + record.invalidate_cache() + # Auto validate, 1st tier, not auto validated + self.tier_def_obj._cron_auto_tier_validation() + self.assertEqual(record.review_ids.mapped("status"), ["pending", "pending"]) + # Manual validate 2nd tier -> OK + record.validate_tier() + self.assertEqual(record.review_ids.mapped("status"), ["approved", "pending"]) + # Auto validate, 2nd tier -> Not OK, before len(reviewers) > 1 + self.tier_def_obj._cron_auto_tier_validation() + self.assertEqual(record.review_ids.mapped("status"), ["approved", "pending"]) + + def test_3_trigger_server_action(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create server action + server_action = self.env["ir.actions.server"].create( + { + "name": "Set test_bool = True", + "model_id": self.tester_model.id, + "state": "code", + "code": "record.write({'test_bool': True})", + } + ) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "sequence": 20, + "server_action_id": server_action.id, # Server Action + } + ) + # Request validation + test_record.with_user(self.test_user_2).request_validation() + record = test_record.with_user(self.test_user_1) + record.invalidate_cache() + record.validate_tier() + self.assertTrue(record.test_bool) diff --git a/base_tier_validation_server_action/tests/tier_validation_tester.py b/base_tier_validation_server_action/tests/tier_validation_tester.py new file mode 100644 index 000000000..c4db15ab8 --- /dev/null +++ b/base_tier_validation_server_action/tests/tier_validation_tester.py @@ -0,0 +1,28 @@ +# Copyright 2020 Ecosoft (http://ecosoft.co.th) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class TierValidationTester(models.Model): + _name = "tier.validation.tester" + _description = "Tier Validation Tester" + _inherit = ["tier.validation"] + + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("cancel", "Cancel"), + ], + default="draft", + ) + test_field = fields.Float() + user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") + test_bool = fields.Boolean() + + def action_confirm(self): + self.write({"state": "confirmed"}) + + def _get_under_validation_exceptions(self): + return super()._get_under_validation_exceptions() + ["test_bool"] diff --git a/base_tier_validation_server_action/views/tier_definition_view.xml b/base_tier_validation_server_action/views/tier_definition_view.xml new file mode 100644 index 000000000..89305bcd3 --- /dev/null +++ b/base_tier_validation_server_action/views/tier_definition_view.xml @@ -0,0 +1,25 @@ + + + + + tier.definition.form + tier.definition + + + + + + + + + + + + From a85bc4d4b7637af010fb3393cc05afc7db2088cb Mon Sep 17 00:00:00 2001 From: Kitti U Date: Wed, 17 Feb 2021 19:26:19 +0700 Subject: [PATCH 02/22] [14.0][IMP] base_tier_validation_server_action, add server action on rejection --- base_tier_validation_server_action/README.rst | 4 +-- .../__manifest__.py | 2 +- .../base_tier_validation_server_action.pot | 12 +++++++- .../models/tier_definition.py | 8 ++++- .../models/tier_review.py | 14 +++++---- .../readme/CONFIGURE.rst | 2 +- .../readme/DESCRIPTION.rst | 2 +- .../static/description/index.html | 4 +-- .../tests/test_tier_validation.py | 29 +++++++++++++++++++ .../views/tier_definition_view.xml | 1 + 10 files changed, 64 insertions(+), 14 deletions(-) diff --git a/base_tier_validation_server_action/README.rst b/base_tier_validation_server_action/README.rst index fc6005eac..f74e18bc8 100644 --- a/base_tier_validation_server_action/README.rst +++ b/base_tier_validation_server_action/README.rst @@ -25,7 +25,7 @@ Base Tier Validation - Server Action |badge1| |badge2| |badge3| |badge4| |badge5| -This module add option to call "Server Action" when a tier definition is validate. +This module add option to call "Server Action" when a tier definition is approved or rejected .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. @@ -42,7 +42,7 @@ Configuration On each Tier Definition -* Choose server action you want to call as soon this definition is validated +* Choose server action you want to call as soon this definition is approved or rejected * Select "Auto Validate", if you want this definition to get validated by cron job based on "if pass condition" criteria, * If no user specified, use job's system user to validate * If 1 user matched as reviewer, use the user to validate diff --git a/base_tier_validation_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index 54fe11d8e..beafcfd34 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "14.0.1.0.0", + "version": "14.0.1.1.0", "development_status": "Alpha", "maintainers": ["kittiu"], "category": "Tools", diff --git a/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot b/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot index 1466a608f..cac0bc8ff 100644 --- a/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot +++ b/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot @@ -50,7 +50,12 @@ msgstr "" #. module: base_tier_validation_server_action #: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__server_action_id -msgid "Post Review Action" +msgid "Post Approve Action" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__rejected_server_action_id +msgid "Post Reject Action" msgstr "" #. module: base_tier_validation_server_action @@ -58,6 +63,11 @@ msgstr "" msgid "Server action triggered as soon as this step is approved" msgstr "" +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__rejected_server_action_id +msgid "Server action triggered as soon as this step is rejected" +msgstr "" + #. module: base_tier_validation_server_action #: model:ir.model,name:base_tier_validation_server_action.model_tier_definition msgid "Tier Definition" diff --git a/base_tier_validation_server_action/models/tier_definition.py b/base_tier_validation_server_action/models/tier_definition.py index 67fa35c1f..bb3b4767d 100644 --- a/base_tier_validation_server_action/models/tier_definition.py +++ b/base_tier_validation_server_action/models/tier_definition.py @@ -13,10 +13,16 @@ class TierDefinition(models.Model): server_action_id = fields.Many2one( comodel_name="ir.actions.server", - string="Post Review Action", + string="Post Approve Action", domain=[("usage", "=", "ir_actions_server")], help="Server action triggered as soon as this step is approved", ) + rejected_server_action_id = fields.Many2one( + comodel_name="ir.actions.server", + string="Post Reject Action", + domain=[("usage", "=", "ir_actions_server")], + help="Server action triggered as soon as this step is rejected", + ) auto_validate = fields.Boolean( string="Auto Validate", help="Use schedule job to auto validate if condition is met.\n" diff --git a/base_tier_validation_server_action/models/tier_review.py b/base_tier_validation_server_action/models/tier_review.py index adee19bf4..b93e0d4fd 100644 --- a/base_tier_validation_server_action/models/tier_review.py +++ b/base_tier_validation_server_action/models/tier_review.py @@ -9,8 +9,12 @@ class TierReview(models.Model): @api.constrains("status") def _trigger_server_action(self): - for rec in self.filtered(lambda l: l.status == "approved"): - if not rec.definition_id.server_action_id: - continue - ctx = {"active_model": rec.model, "active_id": rec.res_id} - rec.definition_id.server_action_id.with_context(ctx).run() + for rec in self.filtered(lambda l: l.status in ["approved", "rejected"]): + server_action = False + if rec.status == "approved": + server_action = rec.definition_id.server_action_id + if rec.status == "rejected": + server_action = rec.definition_id.rejected_server_action_id + if server_action: + ctx = {"active_model": rec.model, "active_id": rec.res_id} + server_action.with_context(ctx).run() diff --git a/base_tier_validation_server_action/readme/CONFIGURE.rst b/base_tier_validation_server_action/readme/CONFIGURE.rst index d4f0b476e..870e12132 100644 --- a/base_tier_validation_server_action/readme/CONFIGURE.rst +++ b/base_tier_validation_server_action/readme/CONFIGURE.rst @@ -1,6 +1,6 @@ On each Tier Definition -* Choose server action you want to call as soon this definition is validated +* Choose server action you want to call as soon this definition is approved or rejected * Select "Auto Validate", if you want this definition to get validated by cron job based on "if pass condition" criteria, * If no user specified, use job's system user to validate * If 1 user matched as reviewer, use the user to validate diff --git a/base_tier_validation_server_action/readme/DESCRIPTION.rst b/base_tier_validation_server_action/readme/DESCRIPTION.rst index 367b878ae..048108475 100644 --- a/base_tier_validation_server_action/readme/DESCRIPTION.rst +++ b/base_tier_validation_server_action/readme/DESCRIPTION.rst @@ -1 +1 @@ -This module add option to call "Server Action" when a tier definition is validate. +This module add option to call "Server Action" when a tier definition is approved or rejected diff --git a/base_tier_validation_server_action/static/description/index.html b/base_tier_validation_server_action/static/description/index.html index f1c81fbc4..831064a18 100644 --- a/base_tier_validation_server_action/static/description/index.html +++ b/base_tier_validation_server_action/static/description/index.html @@ -368,7 +368,7 @@

Base Tier Validation - Server Action

!! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Alpha License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runbot

-

This module add option to call “Server Action” when a tier definition is validate.

+

This module add option to call “Server Action” when a tier definition is approved or rejected

Important

This is an alpha version, the data model and design can change at any time without warning. @@ -392,7 +392,7 @@

Base Tier Validation - Server Action

Configuration

On each Tier Definition

    -
  • Choose server action you want to call as soon this definition is validated
  • +
  • Choose server action you want to call as soon this definition is approved or rejected
  • Select “Auto Validate”, if you want this definition to get validated by cron job based on “if pass condition” criteria,
      diff --git a/base_tier_validation_server_action/tests/test_tier_validation.py b/base_tier_validation_server_action/tests/test_tier_validation.py index 8356d5634..32bd96a45 100644 --- a/base_tier_validation_server_action/tests/test_tier_validation.py +++ b/base_tier_validation_server_action/tests/test_tier_validation.py @@ -177,3 +177,32 @@ def test_3_trigger_server_action(self): record.invalidate_cache() record.validate_tier() self.assertTrue(record.test_bool) + + def test_4_trigger_rejected_server_action(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create rejected server action + rejected_server_action = self.env["ir.actions.server"].create( + { + "name": "Set test_bool = True", + "model_id": self.tester_model.id, + "state": "code", + "code": "record.write({'test_bool': True})", + } + ) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "sequence": 20, + "rejected_server_action_id": rejected_server_action.id, + } + ) + # Request rejection + test_record.with_user(self.test_user_2).request_validation() + record = test_record.with_user(self.test_user_1) + record.invalidate_cache() + record.reject_tier() + self.assertTrue(record.test_bool) diff --git a/base_tier_validation_server_action/views/tier_definition_view.xml b/base_tier_validation_server_action/views/tier_definition_view.xml index 89305bcd3..44077dc33 100644 --- a/base_tier_validation_server_action/views/tier_definition_view.xml +++ b/base_tier_validation_server_action/views/tier_definition_view.xml @@ -10,6 +10,7 @@ + Date: Tue, 16 Mar 2021 09:50:51 +0000 Subject: [PATCH 03/22] Added translation using Weblate (Spanish) --- base_tier_validation_server_action/i18n/es.po | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 base_tier_validation_server_action/i18n/es.po diff --git a/base_tier_validation_server_action/i18n/es.po b/base_tier_validation_server_action/i18n/es.po new file mode 100644 index 000000000..62cee017d --- /dev/null +++ b/base_tier_validation_server_action/i18n/es.po @@ -0,0 +1,96 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation_server_action +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-03-16 11:46+0000\n" +"Last-Translator: Ana Suárez \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__auto_validate +msgid "Auto Validate" +msgstr "Auto-validar" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__auto_validate_domain +msgid "Auto Validate Domain" +msgstr "Auto-validar dominio" + +#. module: base_tier_validation_server_action +#: model:ir.actions.server,name:base_tier_validation_server_action.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation_server_action.ir_cron_auto_tier_validation +#: model:ir.cron,name:base_tier_validation_server_action.ir_cron_auto_tier_validation +msgid "Automatic Tier Validation" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_review__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_review__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_review____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__server_action_id +msgid "Post Approve Action" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__rejected_server_action_id +msgid "Post Reject Action" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__server_action_id +msgid "Server action triggered as soon as this step is approved" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__rejected_server_action_id +msgid "Server action triggered as soon as this step is rejected" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model,name:base_tier_validation_server_action.model_tier_definition +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model,name:base_tier_validation_server_action.model_tier_review +msgid "Tier Review" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__auto_validate +msgid "" +"Use schedule job to auto validate if condition is met.\n" +"- If no user specified, use job's system user to validate\n" +"- If 1 user matched as reviewer, use the user to validate\n" +"- If > 1 user matched as reviewer, do not auto validate" +msgstr "" + +#. module: base_tier_validation_server_action +#: model_terms:ir.ui.view,arch_db:base_tier_validation_server_action.tier_definition_view_form +msgid "if pass condition" +msgstr "" From ad911b2baa6538a45d7b6271230d594b451ce4f2 Mon Sep 17 00:00:00 2001 From: Kitti U Date: Sun, 27 Jun 2021 22:54:06 +0700 Subject: [PATCH 04/22] [14.0][ADD] base_tier_validation_server_action, use write to trigger server action --- .../__manifest__.py | 2 +- .../models/tier_review.py | 28 +++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/base_tier_validation_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index beafcfd34..8024d2048 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "14.0.1.1.0", + "version": "14.0.1.1.1", "development_status": "Alpha", "maintainers": ["kittiu"], "category": "Tools", diff --git a/base_tier_validation_server_action/models/tier_review.py b/base_tier_validation_server_action/models/tier_review.py index b93e0d4fd..b0f623202 100644 --- a/base_tier_validation_server_action/models/tier_review.py +++ b/base_tier_validation_server_action/models/tier_review.py @@ -1,20 +1,24 @@ # Copyright 2020 Ecosoft (http://ecosoft.co.th) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import api, models +from odoo import models class TierReview(models.Model): _inherit = "tier.review" - @api.constrains("status") - def _trigger_server_action(self): - for rec in self.filtered(lambda l: l.status in ["approved", "rejected"]): - server_action = False - if rec.status == "approved": - server_action = rec.definition_id.server_action_id - if rec.status == "rejected": - server_action = rec.definition_id.rejected_server_action_id - if server_action: - ctx = {"active_model": rec.model, "active_id": rec.res_id} - server_action.with_context(ctx).run() + def write(self, vals): + res = super().write(vals) + if vals.get("status") in ["approved", "rejected"]: + for rec in self: + server_action = False + if rec.status == "approved": + server_action = rec.definition_id.server_action_id + if rec.status == "rejected": + server_action = rec.definition_id.rejected_server_action_id + if server_action: + server_action.with_context( + active_model=rec.model, + active_id=rec.res_id, + ).sudo().run() + return res From 534debbd442ba83d29e337897b2ae95e7e29146e Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Tue, 25 Jan 2022 19:34:44 +0100 Subject: [PATCH 05/22] [14.0][IMP] base_tier_validation_server_action: Avoid recursive server actions --- base_tier_validation_server_action/__manifest__.py | 2 +- base_tier_validation_server_action/models/tier_review.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/base_tier_validation_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index 8024d2048..878bdfcf8 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "14.0.1.1.1", + "version": "14.0.1.1.2", "development_status": "Alpha", "maintainers": ["kittiu"], "category": "Tools", diff --git a/base_tier_validation_server_action/models/tier_review.py b/base_tier_validation_server_action/models/tier_review.py index b0f623202..55c88ff22 100644 --- a/base_tier_validation_server_action/models/tier_review.py +++ b/base_tier_validation_server_action/models/tier_review.py @@ -16,8 +16,14 @@ def write(self, vals): server_action = rec.definition_id.server_action_id if rec.status == "rejected": server_action = rec.definition_id.rejected_server_action_id - if server_action: + server_action_tier = self.env.context.get("server_action_tier") + # Don't allow reentrant server action as it will lead to + # recursive behaviour + if server_action and ( + not server_action_tier or server_action_tier != server_action.id + ): server_action.with_context( + server_action_tier=server_action.id, active_model=rec.model, active_id=rec.res_id, ).sudo().run() From 58f4fd5db823ca111a86e52788719066ccc2fe1b Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Mon, 10 Jan 2022 19:34:54 +0100 Subject: [PATCH 06/22] [14.0][IMP] base_tier_validation_server_action: Promote to Beta --- base_tier_validation_server_action/README.rst | 9 ++------- base_tier_validation_server_action/__manifest__.py | 4 ++-- .../static/description/index.html | 8 +------- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/base_tier_validation_server_action/README.rst b/base_tier_validation_server_action/README.rst index f74e18bc8..ef1287abe 100644 --- a/base_tier_validation_server_action/README.rst +++ b/base_tier_validation_server_action/README.rst @@ -7,9 +7,9 @@ Base Tier Validation - Server Action !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status - :alt: Alpha + :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 @@ -27,11 +27,6 @@ Base Tier Validation - Server Action This module add option to call "Server Action" when a tier definition is approved or rejected -.. IMPORTANT:: - This is an alpha version, the data model and design can change at any time without warning. - Only for development or testing purpose, do not use in production. - `More details on development status `_ - **Table of contents** .. contents:: diff --git a/base_tier_validation_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index 878bdfcf8..ae0f7657b 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,8 +3,8 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "14.0.1.1.2", - "development_status": "Alpha", + "version": "14.0.1.1.3", + "development_status": "Beta", "maintainers": ["kittiu"], "category": "Tools", "website": "https://github.com/OCA/server-ux", diff --git a/base_tier_validation_server_action/static/description/index.html b/base_tier_validation_server_action/static/description/index.html index 831064a18..b614dadbe 100644 --- a/base_tier_validation_server_action/static/description/index.html +++ b/base_tier_validation_server_action/static/description/index.html @@ -367,14 +367,8 @@

      Base Tier Validation - Server Action

      !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

      Alpha License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runbot

      +

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

      This module add option to call “Server Action” when a tier definition is approved or rejected

      -
      -

      Important

      -

      This is an alpha version, the data model and design can change at any time without warning. -Only for development or testing purpose, do not use in production. -More details on development status

      -

      Table of contents

        From d6018a6e9b00626d4d6cd188aca5c77ae9d21777 Mon Sep 17 00:00:00 2001 From: Saran440 Date: Fri, 27 Jan 2023 11:02:39 +0700 Subject: [PATCH 07/22] [15.0][MIG] base_tier_validation_server_action --- base_tier_validation_server_action/__manifest__.py | 6 +++--- .../models/tier_definition.py | 1 - .../tests/test_tier_validation.py | 4 ++-- .../tests/tier_validation_tester.py | 3 --- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/base_tier_validation_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index ae0f7657b..eff44f260 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,9 +3,7 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "14.0.1.1.3", - "development_status": "Beta", - "maintainers": ["kittiu"], + "version": "15.0.1.0.0", "category": "Tools", "website": "https://github.com/OCA/server-ux", "author": "Ecosoft, Odoo Community Association (OCA)", @@ -17,4 +15,6 @@ "data/cron_data.xml", "views/tier_definition_view.xml", ], + "maintainers": ["kittiu"], + "development_status": "Beta", } diff --git a/base_tier_validation_server_action/models/tier_definition.py b/base_tier_validation_server_action/models/tier_definition.py index bb3b4767d..fca911dba 100644 --- a/base_tier_validation_server_action/models/tier_definition.py +++ b/base_tier_validation_server_action/models/tier_definition.py @@ -24,7 +24,6 @@ class TierDefinition(models.Model): help="Server action triggered as soon as this step is rejected", ) auto_validate = fields.Boolean( - string="Auto Validate", help="Use schedule job to auto validate if condition is met.\n" "- If no user specified, use job's system user to validate\n" "- If 1 user matched as reviewer, use the user to validate\n" diff --git a/base_tier_validation_server_action/tests/test_tier_validation.py b/base_tier_validation_server_action/tests/test_tier_validation.py index 32bd96a45..739caabca 100644 --- a/base_tier_validation_server_action/tests/test_tier_validation.py +++ b/base_tier_validation_server_action/tests/test_tier_validation.py @@ -7,7 +7,7 @@ @tagged("post_install", "-at_install") -class TierTierValidation(common.SavepointCase): +class TierTierValidation(common.TransactionCase): @classmethod def setUpClass(cls): super(TierTierValidation, cls).setUpClass() @@ -64,7 +64,7 @@ def setUpClass(cls): @classmethod def tearDownClass(cls): cls.loader.restore_registry() - super(TierTierValidation, cls).tearDownClass() + super().tearDownClass() def test_1_auto_validation(self): # Create new test record diff --git a/base_tier_validation_server_action/tests/tier_validation_tester.py b/base_tier_validation_server_action/tests/tier_validation_tester.py index c4db15ab8..36c533e6a 100644 --- a/base_tier_validation_server_action/tests/tier_validation_tester.py +++ b/base_tier_validation_server_action/tests/tier_validation_tester.py @@ -21,8 +21,5 @@ class TierValidationTester(models.Model): user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") test_bool = fields.Boolean() - def action_confirm(self): - self.write({"state": "confirmed"}) - def _get_under_validation_exceptions(self): return super()._get_under_validation_exceptions() + ["test_bool"] From 7613b575925a86c45d9aa027c912790074b7e768 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Wed, 12 Jul 2023 18:41:01 +0200 Subject: [PATCH 08/22] [MIG] base_tier_validation_server_action --- base_tier_validation_server_action/README.rst | 23 +++++++++++-------- .../__manifest__.py | 2 +- .../static/description/index.html | 12 ++++++---- .../tests/test_tier_validation.py | 8 +++---- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/base_tier_validation_server_action/README.rst b/base_tier_validation_server_action/README.rst index ef1287abe..e3d5afcde 100644 --- a/base_tier_validation_server_action/README.rst +++ b/base_tier_validation_server_action/README.rst @@ -2,10 +2,13 @@ Base Tier Validation - Server Action ==================================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:d00b3ef08eaf5700c0470546ab8455b68a36e0b846660fa76f245af7f97dfed0 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -14,16 +17,16 @@ Base Tier Validation - Server Action :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/14.0/base_tier_validation_server_action + :target: https://github.com/OCA/server-ux/tree/16.0/base_tier_validation_server_action :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-14-0/server-ux-14-0-base_tier_validation_server_action + :target: https://translation.odoo-community.org/projects/server-ux-16-0/server-ux-16-0-base_tier_validation_server_action :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/250/14.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/server-ux&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module add option to call "Server Action" when a tier definition is approved or rejected @@ -48,8 +51,8 @@ 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 `_. +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. @@ -87,6 +90,6 @@ Current `maintainer `__: |maintainer-kittiu| -This module is part of the `OCA/server-ux `_ project on GitHub. +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_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index eff44f260..341e323b9 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "category": "Tools", "website": "https://github.com/OCA/server-ux", "author": "Ecosoft, Odoo Community Association (OCA)", diff --git a/base_tier_validation_server_action/static/description/index.html b/base_tier_validation_server_action/static/description/index.html index b614dadbe..bead9e971 100644 --- a/base_tier_validation_server_action/static/description/index.html +++ b/base_tier_validation_server_action/static/description/index.html @@ -3,7 +3,7 @@ - + Base Tier Validation - Server Action -
        -

        Base Tier Validation - Server Action

        +
        + + +Odoo Community Association + +
        +

        Base Tier Validation - Server Action

        -

        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

        This module add option to call “Server Action” when a tier definition is approved or rejected

        Table of contents

        @@ -386,7 +391,7 @@

        Base Tier Validation - Server Action

      -

      Configuration

      +

      Configuration

      On each Tier Definition

      • Choose server action you want to call as soon this definition is @@ -401,7 +406,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 @@ -409,21 +414,21 @@

      Bug Tracker

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

+ diff --git a/base_tier_validation_server_action/tests/test_tier_validation.py b/base_tier_validation_server_action/tests/test_tier_validation.py index 0f95f397c..797f15fee 100644 --- a/base_tier_validation_server_action/tests/test_tier_validation.py +++ b/base_tier_validation_server_action/tests/test_tier_validation.py @@ -98,12 +98,12 @@ def test_1_auto_validation(self): # Auto validate, 1st tier, not auto validated self.tier_def_obj._cron_auto_tier_validation() self.assertEqual( - record.review_ids.mapped("status"), ["pending", "pending", "pending"] + record.review_ids.mapped("status"), ["waiting", "waiting", "waiting"] ) # Manual validate 2nd tier -> OK record.validate_tier() self.assertEqual( - record.review_ids.mapped("status"), ["approved", "pending", "pending"] + record.review_ids.mapped("status"), ["approved", "pending", "waiting"] ) # Auto validate, 2nd tier -> OK self.tier_def_obj._cron_auto_tier_validation() @@ -140,13 +140,21 @@ def test_2_auto_validation_exception(self): record = test_record.with_user(self.test_user_1) record.invalidate_recordset() # Auto validate, 1st tier, not auto validated - self.tier_def_obj._cron_auto_tier_validation() - self.assertEqual(record.review_ids.mapped("status"), ["pending", "pending"]) + with self.assertLogs( + "odoo.addons.base_tier_validation_server_action.models.tier_definition", + level="WARNING", + ): + self.tier_def_obj._cron_auto_tier_validation() + self.assertEqual(record.review_ids.mapped("status"), ["waiting", "waiting"]) # Manual validate 2nd tier -> OK record.validate_tier() self.assertEqual(record.review_ids.mapped("status"), ["approved", "pending"]) # Auto validate, 2nd tier -> Not OK, before len(reviewers) > 1 - self.tier_def_obj._cron_auto_tier_validation() + with self.assertLogs( + "odoo.addons.base_tier_validation_server_action.models.tier_definition", + level="WARNING", + ): + self.tier_def_obj._cron_auto_tier_validation() self.assertEqual(record.review_ids.mapped("status"), ["approved", "pending"]) def test_3_trigger_server_action(self): diff --git a/base_tier_validation_server_action/views/tier_definition_view.xml b/base_tier_validation_server_action/views/tier_definition_view.xml index 44077dc33..af37ae6b1 100644 --- a/base_tier_validation_server_action/views/tier_definition_view.xml +++ b/base_tier_validation_server_action/views/tier_definition_view.xml @@ -17,7 +17,7 @@ string="if pass condition" widget="domain" options="{'model': 'model'}" - attrs="{'invisible': [('auto_validate', '=', False)]}" + invisible="not auto_validate" /> From d4101b5dd0fa3cdb86f4822ba02a78259fe4225c Mon Sep 17 00:00:00 2001 From: Carlos Lopez Date: Fri, 20 Feb 2026 13:55:42 -0500 Subject: [PATCH 15/22] [FIX] base_tier_validation_server_action: Change where the mock has to be loaded With the changes introduced in odoo/odoo@de056cc#diff-b37c7fd5520c97a29ddc59495779e7be61a66e15e85603928e27b3affb9dc31f, an error was occurring because the change validation on the model was being performed before tearDownClass was executed. Therefore, it has been modified so that the mock changes are applied in each test and cleaned up after each test. This way, the error will no longer appear and the test will run normally. --- base_tier_validation_server_action/README.rst | 2 +- .../__manifest__.py | 2 +- .../static/description/index.html | 2 +- .../tests/test_tier_validation.py | 46 +++++++++---------- 4 files changed, 25 insertions(+), 27 deletions(-) diff --git a/base_tier_validation_server_action/README.rst b/base_tier_validation_server_action/README.rst index e25fd91be..0dbb96628 100644 --- a/base_tier_validation_server_action/README.rst +++ b/base_tier_validation_server_action/README.rst @@ -11,7 +11,7 @@ Base Tier Validation - Server Action !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:d2423fd167c12f75c0dddb01d1e6d3d466dded51f278ab5a4c478e4f218dd0a3 + !! source digest: sha256:d48528f20aa3399ca23b8de6f65f75c91d14423e28b51cc2f3efe38041f174e5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/base_tier_validation_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index 863fb02ff..9100fc3e6 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "category": "Tools", "website": "https://github.com/OCA/server-ux", "author": "Ecosoft, Odoo Community Association (OCA)", diff --git a/base_tier_validation_server_action/static/description/index.html b/base_tier_validation_server_action/static/description/index.html index 3f4deb48a..2759dd680 100644 --- a/base_tier_validation_server_action/static/description/index.html +++ b/base_tier_validation_server_action/static/description/index.html @@ -372,7 +372,7 @@

Base Tier Validation - Server Action

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:d2423fd167c12f75c0dddb01d1e6d3d466dded51f278ab5a4c478e4f218dd0a3 +!! source digest: sha256:d48528f20aa3399ca23b8de6f65f75c91d14423e28b51cc2f3efe38041f174e5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module add option to call “Server Action” when a tier definition is diff --git a/base_tier_validation_server_action/tests/test_tier_validation.py b/base_tier_validation_server_action/tests/test_tier_validation.py index 797f15fee..bb91cad75 100644 --- a/base_tier_validation_server_action/tests/test_tier_validation.py +++ b/base_tier_validation_server_action/tests/test_tier_validation.py @@ -8,25 +8,24 @@ @tagged("post_install", "-at_install") class TierTierValidation(common.TransactionCase): - @classmethod - def setUpClass(cls): - super().setUpClass() + def setUp(self): + super().setUp() - cls.loader = FakeModelLoader(cls.env, cls.__module__) - cls.loader.backup_registry() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() from .tier_validation_tester import TierValidationTester - cls.loader.update_registry((TierValidationTester,)) - cls.test_model = cls.env[TierValidationTester._name] - cls.tester_model = cls.env["ir.model"].search( + self.loader.update_registry((TierValidationTester,)) + self.test_model = self.env[TierValidationTester._name] + self.tester_model = self.env["ir.model"].search( [("model", "=", "tier.validation.tester")] ) # Access record: - cls.env["ir.model.access"].create( + self.env["ir.model.access"].create( { "name": "access.tester", - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "perm_read": 1, "perm_write": 1, "perm_create": 1, @@ -35,36 +34,35 @@ def setUpClass(cls): ) # Create users: - cls.group_system = cls.env.ref("base.group_system") - group_ids = cls.group_system.ids - cls.test_user_1 = cls.env["res.users"].create( + self.group_system = self.env.ref("base.group_system") + group_ids = self.group_system.ids + self.test_user_1 = self.env["res.users"].create( {"name": "John", "login": "test1", "groups_id": [(6, 0, group_ids)]} ) - cls.test_user_2 = cls.env["res.users"].create( + self.test_user_2 = self.env["res.users"].create( {"name": "Mike", "login": "test2"} ) - cls.test_user_3 = cls.env["res.users"].create( + self.test_user_3 = self.env["res.users"].create( {"name": "John Wick", "login": "test3", "groups_id": [(6, 0, group_ids)]} ) # Create tier definitions: - cls.tier_def_obj = cls.env["tier.definition"] - cls.tier_def_obj.create( + self.tier_def_obj = self.env["tier.definition"] + self.tier_def_obj.create( { - "model_id": cls.tester_model.id, + "model_id": self.tester_model.id, "review_type": "individual", - "reviewer_id": cls.test_user_1.id, + "reviewer_id": self.test_user_1.id, "definition_domain": "[('test_field', '>', 1.0)]", "sequence": 30, } ) - cls.test_record = cls.test_model.create({"test_field": 2.5}) + self.test_record = self.test_model.create({"test_field": 2.5}) - @classmethod - def tearDownClass(cls): - cls.loader.restore_registry() - super().tearDownClass() + def tearDown(self): + self.loader.restore_registry() + super().tearDown() def test_1_auto_validation(self): # Create new test record From 32bcc07589e2fb83122f26471012f0df451fc226 Mon Sep 17 00:00:00 2001 From: Maksym Yankin Date: Thu, 30 Apr 2026 11:36:01 +0300 Subject: [PATCH 16/22] [IMP] base_tier_validation_server_action: pre-commit auto fixes --- base_tier_validation_server_action/README.rst | 16 ++++++++-------- .../__manifest__.py | 2 +- .../models/tier_definition.py | 2 +- .../static/description/index.html | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/base_tier_validation_server_action/README.rst b/base_tier_validation_server_action/README.rst index 0dbb96628..cf2ee8fc3 100644 --- a/base_tier_validation_server_action/README.rst +++ b/base_tier_validation_server_action/README.rst @@ -20,14 +20,14 @@ Base Tier Validation - Server Action .. |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 - :target: https://github.com/OCA/server-ux/tree/18.0/base_tier_validation_server_action - :alt: OCA/server-ux +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ftier--validation-lightgray.png?logo=github + :target: https://github.com/OCA/tier-validation/tree/19.0/base_tier_validation_server_action + :alt: OCA/tier-validation .. |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_server_action + :target: https://translation.odoo-community.org/projects/tier-validation-19-0/tier-validation-19-0-base_tier_validation_server_action :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 + :target: https://runboat.odoo-community.org/builds?repo=OCA/tier-validation&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -58,10 +58,10 @@ On each Tier Definition Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -99,6 +99,6 @@ Current `maintainer `__: |maintainer-kittiu| -This module is part of the `OCA/server-ux `_ project on GitHub. +This module is part of the `OCA/tier-validation `_ 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_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index 9100fc3e6..7d123a300 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -5,7 +5,7 @@ "summary": "Add option to call server action when a tier is validated", "version": "18.0.1.0.1", "category": "Tools", - "website": "https://github.com/OCA/server-ux", + "website": "https://github.com/OCA/tier-validation", "author": "Ecosoft, Odoo Community Association (OCA)", "license": "AGPL-3", "application": False, diff --git a/base_tier_validation_server_action/models/tier_definition.py b/base_tier_validation_server_action/models/tier_definition.py index 5bf88f698..052180014 100644 --- a/base_tier_validation_server_action/models/tier_definition.py +++ b/base_tier_validation_server_action/models/tier_definition.py @@ -52,7 +52,7 @@ def _cron_auto_tier_validation(self): reviewer = review.reviewer_ids or self.env.user if len(reviewer) > 1: _logger.warning( - f"Cannot auto tier validate {doc}: " "too many reviewers" + f"Cannot auto tier validate {doc}: too many reviewers" ) continue review_doc = doc.with_user(reviewer) diff --git a/base_tier_validation_server_action/static/description/index.html b/base_tier_validation_server_action/static/description/index.html index 2759dd680..f5cdeb16d 100644 --- a/base_tier_validation_server_action/static/description/index.html +++ b/base_tier_validation_server_action/static/description/index.html @@ -374,7 +374,7 @@

Base Tier Validation - Server Action

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:d48528f20aa3399ca23b8de6f65f75c91d14423e28b51cc2f3efe38041f174e5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

Beta License: AGPL-3 OCA/tier-validation Translate me on Weblate Try me on Runboat

This module add option to call “Server Action” when a tier definition is approved or rejected

Table of contents

@@ -407,10 +407,10 @@

Configuration

Bug Tracker

-

Bugs are tracked on GitHub Issues. +

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.

+feedback.

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

@@ -438,7 +438,7 @@

Maintainers

promote its widespread use.

Current maintainer:

kittiu

-

This module is part of the OCA/server-ux project on GitHub.

+

This module is part of the OCA/tier-validation project on GitHub.

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

From 71eb4a07ff62954ad9c445eedf1a097fe1d552d4 Mon Sep 17 00:00:00 2001 From: Maksym Yankin Date: Thu, 30 Apr 2026 11:50:55 +0300 Subject: [PATCH 17/22] [MIG] base_tier_validation_server_action: Migration to 19.0 --- base_tier_validation_server_action/README.rst | 2 +- .../__manifest__.py | 2 +- .../base_tier_validation_server_action.pot | 14 +++- .../models/tier_definition.py | 7 +- .../static/description/index.html | 2 +- .../tests/test_tier_validation.py | 78 ++++++------------- .../tests/tier_validation_tester.py | 14 +--- 7 files changed, 45 insertions(+), 74 deletions(-) diff --git a/base_tier_validation_server_action/README.rst b/base_tier_validation_server_action/README.rst index cf2ee8fc3..91ea4ff0a 100644 --- a/base_tier_validation_server_action/README.rst +++ b/base_tier_validation_server_action/README.rst @@ -11,7 +11,7 @@ Base Tier Validation - Server Action !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:d48528f20aa3399ca23b8de6f65f75c91d14423e28b51cc2f3efe38041f174e5 + !! source digest: sha256:69bbfe38cb67ae0d8ca9de827c708be7bc0622a7365a607cb318d9f0198efb18 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/base_tier_validation_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index 7d123a300..037950c11 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "18.0.1.0.1", + "version": "19.0.1.0.0", "category": "Tools", "website": "https://github.com/OCA/tier-validation", "author": "Ecosoft, Odoo Community Association (OCA)", diff --git a/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot b/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot index 2d3dc135e..13a39cdd8 100644 --- a/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot +++ b/base_tier_validation_server_action/i18n/base_tier_validation_server_action.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 18.0\n" +"Project-Id-Version: Odoo Server 19.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -28,6 +28,18 @@ msgstr "" msgid "Automatic Tier Validation" msgstr "" +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_validation__display_name +msgid "Display Name" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_validation__id +msgid "ID" +msgstr "" + #. module: base_tier_validation_server_action #: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__server_action_id msgid "Post Approve Action" diff --git a/base_tier_validation_server_action/models/tier_definition.py b/base_tier_validation_server_action/models/tier_definition.py index 052180014..90f987ef0 100644 --- a/base_tier_validation_server_action/models/tier_definition.py +++ b/base_tier_validation_server_action/models/tier_definition.py @@ -4,6 +4,7 @@ from ast import literal_eval from odoo import api, fields, models +from odoo.fields import Domain _logger = logging.getLogger(__name__) @@ -39,10 +40,8 @@ def _evaluate_review(self, review): @api.model def _cron_auto_tier_validation(self): reviews = self.env["tier.review"].search( - [ - ("status", "in", ("waiting", "pending")), - ("definition_id.auto_validate", "=", True), - ] + Domain("status", "in", ("waiting", "pending")) + & Domain("definition_id.auto_validate", "=", True) ) for review in reviews: doc = self._evaluate_review(review) diff --git a/base_tier_validation_server_action/static/description/index.html b/base_tier_validation_server_action/static/description/index.html index f5cdeb16d..7eed50f35 100644 --- a/base_tier_validation_server_action/static/description/index.html +++ b/base_tier_validation_server_action/static/description/index.html @@ -372,7 +372,7 @@

Base Tier Validation - Server Action

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:d48528f20aa3399ca23b8de6f65f75c91d14423e28b51cc2f3efe38041f174e5 +!! source digest: sha256:69bbfe38cb67ae0d8ca9de827c708be7bc0622a7365a607cb318d9f0198efb18 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/tier-validation Translate me on Weblate Try me on Runboat

This module add option to call “Server Action” when a tier definition is diff --git a/base_tier_validation_server_action/tests/test_tier_validation.py b/base_tier_validation_server_action/tests/test_tier_validation.py index bb91cad75..6927f81fb 100644 --- a/base_tier_validation_server_action/tests/test_tier_validation.py +++ b/base_tier_validation_server_action/tests/test_tier_validation.py @@ -1,53 +1,27 @@ # Copyright 2020 Ecosoft (http://ecosoft.co.th) # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). -from odoo_test_helper import FakeModelLoader - -from odoo.tests import common +from odoo.orm.model_classes import add_to_registry from odoo.tests.common import tagged +from odoo.addons.base_tier_validation.tests.common import CommonTierValidation -@tagged("post_install", "-at_install") -class TierTierValidation(common.TransactionCase): - def setUp(self): - super().setUp() - self.loader = FakeModelLoader(self.env, self.__module__) - self.loader.backup_registry() +@tagged("post_install", "-at_install") +class TierTierValidation(CommonTierValidation): + @classmethod + def setUpClass(cls): + super().setUpClass() from .tier_validation_tester import TierValidationTester - self.loader.update_registry((TierValidationTester,)) - self.test_model = self.env[TierValidationTester._name] - self.tester_model = self.env["ir.model"].search( - [("model", "=", "tier.validation.tester")] - ) - - # Access record: - self.env["ir.model.access"].create( - { - "name": "access.tester", - "model_id": self.tester_model.id, - "perm_read": 1, - "perm_write": 1, - "perm_create": 1, - "perm_unlink": 1, - } - ) - - # Create users: - self.group_system = self.env.ref("base.group_system") - group_ids = self.group_system.ids - self.test_user_1 = self.env["res.users"].create( - {"name": "John", "login": "test1", "groups_id": [(6, 0, group_ids)]} - ) - self.test_user_2 = self.env["res.users"].create( - {"name": "Mike", "login": "test2"} - ) - self.test_user_3 = self.env["res.users"].create( - {"name": "John Wick", "login": "test3", "groups_id": [(6, 0, group_ids)]} + add_to_registry(cls.registry, TierValidationTester) + cls.registry._setup_models__(cls.env.cr, ["tier.validation.tester"]) + cls.registry.init_models( + cls.env.cr, + ["tier.validation.tester"], + {"models_to_check": True}, ) - # Create tier definitions: - self.tier_def_obj = self.env["tier.definition"] + def _setup_tier_definitions(self): self.tier_def_obj.create( { "model_id": self.tester_model.id, @@ -58,12 +32,6 @@ def setUp(self): } ) - self.test_record = self.test_model.create({"test_field": 2.5}) - - def tearDown(self): - self.loader.restore_registry() - super().tearDown() - def test_1_auto_validation(self): # Create new test record test_record = self.test_model.create({"test_field": 2.5}) @@ -90,13 +58,14 @@ def test_1_auto_validation(self): } ) # Request validation - test_record.with_user(self.test_user_2).request_validation() + reviews = test_record.with_user(self.test_user_2).request_validation() + reviews._update_review_status() record = test_record.with_user(self.test_user_1) record.invalidate_recordset() # Auto validate, 1st tier, not auto validated self.tier_def_obj._cron_auto_tier_validation() self.assertEqual( - record.review_ids.mapped("status"), ["waiting", "waiting", "waiting"] + record.review_ids.mapped("status"), ["pending", "waiting", "waiting"] ) # Manual validate 2nd tier -> OK record.validate_tier() @@ -127,14 +96,15 @@ def test_2_auto_validation_exception(self): { "model_id": self.tester_model.id, "review_type": "individual", - "reviewer_group_id": self.group_system.id, + "reviewer_group_id": self.test_group.id, "sequence": 20, "approve_sequence": True, "auto_validate": True, } ) # Request validation - test_record.with_user(self.test_user_2).request_validation() + reviews = test_record.with_user(self.test_user_2).request_validation() + reviews._update_review_status() record = test_record.with_user(self.test_user_1) record.invalidate_recordset() # Auto validate, 1st tier, not auto validated @@ -143,7 +113,7 @@ def test_2_auto_validation_exception(self): level="WARNING", ): self.tier_def_obj._cron_auto_tier_validation() - self.assertEqual(record.review_ids.mapped("status"), ["waiting", "waiting"]) + self.assertEqual(record.review_ids.mapped("status"), ["pending", "waiting"]) # Manual validate 2nd tier -> OK record.validate_tier() self.assertEqual(record.review_ids.mapped("status"), ["approved", "pending"]) @@ -178,7 +148,8 @@ def test_3_trigger_server_action(self): } ) # Request validation - test_record.with_user(self.test_user_2).request_validation() + reviews = test_record.with_user(self.test_user_2).request_validation() + reviews._update_review_status() record = test_record.with_user(self.test_user_1) record.invalidate_recordset() record.validate_tier() @@ -207,7 +178,8 @@ def test_4_trigger_rejected_server_action(self): } ) # Request rejection - test_record.with_user(self.test_user_2).request_validation() + reviews = test_record.with_user(self.test_user_2).request_validation() + reviews._update_review_status() record = test_record.with_user(self.test_user_1) record.invalidate_recordset() record.reject_tier() diff --git a/base_tier_validation_server_action/tests/tier_validation_tester.py b/base_tier_validation_server_action/tests/tier_validation_tester.py index 36c533e6a..9356cb09e 100644 --- a/base_tier_validation_server_action/tests/tier_validation_tester.py +++ b/base_tier_validation_server_action/tests/tier_validation_tester.py @@ -5,20 +5,8 @@ class TierValidationTester(models.Model): - _name = "tier.validation.tester" - _description = "Tier Validation Tester" - _inherit = ["tier.validation"] + _inherit = "tier.validation.tester" - state = fields.Selection( - selection=[ - ("draft", "Draft"), - ("confirmed", "Confirmed"), - ("cancel", "Cancel"), - ], - default="draft", - ) - test_field = fields.Float() - user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") test_bool = fields.Boolean() def _get_under_validation_exceptions(self): From 90309e30935c26410889ef91a23d6725cc7b1bbc Mon Sep 17 00:00:00 2001 From: Bosd Date: Wed, 13 May 2026 20:06:08 +0000 Subject: [PATCH 18/22] Added translation using Weblate (Dutch) --- base_tier_validation_server_action/i18n/nl.po | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 base_tier_validation_server_action/i18n/nl.po diff --git a/base_tier_validation_server_action/i18n/nl.po b/base_tier_validation_server_action/i18n/nl.po new file mode 100644 index 000000000..ada98ecc9 --- /dev/null +++ b/base_tier_validation_server_action/i18n/nl.po @@ -0,0 +1,96 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation_server_action +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-05-13 22:45+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__auto_validate +msgid "Auto Validate" +msgstr "Automatisch valideren" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__auto_validate_domain +msgid "Auto Validate Domain" +msgstr "Domein voor automatische validatie" + +#. module: base_tier_validation_server_action +#: model:ir.actions.server,name:base_tier_validation_server_action.ir_cron_auto_tier_validation_ir_actions_server +msgid "Automatic Tier Validation" +msgstr "Automatische niveauvalidatie" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_validation__display_name +msgid "Display Name" +msgstr "Schermnaam" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_validation__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__server_action_id +msgid "Post Approve Action" +msgstr "Actie na goedkeuring" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__rejected_server_action_id +msgid "Post Reject Action" +msgstr "Actie na afwijzing" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__server_action_id +msgid "Server action triggered as soon as this step is approved" +msgstr "Serveractie die wordt geactiveerd zodra deze stap is goedgekeurd" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__rejected_server_action_id +msgid "Server action triggered as soon as this step is rejected" +msgstr "Serveractie die wordt geactiveerd zodra deze stap is afgewezen" + +#. module: base_tier_validation_server_action +#: model:ir.model,name:base_tier_validation_server_action.model_tier_definition +msgid "Tier Definition" +msgstr "Niveaudefinitie" + +#. module: base_tier_validation_server_action +#: model:ir.model,name:base_tier_validation_server_action.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Niveauvalidatie (abstract)" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__auto_validate +msgid "" +"Use schedule job to auto validate if condition is met.\n" +"- If no user specified, use job's system user to validate\n" +"- If 1 user matched as reviewer, use the user to validate\n" +"- If > 1 user matched as reviewer, do not auto validate" +msgstr "" +"Gebruik een geplande taak om automatisch te valideren als aan de voorwaarde " +"is voldaan.\n" +"- Indien geen gebruiker is opgegeven, wordt de systeemgebruiker van de taak " +"gebruikt om te valideren\n" +"- Indien exact 1 gebruiker overeenkomt als beoordelaar, wordt deze gebruiker " +"gebruikt om te valideren\n" +"- Indien meer dan 1 gebruiker overeenkomt als beoordelaar, vindt er geen " +"automatische validatie plaats" + +#. module: base_tier_validation_server_action +#: model_terms:ir.ui.view,arch_db:base_tier_validation_server_action.tier_definition_view_form +msgid "if pass condition" +msgstr "indien voldaan aan voorwaarde" From 0700cd7c67a037b05e12debfe3c8558ccddf9763 Mon Sep 17 00:00:00 2001 From: intero-chd Date: Mon, 6 Jul 2026 06:26:02 +0000 Subject: [PATCH 19/22] Added translation using Weblate (German) --- base_tier_validation_server_action/i18n/de.po | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 base_tier_validation_server_action/i18n/de.po diff --git a/base_tier_validation_server_action/i18n/de.po b/base_tier_validation_server_action/i18n/de.po new file mode 100644 index 000000000..73e925c1d --- /dev/null +++ b/base_tier_validation_server_action/i18n/de.po @@ -0,0 +1,96 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation_server_action +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-07-06 08:46+0000\n" +"Last-Translator: intero-chd \n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__auto_validate +msgid "Auto Validate" +msgstr "Automatische Überprüfung" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__auto_validate_domain +msgid "Auto Validate Domain" +msgstr "Automatische Validierung Domain" + +#. module: base_tier_validation_server_action +#: model:ir.actions.server,name:base_tier_validation_server_action.ir_cron_auto_tier_validation_ir_actions_server +msgid "Automatic Tier Validation" +msgstr "Automatische Überprüfung der Stufe" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_validation__display_name +msgid "Display Name" +msgstr "Anzeigename" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_validation__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__server_action_id +msgid "Post Approve Action" +msgstr "Maßnahme nach der Genehmigung" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,field_description:base_tier_validation_server_action.field_tier_definition__rejected_server_action_id +msgid "Post Reject Action" +msgstr "Maßnahme nach der Ablehnung" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__server_action_id +msgid "Server action triggered as soon as this step is approved" +msgstr "Sobald dieser Schritt genehmigt wird, wird eine Serveraktion ausgelöst" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__rejected_server_action_id +msgid "Server action triggered as soon as this step is rejected" +msgstr "Sobald dieser Schritt abgelehnt wird, wird eine Serveraktion ausgelöst" + +#. module: base_tier_validation_server_action +#: model:ir.model,name:base_tier_validation_server_action.model_tier_definition +msgid "Tier Definition" +msgstr "Stufendefinition" + +#. module: base_tier_validation_server_action +#: model:ir.model,name:base_tier_validation_server_action.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" + +#. module: base_tier_validation_server_action +#: model:ir.model.fields,help:base_tier_validation_server_action.field_tier_definition__auto_validate +msgid "" +"Use schedule job to auto validate if condition is met.\n" +"- If no user specified, use job's system user to validate\n" +"- If 1 user matched as reviewer, use the user to validate\n" +"- If > 1 user matched as reviewer, do not auto validate" +msgstr "" +"Verwenden Sie eine geplante Aktion, um automatisch zu prüfen, ob die " +"Bedingung erfüllt ist.\n" +"- Wenn kein Benutzer angegeben wurde, verwenden Sie den Systembenutzer der " +"geplanten Aktion zur Überprüfung\n" +"- Wenn ein Benutzer als Genehmiger gefunden wurde, verwenden Sie diesen " +"Benutzer zur Überprüfung\n" +"- Wenn mehr als ein Benutzer als Genehmiger gefunden wurde, führen Sie keine " +"automatische Überprüfung durch" + +#. module: base_tier_validation_server_action +#: model_terms:ir.ui.view,arch_db:base_tier_validation_server_action.tier_definition_view_form +msgid "if pass condition" +msgstr "" From c6a4ab81738748af71857834c41e3dc1be1b26a9 Mon Sep 17 00:00:00 2001 From: Bhavesh Heliconia Date: Mon, 19 Oct 2026 10:29:00 +0530 Subject: [PATCH 20/22] [IMP] base_tier_validation_server_action: pre-commit auto fixes --- base_tier_validation_server_action/data/cron_data.xml | 4 ++-- base_tier_validation_server_action/models/tier_definition.py | 2 +- .../views/tier_definition_view.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/base_tier_validation_server_action/data/cron_data.xml b/base_tier_validation_server_action/data/cron_data.xml index 5f263e0a6..38d267468 100644 --- a/base_tier_validation_server_action/data/cron_data.xml +++ b/base_tier_validation_server_action/data/cron_data.xml @@ -1,8 +1,8 @@ - + Automatic Tier Validation - 1 + hours + From fc8f9639b9e29b5bbe8d45df5b2df4f55f944cc8 Mon Sep 17 00:00:00 2001 From: Bhavesh Heliconia Date: Mon, 19 Oct 2026 10:30:06 +0530 Subject: [PATCH 21/22] [MIG] base_tier_validation_server_action: Migration to 20.0 --- base_tier_validation_server_action/README.rst | 10 +++++----- base_tier_validation_server_action/__manifest__.py | 2 +- .../static/description/index.html | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/base_tier_validation_server_action/README.rst b/base_tier_validation_server_action/README.rst index 91ea4ff0a..1f7bfa1d5 100644 --- a/base_tier_validation_server_action/README.rst +++ b/base_tier_validation_server_action/README.rst @@ -21,13 +21,13 @@ Base Tier Validation - Server Action :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ftier--validation-lightgray.png?logo=github - :target: https://github.com/OCA/tier-validation/tree/19.0/base_tier_validation_server_action + :target: https://github.com/OCA/tier-validation/tree/20.0/base_tier_validation_server_action :alt: OCA/tier-validation .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/tier-validation-19-0/tier-validation-19-0-base_tier_validation_server_action + :target: https://translation.odoo-community.org/projects/tier-validation-20-0/tier-validation-20-0-base_tier_validation_server_action :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/tier-validation&target_branch=19.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/tier-validation&target_branch=20.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -61,7 +61,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -99,6 +99,6 @@ Current `maintainer `__: |maintainer-kittiu| -This module is part of the `OCA/tier-validation `_ project on GitHub. +This module is part of the `OCA/tier-validation `_ 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_server_action/__manifest__.py b/base_tier_validation_server_action/__manifest__.py index 037950c11..b4446b0b3 100644 --- a/base_tier_validation_server_action/__manifest__.py +++ b/base_tier_validation_server_action/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation - Server Action", "summary": "Add option to call server action when a tier is validated", - "version": "19.0.1.0.0", + "version": "20.0.1.0.0", "category": "Tools", "website": "https://github.com/OCA/tier-validation", "author": "Ecosoft, Odoo Community Association (OCA)", diff --git a/base_tier_validation_server_action/static/description/index.html b/base_tier_validation_server_action/static/description/index.html index 7eed50f35..1d8b431e4 100644 --- a/base_tier_validation_server_action/static/description/index.html +++ b/base_tier_validation_server_action/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Base Tier Validation - Server Action