From e15372c071a022f8cbd8a4ba6c020439490066e8 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Tue, 29 Nov 2016 12:41:25 +0100 Subject: [PATCH] [IMP] mass_mailing: better management of contacts lists --- .../mass_mailing/data/mass_mailing_demo.xml | 6 +- addons/mass_mailing/models/mass_mailing.py | 37 ++++--- .../mass_mailing/views/mass_mailing_views.xml | 96 ++++++++++++++----- .../website_mass_mailing/controllers/main.py | 6 +- .../views/unsubscribe_templates.xml | 4 +- 5 files changed, 109 insertions(+), 40 deletions(-) diff --git a/addons/mass_mailing/data/mass_mailing_demo.xml b/addons/mass_mailing/data/mass_mailing_demo.xml index 7dff05d23ff..a80c71f809f 100644 --- a/addons/mass_mailing/data/mass_mailing_demo.xml +++ b/addons/mass_mailing/data/mass_mailing_demo.xml @@ -17,17 +17,17 @@ Aristide Antario aa@example.com - + Beverly Bridge bb@example.com - + Carol Cartridge cc@example.com - + diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py index ada11c4c9a3..b11588b8b06 100644 --- a/addons/mass_mailing/models/mass_mailing.py +++ b/addons/mass_mailing/models/mass_mailing.py @@ -37,11 +37,22 @@ class MassMailingList(models.Model): create_date = fields.Datetime(string='Creation Date') contact_nbr = fields.Integer(compute="_compute_contact_nbr", string='Number of Contacts') + # Compute number of contacts non opt-out for a mailing list def _compute_contact_nbr(self): - contacts_data = self.env['mail.mass_mailing.contact'].read_group([('list_id', 'in', self.ids), ('opt_out', '!=', True)], ['list_id'], ['list_id']) - mapped_data = dict([(c['list_id'][0], c['list_id_count']) for c in contacts_data]) + self.env.cr.execute(''' + select + list_id, count(*) + from + mail_mass_mailing_contact_list_rel r + left join mail_mass_mailing_contact c on (r.contact_id=c.id) + where + c.opt_out <> true + group by + list_id + ''') + data = dict(self.env.cr.fetchall()) for mailing_list in self: - mailing_list.contact_nbr = mapped_data.get(mailing_list.id, 0) + mailing_list.contact_nbr = data.get(mailing_list.id, 0) class MassMailingContact(models.Model): """Model of a contact. This model is different from the partner model @@ -55,14 +66,18 @@ class MassMailingContact(models.Model): _rec_name = 'email' name = fields.Char() + company_name = fields.Char(string='Company Name') + title_id = fields.Many2one('res.partner.title', string='Title') email = fields.Char(required=True) - create_date = fields.Datetime(string='Create Date') - list_id = fields.Many2one( - 'mail.mass_mailing.list', string='Mailing List', - ondelete='cascade', required=True, default=lambda self: self.env['mail.mass_mailing.list'].search([], limit=1, order='id desc')) + create_date = fields.Datetime(string='Creation Date') + list_ids = fields.Many2many( + 'mail.mass_mailing.list', 'mail_mass_mailing_contact_list_rel', + 'contact_id', 'list_id', string='Mailing Lists') opt_out = fields.Boolean(string='Opt Out', help='The contact has chosen not to receive mails anymore from this list') unsubscription_date = fields.Datetime(string='Unsubscription Date') - message_bounce = fields.Integer(string='Bounce', help='Counter of the number of bounced emails for this contact.') + message_bounce = fields.Integer(string='Bounced', help='Counter of the number of bounced emails for this contact.') + country_id = fields.Many2one('res.country', string='Country') + tag_ids = fields.Many2many('res.partner.category', string='Tags') @api.model def create(self, vals): @@ -93,7 +108,7 @@ class MassMailingContact(models.Model): @api.model def add_to_list(self, name, list_id): name, email = self.get_name_email(name) - contact = self.create({'name': name, 'email': email, 'list_id': list_id}) + contact = self.create({'name': name, 'email': email, 'list_ids': [(4, list_id)]}) return contact.name_get()[0] @api.multi @@ -432,9 +447,9 @@ class MassMailing(models.Model): def _onchange_model_and_list(self): if self.mailing_model == 'mail.mass_mailing.contact': if self.contact_list_ids: - self.mailing_domain = "[('list_id', 'in', %s), ('opt_out', '=', False)]" % self.contact_list_ids.ids + self.mailing_domain = "[('list_ids', 'in', [%s]), ('opt_out', '=', False)]" % (','.join(map(str,self.contact_list_ids.ids)),) else: - self.mailing_domain = "[('list_id', '=', False)]" + self.mailing_domain = "[(0, '=', 1)]" elif 'opt_out' in self.env[self.mailing_model]._fields: self.mailing_domain = "[('opt_out', '=', False)]" else: diff --git a/addons/mass_mailing/views/mass_mailing_views.xml b/addons/mass_mailing/views/mass_mailing_views.xml index e1f62390562..2bc6010528f 100644 --- a/addons/mass_mailing/views/mass_mailing_views.xml +++ b/addons/mass_mailing/views/mass_mailing_views.xml @@ -5,6 +5,8 @@ + @@ -16,33 +18,32 @@ List Subscription mail.mass_mailing.contact - {'group_by': ['create_date:month'], 'col_group_by': ['list_id']} + {'group_by': ['create_date:month']} List Unsubscription mail.mass_mailing.contact [('opt_out','=',True)] - {'group_by': ['unsubscription_date:month'], 'col_group_by': ['list_id']} + {'group_by': ['unsubscription_date:month']} mail.mass_mailing.contact.search mail.mass_mailing.contact - - - - + + + + - + - @@ -53,35 +54,85 @@ mail.mass_mailing.contact 10 - - - - - + - + + + + + + mail.mass_mailing.contact.form + mail.mass_mailing.contact + 10 + +
+ +
+
+ + + + + + + + + + + + + +
+
+
+
+ + + mail.mass_mailing.contact.pivot + mail.mass_mailing.contact + 10 + + + + + + + mail.mass_mailing.contact.graph mail.mass_mailing.contact 10 - + - - Mailing List Subscribers + Contacts mail.mass_mailing.contact form - tree,graph + tree,form,graph,pivot {'search_default_not_opt_out': 1} @@ -90,7 +141,8 @@ mail.mass_mailing.contact form tree,form,graph - {'search_default_list_id': active_id, 'search_default_not_opt_out': 1} + [('list_ids', 'in', [active_id])] + {'search_default_not_opt_out': 1}

