From fd5361c0f7116e951cf9e69e2d97a8ccb07ce1b6 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Wed, 10 Jun 2015 10:42:28 +0200 Subject: [PATCH] [IMP] mass_mailing: remove depends to website. Create a website_mass_mailing bridge to add subscribe snippet into website builder. Split website_links to have link_tracker to create short and trackable URLs, and website_links to have a website layout for link_tracker and add button to share page. --- addons/link_tracker/__init__.py | 3 + addons/link_tracker/__openerp__.py | 15 ++++ .../controller}/__init__.py | 2 +- addons/link_tracker/controller/main.py | 13 ++++ addons/link_tracker/models/__init__.py | 2 + .../models/link_tracker.py} | 39 +++++----- .../link_tracker/security/ir.model.access.csv | 10 +++ .../views/link_tracker.xml} | 66 ++++++++--------- addons/mass_mailing/__openerp__.py | 8 +-- addons/mass_mailing/controllers/main.py | 66 +---------------- addons/mass_mailing/controllers/web_editor.py | 3 +- .../mass_mailing/data/mass_mailing_demo.xml | 4 +- addons/mass_mailing/models/__init__.py | 2 +- .../{website_links.py => link_tracker.py} | 10 +-- addons/mass_mailing/models/mass_mailing.py | 8 +-- .../mass_mailing/models/mass_mailing_stats.py | 2 +- .../static/src/js/mass_mailing_editor.js | 15 ++-- addons/mass_mailing/views/mass_mailing.xml | 14 ++-- addons/mass_mailing/views/snippets_themes.xml | 27 ++++--- .../views/theme/airmail_snippets.xml | 39 +++++----- .../views/theme/cleave_snippets.xml | 39 +++++----- .../mass_mailing/views/theme/go_snippets.xml | 39 +++++----- .../views/theme/narrative_snippets.xml | 39 +++++----- .../views/theme/neopolitan_snippets.xml | 52 +++++++------- .../views/theme/skyline_snippets.xml | 39 +++++----- .../views/theme/sunday_snippets.xml | 39 +++++----- .../views/theme/zenflat_snippets.xml | 39 +++++----- addons/website_links/__init__.py | 3 +- addons/website_links/__openerp__.py | 7 +- addons/website_links/controller/main.py | 18 ++--- .../security/ir.model.access.csv | 12 +--- .../static/src/js/website_links_charts.js | 2 +- addons/website_mass_mailing/__init__.py | 3 + addons/website_mass_mailing/__openerp__.py | 16 +++++ .../controllers/__init__.py | 3 + .../website_mass_mailing/controllers/main.py | 72 +++++++++++++++++++ .../src/js/website_mass_mailing.editor.js | 0 .../static/src/js/website_mass_mailing.js | 0 .../views/snippets.xml | 0 .../views/unsubscribe.xml | 4 +- .../views/website_mass_mailing.xml | 4 +- 41 files changed, 437 insertions(+), 341 deletions(-) create mode 100644 addons/link_tracker/__init__.py create mode 100644 addons/link_tracker/__openerp__.py rename addons/{website_links/models => link_tracker/controller}/__init__.py (54%) create mode 100644 addons/link_tracker/controller/main.py create mode 100644 addons/link_tracker/models/__init__.py rename addons/{website_links/models/website_links.py => link_tracker/models/link_tracker.py} (86%) create mode 100644 addons/link_tracker/security/ir.model.access.csv rename addons/{website_links/views/website_links.xml => link_tracker/views/link_tracker.xml} (70%) rename addons/mass_mailing/models/{website_links.py => link_tracker.py} (71%) create mode 100644 addons/website_mass_mailing/__init__.py create mode 100644 addons/website_mass_mailing/__openerp__.py create mode 100644 addons/website_mass_mailing/controllers/__init__.py create mode 100644 addons/website_mass_mailing/controllers/main.py rename addons/{mass_mailing => website_mass_mailing}/static/src/js/website_mass_mailing.editor.js (100%) rename addons/{mass_mailing => website_mass_mailing}/static/src/js/website_mass_mailing.js (100%) rename addons/{mass_mailing => website_mass_mailing}/views/snippets.xml (100%) rename addons/{mass_mailing => website_mass_mailing}/views/unsubscribe.xml (95%) rename addons/{mass_mailing => website_mass_mailing}/views/website_mass_mailing.xml (60%) diff --git a/addons/link_tracker/__init__.py b/addons/link_tracker/__init__.py new file mode 100644 index 00000000000..12ce74572a7 --- /dev/null +++ b/addons/link_tracker/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +import models +import controller \ No newline at end of file diff --git a/addons/link_tracker/__openerp__.py b/addons/link_tracker/__openerp__.py new file mode 100644 index 00000000000..46b10b27942 --- /dev/null +++ b/addons/link_tracker/__openerp__.py @@ -0,0 +1,15 @@ +{ + 'name': 'Link Tracker', + 'category': 'Hidden', + 'description': """ +Create short and trackable URLs. +===================================================== + + """, + 'version': '1.0', + 'depends': ['marketing', 'utm'], + 'data': [ + 'views/link_tracker.xml', + 'security/ir.model.access.csv', + ], +} diff --git a/addons/website_links/models/__init__.py b/addons/link_tracker/controller/__init__.py similarity index 54% rename from addons/website_links/models/__init__.py rename to addons/link_tracker/controller/__init__.py index b49461a2eb5..a84d81a791b 100644 --- a/addons/website_links/models/__init__.py +++ b/addons/link_tracker/controller/__init__.py @@ -1,2 +1,2 @@ # -*- coding: utf-8 -*- -import website_links \ No newline at end of file +import main diff --git a/addons/link_tracker/controller/main.py b/addons/link_tracker/controller/main.py new file mode 100644 index 00000000000..1d7707fb65a --- /dev/null +++ b/addons/link_tracker/controller/main.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +import werkzeug + +from openerp.addons.web import http +from openerp.http import request + + +class link_tracker(http.Controller): + @http.route('/r/', type='http', auth='none', website=True) + def full_url_redirect(self, code, **post): + request.env['link.tracker.click'].add_click(code, request.httprequest.remote_addr, request.session['geoip'].get('country_code'), stat_id=False) + redirect_url = request.env['link.tracker'].get_url_from_code(code) + return werkzeug.utils.redirect(redirect_url or '', 301) diff --git a/addons/link_tracker/models/__init__.py b/addons/link_tracker/models/__init__.py new file mode 100644 index 00000000000..32330efefd5 --- /dev/null +++ b/addons/link_tracker/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +import link_tracker diff --git a/addons/website_links/models/website_links.py b/addons/link_tracker/models/link_tracker.py similarity index 86% rename from addons/website_links/models/website_links.py rename to addons/link_tracker/models/link_tracker.py index 99148d1ae71..591804304b9 100644 --- a/addons/website_links/models/website_links.py +++ b/addons/link_tracker/models/link_tracker.py @@ -21,12 +21,13 @@ def VALIDATE_URL(url): return url -class website_links(models.Model): - """website_links allow users to wrap any URL into a short and trackable URL - via a frontend and backend interface. website_links counts clicks on each tracked link. +class link_tracker(models.Model): + """link_tracker allow users to wrap any URL into a short and trackable URL. + link_tracker counts clicks on each tracked link. This module is also used by mass_mailing, where each link in mail_mail html_body are converted into a trackable link to get the click-through rate of each mass_mailing.""" - _name = "website.links" + + _name = "link.tracker" _rec_name = "short_url" _inherit = ['utm.mixin'] @@ -34,10 +35,10 @@ class website_links(models.Model): url = fields.Char(string='Target URL', required=True) count = fields.Integer(string='Number of Clicks', compute='_compute_count', store=True) short_url = fields.Char(string='Tracked URL', compute='_compute_short_url') - link_click_ids = fields.One2many('website.links.click', 'link_id', string='Clicks') + link_click_ids = fields.One2many('link.tracker.click', 'link_id', string='Clicks') title = fields.Char(string='Page Title', store=True) favicon = fields.Char(string='Favicon', compute='_compute_favicon', store=True) - link_code_ids = fields.One2many('website.links.code', 'link_id', string='Codes') + link_code_ids = fields.One2many('link.tracker.code', 'link_id', string='Codes') code = fields.Char(string='Short URL code', compute='_compute_code') redirected_url = fields.Char(string='Redirected URL', compute='_compute_redirected_url') short_url_host = fields.Char(string='Host of the short URL', compute='_compute_short_url_host') @@ -81,7 +82,7 @@ class website_links(models.Model): @api.one def _compute_code(self): - record = self.env['website.links.code'].search([('link_id', '=', self.id)], limit=1, order='id DESC') + record = self.env['link.tracker.code'].search([('link_id', '=', self.id)], limit=1, order='id DESC') self.code = record.code @api.one @@ -127,7 +128,7 @@ class website_links(models.Model): @api.multi def action_view_statistics(self): - action = self.env['ir.actions.act_window'].for_xml_id('website_links', 'action_view_click_statistics') + action = self.env['ir.actions.act_window'].for_xml_id('link_tracker', 'action_view_click_statistics') action['domain'] = [('link_id', '=', self.id)] return action @@ -177,16 +178,16 @@ class website_links(models.Model): if fname not in create_vals: create_vals[fname] = False - link = super(website_links, self).create(create_vals) + link = super(link_tracker, self).create(create_vals) - code = self.env['website.links.code'].get_random_code_string() - self.env['website.links.code'].create({'code': code, 'link_id': link.id}) + code = self.env['link.tracker.code'].get_random_code_string() + self.env['link.tracker.code'].create({'code': code, 'link_id': link.id}) return link @api.model def get_url_from_code(self, code, context=None): - code_rec = self.env['website.links.code'].sudo().search([('code', '=', code)]) + code_rec = self.env['link.tracker.code'].sudo().search([('code', '=', code)]) if not code_rec: return None @@ -198,11 +199,11 @@ class website_links(models.Model): ] -class website_links_code(models.Model): - _name = "website.links.code" +class link_tracker_code(models.Model): + _name = "link.tracker.code" code = fields.Char(string='Short URL Code', store=True) - link_id = fields.Many2one('website.links', 'Link', required=True, ondelete='cascade') + link_id = fields.Many2one('link.tracker', 'Link', required=True, ondelete='cascade') @api.model def get_random_code_string(self): @@ -220,19 +221,19 @@ class website_links_code(models.Model): ] -class website_links_click(models.Model): - _name = "website.links.click" +class link_tracker_click(models.Model): + _name = "link.tracker.click" _rec_name = "link_id" click_date = fields.Date(string='Create Date') - link_id = fields.Many2one('website.links', 'Link', required=True, ondelete='cascade') + link_id = fields.Many2one('link.tracker', 'Link', required=True, ondelete='cascade') ip = fields.Char(string='Internet Protocol') country_id = fields.Many2one('res.country', 'Country') @api.model def add_click(self, code, ip, country_code, stat_id=False): self = self.sudo() - code_rec = self.env['website.links.code'].search([('code', '=', code)]) + code_rec = self.env['link.tracker.code'].search([('code', '=', code)]) if not code_rec: return None diff --git a/addons/link_tracker/security/ir.model.access.csv b/addons/link_tracker/security/ir.model.access.csv new file mode 100644 index 00000000000..847be6ce162 --- /dev/null +++ b/addons/link_tracker/security/ir.model.access.csv @@ -0,0 +1,10 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_link_tracker_user,link.tracker,model_link_tracker,base.group_user,1,0,0,0 +access_link_tracker_manager,link.tracker,model_link_tracker,marketing.group_marketing_user,1,1,1,1 +access_link_tracker_public,link.tracker,model_link_tracker,base.group_public,1,0,0,0 +access_link_tracker_code_user,link.tracker.code,model_link_tracker_code,base.group_user,1,0,0,0 +access_link_tracker_code_manager,link.tracker.code,model_link_tracker_code,marketing.group_marketing_user,1,1,1,1 +access_link_tracker_code_public,link.tracker.code,model_link_tracker_code,base.group_public,1,0,0,0 +access_link_tracker_click_user,link.tracker.click,model_link_tracker_click,base.group_user,1,0,0,0 +access_link_tracker_click_manager,link.tracker.click,model_link_tracker_click,marketing.group_marketing_user,1,1,1,1 +access_link_tracker_click_public,link.tracker.click,model_link_tracker_click,base.group_public,1,0,0,0 diff --git a/addons/website_links/views/website_links.xml b/addons/link_tracker/views/link_tracker.xml similarity index 70% rename from addons/website_links/views/website_links.xml rename to addons/link_tracker/views/link_tracker.xml index 8616019de41..ec78e86a1b8 100644 --- a/addons/website_links/views/website_links.xml +++ b/addons/link_tracker/views/link_tracker.xml @@ -3,15 +3,15 @@ Statistics of Clicks - website.links.click + link.tracker.click graph [('link_id', 'IN', ids)] - + Links - website.links + link.tracker @@ -21,9 +21,9 @@ - - website.links.form - website.links + + link.tracker.form + link.tracker
@@ -53,9 +53,9 @@ - - website.links.my.form - website.links + + link.tracker.my.form + link.tracker @@ -71,17 +71,17 @@ - - website.links.form.graph.action - website.links + + link.tracker.form.graph.action + link.tracker form form - + - - website.links.tree - website.links + + link.tracker.tree + link.tracker @@ -93,9 +93,9 @@ - - website.links.graph - website.links + + link.tracker.graph + link.tracker @@ -105,17 +105,17 @@ - + Link Tracker - website.links + link.tracker form tree,form,graph - - website.links.click.form - website.links.click + + link.tracker.click.form + link.tracker.click
@@ -131,9 +131,9 @@ - - website.links.click.tree - website.links.click + + link.tracker.click.tree + link.tracker.click @@ -143,9 +143,9 @@ - - website.links.click.graph - website.links.click + + link.tracker.click.graph + link.tracker.click @@ -156,14 +156,14 @@ - + Tracked Links - website.links.click + link.tracker.click form graph,tree,form - + diff --git a/addons/mass_mailing/__openerp__.py b/addons/mass_mailing/__openerp__.py index 0d9a32c20db..f20cfe6e91c 100644 --- a/addons/mass_mailing/__openerp__.py +++ b/addons/mass_mailing/__openerp__.py @@ -16,9 +16,10 @@ professional emails and reuse templates in a few clicks. 'depends': [ 'mail', 'marketing', - 'web_kanban_gauge', - 'website_links', 'utm', + 'link_tracker', + 'web_editor', + 'web_kanban_gauge', ], 'data': [ 'data/mail_data.xml', @@ -29,11 +30,8 @@ professional emails and reuse templates in a few clicks. 'views/mass_mailing.xml', 'views/res_config.xml', 'views/email_template.xml', - 'views/website_mass_mailing.xml', 'security/ir.model.access.csv', 'views/mass_mailing.xml', - 'views/unsubscribe.xml', - 'views/snippets.xml', 'views/editor_field_html.xml', 'views/snippets_themes.xml', 'views/snippets_themes_options.xml', diff --git a/addons/mass_mailing/controllers/main.py b/addons/mass_mailing/controllers/main.py index 2a86ceaaef6..035d22ef09d 100644 --- a/addons/mass_mailing/controllers/main.py +++ b/addons/mass_mailing/controllers/main.py @@ -19,70 +19,8 @@ class MassMailController(http.Controller): return response - @http.route(['/mail/mailing//unsubscribe'], type='http', website=True, auth='none') - def mailing(self, mailing_id, email=None, res_id=None, **post): - mailing = request.env['mail.mass_mailing'].sudo().browse(mailing_id) - if mailing.exists(): - if mailing.mailing_model == 'mail.mass_mailing.contact': - contacts =request.env['mail.mass_mailing.contact'].sudo().search([('email', 'ilike', email)]) - return request.website.render('mass_mailing.page_unsubscribe', {'contacts': contacts, 'email': email, 'mailing_id':mailing_id}) - else: - mailing.update_opt_out(mailing_id, email, [res_id], True) - return request.website.render('mass_mailing.page_unsubscribed') - - @http.route(['/mail/mailing/unsubscribe'], type='json', auth='none') - def unsubscribe(self, mailing_id, opt_in_ids, opt_out_ids, email): - mailing = request.env['mail.mass_mailing'].sudo().browse(mailing_id) - if mailing.exists(): - mailing.update_opt_out(mailing_id, email, opt_in_ids, False) - mailing.update_opt_out(mailing_id, email, opt_out_ids, True) - - @http.route('/website_mass_mailing/is_subscriber', type='json', website=True, auth="public") - def is_subscriber(self, list_id, **post): - cr, uid, context = request.cr, request.uid, request.context - Contacts = request.registry['mail.mass_mailing.contact'] - Users = request.registry['res.users'] - - is_subscriber = False - email = None - if uid != request.website.user_id.id: - email = Users.browse(cr, SUPERUSER_ID, uid, context).email - elif request.session.get('mass_mailing_email'): - email = request.session['mass_mailing_email'] - - if email: - contact_ids = Contacts.search(cr, SUPERUSER_ID, [('list_id', '=', int(list_id)), ('email', '=', email), ('opt_out', '=', False)], context=context) - is_subscriber = len(contact_ids) > 0 - - return {'is_subscriber': is_subscriber, 'email': email} - - @http.route('/website_mass_mailing/subscribe', type='json', auth="public") - def subscribe(self, list_id, email, **post): - cr, uid, context = request.cr, request.uid, request.context - Contacts = request.registry['mail.mass_mailing.contact'] - - contact_ids = Contacts.search_read(cr, SUPERUSER_ID, [('list_id', '=', int(list_id)), ('email', '=', email)], ['opt_out'], context=context) - if not contact_ids: - Contacts.add_to_list(cr, SUPERUSER_ID, email, int(list_id), context=context) - else: - if contact_ids[0]['opt_out']: - Contacts.write(cr, SUPERUSER_ID, [contact_ids[0]['id']], {'opt_out': False}, context=context) - # add email to session - request.session['mass_mailing_email'] = email - return True - @http.route('/r//m/', type='http', auth="none") def full_url_redirect(self, code, stat_id, **post): cr, uid, context = request.cr, request.uid, request.context - request.registry['website.links.click'].add_click(cr, uid, code, request.httprequest.remote_addr, request.session['geoip'].get('country_code'), stat_id=stat_id, context=context) - return werkzeug.utils.redirect(request.registry['website.links'].get_url_from_code(cr, uid, code, context=context), 301) - - @http.route(['/website_mass_mailing/get_content'], type='json', auth="public") - def get_mass_mailing_content(self, newsletter_id, **post): - data = self.is_subscriber(newsletter_id, **post) - mass_mailing_list = request.registry['mail.mass_mailing.list'].browse(request.cr, SUPERUSER_ID, int(newsletter_id), request.context) - data.update({ - 'content': mass_mailing_list.popup_content, - 'redirect_url': mass_mailing_list.popup_redirect_url - }) - return data + request.registry['link.tracker.click'].add_click(cr, uid, code, request.httprequest.remote_addr, request.session['geoip'].get('country_code'), stat_id=stat_id, context=context) + return werkzeug.utils.redirect(request.registry['link.tracker'].get_url_from_code(cr, uid, code, context=context), 301) diff --git a/addons/mass_mailing/controllers/web_editor.py b/addons/mass_mailing/controllers/web_editor.py index f8e3007a5ac..a9cff910c69 100644 --- a/addons/mass_mailing/controllers/web_editor.py +++ b/addons/mass_mailing/controllers/web_editor.py @@ -21,4 +21,5 @@ class Web_Editor(Web_Editor): @http.route(['/mass_mailing/snippets'], type='json', auth="user", website=True) def mass_mailing_snippets(self): - return request.registry["ir.ui.view"].render(request.cr, request.uid, 'mass_mailing.email_designer_snippets', None, context=request.context) + values = {'company_id': request.env['res.users'].browse(request.uid).company_id} + return request.registry["ir.ui.view"].render(request.cr, request.uid, 'mass_mailing.email_designer_snippets', values, context=request.context) diff --git a/addons/mass_mailing/data/mass_mailing_demo.xml b/addons/mass_mailing/data/mass_mailing_demo.xml index f58d9dc0f21..72bce71b78d 100644 --- a/addons/mass_mailing/data/mass_mailing_demo.xml +++ b/addons/mass_mailing/data/mass_mailing_demo.xml @@ -40,7 +40,7 @@ -
Your Company

You get a 20% discount for signing up!

Discount Code: 45A9E77DGW8455

Dear John

Great stories have personality. Consider telling a great story that provides personality. Writing a story with personality for potential clients will assist with making a relationship connection. This shows up in small quirks like word choices or phrases. Write from your point of view, not from someone else's experience.

Great stories are for everyone even when only written for just one person. If you try to write with a wide general audience in mind, your story will ring false and be bland. No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.

Kind Regards,

Michael Fletcher

Step 1:

Place Order

Step 2:

Shipping

Step 3:

Payment

You get a 20% discount for signing up!

Discount Code: 45A9E77DGW8455

Dear ${object.name}

Great stories have personality. Consider telling a great story that provides personality. Writing a story with personality for potential clients will assist with making a relationship connection. This shows up in small quirks like word choices or phrases. Write from your point of view, not from someone else's experience.

Great stories are for everyone even when only written for just one person. If you try to write with a wide general audience in mind, your story will ring false and be bland. No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.

Kind Regards,

Michael Fletcher

Step 1:

Place Order

Step 2:

Shipping

Step 3:

Payment

]]>
@@ -68,7 +68,7 @@ email ]]> -
Your Company

