From af5c1bfcce7ed135586f80a42ff796566b36cc4b Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Tue, 16 Feb 2021 09:52:49 +0000 Subject: [PATCH 01/26] [ADD] partner_tier_validation --- partner_tier_validation/README.rst | 92 +++++++++++++++++ partner_tier_validation/__init__.py | 3 + partner_tier_validation/__manifest__.py | 20 ++++ partner_tier_validation/models/__init__.py | 5 + partner_tier_validation/models/res_partner.py | 20 ++++ .../models/tier_validation.py | 53 ++++++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../views/res_partner_view.xml | 96 ++++++++++++++++++ 8 files changed, 289 insertions(+) create mode 100644 partner_tier_validation/README.rst create mode 100644 partner_tier_validation/__init__.py create mode 100644 partner_tier_validation/__manifest__.py create mode 100644 partner_tier_validation/models/__init__.py create mode 100644 partner_tier_validation/models/res_partner.py create mode 100644 partner_tier_validation/models/tier_validation.py create mode 100644 partner_tier_validation/static/description/icon.png create mode 100644 partner_tier_validation/views/res_partner_view.xml diff --git a/partner_tier_validation/README.rst b/partner_tier_validation/README.rst new file mode 100644 index 00000000..b6e7f63e --- /dev/null +++ b/partner_tier_validation/README.rst @@ -0,0 +1,92 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +==================== +Partner Tier Validation +==================== + +This module extends the functionality of Partner to support a tier +validation process. + +Installation +============ + +This module depends on ``base_tier_validation``. You can find it at +`OCA/server-ux `_ + + +Configuration +============= + +To configure this module, you need to: + +#. Go to *Settings > Technical > Tier Validations > Tier Definition*. +#. Create as many tiers as you want for Contact model. +#. Example: + Definition Formula + Tier Definition Expression + # Available locals: + # - rec: current record + + [rec.state == New] + +Usage +===== + +To use this module, you need to: + +#. Create a Contact triggering at least one "Tier Definition". +#. Click on *Request Validation* button. +#. Under the tab *Reviews* have a look to pending reviews and their statuses. +#. Validator has to update Is Customer or Is Supplier or Both for this Contact to be usable on SO/PO. + +Additional features: + +* You can filter the Invoices requesting your review through the filter *Needs my + Review*. +* User with rights to confirm the Vendor Bill (validate all tiers that would + be generated) can directly do the operation, this is, there is no need for + her/him to request a validation. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/142/11.0 + +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 smash it by providing detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Antonio Yamuta + +Do not contact contributors directly about support or help with technical issues. + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +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. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/partner_tier_validation/__init__.py b/partner_tier_validation/__init__.py new file mode 100644 index 00000000..31660d6a --- /dev/null +++ b/partner_tier_validation/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py new file mode 100644 index 00000000..b3f724a7 --- /dev/null +++ b/partner_tier_validation/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2019 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Partner Tier Validation", + "summary": "Extends the functionality of Contacts to" + "support a tier validation process.", + "version": "12.0.1.0.0", + "category": "Contact", + "author": "Open Source Integrators, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + "contacts", + "base_tier_validation", + ], + "data": [ + "views/res_partner_view.xml", + ], +} diff --git a/partner_tier_validation/models/__init__.py b/partner_tier_validation/models/__init__.py new file mode 100644 index 00000000..a415f52e --- /dev/null +++ b/partner_tier_validation/models/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2019 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import res_partner +from . import tier_validation diff --git a/partner_tier_validation/models/res_partner.py b/partner_tier_validation/models/res_partner.py new file mode 100644 index 00000000..2085f2c1 --- /dev/null +++ b/partner_tier_validation/models/res_partner.py @@ -0,0 +1,20 @@ +# Copyright 2019 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ResPartner(models.Model): + _name = "res.partner" + _inherit = ['res.partner', 'tier.validation'] + _state_from = ['new', 'to approve'] + _state_to = ['approved'] + + # override core odoo to set default value to False + customer = fields.Boolean(string='Is a Customer', default=False, + help="Check this box if this contact is a customer. It can be selected in sales orders.") + + state = fields.Selection(selection=[('new','New'), + ('approved','Approved'),], + string='Status', + default='new' ) diff --git a/partner_tier_validation/models/tier_validation.py b/partner_tier_validation/models/tier_validation.py new file mode 100644 index 00000000..515e3549 --- /dev/null +++ b/partner_tier_validation/models/tier_validation.py @@ -0,0 +1,53 @@ +# Copyright 2019 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models, _ +from odoo.exceptions import ValidationError + +class TierValidation(models.AbstractModel): + _inherit = "tier.validation" + + @api.model + def _get_under_validation_exceptions(self): + res = super(TierValidation, self)._get_under_validation_exceptions() or [] + """Extend for more field exceptions.""" + ex_fields = ['categ_id','state', 'customer','supplier','excise_tax'] + for val in ex_fields: + res.append(val) + return res + + @api.multi + def validate_tier(self): + super(TierValidation, self).validate_tier() + # make sure to only work with res.partner object. + if self._name != 'res.partner': + return + for partner in self: + rec = self.env['tier.review'].search([('res_id','=',partner.id),('model','=','res.partner')]) + if rec and rec.status == 'approved': + if not (partner.customer or partner.supplier): + raise ValidationError(_('Cannot Validate. Please configure partner %s as a Customer or Vendor or Both.') % (partner.display_name)) + else: + partner.state = 'approved' + + # Need to override for Partner Tier Validation since can_review field is set to True based only + # if current user is a member of reviewer_ids. This can_review field is used to enable or disable the boolean + # field Is Customer / Is Vendor not only during the Validation process but even if it is in Approved State. + @api.multi + @api.depends('review_ids') + def _compute_reviewer_ids(self): + if str(self.__class__) == "": + for rec in self: + rec.reviewer_ids = rec.review_ids.filtered( + lambda r: r.status in ( 'pending','approved')).mapped('reviewer_ids') + else: + for rec in self: + rec.reviewer_ids = rec.review_ids.filtered( + lambda r: r.status == 'pending').mapped('reviewer_ids') + + @api.multi + def request_validation(self): + res = super().request_validation() + for rec in self.filtered(lambda x: x._name == 'res.partner'): + rec.message_subscribe(partner_ids=[self.env.user.partner_id.id,]) + return res diff --git a/partner_tier_validation/static/description/icon.png b/partner_tier_validation/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/partner_tier_validation/views/res_partner_view.xml b/partner_tier_validation/views/res_partner_view.xml new file mode 100644 index 00000000..81d72cbc --- /dev/null +++ b/partner_tier_validation/views/res_partner_view.xml @@ -0,0 +1,96 @@ + + + + + + partner.form.tier + res.partner + + + + +
+ +
+
+ +
+ + + + + + + +
+ + + + + {'readonly': [('can_review', '=', False)]} + + + {'readonly': [('can_review', '=', False)]} + + +
+
+ + + partner.form.tier.filter + res.partner + + + + + + + + + +
From 0e88218b52c2d63165c52ad2fc5908f74521f2e4 Mon Sep 17 00:00:00 2001 From: Freni-OSI Date: Wed, 17 Feb 2021 16:00:11 +0530 Subject: [PATCH 02/26] [14.0][MIG]partner_tier_validation --- partner_tier_validation/README.rst | 4 +- partner_tier_validation/__manifest__.py | 12 +- partner_tier_validation/models/__init__.py | 2 +- partner_tier_validation/models/res_partner.py | 23 ++- .../models/tier_validation.py | 55 ++++--- .../views/res_partner_view.xml | 147 ++++++++++-------- 6 files changed, 127 insertions(+), 116 deletions(-) diff --git a/partner_tier_validation/README.rst b/partner_tier_validation/README.rst index b6e7f63e..c197ce0b 100644 --- a/partner_tier_validation/README.rst +++ b/partner_tier_validation/README.rst @@ -2,9 +2,9 @@ :target: https://www.gnu.org/licenses/agpl :alt: License: AGPL-3 -==================== +======================= Partner Tier Validation -==================== +======================= This module extends the functionality of Partner to support a tier validation process. diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index b3f724a7..8aa407ca 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -1,19 +1,17 @@ -# Copyright 2019 Open Source Integrators +# Copyright 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Partner Tier Validation", "summary": "Extends the functionality of Contacts to" - "support a tier validation process.", - "version": "12.0.1.0.0", + "support a tier validation process.", + "version": "14.0.1.0.0", + "website": "https://github.com/OCA/partner-contact", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", "application": False, "installable": True, - "depends": [ - "contacts", - "base_tier_validation", - ], + "depends": ["contacts", "base_tier_validation", "partner_autocomplete"], "data": [ "views/res_partner_view.xml", ], diff --git a/partner_tier_validation/models/__init__.py b/partner_tier_validation/models/__init__.py index a415f52e..9253d487 100644 --- a/partner_tier_validation/models/__init__.py +++ b/partner_tier_validation/models/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2019 Open Source Integrators +# Copyright 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import res_partner diff --git a/partner_tier_validation/models/res_partner.py b/partner_tier_validation/models/res_partner.py index 2085f2c1..aeea2870 100644 --- a/partner_tier_validation/models/res_partner.py +++ b/partner_tier_validation/models/res_partner.py @@ -1,20 +1,15 @@ -# Copyright 2019 Open Source Integrators +# Copyright 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import fields, models -class ResPartner(models.Model): +class ResPartner11(models.Model): _name = "res.partner" - _inherit = ['res.partner', 'tier.validation'] - _state_from = ['new', 'to approve'] - _state_to = ['approved'] + _inherit = ["res.partner", "tier.validation", "mail.activity.mixin"] + _state_from = ["new", "to approve"] + _state_to = ["approved"] - # override core odoo to set default value to False - customer = fields.Boolean(string='Is a Customer', default=False, - help="Check this box if this contact is a customer. It can be selected in sales orders.") - - state = fields.Selection(selection=[('new','New'), - ('approved','Approved'),], - string='Status', - default='new' ) + state = fields.Selection( + [("new", "New"), ("approved", "Approved")], string="Status", default="new" + ) diff --git a/partner_tier_validation/models/tier_validation.py b/partner_tier_validation/models/tier_validation.py index 515e3549..565cc1bb 100644 --- a/partner_tier_validation/models/tier_validation.py +++ b/partner_tier_validation/models/tier_validation.py @@ -1,53 +1,58 @@ -# Copyright 2019 Open Source Integrators +# Copyright 2021 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import api, models, _ -from odoo.exceptions import ValidationError +from odoo import api, models + class TierValidation(models.AbstractModel): _inherit = "tier.validation" @api.model def _get_under_validation_exceptions(self): - res = super(TierValidation, self)._get_under_validation_exceptions() or [] """Extend for more field exceptions.""" - ex_fields = ['categ_id','state', 'customer','supplier','excise_tax'] + res = super(TierValidation, self)._get_under_validation_exceptions() or [] + ex_fields = ["categ_id", "state", "customer", "supplier", "excise_tax"] for val in ex_fields: res.append(val) return res - @api.multi def validate_tier(self): super(TierValidation, self).validate_tier() # make sure to only work with res.partner object. - if self._name != 'res.partner': - return + if self._name != "res.partner": + return for partner in self: - rec = self.env['tier.review'].search([('res_id','=',partner.id),('model','=','res.partner')]) - if rec and rec.status == 'approved': - if not (partner.customer or partner.supplier): - raise ValidationError(_('Cannot Validate. Please configure partner %s as a Customer or Vendor or Both.') % (partner.display_name)) - else: - partner.state = 'approved' + rec = self.env["tier.review"].search( + [("res_id", "=", partner.id), ("model", "=", "res.partner")] + ) + if rec and rec.status == "approved": + partner.state = "approved" - # Need to override for Partner Tier Validation since can_review field is set to True based only - # if current user is a member of reviewer_ids. This can_review field is used to enable or disable the boolean - # field Is Customer / Is Vendor not only during the Validation process but even if it is in Approved State. - @api.multi - @api.depends('review_ids') + # Need to override for Partner Tier Validation since can_review field + # is set to True based only + # if current user is a member of reviewer_ids. This can_review field + # is used to enable or disable the boolean + # field Is Customer / Is Vendor not only during the Validation process + # but even if it is in Approved State. + @api.depends("review_ids") def _compute_reviewer_ids(self): - if str(self.__class__) == "": + if str(self.__class__) == "": for rec in self: rec.reviewer_ids = rec.review_ids.filtered( - lambda r: r.status in ( 'pending','approved')).mapped('reviewer_ids') + lambda r: r.status in ("pending", "approved") + ).mapped("reviewer_ids") else: for rec in self: rec.reviewer_ids = rec.review_ids.filtered( - lambda r: r.status == 'pending').mapped('reviewer_ids') + lambda r: r.status == "pending" + ).mapped("reviewer_ids") - @api.multi def request_validation(self): res = super().request_validation() - for rec in self.filtered(lambda x: x._name == 'res.partner'): - rec.message_subscribe(partner_ids=[self.env.user.partner_id.id,]) + for rec in self.filtered(lambda x: x._name == "res.partner"): + rec.message_subscribe( + partner_ids=[ + self.env.user.partner_id.id, + ] + ) return res diff --git a/partner_tier_validation/views/res_partner_view.xml b/partner_tier_validation/views/res_partner_view.xml index 81d72cbc..f6675dc5 100644 --- a/partner_tier_validation/views/res_partner_view.xml +++ b/partner_tier_validation/views/res_partner_view.xml @@ -1,96 +1,109 @@ - - partner.form.tier res.partner - - - - + + +
- -
-
- - - - -
- - - - {'readonly': [('can_review', '=', False)]} - - - {'readonly': [('can_review', '=', False)]} - - + +
+
- + partner.form.tier.filter res.partner - + - - - + + - +
From c7bd5f192ec5742637dad07f089c2b8322f90cb3 Mon Sep 17 00:00:00 2001 From: Freni-OSI Date: Wed, 3 Mar 2021 11:46:46 +0530 Subject: [PATCH 03/26] [14.0][IMP]Improved partner_tier_validation --- partner_tier_validation/__manifest__.py | 4 ++-- partner_tier_validation/models/__init__.py | 2 +- partner_tier_validation/models/res_partner.py | 4 ++-- partner_tier_validation/models/tier_validation.py | 2 +- partner_tier_validation/views/res_partner_view.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index 8aa407ca..c86cd1f1 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -1,4 +1,4 @@ -# Copyright 2021 Open Source Integrators +# Copyright 2019 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Partner Tier Validation", @@ -11,7 +11,7 @@ "license": "AGPL-3", "application": False, "installable": True, - "depends": ["contacts", "base_tier_validation", "partner_autocomplete"], + "depends": ["contacts", "base_tier_validation"], "data": [ "views/res_partner_view.xml", ], diff --git a/partner_tier_validation/models/__init__.py b/partner_tier_validation/models/__init__.py index 9253d487..a415f52e 100644 --- a/partner_tier_validation/models/__init__.py +++ b/partner_tier_validation/models/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2021 Open Source Integrators +# Copyright 2019 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import res_partner diff --git a/partner_tier_validation/models/res_partner.py b/partner_tier_validation/models/res_partner.py index aeea2870..df52d4b9 100644 --- a/partner_tier_validation/models/res_partner.py +++ b/partner_tier_validation/models/res_partner.py @@ -1,10 +1,10 @@ -# Copyright 2021 Open Source Integrators +# Copyright 2019 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import fields, models -class ResPartner11(models.Model): +class ResPartner(models.Model): _name = "res.partner" _inherit = ["res.partner", "tier.validation", "mail.activity.mixin"] _state_from = ["new", "to approve"] diff --git a/partner_tier_validation/models/tier_validation.py b/partner_tier_validation/models/tier_validation.py index 565cc1bb..a070e2ac 100644 --- a/partner_tier_validation/models/tier_validation.py +++ b/partner_tier_validation/models/tier_validation.py @@ -1,4 +1,4 @@ -# Copyright 2021 Open Source Integrators +# Copyright 2019 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import api, models diff --git a/partner_tier_validation/views/res_partner_view.xml b/partner_tier_validation/views/res_partner_view.xml index f6675dc5..053dbbb4 100644 --- a/partner_tier_validation/views/res_partner_view.xml +++ b/partner_tier_validation/views/res_partner_view.xml @@ -1,5 +1,5 @@ - From 06f0edb2bf0afda0f0091665f6743f3b1d42a9cf Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 24 Mar 2021 00:11:47 +0000 Subject: [PATCH 04/26] [FIX] partner_tier_validation: workflow was not working --- partner_tier_validation/__manifest__.py | 5 +- .../data/tier_definition.xml | 12 +++ partner_tier_validation/models/__init__.py | 2 +- partner_tier_validation/models/res_partner.py | 27 ++++- .../models/tier_definition.py | 14 +++ .../models/tier_validation.py | 58 ----------- .../readme/CONFIGURATION.rst | 10 ++ .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 5 + partner_tier_validation/readme/INSTALL.rst | 2 + partner_tier_validation/readme/USAGE.rst | 19 ++++ .../views/res_partner_view.xml | 98 +++---------------- 12 files changed, 106 insertions(+), 150 deletions(-) create mode 100644 partner_tier_validation/data/tier_definition.xml create mode 100644 partner_tier_validation/models/tier_definition.py delete mode 100644 partner_tier_validation/models/tier_validation.py create mode 100644 partner_tier_validation/readme/CONFIGURATION.rst create mode 100644 partner_tier_validation/readme/CONTRIBUTORS.rst create mode 100644 partner_tier_validation/readme/DESCRIPTION.rst create mode 100644 partner_tier_validation/readme/INSTALL.rst create mode 100644 partner_tier_validation/readme/USAGE.rst diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index c86cd1f1..cb932174 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -2,17 +2,16 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Partner Tier Validation", - "summary": "Extends the functionality of Contacts to" - "support a tier validation process.", + "summary": "Support a tier validation process for Contacts", "version": "14.0.1.0.0", "website": "https://github.com/OCA/partner-contact", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", - "application": False, "installable": True, "depends": ["contacts", "base_tier_validation"], "data": [ + "data/tier_definition.xml", "views/res_partner_view.xml", ], } diff --git a/partner_tier_validation/data/tier_definition.xml b/partner_tier_validation/data/tier_definition.xml new file mode 100644 index 00000000..9d328db9 --- /dev/null +++ b/partner_tier_validation/data/tier_definition.xml @@ -0,0 +1,12 @@ + + + Partner Validation + + group + + domain + ["&",["parent_id","=",False],"|",["active","=",True],["active","=",False]] + + diff --git a/partner_tier_validation/models/__init__.py b/partner_tier_validation/models/__init__.py index a415f52e..77a3f1dc 100644 --- a/partner_tier_validation/models/__init__.py +++ b/partner_tier_validation/models/__init__.py @@ -2,4 +2,4 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import res_partner -from . import tier_validation +from . import tier_definition diff --git a/partner_tier_validation/models/res_partner.py b/partner_tier_validation/models/res_partner.py index df52d4b9..79464e01 100644 --- a/partner_tier_validation/models/res_partner.py +++ b/partner_tier_validation/models/res_partner.py @@ -1,15 +1,32 @@ # Copyright 2019 Open Source Integrators # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models class ResPartner(models.Model): _name = "res.partner" - _inherit = ["res.partner", "tier.validation", "mail.activity.mixin"] - _state_from = ["new", "to approve"] - _state_to = ["approved"] + _inherit = ["res.partner", "tier.validation"] + _tier_validation_manual_config = False state = fields.Selection( - [("new", "New"), ("approved", "Approved")], string="Status", default="new" + [("draft", "Draft"), ("confirmed", "Active"), ("cancel", "Archived")], + string="Status", + default="draft", ) + + @api.model + def create(self, vals): + new = super().create(vals) + if new.need_validation and new.state != "confirmed": + new.active = False + return new + + def write(self, vals): + """ + Default `active` is False. + It is set to True when State changes to confirmed. + """ + if "state" in vals: + vals["active"] = vals["state"] == "confirmed" + return super().write(vals) diff --git a/partner_tier_validation/models/tier_definition.py b/partner_tier_validation/models/tier_definition.py new file mode 100644 index 00000000..c159d95b --- /dev/null +++ b/partner_tier_validation/models/tier_definition.py @@ -0,0 +1,14 @@ +# Copyright 2019 Open Source Integrators +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class TierDefinition(models.Model): + _inherit = "tier.definition" + + @api.model + def _get_tier_validation_model_names(self): + res = super(TierDefinition, self)._get_tier_validation_model_names() + res.append("res.partner") + return res diff --git a/partner_tier_validation/models/tier_validation.py b/partner_tier_validation/models/tier_validation.py deleted file mode 100644 index a070e2ac..00000000 --- a/partner_tier_validation/models/tier_validation.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2019 Open Source Integrators -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). - -from odoo import api, models - - -class TierValidation(models.AbstractModel): - _inherit = "tier.validation" - - @api.model - def _get_under_validation_exceptions(self): - """Extend for more field exceptions.""" - res = super(TierValidation, self)._get_under_validation_exceptions() or [] - ex_fields = ["categ_id", "state", "customer", "supplier", "excise_tax"] - for val in ex_fields: - res.append(val) - return res - - def validate_tier(self): - super(TierValidation, self).validate_tier() - # make sure to only work with res.partner object. - if self._name != "res.partner": - return - for partner in self: - rec = self.env["tier.review"].search( - [("res_id", "=", partner.id), ("model", "=", "res.partner")] - ) - if rec and rec.status == "approved": - partner.state = "approved" - - # Need to override for Partner Tier Validation since can_review field - # is set to True based only - # if current user is a member of reviewer_ids. This can_review field - # is used to enable or disable the boolean - # field Is Customer / Is Vendor not only during the Validation process - # but even if it is in Approved State. - @api.depends("review_ids") - def _compute_reviewer_ids(self): - if str(self.__class__) == "": - for rec in self: - rec.reviewer_ids = rec.review_ids.filtered( - lambda r: r.status in ("pending", "approved") - ).mapped("reviewer_ids") - else: - for rec in self: - rec.reviewer_ids = rec.review_ids.filtered( - lambda r: r.status == "pending" - ).mapped("reviewer_ids") - - def request_validation(self): - res = super().request_validation() - for rec in self.filtered(lambda x: x._name == "res.partner"): - rec.message_subscribe( - partner_ids=[ - self.env.user.partner_id.id, - ] - ) - return res diff --git a/partner_tier_validation/readme/CONFIGURATION.rst b/partner_tier_validation/readme/CONFIGURATION.rst new file mode 100644 index 00000000..f2c56d72 --- /dev/null +++ b/partner_tier_validation/readme/CONFIGURATION.rst @@ -0,0 +1,10 @@ +The approval rules can be configured to suit particular use cases. +A default validation rule is provided out of the box, +that can be used as a starting point fot this configuration. + +This configuration is done at +*Settings > Technical > Tier Validations > Tier Definition*. + +Note that, since Contacts start as archived records, +the *Definition Domain* must include ``"|",["active","=",True],["active","=",False]``. +Otherwise the validation rule won't apply correctly in new records. diff --git a/partner_tier_validation/readme/CONTRIBUTORS.rst b/partner_tier_validation/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..3c78380f --- /dev/null +++ b/partner_tier_validation/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `Open Source Integrators `_. + + * Antonio Yamuta + * Daniel Reis diff --git a/partner_tier_validation/readme/DESCRIPTION.rst b/partner_tier_validation/readme/DESCRIPTION.rst new file mode 100644 index 00000000..3e383aee --- /dev/null +++ b/partner_tier_validation/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +Adds an approval workflow to Partners. +The default rule requires new parent Contacts to be approved +before they can be used. + +For this, the new Contact record is kept as "Archived" until it is approved. diff --git a/partner_tier_validation/readme/INSTALL.rst b/partner_tier_validation/readme/INSTALL.rst new file mode 100644 index 00000000..638fbd2d --- /dev/null +++ b/partner_tier_validation/readme/INSTALL.rst @@ -0,0 +1,2 @@ +This module depends on ``base_tier_validation``. You can find it at +`OCA/server-ux `_ diff --git a/partner_tier_validation/readme/USAGE.rst b/partner_tier_validation/readme/USAGE.rst new file mode 100644 index 00000000..40016f54 --- /dev/null +++ b/partner_tier_validation/readme/USAGE.rst @@ -0,0 +1,19 @@ +A regular user creates a new Contact and sends it for approval: + +#. Create a Contact triggering at least one "Tier Definition". + The Contact will be in Draft state and marked as Archived until approved. +#. Click on *Request Validation* button. +#. In the *Reviews* section, at the bottom of the form, inspect the pending reviews and their status. + + +The approver reviews Contacts to approve: + +#. Navigate to the Contacts app, and select the filter "Needs my Approval" +#. Open the Contact form to approve. It will display a + "This Records needs to be validated" banner, with "Validate" and "Reject" options. +#. The approver can change the state to "Active". + This will automatically unarchive the record and make it available to be used. + + +The Approve/Reject actions do not automatically change the State. +This could be a future improvement. diff --git a/partner_tier_validation/views/res_partner_view.xml b/partner_tier_validation/views/res_partner_view.xml index 053dbbb4..cc74dee5 100644 --- a/partner_tier_validation/views/res_partner_view.xml +++ b/partner_tier_validation/views/res_partner_view.xml @@ -1,4 +1,3 @@ - @@ -6,85 +5,18 @@ partner.form.tier res.partner - - - -
- -
-
+ + -
- - - - - - - -
- - + +
+ +
@@ -95,12 +27,12 @@ res.partner - + From 0a2d6de9bec20d60a357d92456b1dd64bc53e510 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 3 Mar 2021 12:32:04 +0000 Subject: [PATCH 05/26] partner_tier_validation 14.0.1.1.0 --- partner_tier_validation/README.rst | 115 +++-- partner_tier_validation/__manifest__.py | 2 +- .../i18n/partner_tier_validation.pot | 112 +++++ .../static/description/index.html | 453 ++++++++++++++++++ 4 files changed, 632 insertions(+), 50 deletions(-) create mode 100644 partner_tier_validation/i18n/partner_tier_validation.pot create mode 100644 partner_tier_validation/static/description/index.html diff --git a/partner_tier_validation/README.rst b/partner_tier_validation/README.rst index c197ce0b..855c4bb4 100644 --- a/partner_tier_validation/README.rst +++ b/partner_tier_validation/README.rst @@ -1,92 +1,109 @@ -.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png - :target: https://www.gnu.org/licenses/agpl - :alt: License: AGPL-3 - ======================= Partner Tier Validation ======================= -This module extends the functionality of Partner to support a tier -validation process. +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -Installation -============ +.. |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%2Fpartner--contact-lightgray.png?logo=github + :target: https://github.com/OCA/partner-contact/tree/14.0/partner_tier_validation + :alt: OCA/partner-contact +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/partner-contact-14-0/partner-contact-14-0-partner_tier_validation + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/134/14.0 + :alt: Try me on Runbot -This module depends on ``base_tier_validation``. You can find it at -`OCA/server-ux `_ +|badge1| |badge2| |badge3| |badge4| |badge5| +Adds an approval workflow to Partners. +The default rule requires new parent Contacts to be approved +before they can be used. -Configuration -============= +For this, the new Contact record is kept as "Archived" until it is approved. -To configure this module, you need to: +**Table of contents** -#. Go to *Settings > Technical > Tier Validations > Tier Definition*. -#. Create as many tiers as you want for Contact model. -#. Example: - Definition Formula - Tier Definition Expression - # Available locals: - # - rec: current record +.. contents:: + :local: - [rec.state == New] +Installation +============ + +This module depends on ``base_tier_validation``. You can find it at +`OCA/server-ux `_ Usage ===== -To use this module, you need to: +A regular user creates a new Contact and sends it for approval: -#. Create a Contact triggering at least one "Tier Definition". +#. Create a Contact triggering at least one "Tier Definition". + The Contact will be in Draft state and marked as Archived until approved. #. Click on *Request Validation* button. -#. Under the tab *Reviews* have a look to pending reviews and their statuses. -#. Validator has to update Is Customer or Is Supplier or Both for this Contact to be usable on SO/PO. +#. In the *Reviews* section, at the bottom of the form, inspect the pending reviews and their status. -Additional features: -* You can filter the Invoices requesting your review through the filter *Needs my - Review*. -* User with rights to confirm the Vendor Bill (validate all tiers that would - be generated) can directly do the operation, this is, there is no need for - her/him to request a validation. +The approver reviews Contacts to approve: -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/142/11.0 +#. Navigate to the Contacts app, and select the filter "Needs my Approval" +#. Open the Contact form to approve. It will display a + "This Records needs to be validated" banner, with "Validate" and "Reject" options. +#. The approver can change the state to "Active". + This will automatically unarchive the record and make it available to be used. + + +The Approve/Reject actions do not automatically change the State. +This could be a future improvement. 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 smash it by providing detailed and welcomed feedback. +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 ======= -Images ------- +Authors +~~~~~~~ -* Odoo Community Association: `Icon `_. +* Open Source Integrators Contributors ------------- +~~~~~~~~~~~~ -* Antonio Yamuta +* `Open Source Integrators `_. -Do not contact contributors directly about support or help with technical issues. + * Antonio Yamuta + * Daniel Reis -Maintainer ----------- +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. .. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association :target: https://odoo-community.org -This module is maintained by the OCA. - 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. -To contribute to this module, please visit https://odoo-community.org. +This module is part of the `OCA/partner-contact `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index cb932174..20cfa629 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Tier Validation", "summary": "Support a tier validation process for Contacts", - "version": "14.0.1.0.0", + "version": "14.0.1.1.0", "website": "https://github.com/OCA/partner-contact", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", diff --git a/partner_tier_validation/i18n/partner_tier_validation.pot b/partner_tier_validation/i18n/partner_tier_validation.pot new file mode 100644 index 00000000..afda27cd --- /dev/null +++ b/partner_tier_validation/i18n/partner_tier_validation.pot @@ -0,0 +1,112 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_tier_validation +# +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: partner_tier_validation +#: model:ir.model.fields.selection,name:partner_tier_validation.selection__res_partner__state__confirmed +msgid "Active" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields.selection,name:partner_tier_validation.selection__res_partner__state__cancel +msgid "Archived" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__can_review +msgid "Can Review" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model,name:partner_tier_validation.model_res_partner +msgid "Contact" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__display_name +#: model:ir.model.fields,field_description:partner_tier_validation.field_tier_definition__display_name +msgid "Display Name" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields.selection,name:partner_tier_validation.selection__res_partner__state__draft +msgid "Draft" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__has_comment +msgid "Has Comment" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__id +#: model:ir.model.fields,field_description:partner_tier_validation.field_tier_definition__id +msgid "ID" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner____last_update +#: model:ir.model.fields,field_description:partner_tier_validation.field_tier_definition____last_update +msgid "Last Modified on" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__need_validation +msgid "Need Validation" +msgstr "" + +#. module: partner_tier_validation +#: model_terms:ir.ui.view,arch_db:partner_tier_validation.partner_form_tier_filter +msgid "Needs my Approval" +msgstr "" + +#. module: partner_tier_validation +#: model:tier.definition,name:partner_tier_validation.partner_tier_definition +msgid "Partner Validation" +msgstr "" + +#. module: partner_tier_validation +#: model_terms:ir.ui.view,arch_db:partner_tier_validation.partner_form_tier_filter +msgid "Partner(s) to Approve" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__rejected +msgid "Rejected" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__reviewer_ids +msgid "Reviewers" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__state +msgid "Status" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model,name:partner_tier_validation.model_tier_definition +msgid "Tier Definition" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__validated +msgid "Validated" +msgstr "" + +#. module: partner_tier_validation +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__review_ids +msgid "Validations" +msgstr "" diff --git a/partner_tier_validation/static/description/index.html b/partner_tier_validation/static/description/index.html new file mode 100644 index 00000000..11eb1dd1 --- /dev/null +++ b/partner_tier_validation/static/description/index.html @@ -0,0 +1,453 @@ + + + + + + +Partner Tier Validation + + + +
+

