diff --git a/addons/mass_mailing/__manifest__.py b/addons/mass_mailing/__manifest__.py index 21ecbd5ff5d..48b401d0b55 100644 --- a/addons/mass_mailing/__manifest__.py +++ b/addons/mass_mailing/__manifest__.py @@ -23,6 +23,7 @@ 'data': [ 'security/mass_mailing_security.xml', 'security/ir.model.access.csv', + 'data/digest_data.xml', 'data/mail_data.xml', 'data/mailing_data_templates.xml', 'data/mass_mailing_data.xml', diff --git a/addons/mass_mailing/controllers/main.py b/addons/mass_mailing/controllers/main.py index f835071aa44..47e5f8d59bc 100644 --- a/addons/mass_mailing/controllers/main.py +++ b/addons/mass_mailing/controllers/main.py @@ -195,3 +195,18 @@ class MassMailController(http.Controller): record.sudo().message_post(body=_("Feedback from %(email)s: %(feedback)s", email=email, feedback=feedback)) return bool(records) return 'error' + + @http.route('/mailing/report/unsubscribe', type='http', website=True, auth='public') + def turn_off_mailing_reports(self, token, user_id): + if not token or not user_id: + raise werkzeug.exceptions.NotFound() + user_id = int(user_id) + correct_token = consteq(token, request.env['mailing.mailing']._get_unsubscribe_token(user_id)) + user = request.env['res.users'].sudo().browse(user_id) + if correct_token and user.has_group('mass_mailing.group_mass_mailing_user'): + request.env['ir.config_parameter'].sudo().set_param('mass_mailing.mass_mailing_reports', False) + if user.has_group('base.group_system'): + menu_id = request.env.ref('mass_mailing.menu_mass_mailing_global_settings').id + return request.render('mass_mailing.mailing_report_deactivated', {'menu_id': menu_id}) + return request.render('mass_mailing.mailing_report_deactivated') + raise werkzeug.exceptions.NotFound() diff --git a/addons/mass_mailing/data/digest_data.xml b/addons/mass_mailing/data/digest_data.xml new file mode 100644 index 00000000000..b4291107141 --- /dev/null +++ b/addons/mass_mailing/data/digest_data.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/addons/mass_mailing/data/mailing_data_templates.xml b/addons/mass_mailing/data/mailing_data_templates.xml index 8022779537b..dbc544cd5f5 100644 --- a/addons/mass_mailing/data/mailing_data_templates.xml +++ b/addons/mass_mailing/data/mailing_data_templates.xml @@ -60,7 +60,7 @@ %Click (Total) - + diff --git a/addons/mass_mailing/data/mass_mailing_data.xml b/addons/mass_mailing/data/mass_mailing_data.xml index 90dedf14351..c10040c48e1 100644 --- a/addons/mass_mailing/data/mass_mailing_data.xml +++ b/addons/mass_mailing/data/mass_mailing_data.xml @@ -1,6 +1,8 @@ + + Mail Marketing: Process queue diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py index 12460592403..40414588a1f 100644 --- a/addons/mass_mailing/models/mailing.py +++ b/addons/mass_mailing/models/mailing.py @@ -965,14 +965,15 @@ class MassMailing(models.Model): 'kpi_mail_required': not mass_mailing.sent_date, }) - mailings = self.env['mailing.mailing'].search([ - ('kpi_mail_required', '=', True), - ('state', '=', 'done'), - ('sent_date', '<=', fields.Datetime.now() - relativedelta(days=1)), - ('sent_date', '>=', fields.Datetime.now() - relativedelta(days=5)), - ]) - if mailings: - mailings._action_send_statistics() + if self.env['ir.config_parameter'].sudo().get_param('mass_mailing.mass_mailing_reports'): + mailings = self.env['mailing.mailing'].search([ + ('kpi_mail_required', '=', True), + ('state', '=', 'done'), + ('sent_date', '<=', fields.Datetime.now() - relativedelta(days=1)), + ('sent_date', '>=', fields.Datetime.now() - relativedelta(days=5)), + ]) + if mailings: + mailings._action_send_statistics() # ------------------------------------------------------ # STATISTICS @@ -1003,16 +1004,20 @@ class MassMailing(models.Model): 'mailing_type': mailing_type, }, ) + rendering_data = { + 'body': tools.html_sanitize(link_trackers_body), + 'company': mail_company, + 'user': mail_user, + 'display_mobile_banner': True, + ** mailing._prepare_statistics_email_values(), + } + if mail_user.has_group('mass_mailing.group_mass_mailing_user'): + rendering_data['mailing_report_token'] = self._get_unsubscribe_token(mail_user.id) + rendering_data['user_id'] = mail_user.id rendered_body = self.env['ir.qweb']._render( 'digest.digest_mail_main', - { - 'body': tools.html_sanitize(link_trackers_body), - 'company': mail_company, - 'user': mail_user, - 'display_mobile_banner': True, - ** mailing._prepare_statistics_email_values() - }, + rendering_data ) full_mail = self.env['mail.render.mixin']._render_encapsulate( @@ -1108,6 +1113,11 @@ class MassMailing(models.Model): if self.mailing_type == 'mail': return _('Emails') + def _get_unsubscribe_token(self, user_id): + """Generate a secure hash for this user. It allows to opt out from + mailing reports while keeping some security in that process. """ + return tools.hmac(self.env(su=True), 'mailing-report-deactivated', user_id) + # ------------------------------------------------------ # TOOLS # ------------------------------------------------------ diff --git a/addons/mass_mailing/models/res_config_settings.py b/addons/mass_mailing/models/res_config_settings.py index aba6d87e2b5..00059b9f699 100644 --- a/addons/mass_mailing/models/res_config_settings.py +++ b/addons/mass_mailing/models/res_config_settings.py @@ -14,6 +14,8 @@ class ResConfigSettings(models.TransientModel): show_blacklist_buttons = fields.Boolean(string="Blacklist Option when Unsubscribing", config_parameter='mass_mailing.show_blacklist_buttons', help="""Allow the recipient to manage himself his state in the blacklist via the unsubscription page.""") + mass_mailing_reports = fields.Boolean(string='24H Stat Mailing Reports', config_parameter='mass_mailing.mass_mailing_reports', + help='Check how well your mailing is doing a day after it has been sent.') @api.onchange('mass_mailing_outgoing_mail_server') def _onchange_mass_mailing_outgoing_mail_server(self): diff --git a/addons/mass_mailing/views/mass_mailing_templates_portal.xml b/addons/mass_mailing/views/mass_mailing_templates_portal.xml index 54130b3818e..6e1dbadb8cb 100644 --- a/addons/mass_mailing/views/mass_mailing_templates_portal.xml +++ b/addons/mass_mailing/views/mass_mailing_templates_portal.xml @@ -1,5 +1,29 @@ + +