diff --git a/partner_contact_address_default/README.rst b/partner_contact_address_default/README.rst index 4727c66ff49..00d8f9e711e 100644 --- a/partner_contact_address_default/README.rst +++ b/partner_contact_address_default/README.rst @@ -41,6 +41,14 @@ contacts. .. contents:: :local: +Configuration +============= + +1. Go to Settings. +2. Under Contact Category, enable Contact Address Default Allow All + Partners to allow selecting any partner, instead of being limited to + child contacts. + Usage ===== @@ -69,22 +77,26 @@ Authors Contributors ------------ -- `Tecnativa `__: +- `Tecnativa `__: + + - Carlos Dauden + - Sergio Teruel + +- `Sygel `__: - - Carlos Dauden - - Sergio Teruel + - Manuel Regidor -- `Sygel `__: +- `Studio73 `__: - - Manuel Regidor + - Carlos Reyes -- `Studio73 `__: +- `ForgeFlow `__: - - Carlos Reyes + - Laura Cazorla -- `ForgeFlow `__: +- `Quartile `__: - - Laura Cazorla + - Aung Ko Ko Lin Maintainers ----------- diff --git a/partner_contact_address_default/__manifest__.py b/partner_contact_address_default/__manifest__.py index 33393e0ad15..ca43c878aa7 100644 --- a/partner_contact_address_default/__manifest__.py +++ b/partner_contact_address_default/__manifest__.py @@ -13,6 +13,9 @@ "license": "AGPL-3", "application": False, "installable": True, - "depends": ["base"], - "data": ["views/res_partner_views.xml"], + "depends": ["base_setup"], + "data": [ + "views/res_config_settings_views.xml", + "views/res_partner_views.xml", + ], } diff --git a/partner_contact_address_default/models/__init__.py b/partner_contact_address_default/models/__init__.py index 3d2c983c62c..6b6460afa3a 100644 --- a/partner_contact_address_default/models/__init__.py +++ b/partner_contact_address_default/models/__init__.py @@ -1,2 +1,4 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import res_company +from . import res_config_settings from . import res_partner diff --git a/partner_contact_address_default/models/res_company.py b/partner_contact_address_default/models/res_company.py new file mode 100644 index 00000000000..ccd1cd6cdf5 --- /dev/null +++ b/partner_contact_address_default/models/res_company.py @@ -0,0 +1,10 @@ +# Copyright 2025 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + contact_address_default_allow_all_partners = fields.Boolean() diff --git a/partner_contact_address_default/models/res_config_settings.py b/partner_contact_address_default/models/res_config_settings.py new file mode 100644 index 00000000000..930821d4ecf --- /dev/null +++ b/partner_contact_address_default/models/res_config_settings.py @@ -0,0 +1,13 @@ +# Copyright 2025 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + contact_address_default_allow_all_partners = fields.Boolean( + related="company_id.contact_address_default_allow_all_partners", + readonly=False, + ) diff --git a/partner_contact_address_default/models/res_partner.py b/partner_contact_address_default/models/res_partner.py index 19bd3d95062..4cc9c1847a7 100644 --- a/partner_contact_address_default/models/res_partner.py +++ b/partner_contact_address_default/models/res_partner.py @@ -2,7 +2,7 @@ # Copyright 2020 Tecnativa - Sergio Teruel # Copyright 2024 ForgeFlow S.L. (https://www.forgeflow.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models class ResPartner(models.Model): @@ -20,6 +20,29 @@ class ResPartner(models.Model): comodel_name="res.partner", string="Default contact", ) + partner_delivery_domain = fields.Binary(compute="_compute_partner_domains") + partner_invoice_domain = fields.Binary(compute="_compute_partner_domains") + partner_contact_domain = fields.Binary(compute="_compute_partner_domains") + + @api.depends_context("company") + @api.depends("commercial_partner_id") + def _compute_partner_domains(self): + for partner in self: + if self.env.company.contact_address_default_allow_all_partners: + partner.partner_delivery_domain = [] + partner.partner_invoice_domain = [] + partner.partner_contact_domain = [] + continue + base_domain = [("id", "child_of", partner.commercial_partner_id.ids)] + partner.partner_delivery_domain = fields.Domain.AND( + [base_domain, [("type", "=", "delivery")]] + ) + partner.partner_invoice_domain = fields.Domain.AND( + [base_domain, [("type", "=", "invoice")]] + ) + partner.partner_contact_domain = fields.Domain.AND( + [base_domain, [("type", "=", "contact")]] + ) def get_address_default_type(self): """This will be the extension method for other contact types""" diff --git a/partner_contact_address_default/readme/CONFIGURE.md b/partner_contact_address_default/readme/CONFIGURE.md new file mode 100644 index 00000000000..81146a2a961 --- /dev/null +++ b/partner_contact_address_default/readme/CONFIGURE.md @@ -0,0 +1,4 @@ +1. Go to Settings. +2. Under Contact Category, enable Contact Address Default Allow All + Partners to allow selecting any partner, instead of being limited to + child contacts. diff --git a/partner_contact_address_default/readme/CONTRIBUTORS.md b/partner_contact_address_default/readme/CONTRIBUTORS.md index 64b3878aae0..ed241d3ca77 100644 --- a/partner_contact_address_default/readme/CONTRIBUTORS.md +++ b/partner_contact_address_default/readme/CONTRIBUTORS.md @@ -7,3 +7,5 @@ - Carlos Reyes - [ForgeFlow](https://www.forgeflow.com): - Laura Cazorla +- [Quartile](https://www.quartile.co): + - Aung Ko Ko Lin diff --git a/partner_contact_address_default/static/description/index.html b/partner_contact_address_default/static/description/index.html index b68f99d348c..810181f8eb8 100644 --- a/partner_contact_address_default/static/description/index.html +++ b/partner_contact_address_default/static/description/index.html @@ -381,18 +381,28 @@