Partner Tier Validation

+ + +

Beta License: AGPL-3 OCA/partner-contact Translate me on Weblate Try me on Runbot

+

Adds an approval workflow to Partners. +The default rule requires new parent Contacts to be approved +before they can be used.

+

For this, the new Contact record is kept as “Archived” until it is approved.

+

Table of contents

+ +
+

Installation

+

This module depends on base_tier_validation. You can find it at +OCA/server-ux

+
+
+

Usage

+

A regular user creates a new Contact and sends it for approval:

+
    +
  1. Create a Contact triggering at least one “Tier Definition”. +The Contact will be in Draft state and marked as Archived until approved.
  2. +
  3. Click on Request Validation button.
  4. +
  5. In the Reviews section, at the bottom of the form, inspect the pending reviews and their status.
  6. +
+

The approver reviews Contacts to approve:

+
    +
  1. Navigate to the Contacts app, and select the filter “Needs my Approval”
  2. +
  3. Open the Contact form to approve. It will display a +“This Records needs to be validated” banner, with “Validate” and “Reject” options.
  4. +
  5. The approver can change the state to “Active”. +This will automatically unarchive the record and make it available to be used.
  6. +
+

The Approve/Reject actions do not automatically change the State. +This could be a future improvement.

+
+
+

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

+
    +
  • Open Source Integrators
  • +
