From f446e54cbd788875f2032f07445d3ce24608a503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 9 Mar 2022 08:36:12 +0000 Subject: [PATCH] [MOV] mass_mailing: reorganize controllers and templates PURPOSE Reorganize addon according to guidelines, helping finding and updating SPECIFICATIONS Reorganize templates in order to see a bit what's going on here. Notably split subscription (opt-out, blacklist) from management (view, reporting) templates. Reorganize controller code by main section in order to separate a bit various code purpose. This commit contains only file split / renaming and code move. Task-2864264 (Mass Mailing Module Reorganization) Part-of: odoo/odoo#92509 --- addons/mass_mailing/__manifest__.py | 6 +- addons/mass_mailing/controllers/main.py | 108 ++++++++++-------- .../js/{unsubscribe.js => mailing_portal.js} | 0 .../mailing_templates_portal_layouts.xml | 36 ++++++ .../mailing_templates_portal_management.xml | 32 ++++++ ... mailing_templates_portal_unsubscribe.xml} | 63 ---------- 6 files changed, 134 insertions(+), 111 deletions(-) rename addons/mass_mailing/static/src/js/{unsubscribe.js => mailing_portal.js} (100%) create mode 100644 addons/mass_mailing/views/mailing_templates_portal_layouts.xml create mode 100644 addons/mass_mailing/views/mailing_templates_portal_management.xml rename addons/mass_mailing/views/{mass_mailing_templates_portal.xml => mailing_templates_portal_unsubscribe.xml} (68%) diff --git a/addons/mass_mailing/__manifest__.py b/addons/mass_mailing/__manifest__.py index 9580bce45b9..85b9c2e55db 100644 --- a/addons/mass_mailing/__manifest__.py +++ b/addons/mass_mailing/__manifest__.py @@ -48,7 +48,9 @@ 'views/utm_campaign_views.xml', 'views/mailing_menus.xml', 'views/assets.xml', - 'views/mass_mailing_templates_portal.xml', + 'views/mailing_templates_portal_layouts.xml', + 'views/mailing_templates_portal_management.xml', + 'views/mailing_templates_portal_unsubscribe.xml', 'views/themes_templates.xml', 'views/snippets_themes.xml', 'views/snippets/s_alert.xml', @@ -94,7 +96,7 @@ 'mass_mailing/static/src/js/mass_mailing_design_constants.js', 'mass_mailing/static/src/js/mass_mailing_widget.js', 'mass_mailing/static/src/js/mailing_mailing_view_form_full_width.js', - 'mass_mailing/static/src/js/unsubscribe.js', + 'mass_mailing/static/src/js/mailing_portal.js', ], 'mass_mailing.assets_mail_themes': [ 'mass_mailing/static/src/scss/themes/**/*', diff --git a/addons/mass_mailing/controllers/main.py b/addons/mass_mailing/controllers/main.py index c3c92d8465b..517fa7fa227 100644 --- a/addons/mass_mailing/controllers/main.py +++ b/addons/mass_mailing/controllers/main.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import base64 +import base64 import werkzeug from odoo import _, exceptions, http, tools @@ -23,10 +23,9 @@ class MassMailController(http.Controller): model_display = mailing.mailing_model_id.display_name blacklist_entry._message_log(body=description + " ({})".format(model_display)) - @http.route(['/unsubscribe_from_list'], type='http', website=True, multilang=False, auth='public', sitemap=False) - def unsubscribe_placeholder_link(self, **post): - """Dummy route so placeholder is not prefixed by language, MUST have multilang=False""" - raise werkzeug.exceptions.NotFound() + # ------------------------------------------------------------ + # SUBSCRIPTION MANAGEMENT + # ------------------------------------------------------------ @http.route(['/mail/mailing//unsubscribe'], type='http', website=True, auth='public') def mailing(self, mailing_id, email=None, res_id=None, token="", **post): @@ -92,6 +91,28 @@ class MassMailController(http.Controller): return True return 'error' + @http.route('/mailing/feedback', type='json', auth='public') + def send_feedback(self, mailing_id, res_id, email, feedback, token): + mailing = request.env['mailing.mailing'].sudo().browse(mailing_id) + if mailing.exists() and email: + if not self._valid_unsubscribe_token(mailing_id, res_id, email, token): + return 'unauthorized' + model = request.env[mailing.mailing_model_real] + records = model.sudo().search([('email_normalized', '=', tools.email_normalize(email))]) + for record in records: + record.sudo().message_post(body=_("Feedback from %(email)s: %(feedback)s", email=email, feedback=feedback)) + return bool(records) + return 'error' + + @http.route(['/unsubscribe_from_list'], type='http', website=True, multilang=False, auth='public', sitemap=False) + def unsubscribe_placeholder_link(self, **post): + """Dummy route so placeholder is not prefixed by language, MUST have multilang=False""" + raise werkzeug.exceptions.NotFound() + + # ------------------------------------------------------------ + # TRACKING + # ------------------------------------------------------------ + @http.route('/mail/track///blank.gif', type='http', auth='public') def track_mail_open(self, mail_id, token, **post): """ Email tracking. """ @@ -105,6 +126,39 @@ class MassMailController(http.Controller): return response + @http.route('/r//m/', type='http', auth="public") + def full_url_redirect(self, code, mailing_trace_id, **post): + # don't assume geoip is set, it is part of the website module + # which mass_mailing doesn't depend on + country_code = request.geoip.get('country_code') + + request.env['link.tracker.click'].sudo().add_click( + code, + ip=request.httprequest.remote_addr, + country_code=country_code, + mailing_trace_id=mailing_trace_id + ) + return request.redirect(request.env['link.tracker'].get_url_from_code(code), code=301, local=False) + + # ------------------------------------------------------------ + # MAILING MANAGEMENT + # ------------------------------------------------------------ + + @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() + @http.route(['/mailing//view'], type='http', website=True, auth='public') def view(self, mailing_id, email=None, res_id=None, token=""): mailing = request.env['mailing.mailing'].sudo().browse(mailing_id) @@ -134,19 +188,9 @@ class MassMailController(http.Controller): return request.redirect('/web') - @http.route('/r//m/', type='http', auth="public") - def full_url_redirect(self, code, mailing_trace_id, **post): - # don't assume geoip is set, it is part of the website module - # which mass_mailing doesn't depend on - country_code = request.geoip.get('country_code') - - request.env['link.tracker.click'].sudo().add_click( - code, - ip=request.httprequest.remote_addr, - country_code=country_code, - mailing_trace_id=mailing_trace_id - ) - return request.redirect(request.env['link.tracker'].get_url_from_code(code), code=301, local=False) + # ------------------------------------------------------------ + # BLACKLIST + # ------------------------------------------------------------ @http.route('/mailing/blacklist/check', type='json', auth='public') def blacklist_check(self, mailing_id, res_id, email, token): @@ -182,31 +226,3 @@ class MassMailController(http.Controller): _("""Requested de-blacklisting via unsubscription page.""")) return True return 'error' - - @http.route('/mailing/feedback', type='json', auth='public') - def send_feedback(self, mailing_id, res_id, email, feedback, token): - mailing = request.env['mailing.mailing'].sudo().browse(mailing_id) - if mailing.exists() and email: - if not self._valid_unsubscribe_token(mailing_id, res_id, email, token): - return 'unauthorized' - model = request.env[mailing.mailing_model_real] - records = model.sudo().search([('email_normalized', '=', tools.email_normalize(email))]) - for record in records: - 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/static/src/js/unsubscribe.js b/addons/mass_mailing/static/src/js/mailing_portal.js similarity index 100% rename from addons/mass_mailing/static/src/js/unsubscribe.js rename to addons/mass_mailing/static/src/js/mailing_portal.js diff --git a/addons/mass_mailing/views/mailing_templates_portal_layouts.xml b/addons/mass_mailing/views/mailing_templates_portal_layouts.xml new file mode 100644 index 00000000000..ba652e5bfbc --- /dev/null +++ b/addons/mass_mailing/views/mailing_templates_portal_layouts.xml @@ -0,0 +1,36 @@ + + + + + diff --git a/addons/mass_mailing/views/mailing_templates_portal_management.xml b/addons/mass_mailing/views/mailing_templates_portal_management.xml new file mode 100644 index 00000000000..03dafe2cd6c --- /dev/null +++ b/addons/mass_mailing/views/mailing_templates_portal_management.xml @@ -0,0 +1,32 @@ + + + + + + + \ No newline at end of file diff --git a/addons/mass_mailing/views/mass_mailing_templates_portal.xml b/addons/mass_mailing/views/mailing_templates_portal_unsubscribe.xml similarity index 68% rename from addons/mass_mailing/views/mass_mailing_templates_portal.xml rename to addons/mass_mailing/views/mailing_templates_portal_unsubscribe.xml index c1f4f6be745..bc46f2914d6 100644 --- a/addons/mass_mailing/views/mass_mailing_templates_portal.xml +++ b/addons/mass_mailing/views/mailing_templates_portal_unsubscribe.xml @@ -1,29 +1,5 @@ - - - - - - -