If the mass mailing was to mail contacts, this could cause an error if the recipient unsubscribed. If the mass mailing was to mailing list, unsubscribe would not work. This change update unsubscribe to take into account changes in765e752ande15372c07that allowed mailing list / mailing list contacts to be used separately. opw-770473 closes #20145
52 lines
2.3 KiB
Python
52 lines
2.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import werkzeug
|
|
|
|
from odoo import _, exceptions, http
|
|
from odoo.http import request
|
|
from odoo.tools import consteq
|
|
|
|
|
|
class MassMailController(http.Controller):
|
|
|
|
@http.route(['/mail/mailing/<int:mailing_id>/unsubscribe'], type='http', website=True, auth='public')
|
|
def mailing(self, mailing_id, email=None, res_id=None, token="", **post):
|
|
mailing = request.env['mail.mass_mailing'].sudo().browse(mailing_id)
|
|
if mailing.exists():
|
|
res_id = res_id and int(res_id)
|
|
res_ids = []
|
|
if mailing.mailing_model == 'mail.mass_mailing.list':
|
|
contacts = request.env['mail.mass_mailing.contact'].sudo().search([
|
|
('email', '=', email),
|
|
('list_ids', 'in', [mailing_list.id for mailing_list in mailing.contact_list_ids])
|
|
])
|
|
res_ids = contacts.ids
|
|
else:
|
|
res_ids = [res_id]
|
|
|
|
right_token = mailing._unsubscribe_token(res_id, email)
|
|
if not consteq(str(token), right_token):
|
|
raise exceptions.AccessDenied()
|
|
mailing.update_opt_out(email, res_ids, True)
|
|
return _('You have been unsubscribed successfully')
|
|
|
|
@http.route('/mail/track/<int:mail_id>/blank.gif', type='http', auth='none')
|
|
def track_mail_open(self, mail_id, **post):
|
|
""" Email tracking. """
|
|
request.env['mail.mail.statistics'].sudo().set_opened(mail_mail_ids=[mail_id])
|
|
response = werkzeug.wrappers.Response()
|
|
response.mimetype = 'image/gif'
|
|
response.data = 'R0lGODlhAQABAIAAANvf7wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='.decode('base64')
|
|
|
|
return response
|
|
|
|
@http.route('/r/<string:code>/m/<int:stat_id>', type='http', auth="none")
|
|
def full_url_redirect(self, code, stat_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.session.get('geoip', False) and request.session.geoip.get('country_code', False)
|
|
|
|
request.env['link.tracker.click'].add_click(code, request.httprequest.remote_addr, country_code, stat_id=stat_id)
|
|
return werkzeug.utils.redirect(request.env['link.tracker'].get_url_from_code(code), 301)
|