+
+ +
+

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/partner-contact project on GitHub.

+

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

+
+
+
+ + From efa7e48c1d4bc38a6c7ea5e923bb266e16f43267 Mon Sep 17 00:00:00 2001 From: Patrick Wilson <36892066+patrickrwilson@users.noreply.github.com> Date: Wed, 19 May 2021 13:24:04 -0600 Subject: [PATCH 06/26] [IMP] - Added new optional tier definition for is_company = true. - Added auto active if no validation needed during create. - Added reset validation during write for specific fields. [FIX] Code White Space Formatting [IMP] Reviewer Suggestions [IMP] Added Tests --- .../data/tier_definition.xml | 6 +- partner_tier_validation/models/res_partner.py | 23 +++++-- .../readme/DESCRIPTION.rst | 9 ++- partner_tier_validation/tests/__init__.py | 3 + .../tests/test_tier_validation.py | 68 +++++++++++++++++++ 5 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 partner_tier_validation/tests/__init__.py create mode 100644 partner_tier_validation/tests/test_tier_validation.py diff --git a/partner_tier_validation/data/tier_definition.xml b/partner_tier_validation/data/tier_definition.xml index 9d328db9..4a5436fa 100644 --- a/partner_tier_validation/data/tier_definition.xml +++ b/partner_tier_validation/data/tier_definition.xml @@ -1,12 +1,12 @@ - - Partner Validation + + Partner Validation (Company) group domain ["&",["parent_id","=",False],"|",["active","=",True],["active","=",False]] + >["&",["is_company","=",True],"|",["active","=",True],["active","=",False]] diff --git a/partner_tier_validation/models/res_partner.py b/partner_tier_validation/models/res_partner.py index 79464e01..34e78d17 100644 --- a/partner_tier_validation/models/res_partner.py +++ b/partner_tier_validation/models/res_partner.py @@ -15,18 +15,33 @@ class ResPartner(models.Model): default="draft", ) + @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. + """ + return ["is_company", "parent_id"] + @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" return new def write(self, vals): - """ - Default `active` is False. - It is set to True when State changes to confirmed. - """ + # 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" return super().write(vals) diff --git a/partner_tier_validation/readme/DESCRIPTION.rst b/partner_tier_validation/readme/DESCRIPTION.rst index 3e383aee..fe2b83fe 100644 --- a/partner_tier_validation/readme/DESCRIPTION.rst +++ b/partner_tier_validation/readme/DESCRIPTION.rst @@ -1,5 +1,12 @@ Adds an approval workflow to Partners. -The default rule requires new parent Contacts to be approved +The default rule requires new company Contacts to be approved before they can be used. +The rule can be extended to new non-company contact, +but beware that may cause issues with automatically created new contacts, +such as the ones generated when processing incoming emails. + +If the 'Is Company' or 'Parent' field changes then the contact is Request +for approval. + For this, the new Contact record is kept as "Archived" until it is approved. diff --git a/partner_tier_validation/tests/__init__.py b/partner_tier_validation/tests/__init__.py new file mode 100644 index 00000000..f3959641 --- /dev/null +++ b/partner_tier_validation/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/partner_tier_validation/tests/test_tier_validation.py b/partner_tier_validation/tests/test_tier_validation.py new file mode 100644 index 00000000..f4fe3d22 --- /dev/null +++ b/partner_tier_validation/tests/test_tier_validation.py @@ -0,0 +1,68 @@ +# Copyright 2021 Patrick Wilson +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo.exceptions import ValidationError +from odoo.tests import common, tagged + + +@tagged("-at_install", "post_install") +class TestPartnerTierValidation(common.SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + # Get res partner model + cls.partner_model = cls.env.ref("base.model_res_partner") + + # Create users + group_ids = cls.env.ref("base.group_system").ids + group_ids.append(cls.env.ref("base.group_partner_manager").id) + cls.test_user_1 = cls.env["res.users"].create( + { + "name": "John", + "login": "test1", + "groups_id": [(6, 0, group_ids)], + "email": "test@examlple.com", + } + ) + + # Create tier definitions: + cls.tier_def_obj = cls.env["tier.definition"] + cls.tier_def_obj.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)]", + } + ) + + def test_tier_validation_model_name(self): + self.assertIn( + "res.partner", self.tier_def_obj._get_tier_validation_model_names() + ) + + def test_validation_res_partner(self): + company = 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) + + # Assert an error shows if trying to make it active + with self.assertRaises(ValidationError): + company.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") + + # Change company type to retrigger validation + company.write({"company_type": "person", "is_company": False}) + self.assertEqual(company.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) From 8f9828ef22462408491d7e6e3e02230571df8dae Mon Sep 17 00:00:00 2001 From: oca-travis Date: Fri, 28 May 2021 15:18:24 +0000 Subject: [PATCH 07/26] partner_tier_validation 14.0.2.0.0 --- partner_tier_validation/README.rst | 9 ++++++++- partner_tier_validation/__manifest__.py | 2 +- partner_tier_validation/i18n/partner_tier_validation.pot | 4 ++-- partner_tier_validation/static/description/index.html | 7 ++++++- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/partner_tier_validation/README.rst b/partner_tier_validation/README.rst index 855c4bb4..3b43aa1b 100644 --- a/partner_tier_validation/README.rst +++ b/partner_tier_validation/README.rst @@ -26,9 +26,16 @@ Partner Tier Validation |badge1| |badge2| |badge3| |badge4| |badge5| Adds an approval workflow to Partners. -The default rule requires new parent Contacts to be approved +The default rule requires new company Contacts to be approved before they can be used. +The rule can be extended to new non-company contact, +but beware that may cause issues with automatically created new contacts, +such as the ones generated when processing incoming emails. + +If the 'Is Company' or 'Parent' field changes then the contact is Request +for approval. + For this, the new Contact record is kept as "Archived" until it is approved. **Table of contents** diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index 20cfa629..8321c7d0 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Tier Validation", "summary": "Support a tier validation process for Contacts", - "version": "14.0.1.1.0", + "version": "14.0.2.0.0", "website": "https://github.com/OCA/partner-contact", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", diff --git a/partner_tier_validation/i18n/partner_tier_validation.pot b/partner_tier_validation/i18n/partner_tier_validation.pot index afda27cd..fad014b9 100644 --- a/partner_tier_validation/i18n/partner_tier_validation.pot +++ b/partner_tier_validation/i18n/partner_tier_validation.pot @@ -72,8 +72,8 @@ msgid "Needs my Approval" msgstr "" #. module: partner_tier_validation -#: model:tier.definition,name:partner_tier_validation.partner_tier_definition -msgid "Partner Validation" +#: model:tier.definition,name:partner_tier_validation.partner_tier_definition_company_only +msgid "Partner Validation (Company)" msgstr "" #. module: partner_tier_validation diff --git a/partner_tier_validation/static/description/index.html b/partner_tier_validation/static/description/index.html index 11eb1dd1..f9344437 100644 --- a/partner_tier_validation/static/description/index.html +++ b/partner_tier_validation/static/description/index.html @@ -369,8 +369,13 @@

Partner Tier Validation

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/partner-contact Translate me on Weblate Try me on Runbot

Adds an approval workflow to Partners. -The default rule requires new parent Contacts to be approved +The default rule requires new company Contacts to be approved before they can be used.

+

The rule can be extended to new non-company contact, +but beware that may cause issues with automatically created new contacts, +such as the ones generated when processing incoming emails.

+

If the ‘Is Company’ or ‘Parent’ field changes then the contact is Request +for approval.

For this, the new Contact record is kept as “Archived” until it is approved.

Table of contents

From 59f0efb93945855877255c79d501727fab6209c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Mon, 11 Oct 2021 08:55:57 +0200 Subject: [PATCH 08/26] [FIX] partner_tier_validation: Defer rule activation for compatibility Having this rule activated by default in tests environments makes other tests to fail due to the additional constraint not expected by them, so what we are doing is: - Having the rule deactivated by default. - On a post-init hook, we activate it only if we are not in a test environment. - On own modules tests, we activate it as well TT30292 --- partner_tier_validation/__init__.py | 1 + partner_tier_validation/__manifest__.py | 1 + .../data/tier_definition.xml | 1 + partner_tier_validation/hooks.py | 18 ++++++++++++++++++ 4 files changed, 21 insertions(+) create mode 100644 partner_tier_validation/hooks.py diff --git a/partner_tier_validation/__init__.py b/partner_tier_validation/__init__.py index 31660d6a..c0d9f3d1 100644 --- a/partner_tier_validation/__init__.py +++ b/partner_tier_validation/__init__.py @@ -1,3 +1,4 @@ # 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 8321c7d0..7b2ca7f1 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -14,4 +14,5 @@ "data/tier_definition.xml", "views/res_partner_view.xml", ], + "post_init_hook": "post_init_hook", } diff --git a/partner_tier_validation/data/tier_definition.xml b/partner_tier_validation/data/tier_definition.xml index 4a5436fa..528842bc 100644 --- a/partner_tier_validation/data/tier_definition.xml +++ b/partner_tier_validation/data/tier_definition.xml @@ -5,6 +5,7 @@ group domain + ["&",["is_company","=",True],"|",["active","=",True],["active","=",False]] diff --git a/partner_tier_validation/hooks.py b/partner_tier_validation/hooks.py new file mode 100644 index 00000000..0bfebf18 --- /dev/null +++ b/partner_tier_validation/hooks.py @@ -0,0 +1,18 @@ +# 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}) From c8f24ecfce92ec484355590b03f5a297d4a9ec94 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Tue, 1 Feb 2022 13:57:32 +0000 Subject: [PATCH 09/26] [REF] partner_tier_validation: do not archive, depend on partner_stage --- partner_tier_validation/__init__.py | 2 - partner_tier_validation/__manifest__.py | 4 +- .../data/tier_definition.xml | 6 +-- partner_tier_validation/hooks.py | 18 ------- partner_tier_validation/models/res_partner.py | 41 +++++++++------- .../tests/test_tier_validation.py | 47 +++++++++++-------- .../views/res_partner_view.xml | 16 ++----- 7 files changed, 60 insertions(+), 74 deletions(-) delete mode 100644 partner_tier_validation/hooks.py diff --git a/partner_tier_validation/__init__.py b/partner_tier_validation/__init__.py index c0d9f3d1..3275ac2a 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 7b2ca7f1..5836fb65 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 528842bc..c46c0e54 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 0bfebf18..00000000 --- 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 34e78d17..90908509 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 f4fe3d22..56420cfc 100644 --- a/partner_tier_validation/tests/test_tier_validation.py +++ b/partner_tier_validation/tests/test_tier_validation.py @@ -21,48 +21,55 @@ def setUpClass(cls): "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 cc74dee5..29cbd0a6 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 @@ From c44a343e6877c088ca5ed1456a735e0ec768a585 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 11 Nov 2021 07:13:57 +0000 Subject: [PATCH 10/26] partner_tier_validation 14.0.3.0.0 --- partner_tier_validation/README.rst | 8 ++++++ partner_tier_validation/__manifest__.py | 2 +- .../i18n/partner_tier_validation.pot | 27 +++++-------------- .../static/description/index.html | 2 ++ 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/partner_tier_validation/README.rst b/partner_tier_validation/README.rst index 3b43aa1b..777f7887 100644 --- a/partner_tier_validation/README.rst +++ b/partner_tier_validation/README.rst @@ -111,6 +111,14 @@ 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-dreispt| image:: https://github.com/dreispt.png?size=40px + :target: https://github.com/dreispt + :alt: dreispt + +Current `maintainer `__: + +|maintainer-dreispt| + This module is part of the `OCA/partner-contact `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index 5836fb65..b4d410d3 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Tier Validation", "summary": "Support a tier validation process for Contacts", - "version": "14.0.2.0.0", + "version": "14.0.3.0.0", "website": "https://github.com/OCA/partner-contact", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", diff --git a/partner_tier_validation/i18n/partner_tier_validation.pot b/partner_tier_validation/i18n/partner_tier_validation.pot index fad014b9..2e5dfbc0 100644 --- a/partner_tier_validation/i18n/partner_tier_validation.pot +++ b/partner_tier_validation/i18n/partner_tier_validation.pot @@ -13,16 +13,6 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" -#. module: partner_tier_validation -#: model:ir.model.fields.selection,name:partner_tier_validation.selection__res_partner__state__confirmed -msgid "Active" -msgstr "" - -#. module: partner_tier_validation -#: model:ir.model.fields.selection,name:partner_tier_validation.selection__res_partner__state__cancel -msgid "Archived" -msgstr "" - #. module: partner_tier_validation #: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__can_review msgid "Can Review" @@ -39,11 +29,6 @@ msgstr "" msgid "Display Name" msgstr "" -#. module: partner_tier_validation -#: model:ir.model.fields.selection,name:partner_tier_validation.selection__res_partner__state__draft -msgid "Draft" -msgstr "" - #. module: partner_tier_validation #: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__has_comment msgid "Has Comment" @@ -72,8 +57,8 @@ msgid "Needs my Approval" msgstr "" #. module: partner_tier_validation -#: model:tier.definition,name:partner_tier_validation.partner_tier_definition_company_only -msgid "Partner Validation (Company)" +#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__next_review +msgid "Next Review" msgstr "" #. module: partner_tier_validation @@ -92,13 +77,13 @@ msgid "Reviewers" msgstr "" #. module: partner_tier_validation -#: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__state -msgid "Status" +#: model:ir.model,name:partner_tier_validation.model_tier_definition +msgid "Tier Definition" msgstr "" #. module: partner_tier_validation -#: model:ir.model,name:partner_tier_validation.model_tier_definition -msgid "Tier Definition" +#: model:tier.definition,name:partner_tier_validation.partner_tier_definition_company_only +msgid "Validate New Company" msgstr "" #. module: partner_tier_validation diff --git a/partner_tier_validation/static/description/index.html b/partner_tier_validation/static/description/index.html index f9344437..a247d0b5 100644 --- a/partner_tier_validation/static/description/index.html +++ b/partner_tier_validation/static/description/index.html @@ -449,6 +449,8 @@

Maintainers

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:

+

dreispt

This module is part of the OCA/partner-contact project on GitHub.

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

From 113f05ad319f58956f7bf4027c90b69cac87ad1e Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 24 Feb 2022 18:54:22 +0000 Subject: [PATCH 11/26] [FIX] partner_tier_validation: create does not need custom code, restart validation on controlled field changes --- partner_tier_validation/models/res_partner.py | 46 +++++++++---------- .../readme/CONFIGURATION.rst | 22 +++++++-- partner_tier_validation/readme/USAGE.rst | 5 ++ 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/partner_tier_validation/models/res_partner.py b/partner_tier_validation/models/res_partner.py index 90908509..e364918d 100644 --- a/partner_tier_validation/models/res_partner.py +++ b/partner_tier_validation/models/res_partner.py @@ -15,40 +15,36 @@ class ResPartner(models.Model): _tier_validation_manual_config = False @api.model - def _tier_revalidation_fields(self, values): + def _partner_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 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) - # 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 + # IDEA: make it a System Parameter? + return [ + "company_type", + "parent_id", + "vat", + "state_id", + "country_id", + "property_account_position_id", + "property_account_receivable_id", + "property_account_payable_id", + ] def write(self, vals): - # Signal state transition by adding to vals + # Tier Validation does not work woith Stages, only States :-( + # So, signal state transition by adding it to the 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) + # Changing certain fields requiresd a new validation process + revalidate_fields = self._partner_tier_revalidation_fields(vals) if any(x in revalidate_fields for x in vals.keys()): - self.mapped("review_ids").unlink() - vals["state"] = "draft" - self.request_validation() - return super().write(vals) + vals["stage_id"] = self._get_default_stage_id().id + res = super().write(vals) + if "stage_id" in vals: + self.restart_validation() + return res diff --git a/partner_tier_validation/readme/CONFIGURATION.rst b/partner_tier_validation/readme/CONFIGURATION.rst index f2c56d72..12f37af2 100644 --- a/partner_tier_validation/readme/CONFIGURATION.rst +++ b/partner_tier_validation/readme/CONFIGURATION.rst @@ -3,8 +3,22 @@ A default validation rule is provided out of the box, that can be used as a starting point fot this configuration. This configuration is done at -*Settings > Technical > Tier Validations > Tier Definition*. +*Settings / Technical / Tier Validations / Tier Definition*. -Note that, since Contacts start as archived records, -the *Definition Domain* must include ``"|",["active","=",True],["active","=",False]``. -Otherwise the validation rule won't apply correctly in new records. +Also relevant is the configuration on the default Stage +for new Contacts/Partners. +This can be set at *Contacts / Configuration / Contact Stage*, +setting the "Default Sate" field on the appropriate Stage record. + +Changing some fields will trigger a new request for validation. +This list of fields can be customized extending ``_partner_tier_revalidation_fields``. +By default these fields are: + +- Company Type (Individual or Company) +- Parent Company +- Tax ID +- State +- Country +- Fiscal Position +- Account Receivable +- Account Payable diff --git a/partner_tier_validation/readme/USAGE.rst b/partner_tier_validation/readme/USAGE.rst index 40016f54..fb81ae01 100644 --- a/partner_tier_validation/readme/USAGE.rst +++ b/partner_tier_validation/readme/USAGE.rst @@ -1,3 +1,8 @@ +Before using, check Contact Stages configuration, +to ensure that the default stage has the "Related State" field +set to "To Approve". +For example, having the "Draft" stage the default ensures this. + A regular user creates a new Contact and sends it for approval: #. Create a Contact triggering at least one "Tier Definition". From 62fe616dea5fc4fcb5504aad33c68365ebdab0f7 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Thu, 3 Mar 2022 09:29:20 +0000 Subject: [PATCH 12/26] [FIX] partner_tier_validation: fix tests --- partner_tier_validation/models/res_partner.py | 12 ++-- .../tests/test_tier_validation.py | 68 ++++++++++++------- 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/partner_tier_validation/models/res_partner.py b/partner_tier_validation/models/res_partner.py index e364918d..9c251a95 100644 --- a/partner_tier_validation/models/res_partner.py +++ b/partner_tier_validation/models/res_partner.py @@ -34,16 +34,16 @@ def _partner_tier_revalidation_fields(self, values): ] def write(self, vals): - # Tier Validation does not work woith Stages, only States :-( - # So, signal state transition by adding it to the vals + # Changing certain fields requires a new validation process + revalidate_fields = self._partner_tier_revalidation_fields(vals) + if any(x in revalidate_fields for x in vals.keys()): + vals["stage_id"] = self._get_default_stage_id().id + # Tier Validation does not work with Stages, only States :-( + # Workaround is to signal state transition adding it to the write values 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 requiresd a new validation process - revalidate_fields = self._partner_tier_revalidation_fields(vals) - if any(x in revalidate_fields for x in vals.keys()): - vals["stage_id"] = self._get_default_stage_id().id res = super().write(vals) if "stage_id" in vals: self.restart_validation() diff --git a/partner_tier_validation/tests/test_tier_validation.py b/partner_tier_validation/tests/test_tier_validation.py index 56420cfc..1a556b57 100644 --- a/partner_tier_validation/tests/test_tier_validation.py +++ b/partner_tier_validation/tests/test_tier_validation.py @@ -10,18 +10,25 @@ class TestPartnerTierValidation(common.SavepointCase): @classmethod def setUpClass(cls): super().setUpClass() - # Get res partner model - cls.partner_model = cls.env.ref("base.model_res_partner") - # Create users - group_ids = cls.env.ref("base.group_system").ids - group_ids.append(cls.env.ref("base.group_partner_manager").id) - cls.test_user_1 = cls.env["res.users"].create( + group_user = cls.env.ref("base.group_user") + group_contacts = cls.env.ref("base.group_partner_manager") + group_approver = cls.env.ref("base.group_no_one") + User = cls.env["res.users"] + cls.user_employee = User.create( + { + "name": "Employee", + "login": "empl1", + "email": "empl1@example.com", + "groups_id": (group_user | group_contacts).ids, + } + ) + cls.user_approver = User.create( { - "name": "John", - "login": "test1", - "groups_id": [(6, 0, group_ids)], - "email": "test@example.com", + "name": "Approver", + "login": "aprov1", + "email": "approv1@example.com", + "groups_id": (group_user | group_contacts | group_approver).ids, } ) @@ -29,13 +36,20 @@ def setUpClass(cls): cls.TierDefinition = cls.env["tier.definition"] cls.TierDefinition.create( { - "model_id": cls.partner_model.id, + "model_id": cls.env.ref("base.model_res_partner").id, "review_type": "individual", - "reviewer_id": cls.test_user_1.id, + "reviewer_id": cls.user_approver.id, "definition_domain": "[('is_company','=',True)]", } ) + # Setup Contact Stages: draft is the default + Stage = cls.env["res.partner.stage"] + Stage.search([("is_default", "=", True)]).write({"is_default": False}) + cls.stage_draft = Stage.search([("state", "=", "draft")], limit=1) + cls.stage_draft.is_default = True + cls.stage_confirmed = Stage.search([("state", "=", "confirmed")], limit=1) + def test_tier_validation_model_name(self): self.assertIn( "res.partner", self.TierDefinition._get_tier_validation_model_names() @@ -45,31 +59,37 @@ def test_validation_res_partner(self): """ Case where new Contact requires validation """ - contact = self.env["res.partner"].create( - {"name": "Company for test", "company_type": "company"} - ) - # Since contact need validation, it should be inactive + Partner = self.env["res.partner"] + contact_vals = {"name": "Company for test", "company_type": "company"} + contact = Partner.with_user(self.user_employee).create(contact_vals) self.assertEqual(contact.state, "draft") # Assert an error shows if trying to make it active with self.assertRaises(ValidationError): - contact.write({"state": "confirmed"}) + contact.write({"stage_id": self.stage_confirmed.id}) # Request and validate partner contact.request_validation() - contact.with_user(self.test_user_1).validate_tier() - contact.with_user(self.test_user_1).write({"state": "confirmed"}) + contact.with_user(self.user_approver).validate_tier() + contact.with_user(self.user_approver).write( + {"stage_id": self.stage_confirmed.id} + ) self.assertEqual(contact.state, "confirmed") # Change company type to retrigger validation - contact.write({"company_type": "person", "is_company": False}) - self.assertEqual(contact.state, "draft") + contact.write({"company_type": "person"}) + self.assertEqual( + contact.state, "draft", "Change company type sets back to draft" + ) 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"} - ) + Partner = self.env["res.partner"] + contact_vals = {"name": "Company for test", "company_type": "person"} + contact = Partner.with_user(self.user_employee).create(contact_vals) + self.assertEqual(contact.state, "draft") + # Can move to confirmed state without approval + contact.write({"stage_id": self.stage_confirmed.id}) self.assertEqual(contact.state, "confirmed") From d8960093201877cedbdacbc241374e8f4e235022 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 4 Mar 2022 19:19:13 +0000 Subject: [PATCH 13/26] partner_tier_validation 14.0.3.0.1 --- partner_tier_validation/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index b4d410d3..cdae869d 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Tier Validation", "summary": "Support a tier validation process for Contacts", - "version": "14.0.3.0.0", + "version": "14.0.3.0.1", "website": "https://github.com/OCA/partner-contact", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", From 117bc16fc35db4516f7c8c571d5909326dd2fd06 Mon Sep 17 00:00:00 2001 From: Patrick Wilson <36892066+patrickrwilson@users.noreply.github.com> Date: Wed, 27 Apr 2022 16:21:53 -0400 Subject: [PATCH 14/26] [IMP] partner_tier_validation (Prevent bypass) This prevents a scenario where a user can bypass validation by moving the partner to a 'cancel' stage and then moving it back to confirmed. --- partner_tier_validation/models/res_partner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/partner_tier_validation/models/res_partner.py b/partner_tier_validation/models/res_partner.py index 9c251a95..3b303bf4 100644 --- a/partner_tier_validation/models/res_partner.py +++ b/partner_tier_validation/models/res_partner.py @@ -9,7 +9,7 @@ class ResPartner(models.Model): _inherit = ["res.partner", "tier.validation"] _tier_validation_buttons_xpath = "/form/header/field[@name='state']" - _state_from = ["draft"] + _state_from = ["draft", "cancel"] _state_to = ["confirmed"] _cancel_state = ["inactive"] _tier_validation_manual_config = False @@ -45,6 +45,6 @@ def write(self, vals): stage = self.env["res.partner.stage"].browse(stage_id) vals["state"] = stage.state res = super().write(vals) - if "stage_id" in vals: + if "stage_id" in vals and vals.get("stage_id") in self._state_from: self.restart_validation() return res From 540f930b5d1c3cf023335999153e50a945a34b74 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sat, 30 Apr 2022 16:35:38 +0000 Subject: [PATCH 15/26] partner_tier_validation 14.0.3.0.2 --- partner_tier_validation/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index cdae869d..ae0338f3 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Tier Validation", "summary": "Support a tier validation process for Contacts", - "version": "14.0.3.0.1", + "version": "14.0.3.0.2", "website": "https://github.com/OCA/partner-contact", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", From 816960ebc6f3867159973ea45f5c55287dbeea20 Mon Sep 17 00:00:00 2001 From: David Montull Date: Wed, 14 Sep 2022 15:54:32 +0200 Subject: [PATCH 16/26] [IMP] partner_tier_validation: black, isort, prettier --- partner_tier_validation/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index ae0338f3..76bb695e 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Tier Validation", "summary": "Support a tier validation process for Contacts", - "version": "14.0.3.0.2", + "version": "15.0.1.0.0", "website": "https://github.com/OCA/partner-contact", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", From 180d5a6bf68fa039e9b94ba29da8d6a1260a4a66 Mon Sep 17 00:00:00 2001 From: David Montull Date: Wed, 14 Sep 2022 16:39:13 +0200 Subject: [PATCH 17/26] [15.0][MIG] partner_tier_validation: Migration to 15.0 --- partner_tier_validation/test-requirements.txt | 1 + partner_tier_validation/tests/test_tier_validation.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 partner_tier_validation/test-requirements.txt diff --git a/partner_tier_validation/test-requirements.txt b/partner_tier_validation/test-requirements.txt new file mode 100644 index 00000000..3044a912 --- /dev/null +++ b/partner_tier_validation/test-requirements.txt @@ -0,0 +1 @@ +git+https://github.com/OCA/partner-contact/pull/1339/head#subdirectory=setup/partner_stage diff --git a/partner_tier_validation/tests/test_tier_validation.py b/partner_tier_validation/tests/test_tier_validation.py index 1a556b57..f9c348b8 100644 --- a/partner_tier_validation/tests/test_tier_validation.py +++ b/partner_tier_validation/tests/test_tier_validation.py @@ -6,7 +6,7 @@ @tagged("-at_install", "post_install") -class TestPartnerTierValidation(common.SavepointCase): +class TestPartnerTierValidation(common.TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -70,6 +70,7 @@ def test_validation_res_partner(self): # Request and validate partner contact.request_validation() + contact.invalidate_cache() contact.with_user(self.user_approver).validate_tier() contact.with_user(self.user_approver).write( {"stage_id": self.stage_confirmed.id} From 6dc9a5a30d8891535236d9a49f9f5ba4dd7241be Mon Sep 17 00:00:00 2001 From: Urvisha-OSI Date: Mon, 20 Mar 2023 16:41:45 +0530 Subject: [PATCH 18/26] [IMP] partner_tier_validation: pre-commit stuff --- partner_tier_validation/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index 76bb695e..d242d206 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Partner Tier Validation", "summary": "Support a tier validation process for Contacts", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "website": "https://github.com/OCA/partner-contact", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", From 03f7426e07111044deaafd1b5aef6b7bb977d801 Mon Sep 17 00:00:00 2001 From: Urvisha-OSI Date: Mon, 20 Mar 2023 17:31:42 +0530 Subject: [PATCH 19/26] [MIG] partner_tier_validation: Migrated to 16.0 --- partner_tier_validation/README.rst | 15 ++++++++------- partner_tier_validation/readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 8 ++++---- partner_tier_validation/test-requirements.txt | 1 - 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/partner_tier_validation/README.rst b/partner_tier_validation/README.rst index 777f7887..d3f0e167 100644 --- a/partner_tier_validation/README.rst +++ b/partner_tier_validation/README.rst @@ -14,14 +14,14 @@ Partner Tier Validation :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpartner--contact-lightgray.png?logo=github - :target: https://github.com/OCA/partner-contact/tree/14.0/partner_tier_validation + :target: https://github.com/OCA/partner-contact/tree/16.0/partner_tier_validation :alt: OCA/partner-contact .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/partner-contact-14-0/partner-contact-14-0-partner_tier_validation + :target: https://translation.odoo-community.org/projects/partner-contact-16-0/partner-contact-16-0-partner_tier_validation :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/134/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/webui/builds.html?repo=OCA/partner-contact&target_branch=16.0 + :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -78,7 +78,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 smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -97,6 +97,7 @@ Contributors * Antonio Yamuta * Daniel Reis + * Urvisha Desai Maintainers ~~~~~~~~~~~ @@ -119,6 +120,6 @@ Current `maintainer `__: |maintainer-dreispt| -This module is part of the `OCA/partner-contact `_ project on GitHub. +This module is part of the `OCA/partner-contact `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/partner_tier_validation/readme/CONTRIBUTORS.rst b/partner_tier_validation/readme/CONTRIBUTORS.rst index 3c78380f..f3a6bc52 100644 --- a/partner_tier_validation/readme/CONTRIBUTORS.rst +++ b/partner_tier_validation/readme/CONTRIBUTORS.rst @@ -2,3 +2,4 @@ * Antonio Yamuta * Daniel Reis + * Urvisha Desai diff --git a/partner_tier_validation/static/description/index.html b/partner_tier_validation/static/description/index.html index a247d0b5..720b6f80 100644 --- a/partner_tier_validation/static/description/index.html +++ b/partner_tier_validation/static/description/index.html @@ -3,7 +3,7 @@ - + Partner Tier Validation -
-

Partner Tier Validation

+
+ + +Odoo Community Association + +
+

Partner Tier Validation

-

Beta License: AGPL-3 OCA/partner-contact Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/partner-contact Translate me on Weblate Try me on Runboat

Adds an approval workflow to Partners. The default rule requires new company Contacts to be approved before they can be used.

The rule can be extended to new non-company contact, but beware that may @@ -394,12 +399,12 @@

Partner Tier Validation

-

Installation

+

Installation

This module depends on base_tier_validation. You can find it at OCA/server-ux

-

Usage

+

Usage

Before using, check Contact Stages configuration, to ensure that the default stage has the “Related State” field set to “To Approve”. For example, having the “Draft” stage the default ensures this.

@@ -424,7 +429,7 @@

Usage

could be a future improvement.

-

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 @@ -432,15 +437,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Open Source Integrators
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -466,5 +471,6 @@

Maintainers

+
From 23516b7dd53861567728cd2d66037a7d38ea5f91 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 10 Feb 2026 10:49:34 +0000 Subject: [PATCH 25/26] Translated using Weblate (Italian) Currently translated at 100.0% (17 of 17 strings) Translation: partner-contact-18.0/partner-contact-18.0-partner_tier_validation Translate-URL: https://translation.odoo-community.org/projects/partner-contact-18-0/partner-contact-18-0-partner_tier_validation/it/ --- partner_tier_validation/i18n/it.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/partner_tier_validation/i18n/it.po b/partner_tier_validation/i18n/it.po index d593f509..98cefbf0 100644 --- a/partner_tier_validation/i18n/it.po +++ b/partner_tier_validation/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-12-27 11:42+0000\n" +"PO-Revision-Date: 2026-02-10 11:46+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 5.15.2\n" #. module: partner_tier_validation #: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__can_review @@ -34,7 +34,7 @@ msgstr "Ha commenti" #. module: partner_tier_validation #: model:ir.model.fields,field_description:partner_tier_validation.field_res_partner__need_validation msgid "Need Validation" -msgstr "Richiede validazione" +msgstr "Richiede conferma" #. module: partner_tier_validation #: model_terms:ir.ui.view,arch_db:partner_tier_validation.partner_form_tier_filter From 9f40fa7f14f605f833d84b706fedab448523712a Mon Sep 17 00:00:00 2001 From: hda Date: Wed, 20 May 2026 09:04:40 +0200 Subject: [PATCH 26/26] [ADD] partner_tier_validation: Add to 19.0 --- partner_tier_validation/README.rst | 16 ++++++++-------- partner_tier_validation/__manifest__.py | 4 ++-- .../static/description/index.html | 8 ++++---- .../tests/test_tier_validation.py | 10 ++++++---- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/partner_tier_validation/README.rst b/partner_tier_validation/README.rst index cc538bd9..d08b9f8c 100644 --- a/partner_tier_validation/README.rst +++ b/partner_tier_validation/README.rst @@ -20,14 +20,14 @@ Partner Tier Validation .. |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%2Fpartner--contact-lightgray.png?logo=github - :target: https://github.com/OCA/partner-contact/tree/18.0/partner_tier_validation - :alt: OCA/partner-contact +.. |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/partner_tier_validation + :alt: OCA/tier-validation .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/partner-contact-18-0/partner-contact-18-0-partner_tier_validation + :target: https://translation.odoo-community.org/projects/tier-validation-19-0/tier-validation-19-0-partner_tier_validation :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/partner-contact&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| @@ -86,10 +86,10 @@ could be a future improvement. 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. @@ -131,6 +131,6 @@ Current `maintainer `__: |maintainer-dreispt| -This module is part of the `OCA/partner-contact `_ 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/partner_tier_validation/__manifest__.py b/partner_tier_validation/__manifest__.py index 1b53842f..0783e3d6 100644 --- a/partner_tier_validation/__manifest__.py +++ b/partner_tier_validation/__manifest__.py @@ -3,8 +3,8 @@ { "name": "Partner Tier Validation", "summary": "Support a tier validation process for Contacts", - "version": "18.0.1.0.0", - "website": "https://github.com/OCA/partner-contact", + "version": "19.0.1.0.0", + "website": "https://github.com/OCA/tier-validation", "category": "Contact", "author": "Open Source Integrators, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/partner_tier_validation/static/description/index.html b/partner_tier_validation/static/description/index.html index 1348f27a..1a135df5 100644 --- a/partner_tier_validation/static/description/index.html +++ b/partner_tier_validation/static/description/index.html @@ -374,7 +374,7 @@

Partner Tier Validation

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:88d5716b7faaa58f99be747a4e696bf3529607c4e811ef13c99e450802507d7f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/partner-contact Translate me on Weblate Try me on Runboat

+

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

Adds an approval workflow to Partners. The default rule requires new company Contacts to be approved before they can be used.

The rule can be extended to new non-company contact, but beware that may @@ -430,10 +430,10 @@

Usage

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.

@@ -466,7 +466,7 @@

Maintainers

promote its widespread use.

Current maintainer:

dreispt

-

This module is part of the OCA/partner-contact 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/partner_tier_validation/tests/test_tier_validation.py b/partner_tier_validation/tests/test_tier_validation.py index 21c36edc..f599ba20 100644 --- a/partner_tier_validation/tests/test_tier_validation.py +++ b/partner_tier_validation/tests/test_tier_validation.py @@ -2,11 +2,13 @@ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). from odoo.exceptions import ValidationError -from odoo.tests import common, tagged +from odoo.tests import tagged + +from odoo.addons.base.tests.common import BaseCommon @tagged("-at_install", "post_install") -class TestPartnerTierValidation(common.TransactionCase): +class TestPartnerTierValidation(BaseCommon): @classmethod def setUpClass(cls): super().setUpClass() @@ -20,7 +22,7 @@ def setUpClass(cls): "name": "Employee", "login": "empl1", "email": "empl1@example.com", - "groups_id": (group_user | group_contacts).ids, + "group_ids": (group_user | group_contacts).ids, } ) cls.user_approver = User.create( @@ -28,7 +30,7 @@ def setUpClass(cls): "name": "Approver", "login": "aprov1", "email": "approv1@example.com", - "groups_id": (group_user | group_contacts | group_approver).ids, + "group_ids": (group_user | group_contacts | group_approver).ids, } )