diff --git a/addons/mass_mailing/__manifest__.py b/addons/mass_mailing/__manifest__.py index 8c50e471297..85b9c2e55db 100644 --- a/addons/mass_mailing/__manifest__.py +++ b/addons/mass_mailing/__manifest__.py @@ -20,31 +20,37 @@ 'digest', ], 'data': [ - 'security/mass_mailing_security.xml', + 'security/res_groups_data.xml', 'security/ir.model.access.csv', 'data/digest_data.xml', - 'data/mail_data.xml', - 'data/mailing_data_templates.xml', - 'data/mass_mailing_data.xml', 'data/ir_attachment_data.xml', + 'data/ir_config_parameter_data.xml', + 'data/ir_cron_data.xml', + 'data/ir_module_data.xml', + 'data/mailing_data_templates.xml', + 'data/mailing_list_data.xml', + 'data/res_users_data.xml', 'wizard/mail_compose_message_views.xml', 'wizard/mailing_contact_import_views.xml', 'wizard/mailing_contact_to_list_views.xml', 'wizard/mailing_list_merge_views.xml', 'wizard/mailing_mailing_test_views.xml', 'wizard/mailing_mailing_schedule_date_views.xml', + 'report/mailing_trace_report_views.xml', 'views/mailing_filter_views.xml', - 'views/mailing_mailing_views_menus.xml', 'views/mailing_trace_views.xml', 'views/link_tracker_views.xml', 'views/mailing_contact_views.xml', + 'views/mailing_contact_subscription_views.xml', 'views/mailing_list_views.xml', 'views/mailing_mailing_views.xml', 'views/res_config_settings_views.xml', 'views/utm_campaign_views.xml', - 'report/mailing_trace_report_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', @@ -90,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/data/ir_attachment_data.xml b/addons/mass_mailing/data/ir_attachment_data.xml index 65cc4ab2de4..a50944cde51 100644 --- a/addons/mass_mailing/data/ir_attachment_data.xml +++ b/addons/mass_mailing/data/ir_attachment_data.xml @@ -1,7 +1,13 @@ - + + + + s_cover_default_image.jpg + url + /mass_mailing/static/src/img/theme_default/s_default_image_block_banner.jpg + s_media_list_default_image_1.jpg @@ -128,6 +134,18 @@ url /mass_mailing/static/src/img/snippets_demo/s_blockquote_cover.jpg + + + s_image_text_default_image.jpg + url + /mass_mailing/static/src/img/theme_default/s_default_image_block_image_text.jpg + + + + s_mail_block_event_default_image.jpg + url + /mass_mailing/static/src/img/theme_default/s_default_image_block_event.jpg + s_masonry_block_default_image_1.jpg @@ -140,5 +158,35 @@ url /mass_mailing/static/src/img/snippets_demo/s_cover.jpg + + + s_picture_default_image.jpg + url + /mass_mailing/static/src/img/theme_default/s_default_image_block_image.jpg + + + + s_text_image_default_image.jpg + url + /mass_mailing/static/src/img/theme_default/s_default_image_block_text_image.jpg + + + + s_three_columns_default_image_1.jpg + url + /mass_mailing/static/src/img/theme_default/s_default_image_block_three_cols_1.jpg + + + + s_three_columns_default_image_2.jpg + url + /mass_mailing/static/src/img/theme_default/s_default_image_block_three_cols_2.jpg + + + + s_three_columns_default_image_3.jpg + url + /mass_mailing/static/src/img/theme_default/s_default_image_block_three_cols_3.jpg + diff --git a/addons/mass_mailing/data/ir_config_parameter_data.xml b/addons/mass_mailing/data/ir_config_parameter_data.xml new file mode 100644 index 00000000000..531c0854ad9 --- /dev/null +++ b/addons/mass_mailing/data/ir_config_parameter_data.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/addons/mass_mailing/data/ir_cron_data.xml b/addons/mass_mailing/data/ir_cron_data.xml new file mode 100644 index 00000000000..c83a2387daf --- /dev/null +++ b/addons/mass_mailing/data/ir_cron_data.xml @@ -0,0 +1,29 @@ + + + + + + Mail Marketing: Process queue + + code + model._process_mass_mailing_queue() + + 1 + days + -1 + + + + + Mail Marketing: A/B Testing + + code + model._cron_process_mass_mailing_ab_testing() + + 1 + days + -1 + + + + diff --git a/addons/mass_mailing/data/ir_module_data.xml b/addons/mass_mailing/data/ir_module_data.xml new file mode 100644 index 00000000000..ab373707f62 --- /dev/null +++ b/addons/mass_mailing/data/ir_module_data.xml @@ -0,0 +1,10 @@ + + + + + 19 + Helps you manage your mass mailing to design + professional emails and reuse templates. + + + diff --git a/addons/mass_mailing/data/mail_data.xml b/addons/mass_mailing/data/mail_data.xml deleted file mode 100644 index fada8fb3bc8..00000000000 --- a/addons/mass_mailing/data/mail_data.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/addons/mass_mailing/data/mailing_data_templates.xml b/addons/mass_mailing/data/mailing_data_templates.xml index a011ed4155a..d35942f293c 100644 --- a/addons/mass_mailing/data/mailing_data_templates.xml +++ b/addons/mass_mailing/data/mailing_data_templates.xml @@ -1,5 +1,92 @@ + + + + + + + - - - - + diff --git a/addons/mass_mailing/views/link_tracker_views.xml b/addons/mass_mailing/views/link_tracker_views.xml index 615b4c27f24..ef227f04f75 100644 --- a/addons/mass_mailing/views/link_tracker_views.xml +++ b/addons/mass_mailing/views/link_tracker_views.xml @@ -78,12 +78,4 @@ - - - - diff --git a/addons/mass_mailing/views/mailing_contact_subscription_views.xml b/addons/mass_mailing/views/mailing_contact_subscription_views.xml new file mode 100644 index 00000000000..d59e92300f4 --- /dev/null +++ b/addons/mass_mailing/views/mailing_contact_subscription_views.xml @@ -0,0 +1,53 @@ + + + + mailing.contact.subscription.view.form + mailing.contact.subscription + 10 + +
+ + + + + + +
+
+
+ + + mailing.contact.subscription.view.tree + mailing.contact.subscription + + + + + + + + + + + + + mailing.contact.subscription.view.search + mailing.contact.subscription + + + + + + + + +
diff --git a/addons/mass_mailing/views/mailing_contact_views.xml b/addons/mass_mailing/views/mailing_contact_views.xml index 30a491b311d..a8ce9c32af7 100644 --- a/addons/mass_mailing/views/mailing_contact_views.xml +++ b/addons/mass_mailing/views/mailing_contact_views.xml @@ -1,58 +1,6 @@ - - - mailing.contact.subscription.view.form - mailing.contact.subscription - 10 - -
- - - - - - -
-
-
- - - mailing.contact.subscription.view.tree - mailing.contact.subscription - - - - - - - - - - - - - mailing.contact.subscription.view.search - mailing.contact.subscription - - - - - - - - - - + mailing.contact.view.search mailing.contact @@ -241,8 +189,4 @@

- -
diff --git a/addons/mass_mailing/views/mailing_list_views.xml b/addons/mass_mailing/views/mailing_list_views.xml index db3b5c34528..22de8850c81 100644 --- a/addons/mass_mailing/views/mailing_list_views.xml +++ b/addons/mass_mailing/views/mailing_list_views.xml @@ -293,8 +293,4 @@

- - diff --git a/addons/mass_mailing/views/mailing_mailing_views.xml b/addons/mass_mailing/views/mailing_mailing_views.xml index 7e8745fb0e2..8a755956fc3 100644 --- a/addons/mass_mailing/views/mailing_mailing_views.xml +++ b/addons/mass_mailing/views/mailing_mailing_views.xml @@ -718,10 +718,4 @@ mailing.mailing form - - - diff --git a/addons/mass_mailing/views/mailing_mailing_views_menus.xml b/addons/mass_mailing/views/mailing_mailing_views_menus.xml deleted file mode 100644 index db7aa2b7dc8..00000000000 --- a/addons/mass_mailing/views/mailing_mailing_views_menus.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/addons/mass_mailing/views/mailing_menus.xml b/addons/mass_mailing/views/mailing_menus.xml new file mode 100644 index 00000000000..20f92317129 --- /dev/null +++ b/addons/mass_mailing/views/mailing_menus.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ - - - - - - - diff --git a/addons/mass_mailing/views/mailing_trace_views.xml b/addons/mass_mailing/views/mailing_trace_views.xml index ec50f179d98..29de31fffc2 100644 --- a/addons/mass_mailing/views/mailing_trace_views.xml +++ b/addons/mass_mailing/views/mailing_trace_views.xml @@ -140,10 +140,4 @@

- - - diff --git a/addons/mass_mailing/views/res_config_settings_views.xml b/addons/mass_mailing/views/res_config_settings_views.xml index d3b8715b288..0ef06f24ac0 100644 --- a/addons/mass_mailing/views/res_config_settings_views.xml +++ b/addons/mass_mailing/views/res_config_settings_views.xml @@ -78,7 +78,4 @@ inline {'module' : 'mass_mailing', 'bin_size': False} - - diff --git a/addons/mass_mailing/views/utm_campaign_views.xml b/addons/mass_mailing/views/utm_campaign_views.xml index 8b01bc0f94f..b93eb906b05 100644 --- a/addons/mass_mailing/views/utm_campaign_views.xml +++ b/addons/mass_mailing/views/utm_campaign_views.xml @@ -111,20 +111,4 @@ [('is_auto_campaign', '=', False)] - - - - - - diff --git a/addons/mass_mailing_sms/__manifest__.py b/addons/mass_mailing_sms/__manifest__.py index 8346e4c4d77..80fbd96f4cf 100644 --- a/addons/mass_mailing_sms/__manifest__.py +++ b/addons/mass_mailing_sms/__manifest__.py @@ -15,15 +15,14 @@ 'data': [ 'data/utm_data.xml', 'security/ir.model.access.csv', - 'views/mailing_sms_menus.xml', + 'report/mailing_trace_report_views.xml', 'views/mailing_list_views.xml', 'views/mailing_contact_views.xml', 'views/mailing_trace_views.xml', 'views/mailing_mailing_views.xml', - 'views/link_tracker_views.xml', 'views/mass_mailing_sms_templates_portal.xml', 'views/utm_campaign_views.xml', - 'report/mailing_trace_report_views.xml', + 'views/mailing_sms_menus.xml', 'wizard/sms_composer_views.xml', 'wizard/mailing_sms_test_views.xml', ], diff --git a/addons/mass_mailing_sms/models/mailing_mailing.py b/addons/mass_mailing_sms/models/mailing_mailing.py index 716437347cb..cd4a5a02d94 100644 --- a/addons/mass_mailing_sms/models/mailing_mailing.py +++ b/addons/mass_mailing_sms/models/mailing_mailing.py @@ -30,11 +30,15 @@ class Mailing(models.Model): # otherwise 'sms_subject' will get the old helper from 'mass_mailing' module. # overriding 'subject' field helper in this model is not working, since the helper will keep the new value # even when 'mass_mailing_sms' removed (see 'mailing_mailing_view_form_sms' for more details). - sms_subject = fields.Char('Title', help='For an email, the subject your recipients will see in their inbox.\n' - 'For an SMS, the internal title of the message.', - related='subject', translate=False, readonly=False) + sms_subject = fields.Char( + 'Title', related='subject', + readonly=False, translate=False, + help='For an email, the subject your recipients will see in their inbox.\n' + 'For an SMS, the internal title of the message.') # sms options - body_plaintext = fields.Text('SMS Body', compute='_compute_body_plaintext', store=True, readonly=False) + body_plaintext = fields.Text( + 'SMS Body', compute='_compute_body_plaintext', + store=True, readonly=False) sms_template_id = fields.Many2one('sms.template', string='SMS Template', ondelete='set null') sms_has_insufficient_credit = fields.Boolean( 'Insufficient IAP credits', compute='_compute_sms_has_iap_failure', @@ -47,7 +51,9 @@ class Mailing(models.Model): # opt_out_link sms_allow_unsubscribe = fields.Boolean('Include opt-out link', default=False) # A/B Testing - ab_testing_sms_winner_selection = fields.Selection(related="campaign_id.ab_testing_sms_winner_selection", default="clicks_ratio", readonly=False, copy=True) + ab_testing_sms_winner_selection = fields.Selection( + related="campaign_id.ab_testing_sms_winner_selection", + default="clicks_ratio", readonly=False, copy=True) @api.depends('mailing_type') def _compute_medium_id(self): @@ -78,7 +84,7 @@ class Mailing(models.Model): trace_dict = dict.fromkeys(self.ids, {key: False for key in failures}) for t in traces: - trace_dict[t['mass_mailing_id'][0]][t['failure_type']] = t['__count'] and True or False + trace_dict[t['mass_mailing_id'][0]][t['failure_type']] = bool(t['__count']) for mail in self: mail.sms_has_insufficient_credit = trace_dict[mail.id]['sms_credit'] diff --git a/addons/mass_mailing_sms/report/mailing_trace_report_views.xml b/addons/mass_mailing_sms/report/mailing_trace_report_views.xml index 4a84bd7df6e..430aedd4246 100644 --- a/addons/mass_mailing_sms/report/mailing_trace_report_views.xml +++ b/addons/mass_mailing_sms/report/mailing_trace_report_views.xml @@ -83,9 +83,4 @@ - - - - - diff --git a/addons/mass_mailing_sms/views/link_tracker_views.xml b/addons/mass_mailing_sms/views/link_tracker_views.xml deleted file mode 100644 index 30ab3459e02..00000000000 --- a/addons/mass_mailing_sms/views/link_tracker_views.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/addons/mass_mailing_sms/views/mailing_contact_views.xml b/addons/mass_mailing_sms/views/mailing_contact_views.xml index 0d6c1acf46b..012722dae27 100644 --- a/addons/mass_mailing_sms/views/mailing_contact_views.xml +++ b/addons/mass_mailing_sms/views/mailing_contact_views.xml @@ -91,10 +91,4 @@

- - - - - - diff --git a/addons/mass_mailing_sms/views/mailing_list_views.xml b/addons/mass_mailing_sms/views/mailing_list_views.xml index 16ccdf0ccad..a469d9a899f 100644 --- a/addons/mass_mailing_sms/views/mailing_list_views.xml +++ b/addons/mass_mailing_sms/views/mailing_list_views.xml @@ -42,9 +42,4 @@

- - - - - diff --git a/addons/mass_mailing_sms/views/mailing_mailing_views.xml b/addons/mass_mailing_sms/views/mailing_mailing_views.xml index 14decacb220..6d336dcd25e 100644 --- a/addons/mass_mailing_sms/views/mailing_mailing_views.xml +++ b/addons/mass_mailing_sms/views/mailing_mailing_views.xml @@ -281,9 +281,4 @@ - - - - - diff --git a/addons/mass_mailing_sms/views/mailing_sms_menus.xml b/addons/mass_mailing_sms/views/mailing_sms_menus.xml index b60d678c5b5..c60a4ebf881 100644 --- a/addons/mass_mailing_sms/views/mailing_sms_menus.xml +++ b/addons/mass_mailing_sms/views/mailing_sms_menus.xml @@ -10,6 +10,7 @@ @@ -23,19 +24,30 @@ - + + + + @@ -55,7 +67,7 @@ groups="mass_mailing.group_mass_mailing_user"/> - -