From ac6bb81a18f8cc53b2a45f332d673063332d8db5 Mon Sep 17 00:00:00 2001 From: ernesto Date: Thu, 17 May 2018 16:00:43 -0400 Subject: [PATCH] [MIG] mass_mailing_partner: Migration to 11.0 --- mass_mailing_partner/README.rst | 82 +++++++++---- mass_mailing_partner/__init__.py | 1 - mass_mailing_partner/__manifest__.py | 5 +- mass_mailing_partner/hooks.py | 1 - mass_mailing_partner/models/__init__.py | 1 - .../models/mail_mail_statistics.py | 1 - .../models/mail_mass_mailing.py | 1 - .../models/mail_mass_mailing_contact.py | 112 ++++++++++-------- mass_mailing_partner/models/res_partner.py | 41 ++++--- mass_mailing_partner/readme/CONFIGURE.rst | 2 + mass_mailing_partner/readme/CONTRIBUTORS.rst | 9 ++ mass_mailing_partner/readme/DESCRIPTION.rst | 11 ++ mass_mailing_partner/readme/USAGE.rst | 3 + mass_mailing_partner/tests/__init__.py | 1 - mass_mailing_partner/tests/base.py | 40 +++++-- .../tests/test_mail_mail_statistics.py | 8 +- .../tests/test_mail_mass_mailing_contact.py | 57 ++++++--- .../tests/test_partner_mail_list_wizard.py | 10 +- .../tests/test_res_partner.py | 40 +++---- .../views/mail_mass_mailing_contact_view.xml | 81 ++++++++----- .../views/mail_mass_mailing_view.xml | 2 +- .../views/res_partner_view.xml | 84 ++++++------- mass_mailing_partner/wizard/__init__.py | 1 - .../wizard/partner_mail_list_wizard.py | 32 +++-- 24 files changed, 379 insertions(+), 247 deletions(-) create mode 100644 mass_mailing_partner/readme/CONFIGURE.rst create mode 100644 mass_mailing_partner/readme/CONTRIBUTORS.rst create mode 100644 mass_mailing_partner/readme/DESCRIPTION.rst create mode 100644 mass_mailing_partner/readme/USAGE.rst diff --git a/mass_mailing_partner/README.rst b/mass_mailing_partner/README.rst index 315660b4..cc54775b 100644 --- a/mass_mailing_partner/README.rst +++ b/mass_mailing_partner/README.rst @@ -1,15 +1,35 @@ -.. 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 - =============================== Link partners with mass-mailing =============================== +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fsocial-lightgray.png?logo=github + :target: https://github.com/OCA/social/tree/11.0/mass_mailing_partner + :alt: OCA/social +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/social-11-0/social-11-0-mass_mailing_partner + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/205/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + This module links mass-mailing contacts with partners. Features --------- +~~~~~~~~ + * When creating or saving a mass-mailing contact, partners are matched through email, linking matched partner, or creating a new one if no match and the maling list partner mandatory field is checked. @@ -17,6 +37,10 @@ Features * Mass mailing stats smart button in partner form. * Filter and group by partner in mail statistics tree view +**Table of contents** + +.. contents:: + :local: Configuration ============= @@ -31,44 +55,50 @@ In partner view, there is a new action called "Add to mailing list". This action open a pop-up to select a mailing list. Selected partners will be added as mailing list contacts. -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/205/10.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. +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 +~~~~~~~ + +* Tecnativa + Contributors ------------- +~~~~~~~~~~~~ -* Pedro M. Baeza -* Rafael Blasco -* Antonio Espinosa -* Javier Iniesta -* Jairo Llopis -* David Vidal +* `Tecnativa `_: + * Pedro M. Baeza + * Rafael Blasco + * Antonio Espinosa + * Javier Iniesta + * Jairo Llopis + * David Vidal + * Ernesto Tejeda -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/social `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mass_mailing_partner/__init__.py b/mass_mailing_partner/__init__.py index f0fe988d..27d867f1 100644 --- a/mass_mailing_partner/__init__.py +++ b/mass_mailing_partner/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta diff --git a/mass_mailing_partner/__manifest__.py b/mass_mailing_partner/__manifest__.py index 493639d4..20e2e738 100644 --- a/mass_mailing_partner/__manifest__.py +++ b/mass_mailing_partner/__manifest__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015-2016 Antonio Espinosa # Copyright 2015 Javier Iniesta @@ -6,10 +5,10 @@ { "name": "Link partners with mass-mailing", - "version": "10.0.1.0.3", + "version": "11.0.1.0.0", "author": "Tecnativa, " "Odoo Community Association (OCA)", - "website": "https://www.tecnativa.com", + "website": "https://github.com/OCA/social", "license": "AGPL-3", "category": "Marketing", "depends": [ diff --git a/mass_mailing_partner/hooks.py b/mass_mailing_partner/hooks.py index cf8edf60..85163f6d 100644 --- a/mass_mailing_partner/hooks.py +++ b/mass_mailing_partner/hooks.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta diff --git a/mass_mailing_partner/models/__init__.py b/mass_mailing_partner/models/__init__.py index a1322f45..6de33d61 100644 --- a/mass_mailing_partner/models/__init__.py +++ b/mass_mailing_partner/models/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta diff --git a/mass_mailing_partner/models/mail_mail_statistics.py b/mass_mailing_partner/models/mail_mail_statistics.py index 385bc0aa..b188bdb2 100644 --- a/mass_mailing_partner/models/mail_mail_statistics.py +++ b/mass_mailing_partner/models/mail_mail_statistics.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). diff --git a/mass_mailing_partner/models/mail_mass_mailing.py b/mass_mailing_partner/models/mail_mass_mailing.py index b3afe8be..14169aeb 100644 --- a/mass_mailing_partner/models/mail_mass_mailing.py +++ b/mass_mailing_partner/models/mail_mass_mailing.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta diff --git a/mass_mailing_partner/models/mail_mass_mailing_contact.py b/mass_mailing_partner/models/mail_mass_mailing_contact.py index 864d9c47..e5acf556 100644 --- a/mass_mailing_partner/models/mail_mass_mailing_contact.py +++ b/mass_mailing_partner/models/mail_mass_mailing_contact.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta @@ -6,6 +5,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import _, api, fields, models +from odoo.exceptions import ValidationError class MailMassMailingContact(models.Model): @@ -14,68 +14,84 @@ class MailMassMailingContact(models.Model): partner_id = fields.Many2one(comodel_name='res.partner', string="Partner", domain=[('email', '!=', False)]) - _sql_constraints = [ - ('partner_list_uniq', 'unique(partner_id, list_id)', - _('Partner already exists in this mailing list.')) - ] + @api.constrains('partner_id', 'list_ids') + def _check_partner_id_list_ids(self): + for contact in self: + if contact.partner_id: + other_contact = self.search([ + ('partner_id', '=', contact.partner_id.id), + ('id', '!=', contact.id) + ]) + if contact.list_ids & other_contact.mapped('list_ids'): + raise ValidationError(_("Partner already exists in one of " + "these mailing lists")) @api.onchange('partner_id') - def _onchange_partner(self): + def _onchange_partner_mass_mailing_partner(self): if self.partner_id: self.name = self.partner_id.name self.email = self.partner_id.email + self.title_id = self.partner_id.title + self.company_name = self.partner_id.company_id.name + self.country_id = self.partner_id.country_id + category_ids = self.partner_id.category_id + if category_ids: + self.tag_ids = category_ids @api.model - @api.returns('self', lambda x: x.id) def create(self, vals): - if not vals.get('partner_id'): - vals = self._set_partner(vals) - vals = self._set_name_email(vals) - return super(MailMassMailingContact, self).create(vals) + record = self.new(vals) + if not record.partner_id: + record._set_partner() + record._onchange_partner_mass_mailing_partner() + new_vals = record._convert_to_write(record._cache) + return super(MailMassMailingContact, self).create(new_vals) def write(self, vals): for contact in self: - if vals.get('partner_id', None) is False: - # If removing partner, search again by email - vals = contact._set_partner(vals) - vals = contact._set_name_email(vals) - return super(MailMassMailingContact, self).write(vals) + new_vals = contact.copy_data(vals)[0] + record = self.new(new_vals) + if not record.partner_id: + record._set_partner() + record._onchange_partner_mass_mailing_partner() + new_vals = record._convert_to_write(record._cache) + super(MailMassMailingContact, contact).write(new_vals) + return True + + def _get_company(self): + company_id = False + if self.company_name: + company_id = self.env['res.company'].search( + [('name', '=', self.company_name)]).id + if not company_id: + company_id = self.env['res.company'].create( + {'name': self.company_name}).id + return company_id - def _prepare_partner(self, vals, mailing_list): - vals = { - 'name': vals.get('name') or vals.get('email'), - 'email': vals.get('email', False), + def _get_categories(self): + ca_ids = self.tag_ids.ids + self.list_ids.mapped('partner_category.id') + return [[6, 0, ca_ids]] + + def _prepare_partner(self): + return { + 'name': self.name or self.email, + 'email': self.email, + 'country_id': self.country_id.id, + 'title': self.title_id.id, + 'company_id': self._get_company(), + 'category_id': self._get_categories(), } - if mailing_list.partner_category: - vals['category_id'] = [(4, mailing_list.partner_category.id, 0)] - return vals - def _set_partner(self, vals): - email = vals.get('email', self.email) - if not email: # pragma: no cover - return vals - m_mailing = self.env['mail.mass_mailing.list'] + @api.multi + def _set_partner(self): + self.ensure_one() m_partner = self.env['res.partner'] - list_id = vals.get('list_id', self.list_id.id) - mailing_list = m_mailing.browse(list_id) # Look for a partner with that email - email = email.strip() - partners = m_partner.search([('email', '=ilike', email)], limit=1) - if partners: + email = self.email.strip() + partner = m_partner.search([('email', '=ilike', email)], limit=1) + if partner: # Partner found - vals['partner_id'] = partners[0].id - elif mailing_list.partner_mandatory: + self.partner_id = partner + elif self.list_ids.filtered('partner_mandatory'): # Create partner - partner = m_partner.sudo().create( - self._prepare_partner(vals, mailing_list)) - vals['partner_id'] = partner.id - return vals - - def _set_name_email(self, vals): - partner_id = vals.get('partner_id', self.partner_id.id) - if not partner_id: - return vals - partner = self.env['res.partner'].browse(partner_id) - vals['email'] = partner.email - vals['name'] = partner.name - return vals + self.partner_id = m_partner.sudo().create(self._prepare_partner()) diff --git a/mass_mailing_partner/models/res_partner.py b/mass_mailing_partner/models/res_partner.py index d98c9a02..e6310e3b 100644 --- a/mass_mailing_partner/models/res_partner.py +++ b/mass_mailing_partner/models/res_partner.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta @@ -13,15 +12,15 @@ class ResPartner(models.Model): _inherit = 'res.partner' mass_mailing_contact_ids = fields.One2many( - string="Mailing lists", + string="Mailing contacts", oldname="mass_mailing_contacts", domain=[('opt_out', '=', False)], comodel_name='mail.mass_mailing.contact', inverse_name='partner_id') mass_mailing_contacts_count = fields.Integer( - string='Mailing list number', + string='Mailing contacts number', compute='_compute_mass_mailing_contacts_count', store=True, compute_sudo=True) - mass_mailing_stats = fields.One2many( + mass_mailing_stats_ids = fields.One2many( string="Mass mailing stats", comodel_name='mail.mail.statistics', inverse_name='partner_id') mass_mailing_stats_count = fields.Integer( @@ -31,12 +30,12 @@ class ResPartner(models.Model): @api.constrains('email') def _check_email_mass_mailing_contacts(self): for partner in self: - if partner.sudo().mass_mailing_contact_ids and not partner.email: - raise ValidationError( - _("This partner '%s' is subscribed to one or more " - "mailing lists. Email must be assigned.") % partner.name) + if not partner.email and self.sudo().mass_mailing_contact_ids: + raise ValidationError(_( + "This partner '%s' is linked to one or more mass " + "mailing contact. Email must be assigned." + ) % partner.name) - @api.multi @api.depends('mass_mailing_contact_ids', 'mass_mailing_contact_ids.opt_out') def _compute_mass_mailing_contacts_count(self): @@ -49,8 +48,7 @@ class ResPartner(models.Model): partner.mass_mailing_contacts_count = mapped_data.get(partner.id, 0) - @api.multi - @api.depends('mass_mailing_stats') + @api.depends('mass_mailing_stats_ids') def _compute_mass_mailing_stats_count(self): contact_data = self.env['mail.mail.statistics'].read_group( [('partner_id', 'in', self.ids)], ['partner_id'], ['partner_id']) @@ -62,12 +60,21 @@ class ResPartner(models.Model): def write(self, vals): res = super(ResPartner, self).write(vals) - if vals.get('name') or vals.get('email'): - mm_vals = {} - if vals.get('name'): - mm_vals['name'] = vals['name'] - if vals.get('email'): - mm_vals['email'] = vals['email'] + mm_vals = {} + if vals.get('name'): + mm_vals['name'] = vals['name'] + if vals.get('email'): + mm_vals['email'] = vals['email'] + if vals.get('title'): + mm_vals['title_id'] = vals['title'] + if vals.get('company_id'): + company = self.env['res.company'].browse(vals.get('company_id')) + mm_vals['company_name'] = company.name + if vals.get('country_id'): + mm_vals['country_id'] = vals['country_id'] + if vals.get('category_id'): + mm_vals['tag_ids'] = vals['category_id'] + if mm_vals: # Using sudo because ACLs shouldn't produce data inconsistency self.env["mail.mass_mailing.contact"].sudo().search([ ("partner_id", "in", self.ids), diff --git a/mass_mailing_partner/readme/CONFIGURE.rst b/mass_mailing_partner/readme/CONFIGURE.rst new file mode 100644 index 00000000..b8119b8e --- /dev/null +++ b/mass_mailing_partner/readme/CONFIGURE.rst @@ -0,0 +1,2 @@ +At first install, all existing mass mailing contacts are matched against +partners. And also mass mailing statistics are matched using model and res_id. diff --git a/mass_mailing_partner/readme/CONTRIBUTORS.rst b/mass_mailing_partner/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..a7c4a724 --- /dev/null +++ b/mass_mailing_partner/readme/CONTRIBUTORS.rst @@ -0,0 +1,9 @@ +* `Tecnativa `_: + + * Pedro M. Baeza + * Rafael Blasco + * Antonio Espinosa + * Javier Iniesta + * Jairo Llopis + * David Vidal + * Ernesto Tejeda diff --git a/mass_mailing_partner/readme/DESCRIPTION.rst b/mass_mailing_partner/readme/DESCRIPTION.rst new file mode 100644 index 00000000..ee5e6358 --- /dev/null +++ b/mass_mailing_partner/readme/DESCRIPTION.rst @@ -0,0 +1,11 @@ +This module links mass-mailing contacts with partners. + +Features +~~~~~~~~ + +* When creating or saving a mass-mailing contact, partners are matched through + email, linking matched partner, or creating a new one if no match and the + maling list partner mandatory field is checked. +* Mailing contacts smart button in partner form. +* Mass mailing stats smart button in partner form. +* Filter and group by partner in mail statistics tree view diff --git a/mass_mailing_partner/readme/USAGE.rst b/mass_mailing_partner/readme/USAGE.rst new file mode 100644 index 00000000..1149221e --- /dev/null +++ b/mass_mailing_partner/readme/USAGE.rst @@ -0,0 +1,3 @@ +In partner view, there is a new action called "Add to mailing list". This +action open a pop-up to select a mailing list. Selected partners will be added +as mailing list contacts. diff --git a/mass_mailing_partner/tests/__init__.py b/mass_mailing_partner/tests/__init__.py index 68f402ac..9ab068b7 100644 --- a/mass_mailing_partner/tests/__init__.py +++ b/mass_mailing_partner/tests/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta diff --git a/mass_mailing_partner/tests/base.py b/mass_mailing_partner/tests/base.py index eb5b4426..2b3a4c1e 100644 --- a/mass_mailing_partner/tests/base.py +++ b/mass_mailing_partner/tests/base.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta @@ -10,17 +9,23 @@ from odoo.tests.common import TransactionCase class BaseCase(TransactionCase): def setUp(self): super(BaseCase, self).setUp() - m_partner_category = self.env['res.partner.category'] - m_mailing_list = self.env['mail.mass_mailing.list'] - self.company_id = self.env.ref('base.main_company') - self.company = self.env['res.company'].browse(self.company_id) - self.partner = self.create_partner({'name': 'Partner test', - 'email': 'partner@test.com'}) - partner_category = m_partner_category.create({'name': 'Category Test'}) - self.mailing_list = m_mailing_list.create({'name': 'List test'}) - self.mailing_list2 = m_mailing_list.create( + + self.main_company = self.env.ref('base.main_company') + self.country_es = self.env.ref('base.es') + self.category_0 = self.env.ref('base.res_partner_category_0') + self.category_1 = self.env.ref('base.res_partner_category_1') + self.title_mister = self.env.ref('base.res_partner_title_mister') + self.partner = self.create_partner( + {'name': 'Partner test', 'email': 'partner@test.com', + 'title': self.title_mister.id, 'company_id': self.main_company.id, + 'country_id': self.country_es.id, + 'category_id': [(6, 0, (self.category_0 | self.category_1).ids)]}) + + self.category_3 = self.env.ref('base.res_partner_category_3') + self.mailing_list = self.create_mailing_list({'name': 'List test'}) + self.mailing_list2 = self.create_mailing_list( {'name': 'List test 2', 'partner_mandatory': True, - 'partner_category': partner_category.id}) + 'partner_category': self.category_3.id}) def create_partner(self, vals): m_partner = self.env['res.partner'] @@ -30,9 +35,22 @@ class BaseCase(TransactionCase): m_mailing_contact = self.env['mail.mass_mailing.contact'] return m_mailing_contact.create(vals) + def create_mailing_list(self, vals): + m_mailing_list = self.env['mail.mass_mailing.list'] + return m_mailing_list.create(vals) + def check_mailing_contact_partner(self, mailing_contact): if mailing_contact.partner_id: self.assertEqual(mailing_contact.partner_id.email, mailing_contact.email) self.assertEqual(mailing_contact.partner_id.name, mailing_contact.name) + self.assertEqual(mailing_contact.partner_id.title, + mailing_contact.title_id) + if mailing_contact.partner_id.company_id: + self.assertEqual(mailing_contact.partner_id.company_id.name, + mailing_contact.company_name) + self.assertEqual(mailing_contact.partner_id.country_id, + mailing_contact.country_id) + self.assertEqual(mailing_contact.partner_id.category_id, + mailing_contact.tag_ids) diff --git a/mass_mailing_partner/tests/test_mail_mail_statistics.py b/mass_mailing_partner/tests/test_mail_mail_statistics.py index 4b18def6..17353357 100644 --- a/mass_mailing_partner/tests/test_mail_mail_statistics.py +++ b/mass_mailing_partner/tests/test_mail_mail_statistics.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta @@ -21,8 +20,11 @@ class MailMailStatisticsCase(base.BaseCase): def test_link_mail_contact(self): partner = self.create_partner( {'name': 'Test partner', 'email': 'test@domain.com'}) - contact = self.create_mailing_contact( - {'partner_id': partner.id, 'list_id': self.mailing_list.id}) + contact_vals = { + 'partner_id': partner.id, + 'list_ids': [[6, 0, [self.mailing_list.id]]] + } + contact = self.create_mailing_contact(contact_vals) stat = self.env['mail.mail.statistics'].create({ 'model': 'mail.mass_mailing.contact', 'res_id': contact.id, diff --git a/mass_mailing_partner/tests/test_mail_mass_mailing_contact.py b/mass_mailing_partner/tests/test_mail_mass_mailing_contact.py index dde27599..de4d5648 100644 --- a/mass_mailing_partner/tests/test_mail_mass_mailing_contact.py +++ b/mass_mailing_partner/tests/test_mail_mass_mailing_contact.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta @@ -6,44 +5,66 @@ from . import base from ..hooks import post_init_hook -from psycopg2 import IntegrityError +from odoo.exceptions import ValidationError class MailMassMailingContactCase(base.BaseCase): def test_match_existing_contacts(self): contact = self.create_mailing_contact( - {'email': 'partner@test.com', 'list_id': self.mailing_list.id}) + {'email': 'partner@test.com', + 'list_ids': [(6, 0, self.mailing_list.ids)]}) post_init_hook(self.cr, self.registry) self.assertEqual(contact.partner_id.id, self.partner.id) + self.check_mailing_contact_partner(contact) def test_create_mass_mailing_contact(self): - contact = self.create_mailing_contact( - {'email': 'partner2@test.com', 'name': 'Partner test 2', - 'list_id': self.mailing_list2.id}) + title_doctor = self.env.ref('base.res_partner_title_doctor') + country_cu = self.env.ref('base.cu') + category_4 = self.env.ref('base.res_partner_category_4') + category_5 = self.env.ref('base.res_partner_category_5') + contact_vals = { + 'name': 'Partner test 2', 'email': 'partner2@test.com', + 'title_id': title_doctor.id, 'company_name': "TestCompany", + 'country_id': country_cu.id, + 'tag_ids': [(6, 0, (category_4 | category_5).ids)], + 'list_ids': [(6, 0, (self.mailing_list | self.mailing_list2).ids)], + } + contact = self.create_mailing_contact(contact_vals) self.check_mailing_contact_partner(contact) - with self.assertRaises(IntegrityError): - self.create_mailing_contact({'email': 'partner2@test.com', - 'list_id': self.mailing_list2.id}) + with self.assertRaises(ValidationError): + self.create_mailing_contact( + {'email': 'partner2@test.com', + 'list_ids': [[6, 0, [self.mailing_list2.id]]]}) def test_write_mass_mailing_contact(self): contact = self.create_mailing_contact( - {'email': 'partner@test.com', 'list_id': self.mailing_list.id}) + {'email': 'partner@test.com', + 'list_ids': [(6, 0, self.mailing_list.ids)]}) contact.write({'partner_id': False}) self.check_mailing_contact_partner(contact) contact2 = self.create_mailing_contact( {'email': 'partner2@test.com', 'name': 'Partner test 2', - 'list_id': self.mailing_list.id}) - contact.write({'partner_id': False}) + 'list_ids': [(6, 0, self.mailing_list.ids)]}) + contact2.write({'partner_id': False}) self.assertFalse(contact2.partner_id) def test_onchange_partner(self): contact = self.create_mailing_contact( - {'email': 'partner@test.com', 'list_id': self.mailing_list.id}) - partner = self.create_partner( - {'name': 'Test partner', 'email': 'sample@test.com'}) + {'email': 'partner@test.com', + 'list_ids': [[6, 0, [self.mailing_list.id]]]}) + title_doctor = self.env.ref('base.res_partner_title_doctor') + country_cu = self.env.ref('base.cu') + category_4 = self.env.ref('base.res_partner_category_4') + category_5 = self.env.ref('base.res_partner_category_5') + partner_vals = { + 'name': 'Partner test 2', 'email': 'partner2@test.com', + 'title': title_doctor.id, 'company_id': self.main_company.id, + 'country_id': country_cu.id, + 'category_id': [(6, 0, (category_4 | category_5).ids)], + } + partner = self.create_partner(partner_vals) with self.env.do_in_onchange(): contact.partner_id = partner - contact._onchange_partner() - self.assertEqual(contact.name, partner.name) - self.assertEqual(contact.email, partner.email) + contact._onchange_partner_mass_mailing_partner() + self.check_mailing_contact_partner(contact) diff --git a/mass_mailing_partner/tests/test_partner_mail_list_wizard.py b/mass_mailing_partner/tests/test_partner_mail_list_wizard.py index 82a8957d..da173672 100644 --- a/mass_mailing_partner/tests/test_partner_mail_list_wizard.py +++ b/mass_mailing_partner/tests/test_partner_mail_list_wizard.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta @@ -15,10 +14,11 @@ class PartnerMailListWizardCase(base.BaseCase): {'mail_list_id': self.mailing_list.id}) wizard.partner_ids = [self.partner.id] wizard.add_to_mail_list() - contact = self.env['mail.mass_mailing.contact'].search([ - ('partner_id', '=', self.partner.id), - ('list_id', '=', self.mailing_list.id)]) - self.check_mailing_contact_partner(contact) + contacts = self.env['mail.mass_mailing.contact'].search([ + ('partner_id', '=', self.partner.id)]) + cont = contacts.filtered(lambda r: wizard.mail_list_id in r.list_ids) + self.assertEqual(len(cont), 1) + self.check_mailing_contact_partner(cont) # This line does not create a new contact wizard.add_to_mail_list() partner = self.env['res.partner'].create({'name': 'No email partner'}) diff --git a/mass_mailing_partner/tests/test_res_partner.py b/mass_mailing_partner/tests/test_res_partner.py index be9303e6..732f8b1a 100644 --- a/mass_mailing_partner/tests/test_res_partner.py +++ b/mass_mailing_partner/tests/test_res_partner.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta @@ -11,29 +10,30 @@ from odoo.exceptions import ValidationError class ResPartnerCase(base.BaseCase): def test_count_mass_mailing_contacts(self): - self.create_mailing_contact({'email': 'partner@test.com', - 'list_id': self.mailing_list.id}) - self.create_mailing_contact({'email': 'partner@test.com', - 'list_id': self.mailing_list2.id}) + self.create_mailing_contact( + {'email': 'partner@test.com', + 'list_ids': [[6, 0, [self.mailing_list.id]]]}) + self.create_mailing_contact( + {'email': 'partner@test.com', + 'list_ids': [[6, 0, [self.mailing_list2.id]]]}) self.assertEqual(self.partner.mass_mailing_contacts_count, 2) def test_write_res_partner(self): - user = self.env['res.users'].create({ - 'login': 'test', - 'name': 'test', - 'email': 'test@example.org', - 'groups_id': [ - (4, self.env.ref('base.group_user').id), - (4, self.env.ref('base.group_partner_manager').id), - ] - }) contact = self.create_mailing_contact( - {'email': 'partner@test.com', 'list_id': self.mailing_list.id}) - self.partner.sudo(user).write({ - 'name': 'Changed', - 'email': 'partner@changed.com', + {'email': 'partner@test.com', + 'list_ids': [[6, 0, [self.mailing_list.id]]]}) + self.assertEqual(self.partner, contact.partner_id) + + title_doctor = self.env.ref('base.res_partner_title_doctor') + country_cu = self.env.ref('base.cu') + category_4 = self.env.ref('base.res_partner_category_4') + category_5 = self.env.ref('base.res_partner_category_5') + self.partner.write({ + 'name': 'Changed', 'email': 'partner@changed.com', + 'title': title_doctor.id, 'company_id': self.main_company.id, + 'country_id': country_cu.id, + 'category_id': [(6, 0, (category_4 | category_5).ids)], }) - self.assertEqual(contact.name, self.partner.name) - self.assertEqual(contact.email, self.partner.email) + self.check_mailing_contact_partner(contact) with self.assertRaises(ValidationError): self.partner.write({'email': False}) diff --git a/mass_mailing_partner/views/mail_mass_mailing_contact_view.xml b/mass_mailing_partner/views/mail_mass_mailing_contact_view.xml index 31e71cec..a9c4017d 100644 --- a/mass_mailing_partner/views/mail_mass_mailing_contact_view.xml +++ b/mass_mailing_partner/views/mail_mass_mailing_contact_view.xml @@ -6,37 +6,60 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). --> - - mail.mass_mailing.contact.tree.partner - mail.mass_mailing.contact - - - - - - - {'readonly': [('partner_id', '!=', False)]} - - - {'readonly': [('partner_id', '!=', False)]} + + mail.mass_mailing.contact.tree.inherit + mail.mass_mailing.contact + + + + + + + + + + mail.mass_mailing.contact.form.partner + mail.mass_mailing.contact + + + + + + + {'readonly': [('partner_id', '!=', False)]} + + + {'readonly': [('partner_id', '!=', False)]} + + + {'readonly': [('partner_id', '!=', False)]} + + + {'readonly': [('partner_id', '!=', False)]} + + + {'readonly': [('partner_id', '!=', False)]} + + + {'readonly': [('partner_id', '!=', False)]} + - - + - - Add partner search field and group by - mail.mass_mailing.contact - - - - + + Add partner search field and group by + mail.mass_mailing.contact + + + + + + + + - - - - - + diff --git a/mass_mailing_partner/views/mail_mass_mailing_view.xml b/mass_mailing_partner/views/mail_mass_mailing_view.xml index 118abfa2..7ae98336 100644 --- a/mass_mailing_partner/views/mail_mass_mailing_view.xml +++ b/mass_mailing_partner/views/mail_mass_mailing_view.xml @@ -10,7 +10,7 @@ mail.mass_mailing.list - + diff --git a/mass_mailing_partner/views/res_partner_view.xml b/mass_mailing_partner/views/res_partner_view.xml index 21bafd7b..18e8bf57 100644 --- a/mass_mailing_partner/views/res_partner_view.xml +++ b/mass_mailing_partner/views/res_partner_view.xml @@ -6,49 +6,49 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). --> - - Partner Form with mailing contacts - res.partner - - - -
- - -
-
-
+ + Partner Form with mailing contacts + res.partner + + + +
+ + +
+
+
- - Partner Search with mailing contacts - res.partner - - - 20 - - - + + Partner Search with mailing contacts + res.partner + + + 20 + + + + - - +
diff --git a/mass_mailing_partner/wizard/__init__.py b/mass_mailing_partner/wizard/__init__.py index 53cb7e44..a53b4177 100644 --- a/mass_mailing_partner/wizard/__init__.py +++ b/mass_mailing_partner/wizard/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta diff --git a/mass_mailing_partner/wizard/partner_mail_list_wizard.py b/mass_mailing_partner/wizard/partner_mail_list_wizard.py index 54426fea..a5343935 100644 --- a/mass_mailing_partner/wizard/partner_mail_list_wizard.py +++ b/mass_mailing_partner/wizard/partner_mail_list_wizard.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2015 Pedro M. Baeza # Copyright 2015 Antonio Espinosa # Copyright 2015 Javier Iniesta @@ -24,19 +23,18 @@ class PartnerMailListWizard(models.TransientModel): for partner in self.partner_ids: if not partner.email: raise UserError(_("Partner '%s' has no email.") % partner.name) - criteria = [ - '|', - ('email', '=', partner.email), - ('partner_id', '=', partner.id), - ('list_id', '=', self.mail_list_id.id), - ] - contact_test = contact_obj.search(criteria) - if contact_test: - continue - contact_vals = { - 'partner_id': partner.id, - 'email': partner.email, - 'name': partner.name, - 'list_id': self.mail_list_id.id - } - contact_obj.create(contact_vals) + contact = contact_obj.search([('partner_id', '=', partner.id)]) + if self.mail_list_id not in contact.mapped('list_ids'): + contact_vals = { + 'partner_id': partner.id, + 'list_ids': [[6, 0, [self.mail_list_id.id]]] + } + if partner.title: + contact_vals['title_id'] = partner.title.id + if partner.company_id: + contact_vals['company_name'] = partner.company_id.name + if partner.country_id: + contact_vals['country_id'] = partner.country_id.id + if partner.category_id: + contact_vals['tag_ids'] = partner.category_id.ids + contact_obj.create(contact_vals)