Partner Contact address default

Table of contents

+
+

Configuration

+
    +
  1. Go to Settings.
  2. +
  3. Under Contact Category, enable Contact Address Default Allow All +Partners to allow selecting any partner, instead of being limited to +child contacts.
  4. +
+
-

Usage

+

Usage

  1. Go to Contacts.
  2. Select default delivery address, invoice address or contact for @@ -400,7 +410,7 @@

    Usage

-

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 @@ -408,15 +418,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association diff --git a/partner_contact_address_default/tests/test_partner_contact_address_default.py b/partner_contact_address_default/tests/test_partner_contact_address_default.py index a3b9073bd27..e942306f545 100644 --- a/partner_contact_address_default/tests/test_partner_contact_address_default.py +++ b/partner_contact_address_default/tests/test_partner_contact_address_default.py @@ -1,6 +1,8 @@ # Copyright 2020 Tecnativa - Carlos Dauden # Copyright 2020 Tecnativa - Sergio Teruel # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields from odoo.tests import common @@ -63,3 +65,24 @@ def test_contact_address_archived(self): self.assertEqual(res["delivery"], self.partner_child_delivery1.id) self.assertEqual(res["invoice"], self.partner.id) self.assertEqual(res["contact"], self.partner.id) + + def test_partner_domains(self): + self.partner._compute_partner_domains() + expected_base = [("id", "child_of", self.partner.commercial_partner_id.ids)] + expected_delivery = fields.Domain.AND( + [expected_base, [("type", "=", "delivery")]] + ) + expected_invoice = fields.Domain.AND( + [expected_base, [("type", "=", "invoice")]] + ) + expected_contact = fields.Domain.AND( + [expected_base, [("type", "=", "contact")]] + ) + self.assertEqual(self.partner.partner_delivery_domain, expected_delivery) + self.assertEqual(self.partner.partner_invoice_domain, expected_invoice) + self.assertEqual(self.partner.partner_contact_domain, expected_contact) + self.env.company.contact_address_default_allow_all_partners = True + self.partner._compute_partner_domains() + self.assertEqual(self.partner.partner_delivery_domain, []) + self.assertEqual(self.partner.partner_invoice_domain, []) + self.assertEqual(self.partner.partner_contact_domain, []) diff --git a/partner_contact_address_default/views/res_config_settings_views.xml b/partner_contact_address_default/views/res_config_settings_views.xml new file mode 100644 index 00000000000..b499eb886f6 --- /dev/null +++ b/partner_contact_address_default/views/res_config_settings_views.xml @@ -0,0 +1,18 @@ + + + + res.config.settings.view.form.inherit + res.config.settings + + + + + + + + + + diff --git a/partner_contact_address_default/views/res_partner_views.xml b/partner_contact_address_default/views/res_partner_views.xml index d153e445b58..1219cf903ff 100644 --- a/partner_contact_address_default/views/res_partner_views.xml +++ b/partner_contact_address_default/views/res_partner_views.xml @@ -6,22 +6,25 @@ + + + @@ -29,6 +32,9 @@ + + +