You get a 20% discount for signing up!

Discount Code: 45A9E77DGW8455

Dear John

Great stories have personality. Consider telling a great story that provides personality. Writing a story with personality for potential clients will assist with making a relationship connection. This shows up in small quirks like word choices or phrases. Write from your point of view, not from someone else's experience.

Great stories are for everyone even when only written for just one person. If you try to write with a wide general audience in mind, your story will ring false and be bland. No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.

Kind Regards,

Michael Fletcher

Step 1:

Place Order

Step 2:

Shipping

Step 3:

Payment

You get a 20% discount for signing up!

Discount Code: 45A9E77DGW8455

Dear ${object.name}

Great stories have personality. Consider telling a great story that provides personality. Writing a story with personality for potential clients will assist with making a relationship connection. This shows up in small quirks like word choices or phrases. Write from your point of view, not from someone else's experience.

Great stories are for everyone even when only written for just one person. If you try to write with a wide general audience in mind, your story will ring false and be bland. No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.

Kind Regards,

Michael Fletcher

Step 1:

Place Order

Step 2:

Shipping

Step 3:

Payment

]]>
diff --git a/addons/mass_mailing/models/__init__.py b/addons/mass_mailing/models/__init__.py index 1e9affea3e7..8ae20b69f90 100644 --- a/addons/mass_mailing/models/__init__.py +++ b/addons/mass_mailing/models/__init__.py @@ -6,4 +6,4 @@ import mail_mail import mail_thread import res_config import mass_mailing_report -import website_links +import link_tracker diff --git a/addons/mass_mailing/models/website_links.py b/addons/mass_mailing/models/link_tracker.py similarity index 71% rename from addons/mass_mailing/models/website_links.py rename to addons/mass_mailing/models/link_tracker.py index f5e10a817d0..02de2ec4cd6 100644 --- a/addons/mass_mailing/models/website_links.py +++ b/addons/mass_mailing/models/link_tracker.py @@ -1,15 +1,15 @@ from openerp import fields from openerp import models -class website_links(models.Model): - _inherit = "website.links" +class link_tracker(models.Model): + _inherit = "link.tracker" mass_mailing_id = fields.Many2one('mail.mass_mailing', string='Mass Mailing') mass_mailing_campaign_id = fields.Many2one('mail.mass_mailing.campaign', string='Mass Mailing Campaign') -class website_links_click(models.Model): - _inherit = "website.links.click" +class link_tracker_click(models.Model): + _inherit = "link.tracker.click" mail_stat_id = fields.Many2one('mail.mail.statistics', string='Mail Statistics') mass_mailing_id = fields.Many2one('mail.mass_mailing', string='Mass Mailing') - mass_mailing_campaign_id = fields.Many2one('mail.mass_mailing.campaign', string='Mass Mailing Campaign') \ No newline at end of file + mass_mailing_campaign_id = fields.Many2one('mail.mass_mailing.campaign', string='Mass Mailing Campaign') diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py index 2fe192b5ea3..05dd09ddfd9 100644 --- a/addons/mass_mailing/models/mass_mailing.py +++ b/addons/mass_mailing/models/mass_mailing.py @@ -208,7 +208,7 @@ class MassMailingCampaign(osv.Model): cr.execute(""" SELECT COUNT(DISTINCT(stats.id)) AS nb_mails, COUNT(DISTINCT(clicks.mail_stat_id)) AS nb_clicks, stats.mass_mailing_campaign_id AS id FROM mail_mail_statistics AS stats - LEFT OUTER JOIN website_links_click AS clicks ON clicks.mail_stat_id = stats.id + LEFT OUTER JOIN link_tracker_click AS clicks ON clicks.mail_stat_id = stats.id WHERE stats.mass_mailing_campaign_id IN %s GROUP BY stats.mass_mailing_campaign_id """, (tuple(ids), )) @@ -436,7 +436,7 @@ class MassMailing(osv.Model): cr.execute(""" SELECT COUNT(DISTINCT(stats.id)) AS nb_mails, COUNT(DISTINCT(clicks.mail_stat_id)) AS nb_clicks, stats.mass_mailing_id AS id FROM mail_mail_statistics AS stats - LEFT OUTER JOIN website_links_click AS clicks ON clicks.mail_stat_id = stats.id + LEFT OUTER JOIN link_tracker_click AS clicks ON clicks.mail_stat_id = stats.id WHERE stats.mass_mailing_id IN %s GROUP BY stats.mass_mailing_id """, (tuple(ids), )) @@ -583,7 +583,7 @@ class MassMailing(osv.Model): def mass_mailing_statistics_action(self, cr, uid, ids, context=None): res = self.pool['ir.actions.act_window'].for_xml_id(cr, uid, 'mass_mailing', 'action_view_mass_mailing_statistics', context=context) - link_click_ids = self.pool['website.links.click'].search(cr, uid, [('mass_mailing_id', 'in', ids)], context=context) + link_click_ids = self.pool['link.tracker.click'].search(cr, uid, [('mass_mailing_id', 'in', ids)], context=context) res['domain'] = [('id', 'in', link_click_ids)] return res @@ -796,7 +796,7 @@ class MassMailing(osv.Model): if utm_mixin.medium_id: vals['medium_id'] = utm_mixin.medium_id.id - res[mass_mailing.id] = self.pool['website.links'].convert_links(cr, uid, html, vals, blacklist=['/unsubscribe_from_list'], context=context) + res[mass_mailing.id] = self.pool['link.tracker'].convert_links(cr, uid, html, vals, blacklist=['/unsubscribe_from_list'], context=context) return res diff --git a/addons/mass_mailing/models/mass_mailing_stats.py b/addons/mass_mailing/models/mass_mailing_stats.py index 7d50e9ab42b..58ab233c4ae 100644 --- a/addons/mass_mailing/models/mass_mailing_stats.py +++ b/addons/mass_mailing/models/mass_mailing_stats.py @@ -78,7 +78,7 @@ class MailMailStats(osv.Model): 'opened': fields.datetime('Opened', help='Date when the email has been opened the first time'), 'replied': fields.datetime('Replied', help='Date when this email has been replied for the first time.'), 'bounced': fields.datetime('Bounced', help='Date when this email has bounced.'), - 'links_click_ids': fields.one2many('website.links.click', 'mail_stat_id', 'Links click'), + 'links_click_ids': fields.one2many('link.tracker.click', 'mail_stat_id', 'Links click'), 'state': fields.function(_compute_state, string='State', type="selection", multi="state", selection=[('outgoing', 'Outgoing'), ('exception', 'Exception'), diff --git a/addons/mass_mailing/static/src/js/mass_mailing_editor.js b/addons/mass_mailing/static/src/js/mass_mailing_editor.js index 9449af6445f..4974674ba3a 100644 --- a/addons/mass_mailing/static/src/js/mass_mailing_editor.js +++ b/addons/mass_mailing/static/src/js/mass_mailing_editor.js @@ -1,4 +1,4 @@ -odoo.define('website_mail.website_mail', function (require) { +odoo.define('mass_mailing.editor', function (require) { "use strict"; var Model = require('web.Model'); @@ -36,7 +36,7 @@ options.registry["width-x"] = options.Class.extend({ if ($handle.hasClass(handler)) { compass = handler; } }); if(self.is_image){ compass = "image"; } - self.BuildingBlock.editor_busy = true; + self.buildingBlock.editor_busy = true; var $body = $(document.body); @@ -63,7 +63,7 @@ options.registry["width-x"] = options.Class.extend({ var body_mouseup = function(){ $body.unbind('mousemove', body_mousemove); $body.unbind('mouseup', body_mouseup); - self.BuildingBlock.editor_busy = false; + self.buildingBlock.editor_busy = false; self.$target.removeClass("resize_editor_busy"); }; $body.mousemove(body_mousemove); @@ -78,7 +78,7 @@ options.registry["width-x"] = options.Class.extend({ var width = offset + target_width - event.pageX; } target.css("width", width + "px"); - self.BuildingBlock.cover_target(self.$overlay, self.$target); + self.buildingBlock.cover_target(self.$overlay, self.$target); return; }, get_int_width: function ($el) { @@ -106,7 +106,7 @@ options.registry["width-x"] = options.Class.extend({ }); } this._super($clone); - this.BuildingBlock.cover_target(this.$overlay, this.$target); + this.buildingBlock.cover_target(this.$overlay, this.$target); }, on_remove: function () { var remove_index = $(this.$target).index(); @@ -118,7 +118,7 @@ options.registry["width-x"] = options.Class.extend({ }); } this._super(); - this.BuildingBlock.cover_target(this.$overlay, this.$target); + this.buildingBlock.cover_target(this.$overlay, this.$target); }, }); @@ -168,6 +168,9 @@ web_editor.Class.include({ $("#choose_template").children().toggleClass("hidden"); $("body").trigger("resize"); $(window.top).trigger('resize'); + setTimeout(function () { + $(".note-popover").toggleClass("hidden", $("#templates").is(":visible")); + },0); }, on_set_snippet_template: function (event) { var $editable = $("#editable_area"); diff --git a/addons/mass_mailing/views/mass_mailing.xml b/addons/mass_mailing/views/mass_mailing.xml index 2e1e1859d83..a6b8d1f5099 100644 --- a/addons/mass_mailing/views/mass_mailing.xml +++ b/addons/mass_mailing/views/mass_mailing.xml @@ -329,8 +329,8 @@
- website.links.tree - website.links + link.tracker.tree + link.tracker 10 @@ -342,9 +342,9 @@ - website.links.search - website.links - + link.tracker.search + link.tracker + @@ -355,7 +355,7 @@ Statistics of Clicks - website.links + link.tracker tree {'search_default_mass_mailing_id': active_id} @@ -709,7 +709,7 @@ Statistics of Clicks - website.links + link.tracker tree {'search_default_mass_mailing_campaign_id': active_id} diff --git a/addons/mass_mailing/views/snippets_themes.xml b/addons/mass_mailing/views/snippets_themes.xml index a102d2f7a6a..01ca28cbaf9 100644 --- a/addons/mass_mailing/views/snippets_themes.xml +++ b/addons/mass_mailing/views/snippets_themes.xml @@ -56,7 +56,7 @@   - + Your Logo   @@ -74,7 +74,7 @@   - + Your Company   @@ -91,13 +91,13 @@   - + Your Logo   - +
social icon @@ -128,13 +128,13 @@
  - + Your Company   - +
social icon @@ -343,7 +343,7 @@
-

Dear John

+

Dear ${object.name}

Great stories have personality. Consider telling a great story that provides personality. Writing a story with personality for potential clients will assist with making a relationship connection. This shows up in small quirks like word choices or phrases. Write from your point of view, not from someone else's experience.

Great stories are for everyone even when only written for just one person. If you try to write with a wide general audience in mind, your story will ring false and be bland. No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.

Kind Regards,

@@ -401,7 +401,7 @@ Footers
-