Click to create a recipient. @@ -99,7 +151,7 @@ @@ -175,7 +227,7 @@ diff --git a/addons/website_mass_mailing/controllers/main.py b/addons/website_mass_mailing/controllers/main.py index ff3a515b4fb..d5b23030717 100644 --- a/addons/website_mass_mailing/controllers/main.py +++ b/addons/website_mass_mailing/controllers/main.py @@ -38,7 +38,7 @@ class MassMailController(MassMailController): is_subscriber = False if email: - contacts_count = request.env['mail.mass_mailing.contact'].sudo().search_count([('list_id', '=', int(list_id)), ('email', '=', email), ('opt_out', '=', False)]) + contacts_count = request.env['mail.mass_mailing.contact'].sudo().search_count([('list_ids', 'in', [int(list_id)]), ('email', '=', email), ('opt_out', '=', False)]) is_subscriber = contacts_count > 0 return {'is_subscriber': is_subscriber, 'email': email} @@ -49,12 +49,12 @@ class MassMailController(MassMailController): name, email = Contacts.get_name_email(email) contact_ids = Contacts.search([ - ('list_id', '=', int(list_id)), + ('list_ids', 'in', [int(list_id)]), ('email', '=', email), ], limit=1) if not contact_ids: # inline add_to_list as we've already called half of it - Contacts.create({'name': name, 'email': email, 'list_id': int(list_id)}) + Contacts.create({'name': name, 'email': email, 'list_ids': [(6,0,[int(list_id)])]}) elif contact_ids.opt_out: contact_ids.opt_out = False # add email to session diff --git a/addons/website_mass_mailing/views/unsubscribe_templates.xml b/addons/website_mass_mailing/views/unsubscribe_templates.xml index 8f044491102..dc9668d4869 100644 --- a/addons/website_mass_mailing/views/unsubscribe_templates.xml +++ b/addons/website_mass_mailing/views/unsubscribe_templates.xml @@ -22,7 +22,9 @@

  • - + + +