diff --git a/partner_tier_validation/__init__.py b/partner_tier_validation/__init__.py index c0d9f3d12..3275ac2ad 100644 --- a/partner_tier_validation/__init__.py +++ b/partner_tier_validation/__init__.py @@ -1,4 +1,2 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). - from . import models -from .hooks import post_init_hook diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index 7b2ca7f1f..5836fb652 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -9,10 +9,10 @@ "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "installable": True, - "depends": ["contacts", "base_tier_validation"], + "depends": ["contacts", "base_tier_validation", "partner_stage"], "data": [ "data/tier_definition.xml", "views/res_partner_view.xml", ], - "post_init_hook": "post_init_hook", + "maintainers": ["dreispt"], } diff --git a/partner_tier_validation/data/tier_definition.xml b/partner_tier_validation/data/tier_definition.xml index 528842bca..c46c0e54a 100644 --- a/partner_tier_validation/data/tier_definition.xml +++ b/partner_tier_validation/data/tier_definition.xml @@ -1,13 +1,11 @@ - Partner Validation (Company) + Validate New Company group domain - ["&",["is_company","=",True],"|",["active","=",True],["active","=",False]] + [["is_company","=",True]] diff --git a/partner_tier_validation/hooks.py b/partner_tier_validation/hooks.py deleted file mode 100644 index 0bfebf185..000000000 --- a/partner_tier_validation/hooks.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2021 Tecnativa - Víctor Martínez -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from odoo import SUPERUSER_ID -from odoo.api import Environment -from odoo.tools import config - - -def post_init_hook(cr, pool): - """ - We need to activate the rule only if we are not in a test environment. - """ - if not config["test_enable"]: - env = Environment(cr, SUPERUSER_ID, {}) - tier_partner = env.ref( - "partner_tier_validation.partner_tier_definition_company_only" - ) - tier_partner.write({"active": True}) diff --git a/partner_tier_validation/models/res_partner.py b/partner_tier_validation/models/res_partner.py index 34e78d17e..909085098 100644 --- a/partner_tier_validation/models/res_partner.py +++ b/partner_tier_validation/models/res_partner.py @@ -1,47 +1,54 @@ # Copyright 2019 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import api, fields, models +from odoo import api, models class ResPartner(models.Model): _name = "res.partner" _inherit = ["res.partner", "tier.validation"] - _tier_validation_manual_config = False - state = fields.Selection( - [("draft", "Draft"), ("confirmed", "Active"), ("cancel", "Archived")], - string="Status", - default="draft", - ) + _tier_validation_buttons_xpath = "/form/header/field[@name='state']" + _state_from = ["draft"] + _state_to = ["confirmed"] + _cancel_state = ["inactive"] + _tier_validation_manual_config = False @api.model def _tier_revalidation_fields(self, values): """ Changing some Partner fields forces Tier Validation to be reevaluated. Out of the box these are is_company and parent_id. - Other can be added extenting this method. + Other can be added extending this method. """ return ["is_company", "parent_id"] + @api.model + def _get_confirmed_stage(self): + return self.env["res.partner.stage"].search( + [("state", "in", self._state_to)], limit=1 + ) + @api.model def create(self, vals): new = super().create(vals) - if new.need_validation and new.state != "confirmed": - new.active = False - else: - new.active = True - new.state = "confirmed" + # Contact not requiring validation + # are created in confirmed state + if not new.need_validation: + confirmed_stage = self._get_confirmed_stage() + new.stage_id = confirmed_stage return new def write(self, vals): + # Signal state transition by adding to vals + if "stage_id" in vals: + stage_id = vals.get("stage_id") + stage = self.env["res.partner.stage"].browse(stage_id) + vals["state"] = stage.state # Changing certain fields required new validation process revalidate_fields = self._tier_revalidation_fields(vals) if any(x in revalidate_fields for x in vals.keys()): self.mapped("review_ids").unlink() vals["state"] = "draft" - - # Automatically update active flag depending on state - if "state" in vals: - vals["active"] = vals["state"] == "confirmed" + self.request_validation() return super().write(vals) diff --git a/partner_tier_validation/tests/test_tier_validation.py b/partner_tier_validation/tests/test_tier_validation.py index f4fe3d221..56420cfcf 100644 --- a/partner_tier_validation/tests/test_tier_validation.py +++ b/partner_tier_validation/tests/test_tier_validation.py @@ -21,48 +21,55 @@ class TestPartnerTierValidation(common.SavepointCase): "name": "John", "login": "test1", "groups_id": [(6, 0, group_ids)], - "email": "test@examlple.com", + "email": "test@example.com", } ) - # Create tier definitions: - cls.tier_def_obj = cls.env["tier.definition"] - cls.tier_def_obj.create( + # Create tier definition: example where only Company needs validation + cls.TierDefinition = cls.env["tier.definition"] + cls.TierDefinition.create( { "model_id": cls.partner_model.id, "review_type": "individual", "reviewer_id": cls.test_user_1.id, - "definition_domain": "['&',('is_company','=',True),'|', \ - ('active','=',True),('active','=',False)]", + "definition_domain": "[('is_company','=',True)]", } ) def test_tier_validation_model_name(self): self.assertIn( - "res.partner", self.tier_def_obj._get_tier_validation_model_names() + "res.partner", self.TierDefinition._get_tier_validation_model_names() ) def test_validation_res_partner(self): - company = self.env["res.partner"].create( + """ + Case where new Contact requires validation + """ + contact = self.env["res.partner"].create( {"name": "Company for test", "company_type": "company"} ) - # Since company need validation, it should be inactive - self.assertEqual(company.active, False) + # Since contact need validation, it should be inactive + self.assertEqual(contact.state, "draft") # Assert an error shows if trying to make it active with self.assertRaises(ValidationError): - company.write({"state": "confirmed"}) + contact.write({"state": "confirmed"}) # Request and validate partner - company.request_validation() - company.with_user(self.test_user_1).validate_tier() - company.with_user(self.test_user_1).write({"state": "confirmed"}) - self.assertEqual(company.state, "confirmed") + contact.request_validation() + contact.with_user(self.test_user_1).validate_tier() + contact.with_user(self.test_user_1).write({"state": "confirmed"}) + self.assertEqual(contact.state, "confirmed") # Change company type to retrigger validation - company.write({"company_type": "person", "is_company": False}) - self.assertEqual(company.state, "draft") + contact.write({"company_type": "person", "is_company": False}) + self.assertEqual(contact.state, "draft") - # Test partner creation that doesn't need validation - customer = self.env["res.partner"].create({"name": "Partner for test"}) - self.assertEqual(customer.active, True) + def test_no_validation_res_partner(self): + """ + Case where new Contact does not require validation + """ + contact = self.env["res.partner"].create( + {"name": "Person for test", "company_type": "person"} + ) + self.assertEqual(contact.state, "confirmed") diff --git a/partner_tier_validation/views/res_partner_view.xml b/partner_tier_validation/views/res_partner_view.xml index cc74dee53..29cbd0a62 100644 --- a/partner_tier_validation/views/res_partner_view.xml +++ b/partner_tier_validation/views/res_partner_view.xml @@ -8,16 +8,10 @@ - -
- -
-
+ + + + @@ -31,7 +25,7 @@