diff options
Diffstat (limited to 'addons/mass_mailing_sms/controllers/main.py')
| -rw-r--r-- | addons/mass_mailing_sms/controllers/main.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/addons/mass_mailing_sms/controllers/main.py b/addons/mass_mailing_sms/controllers/main.py new file mode 100644 index 00000000..7111e862 --- /dev/null +++ b/addons/mass_mailing_sms/controllers/main.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import werkzeug + +from odoo import http, _ +from odoo.addons.phone_validation.tools import phone_validation +from odoo.http import request + + +class MailingSMSController(http.Controller): + + def _check_trace(self, mailing_id, trace_code): + try: + mailing = request.env['mailing.mailing'].sudo().search([('id', '=', mailing_id)]) + except: + mailing = False + if not mailing: + return {'error': 'mailing_error'} + trace = request.env['mailing.trace'].sudo().search([ + ('trace_type', '=', 'sms'), + ('sms_code', '=', trace_code), + ('mass_mailing_id', '=', mailing.id) + ]) + if not trace: + return {'error': 'trace_error'} + return {'trace': trace} + + @http.route(['/sms/<int:mailing_id>/<string:trace_code>'], type='http', website=True, auth='public') + def blacklist_page(self, mailing_id, trace_code, **post): + check_res = self._check_trace(mailing_id, trace_code) + if not check_res.get('trace'): + return werkzeug.utils.redirect('/web') + return request.render('mass_mailing_sms.blacklist_main', { + 'mailing_id': mailing_id, + 'trace_code': trace_code, + }) + + @http.route(['/sms/<int:mailing_id>/unsubscribe/<string:trace_code>'], type='http', website=True, auth='public') + def blacklist_number(self, mailing_id, trace_code, **post): + check_res = self._check_trace(mailing_id, trace_code) + if not check_res.get('trace'): + return werkzeug.utils.redirect('/web') + country_code = request.session.get('geoip', False) and request.session.geoip.get('country_code', False) if request.session.get('geoip') else None + # parse and validate number + sms_number = post.get('sms_number', '').strip(' ') + sanitize_res = phone_validation.phone_sanitize_numbers([sms_number], country_code, None)[sms_number] + tocheck_number = sanitize_res['sanitized'] or sms_number + + trace = check_res['trace'].filtered(lambda r: r.sms_number == tocheck_number)[:1] + mailing_list_ids = trace.mass_mailing_id.contact_list_ids + + # compute opt-out / blacklist information + lists_optout = request.env['mailing.list'].sudo() + lists_optin = request.env['mailing.list'].sudo() + unsubscribe_error = False + if tocheck_number and trace: + if mailing_list_ids: + subscriptions = request.env['mailing.contact.subscription'].sudo().search([ + ('list_id', 'in', mailing_list_ids.ids), + ('contact_id.phone_sanitized', '=', tocheck_number), + ]) + subscriptions.write({'opt_out': True}) + lists_optout = subscriptions.mapped('list_id') + else: + blacklist_rec = request.env['phone.blacklist'].sudo().add(tocheck_number) + blacklist_rec._message_log( + body=_('Blacklist through SMS Marketing unsubscribe (mailing ID: %s - model: %s)') % + (trace.mass_mailing_id.id, trace.mass_mailing_id.mailing_model_id.display_name)) + lists_optin = request.env['mailing.contact.subscription'].sudo().search([ + ('contact_id.phone_sanitized', '=', tocheck_number), + ('list_id', 'not in', mailing_list_ids.ids), + ('opt_out', '=', False), + ]).mapped('list_id') + elif tocheck_number: + unsubscribe_error = _('Number %s not found', tocheck_number) + else: + unsubscribe_error = sanitize_res['msg'] + + return request.render('mass_mailing_sms.blacklist_number', { + 'mailing_id': mailing_id, + 'trace_code': trace_code, + 'sms_number': sms_number, + 'lists_optin': lists_optin, + 'lists_optout': lists_optout, + 'unsubscribe_error': unsubscribe_error, + }) + + @http.route('/r/<string:code>/s/<int:sms_sms_id>', type='http', auth="public") + def sms_short_link_redirect(self, code, sms_sms_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) + if sms_sms_id: + trace_id = request.env['mailing.trace'].sudo().search([('sms_sms_id_int', '=', int(sms_sms_id))]).id + else: + trace_id = False + + request.env['link.tracker.click'].sudo().add_click( + code, + ip=request.httprequest.remote_addr, + country_code=country_code, + mailing_trace_id=trace_id + ) + return werkzeug.utils.redirect(request.env['link.tracker'].get_url_from_code(code), 301) |
