diff --git a/base_tier_validation/models/tier_validation.py b/base_tier_validation/models/tier_validation.py index ea41baf508..ab866e5480 100644 --- a/base_tier_validation/models/tier_validation.py +++ b/base_tier_validation/models/tier_validation.py @@ -436,7 +436,7 @@ def _notify_review_requested(self, tier_reviews): subscribe = "message_subscribe" post = "message_post" if hasattr(self, post) and hasattr(self, subscribe): - for rec in self: + for rec in self.sudo(): users_to_notify = tier_reviews.filtered( lambda r: r.definition_id.notify_on_create and r.res_id == rec.id ).mapped("reviewer_ids") diff --git a/base_tier_validation/tests/common.py b/base_tier_validation/tests/common.py index 1538f0829d..3b3db5892a 100644 --- a/base_tier_validation/tests/common.py +++ b/base_tier_validation/tests/common.py @@ -67,10 +67,15 @@ def setUpClass(cls): # Create users: group_ids = cls.env.ref("base.group_system").ids cls.test_user_1 = cls.env["res.users"].create( - {"name": "John", "login": "test1", "groups_id": [(6, 0, group_ids)]} + { + "name": "John", + "login": "test1", + "email": "john@yourcompany.example.com", + "groups_id": [(6, 0, group_ids)], + } ) cls.test_user_2 = cls.env["res.users"].create( - {"name": "Mike", "login": "test2"} + {"name": "Mike", "login": "test2", "email": "mike@yourcompany.example.com"} ) # Create tier definitions: diff --git a/base_tier_validation/tests/tier_validation_tester.py b/base_tier_validation/tests/tier_validation_tester.py index a291baffd1..cbeaa0b4b0 100644 --- a/base_tier_validation/tests/tier_validation_tester.py +++ b/base_tier_validation/tests/tier_validation_tester.py @@ -7,7 +7,7 @@ class TierValidationTester(models.Model): _name = "tier.validation.tester" _description = "Tier Validation Tester" - _inherit = ["tier.validation"] + _inherit = ["tier.validation", "mail.thread"] _tier_validation_manual_config = True state = fields.Selection( @@ -28,7 +28,7 @@ def action_confirm(self): class TierValidationTester2(models.Model): _name = "tier.validation.tester2" _description = "Tier Validation Tester 2" - _inherit = ["tier.validation"] + _inherit = ["tier.validation", "mail.thread"] _tier_validation_manual_config = False state = fields.Selection( diff --git a/base_tier_validation_formula/tests/test_tier_validation.py b/base_tier_validation_formula/tests/test_tier_validation.py index a0ac7fe349..f681043117 100644 --- a/base_tier_validation_formula/tests/test_tier_validation.py +++ b/base_tier_validation_formula/tests/test_tier_validation.py @@ -50,13 +50,18 @@ def setUpClass(cls): # Create users: group_ids = cls.env.ref("base.group_system").ids cls.test_user_1 = cls.env["res.users"].create( - {"name": "John", "login": "test1", "groups_id": [(6, 0, group_ids)]} + { + "name": "John", + "login": "test1", + "groups_id": [(6, 0, group_ids)], + "email": "john@yourcompany.example.com", + } ) cls.test_user_2 = cls.env["res.users"].create( - {"name": "Mike", "login": "test2"} + {"name": "Mike", "login": "test2", "email": "mike@yourcompany.example.com"} ) cls.test_user_3 = cls.env["res.users"].create( - {"name": "Mary", "login": "test3"} + {"name": "Mary", "login": "test3", "email": "mary@yourcompany.example.com"} ) # Create tier definitions: @@ -103,6 +108,8 @@ def test_01_reviewer_from_python_expression(self): record = self.test_record.with_user(self.test_user_1.id) self.test_record.invalidate_cache() record.invalidate_cache() + record.review_ids[0]._compute_can_review() + record.review_ids[1]._compute_can_review() self.assertIn(self.test_user_1, record.reviewer_ids) self.assertIn(self.test_user_2, record.reviewer_ids) res = self.test_model.search([("reviewer_ids", "in", self.test_user_2.id)]) diff --git a/base_tier_validation_forward/tests/test_tier_validation.py b/base_tier_validation_forward/tests/test_tier_validation.py index abe1e0627b..6551da6eb9 100644 --- a/base_tier_validation_forward/tests/test_tier_validation.py +++ b/base_tier_validation_forward/tests/test_tier_validation.py @@ -12,7 +12,9 @@ class TierTierValidation(TransactionCase): @classmethod def setUpClass(cls): super(TierTierValidation, cls).setUpClass() - + cls.env = cls.env( + context=dict(cls.env.context, tracking_disable=True, no_reset_password=True) + ) cls.loader = FakeModelLoader(cls.env, cls.__module__) cls.loader.backup_registry() from odoo.addons.base_tier_validation.tests.tier_validation_tester import ( @@ -45,13 +47,18 @@ def setUpClass(cls): # Create users: group_ids = cls.env.ref("base.group_system").ids cls.test_user_1 = cls.env["res.users"].create( - {"name": "John", "login": "test1", "groups_id": [(6, 0, group_ids)]} + { + "name": "John", + "login": "test1", + "groups_id": [(6, 0, group_ids)], + "email": "john@yourcompany.example.com", + } ) cls.test_user_2 = cls.env["res.users"].create( - {"name": "Mike", "login": "test2"} + {"name": "Mike", "login": "test2", "email": "mike@yourcompany.example.com"} ) cls.test_user_3 = cls.env["res.users"].create( - {"name": "Mary", "login": "test3"} + {"name": "Mary", "login": "test3", "email": "mary@yourcompany.example.com"} ) # Create tier definitions: @@ -91,6 +98,7 @@ def test_01_forward_tier(self): self.assertTrue(review) record = test_record.with_user(self.test_user_1.id) record.invalidate_cache() + record.review_ids[0]._compute_can_review() record.validate_tier() self.assertFalse(record.can_forward) # User 2 forward to user 1 diff --git a/base_tier_validation_waiting/README.rst b/base_tier_validation_waiting/README.rst new file mode 100644 index 0000000000..406f52724e --- /dev/null +++ b/base_tier_validation_waiting/README.rst @@ -0,0 +1,82 @@ +===================================== +Base Tier Validation - Waiting status +===================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4346475efe4ef480f0be92477f55cec22180d4b9cc084696826c6ae8a532cf7f + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github + :target: https://github.com/OCA/server-ux/tree/15.0/base_tier_validation_waiting + :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-15-0/server-ux-15-0-base_tier_validation_waiting + :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=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends base_tier_validation to add an initial **"waiting"** status to tier reviews. +It also auto moves next review to pending status when needed and handles notification if set. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Set "Notify reviewers on reaching pending" if you want to send a notification when pending status is reached + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* brain-tec AG + +Contributors +~~~~~~~~~~~~ + +* Javier Colmeiro + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-ux `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_tier_validation_waiting/__init__.py b/base_tier_validation_waiting/__init__.py new file mode 100644 index 0000000000..544c2ce7a7 --- /dev/null +++ b/base_tier_validation_waiting/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2022 brain-tec AG (https://braintec.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/base_tier_validation_waiting/__manifest__.py b/base_tier_validation_waiting/__manifest__.py new file mode 100644 index 0000000000..94b605302b --- /dev/null +++ b/base_tier_validation_waiting/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright (c) 2022 brain-tec AG (https://braintec.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Base Tier Validation - Waiting status", + "summary": "Base Tier Validation Extension to add waiting status", + "category": "Tools", + "version": "15.0.1.0.0", + "author": "brain-tec AG, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/server-ux", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + "base_tier_validation", + ], + "data": [ + "security/ir.model.access.csv", + "views/tier_definition_views.xml", + ], + "qweb": ["static/src/xml/tier_review_template.xml"], +} diff --git a/base_tier_validation_waiting/i18n/base_tier_validation_waiting.pot b/base_tier_validation_waiting/i18n/base_tier_validation_waiting.pot new file mode 100644 index 0000000000..d34e8336d5 --- /dev/null +++ b/base_tier_validation_waiting/i18n/base_tier_validation_waiting.pot @@ -0,0 +1,72 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation_waiting +# +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_waiting +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_validation__display_name +msgid "Display Name" +msgstr "" + +#. module: base_tier_validation_waiting +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_validation__id +msgid "ID" +msgstr "" + +#. module: base_tier_validation_waiting +#: model:ir.model.fields,help:base_tier_validation_waiting.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" + +#. module: base_tier_validation_waiting +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_validation____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_tier_validation_waiting +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "" + +#. module: base_tier_validation_waiting +#: model:ir.model.fields,field_description:base_tier_validation_waiting.field_tier_review__status +msgid "Status" +msgstr "" + +#. module: base_tier_validation_waiting +#: model:ir.model,name:base_tier_validation_waiting.model_tier_definition +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation_waiting +#: model:ir.model,name:base_tier_validation_waiting.model_tier_review +msgid "Tier Review" +msgstr "" + +#. module: base_tier_validation_waiting +#: model:ir.model,name:base_tier_validation_waiting.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" + +#. module: base_tier_validation_waiting +#: model:ir.model.fields.selection,name:base_tier_validation_waiting.selection__tier_review__status__waiting +msgid "Waiting" +msgstr "" diff --git a/base_tier_validation_waiting/models/__init__.py b/base_tier_validation_waiting/models/__init__.py new file mode 100644 index 0000000000..c3ebbbafb2 --- /dev/null +++ b/base_tier_validation_waiting/models/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) 2022 brain-tec AG (https://braintec.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import tier_definition +from . import tier_review +from . import tier_validation diff --git a/base_tier_validation_waiting/models/tier_definition.py b/base_tier_validation_waiting/models/tier_definition.py new file mode 100644 index 0000000000..46a6c336c0 --- /dev/null +++ b/base_tier_validation_waiting/models/tier_definition.py @@ -0,0 +1,14 @@ +# Copyright (c) 2022 brain-tec AG (https://braintec.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class TierDefinition(models.Model): + _inherit = "tier.definition" + + notify_on_pending = fields.Boolean( + string="Notify Reviewers on reaching Pending", + help="If set, all possible reviewers will be notified by email when " + "this definition is triggered.", + ) diff --git a/base_tier_validation_waiting/models/tier_review.py b/base_tier_validation_waiting/models/tier_review.py new file mode 100644 index 0000000000..b943d7698e --- /dev/null +++ b/base_tier_validation_waiting/models/tier_review.py @@ -0,0 +1,56 @@ +# Copyright (c) 2022 brain-tec AG (https://braintec.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models +from odoo.tools import config + + +class TierReview(models.Model): + _inherit = "tier.review" + + def _default_status(self): + if ( + not config["test_enable"] + or config["test_enable"] + and self.env.context.get("testing_base_tier_validation_waiting") + ): + return "waiting" + else: + return "pending" + + status = fields.Selection( + selection_add=[("waiting", "Waiting")], + default=_default_status, + ondelete={"waiting": "set default"}, + ) + + def _notify_pending_status(self, review_ids): + """Method to call and reuse abstract notification method""" + resource = self.env[self.model].browse(self.res_id) + resource._notify_review_available(review_ids) + + @api.depends("definition_id.approve_sequence") + def _compute_can_review(self): + """inherit base module to push forward waiting reviews""" + reviews = self.filtered( + lambda rev: rev.status in ["waiting", "pending", "rejected"] + ) + if reviews: + # get minimum sequence of all to prevent jumps + next_seq = min(reviews.mapped("sequence")) + for record in reviews: + # if not in waiting, nothing to do + if record.status != "waiting": + continue + # if approve by sequence, check sequence has been reached + if record.approve_sequence: + if record.sequence == next_seq: + record.status = "pending" + # if there is no approval sequence go directly to pending state + elif not record.approve_sequence: + record.status = "pending" + # notify if state has changed + if record.status == "pending": + if record.definition_id.notify_on_pending: + record._notify_pending_status(record) + return super(TierReview, self)._compute_can_review() diff --git a/base_tier_validation_waiting/models/tier_validation.py b/base_tier_validation_waiting/models/tier_validation.py new file mode 100644 index 0000000000..61f3665682 --- /dev/null +++ b/base_tier_validation_waiting/models/tier_validation.py @@ -0,0 +1,53 @@ +# Copyright (c) 2022 brain-tec AG (https://braintec.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class TierValidation(models.AbstractModel): + _inherit = "tier.validation" + + def _notify_review_available(self, tier_reviews): + """method to notify when reaching pending""" + subscribe = "message_subscribe" + post = "message_post" + if hasattr(self, post) and hasattr(self, subscribe): + for rec in self.sudo(): + users_to_notify = tier_reviews.filtered( + lambda r: r.definition_id.notify_on_pending and r.res_id == rec.id + ).mapped("reviewer_ids") + # Subscribe reviewers and notify + getattr(rec, subscribe)( + partner_ids=users_to_notify.mapped("partner_id").ids + ) + getattr(rec, post)( + subtype_xmlid=self._get_requested_notification_subtype(), + body=rec._notify_requested_review_body(), + ) + + def _validate_tier_waiting_reviews(self, tiers=False): + tier_reviews = tiers or self.review_ids + waiting_reviews = tier_reviews.filtered( + lambda r: r.status == "waiting" + and (self.env.user in r.reviewer_ids) + and r.approve_sequence_bypass + ) + if waiting_reviews: + waiting_reviews.write( + { + "status": "approved", + "done_by": self.env.user.id, + "reviewed_date": fields.Datetime.now(), + } + ) + for review in waiting_reviews: + rec = self.env[review.model].browse(review.res_id) + rec._notify_accepted_reviews() + + def _validate_tier(self, tiers=False): + """extend base tier validation method to allow bypass of waiting + sequences as pending state is hardcoded""" + self.ensure_one() + self._validate_tier_waiting_reviews(tiers) + res = super(TierValidation, self)._validate_tier(tiers) + return res diff --git a/base_tier_validation_waiting/readme/CONFIGURE.rst b/base_tier_validation_waiting/readme/CONFIGURE.rst new file mode 100644 index 0000000000..c0675cc31c --- /dev/null +++ b/base_tier_validation_waiting/readme/CONFIGURE.rst @@ -0,0 +1 @@ +Set "Notify reviewers on reaching pending" if you want to send a notification when pending status is reached diff --git a/base_tier_validation_waiting/readme/CONTRIBUTORS.rst b/base_tier_validation_waiting/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..98e747f68b --- /dev/null +++ b/base_tier_validation_waiting/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Javier Colmeiro diff --git a/base_tier_validation_waiting/readme/DESCRIPTION.rst b/base_tier_validation_waiting/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..210283a887 --- /dev/null +++ b/base_tier_validation_waiting/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module extends base_tier_validation to add an initial **"waiting"** status to tier reviews. +It also auto moves next review to pending status when needed and handles notification if set. diff --git a/base_tier_validation_waiting/security/ir.model.access.csv b/base_tier_validation_waiting/security/ir.model.access.csv new file mode 100644 index 0000000000..97dd8b917b --- /dev/null +++ b/base_tier_validation_waiting/security/ir.model.access.csv @@ -0,0 +1 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink diff --git a/base_tier_validation_waiting/static/description/icon.png b/base_tier_validation_waiting/static/description/icon.png new file mode 100644 index 0000000000..3a0328b516 Binary files /dev/null and b/base_tier_validation_waiting/static/description/icon.png differ diff --git a/base_tier_validation_waiting/static/description/index.html b/base_tier_validation_waiting/static/description/index.html new file mode 100644 index 0000000000..c354ffade7 --- /dev/null +++ b/base_tier_validation_waiting/static/description/index.html @@ -0,0 +1,427 @@ + + + + + + +Base Tier Validation - Waiting status + + + +
+

