From c69ee72f8fb4aabc38ebeceee8ec431de0c445d7 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 9 Jun 2016 10:17:12 +0200 Subject: [PATCH] [ADD] crm_deduplicate_by_ref ================================= Deduplicate Contacts by reference ================================= This module extends the criteria to match duplicated contacts using the field reference. Usage ===== To use this module, you need to: * Go to *Sales > Tools > Deduplicate Contacts*. * Mark "Reference" in the section "Search duplicates based on duplicated data in". * This criteria will be used for deduplicating. --- partner_deduplicate_by_ref/README.rst | 60 ++++++++++ partner_deduplicate_by_ref/__init__.py | 4 + partner_deduplicate_by_ref/__openerp__.py | 21 ++++ partner_deduplicate_by_ref/i18n/es.po | 27 +++++ .../static/description/icon.png | Bin 0 -> 10680 bytes .../static/description/icon.svg | 107 ++++++++++++++++++ partner_deduplicate_by_ref/tests/__init__.py | 4 + .../tests/test_crm_deduplicate_by_ref.py | 50 ++++++++ .../wizards/__init__.py | 5 + .../wizards/partner_merge.py | 29 +++++ .../wizards/partner_merge_view.xml | 20 ++++ 11 files changed, 327 insertions(+) create mode 100644 partner_deduplicate_by_ref/README.rst create mode 100644 partner_deduplicate_by_ref/__init__.py create mode 100644 partner_deduplicate_by_ref/__openerp__.py create mode 100644 partner_deduplicate_by_ref/i18n/es.po create mode 100644 partner_deduplicate_by_ref/static/description/icon.png create mode 100644 partner_deduplicate_by_ref/static/description/icon.svg create mode 100644 partner_deduplicate_by_ref/tests/__init__.py create mode 100644 partner_deduplicate_by_ref/tests/test_crm_deduplicate_by_ref.py create mode 100644 partner_deduplicate_by_ref/wizards/__init__.py create mode 100644 partner_deduplicate_by_ref/wizards/partner_merge.py create mode 100644 partner_deduplicate_by_ref/wizards/partner_merge_view.xml diff --git a/partner_deduplicate_by_ref/README.rst b/partner_deduplicate_by_ref/README.rst new file mode 100644 index 000000000..48cda88b1 --- /dev/null +++ b/partner_deduplicate_by_ref/README.rst @@ -0,0 +1,60 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +================================= +Deduplicate Contacts by reference +================================= + +This module extends the criteria to match duplicated contacts using the field +reference. + +Usage +===== + +To use this module, you need to: + +#. Go to *Sales > Tools > Deduplicate Contacts*. +#. Mark "Reference" in the section "Search duplicates based on duplicated data + in". +#. This criteria will be used for deduplicating. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/111/9.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 smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* `Arrow `_. + +Contributors +------------ + +* Pedro M. Baeza + +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_deduplicate_by_ref/__init__.py b/partner_deduplicate_by_ref/__init__.py new file mode 100644 index 000000000..f8944f05c --- /dev/null +++ b/partner_deduplicate_by_ref/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import wizards diff --git a/partner_deduplicate_by_ref/__openerp__.py b/partner_deduplicate_by_ref/__openerp__.py new file mode 100644 index 000000000..4c5915ed8 --- /dev/null +++ b/partner_deduplicate_by_ref/__openerp__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Deduplicate Contacts by reference", + "version": "9.0.1.0.0", + "category": "Tools", + "website": "https://www.tecnativa.com", + "author": "Tecnativa, " + "Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "depends": [ + "crm", + "crm_deduplicate_acl", + ], + "data": [ + 'wizards/partner_merge_view.xml', + ], +} diff --git a/partner_deduplicate_by_ref/i18n/es.po b/partner_deduplicate_by_ref/i18n/es.po new file mode 100644 index 000000000..0defc8aab --- /dev/null +++ b/partner_deduplicate_by_ref/i18n/es.po @@ -0,0 +1,27 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * crm_deduplicate_by_ref +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-03-01 21:29+0000\n" +"PO-Revision-Date: 2017-03-01 21:29+0000\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: crm_deduplicate_by_ref +#: model:ir.model.fields,field_description:crm_deduplicate_by_ref.field_base_partner_merge_automatic_wizard_group_by_ref +msgid "Reference" +msgstr "Referencia" + +#. module: crm_deduplicate_by_ref +#: model:ir.model,name:crm_deduplicate_by_ref.model_base_partner_merge_automatic_wizard +msgid "base.partner.merge.automatic.wizard" +msgstr "base.partner.merge.automatic.wizard" + diff --git a/partner_deduplicate_by_ref/static/description/icon.png b/partner_deduplicate_by_ref/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..82778ec46536d4507e895aa003cb462a00b06598 GIT binary patch literal 10680 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 literal 0 HcmV?d00001 diff --git a/partner_deduplicate_by_ref/static/description/icon.svg b/partner_deduplicate_by_ref/static/description/icon.svg new file mode 100644 index 000000000..fc243fd98 --- /dev/null +++ b/partner_deduplicate_by_ref/static/description/icon.svg @@ -0,0 +1,107 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/partner_deduplicate_by_ref/tests/__init__.py b/partner_deduplicate_by_ref/tests/__init__.py new file mode 100644 index 000000000..0e3f4a7d8 --- /dev/null +++ b/partner_deduplicate_by_ref/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_crm_deduplicate_by_ref diff --git a/partner_deduplicate_by_ref/tests/test_crm_deduplicate_by_ref.py b/partner_deduplicate_by_ref/tests/test_crm_deduplicate_by_ref.py new file mode 100644 index 000000000..717fb0eeb --- /dev/null +++ b/partner_deduplicate_by_ref/tests/test_crm_deduplicate_by_ref.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.tests import common +from openerp.tools.safe_eval import safe_eval + + +class TestDeduplicateByRef(common.TransactionCase): + def setUp(self): + super(TestDeduplicateByRef, self).setUp() + self.partner_1 = self.env['res.partner'].create({ + 'name': 'Partner 1', + 'ref': '123456', + 'email': 'test@deduplicate.com', + }) + self.partner_2 = self.env['res.partner'].create({ + 'name': 'Partner 2', + 'ref': '123456', + 'email': 'test@deduplicate.com', + }) + + def test_deduplicate_by_ref(self): + wizard = self.env['base.partner.merge.automatic.wizard'].create({ + 'group_by_ref': True, + }) + wizard.start_process_cb() + found_match = False + for line in wizard.line_ids: + match_ids = safe_eval(line.aggr_ids) + if (self.partner_1.id in match_ids and + self.partner_2.id in match_ids): + found_match = True + break + self.assertTrue(found_match) + + def test_deduplicate_by_ref_and_is_company(self): + wizard = self.env['base.partner.merge.automatic.wizard'].create({ + 'group_by_ref': True, + 'group_by_email': True, + }) + wizard.start_process_cb() + found_match = False + for line in wizard.line_ids: + match_ids = safe_eval(line.aggr_ids) + if (self.partner_1.id in match_ids and + self.partner_2.id in match_ids): + found_match = True + break + self.assertTrue(found_match) diff --git a/partner_deduplicate_by_ref/wizards/__init__.py b/partner_deduplicate_by_ref/wizards/__init__.py new file mode 100644 index 000000000..c93eadfed --- /dev/null +++ b/partner_deduplicate_by_ref/wizards/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © 2016 Antiun Ingeniería S.L. - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import partner_merge diff --git a/partner_deduplicate_by_ref/wizards/partner_merge.py b/partner_deduplicate_by_ref/wizards/partner_merge.py new file mode 100644 index 000000000..e39a9da50 --- /dev/null +++ b/partner_deduplicate_by_ref/wizards/partner_merge.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import fields, models + + +class BasePartnerMergeAutomaticWizard(models.TransientModel): + _inherit = "base.partner.merge.automatic.wizard" + + group_by_ref = fields.Boolean('Reference') + + def _generate_query(self, fields, maximum_group=100): + """Inject the additional criteria 'ref IS NOT NULL' when needed. + There's no better way to do it, as there are no hooks for adding + this criteria regularly. + """ + query = super(BasePartnerMergeAutomaticWizard, self)._generate_query( + fields, maximum_group=maximum_group) + if 'ref' in fields: + if 'WHERE' in query: + index = query.find('WHERE') + query = (query[:index + 6] + "ref IS NOT NULL AND " + + query[index + 6:]) + else: + index = query.find(' GROUP BY') + query = (query[:index] + " WHERE ref IS NOT NULL" + + query[index:]) + return query diff --git a/partner_deduplicate_by_ref/wizards/partner_merge_view.xml b/partner_deduplicate_by_ref/wizards/partner_merge_view.xml new file mode 100644 index 000000000..73f1a1487 --- /dev/null +++ b/partner_deduplicate_by_ref/wizards/partner_merge_view.xml @@ -0,0 +1,20 @@ + + + + + + + base.partner.merge.automatic.wizard + + + + + + + + + + + +