Base Tier Validation - Waiting status

+ + +

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

+

This module extends base_tier_validation to add an initial “waiting” status to tier reviews. +It also auto moves next review to pending status when needed and handles notification if set.

+

Table of contents

+ +
+

Configuration

+

Set “Notify reviewers on reaching pending” if you want to send a notification when pending status is reached

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • brain-tec AG
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

This module is part of the OCA/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_waiting/static/src/xml/tier_review_template.xml b/base_tier_validation_waiting/static/src/xml/tier_review_template.xml new file mode 100644 index 0000000000..bd00974800 --- /dev/null +++ b/base_tier_validation_waiting/static/src/xml/tier_review_template.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/base_tier_validation_waiting/tests/__init__.py b/base_tier_validation_waiting/tests/__init__.py new file mode 100644 index 0000000000..d27a780350 --- /dev/null +++ b/base_tier_validation_waiting/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2022 brain-tec AG (https://braintec.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_tier_validation diff --git a/base_tier_validation_waiting/tests/test_tier_validation.py b/base_tier_validation_waiting/tests/test_tier_validation.py new file mode 100644 index 0000000000..8eeaff23b0 --- /dev/null +++ b/base_tier_validation_waiting/tests/test_tier_validation.py @@ -0,0 +1,157 @@ +# Copyright (c) 2022 brain-tec AG (https://braintec.com) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo_test_helper import FakeModelLoader + +from odoo.tests.common import TransactionCase, tagged + + +@tagged("post_install", "-at_install") +class TierTierValidation(TransactionCase): + @classmethod + def setUpClass(cls): + super(TierTierValidation, cls).setUpClass() + cls.env = cls.env( + context=dict( + cls.env.context, + tracking_disable=True, + no_reset_password=True, + testing_base_tier_validation_waiting=True, + ) + ) + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.loader.backup_registry() + from odoo.addons.base_tier_validation.tests.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: + group_ids = cls.env.ref("base.group_system").ids + cls.test_user_1 = cls.env["res.users"].create( + { + "name": "John", + "login": "test1", + "email": "john@yourcompany.example.com", + "groups_id": [(6, 0, group_ids)], + } + ) + cls.test_user_2 = cls.env["res.users"].create( + {"name": "Mike", "login": "test2", "email": "mike@yourcompany.example.com"} + ) + + # 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)]", + "approve_sequence": True, + "notify_on_pending": False, + "sequence": 20, + "name": "Test definition 1 - user 1", + } + ) + cls.tier_def_obj.create( + { + "model_id": cls.tester_model.id, + "review_type": "individual", + "reviewer_id": cls.test_user_2.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "notify_on_pending": True, + "sequence": 10, + "name": "Test definition 2 - user 2", + } + ) + # test 2 + 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)]", + "approve_sequence": False, + "notify_on_pending": True, + "sequence": 10, + "name": "Test definition 3 - user 1 - no sequence", + } + ) + cls.test_record = cls.test_model.create({"test_field": 2.5}) + + @classmethod + def tearDownClass(cls): + cls.loader.restore_registry() + super().tearDownClass() + + def test_01_waiting_tier(self): + # Create new test record + tier_review_obj = self.env["tier.review"] + test_record = self.test_model.create({"test_field": 2.5}) + # Request validation + review = test_record.request_validation() + + self.assertTrue(review) + # both reviews should be waiting when created + review_1 = tier_review_obj.browse(review.ids[0]) + review_2 = tier_review_obj.browse(review.ids[1]) + self.assertTrue(review_1.status == "waiting") + self.assertTrue(review_2.status == "waiting") + # and then normal workflow will follow... + review_1._compute_can_review() + self.assertTrue(review_1.status == "pending") + # first reviewer does not want notifications + # chatter should be empty + # uncomment after #732 is merged self.assertFalse(test_record.message_ids) + self.assertTrue(review_2.status == "waiting") + record = test_record.with_user(self.test_user_1.id) + record.invalidate_cache() + record.validate_tier() + self.assertTrue(review_1.status == "approved") + self.assertTrue(review_2.status == "pending") + # Check notify + msg = test_record.message_ids[0].body + request = test_record.with_user( + self.test_user_1.id + )._notify_requested_review_body() + self.assertIn(request, msg) + record.invalidate_cache() + record = test_record.with_user(self.test_user_2.id) + record.invalidate_cache() + record.validate_tier() + self.assertTrue(review_2.status == "approved") + + def test_02_no_sequence(self): + # Create new test record + tier_review_obj = self.env["tier.review"] + test_record2 = self.test_model.create({"test_field": 0.5}) + # request validation + review = test_record2.request_validation() + self.assertTrue(review) + review_1 = tier_review_obj.browse(review.ids[0]) + self.assertTrue(review_1.status == "waiting") + review_1._compute_can_review() + self.assertTrue(review_1.status == "pending") + msg2 = test_record2.message_ids[0].body + request = test_record2._notify_requested_review_body() + self.assertIn(request, msg2) diff --git a/base_tier_validation_waiting/views/tier_definition_views.xml b/base_tier_validation_waiting/views/tier_definition_views.xml new file mode 100644 index 0000000000..2d883d454d --- /dev/null +++ b/base_tier_validation_waiting/views/tier_definition_views.xml @@ -0,0 +1,14 @@ + + + + tier.definition.form + tier.definition + + + + + + + + + diff --git a/setup/base_tier_validation_waiting/odoo/addons/base_tier_validation_waiting b/setup/base_tier_validation_waiting/odoo/addons/base_tier_validation_waiting new file mode 120000 index 0000000000..7b566daa56 --- /dev/null +++ b/setup/base_tier_validation_waiting/odoo/addons/base_tier_validation_waiting @@ -0,0 +1 @@ +../../../../base_tier_validation_waiting \ No newline at end of file diff --git a/setup/base_tier_validation_waiting/setup.py b/setup/base_tier_validation_waiting/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/base_tier_validation_waiting/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)