82 lines
3.4 KiB
Python
82 lines
3.4 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
from odoo import fields, models
|
||
|
|
||
|
|
||
|
class MailingList(models.Model):
|
||
|
_inherit = 'mailing.list'
|
||
|
|
||
|
contact_count_sms = fields.Integer(compute="_compute_mailing_list_statistics", string="SMS Contacts")
|
||
|
|
||
|
def action_view_mailings(self):
|
||
|
if self.env.context.get('mailing_sms'):
|
||
|
action = self.env["ir.actions.actions"]._for_xml_id('mass_mailing_sms.mailing_mailing_action_sms')
|
||
|
action['domain'] = [('id', 'in', self.mailing_ids.ids)]
|
||
|
action['context'] = {
|
||
|
'default_mailing_type': 'sms',
|
||
|
'default_contact_list_ids': self.ids,
|
||
|
'mailing_sms': True
|
||
|
}
|
||
|
return action
|
||
|
else:
|
||
|
return super(MailingList, self).action_view_mailings()
|
||
|
|
||
|
def action_view_contacts_sms(self):
|
||
|
action = self.action_view_contacts()
|
||
|
action['context'] = dict(action.get('context', {}), search_default_filter_valid_sms_recipient=1)
|
||
|
return action
|
||
|
|
||
|
def action_send_mailing_sms(self):
|
||
|
view = self.env.ref('mass_mailing_sms.mailing_mailing_view_form_sms')
|
||
|
action = self.env["ir.actions.actions"]._for_xml_id('mass_mailing_sms.mailing_mailing_action_sms')
|
||
|
action.update({
|
||
|
'context': {
|
||
|
'default_contact_list_ids': self.ids,
|
||
|
'default_model_id': self.env['ir.model']._get_id('mailing.list'),
|
||
|
'default_mailing_type': 'sms',
|
||
|
},
|
||
|
'target': 'current',
|
||
|
'view_type': 'form',
|
||
|
'views': [(view.id, 'form')],
|
||
|
})
|
||
|
|
||
|
return action
|
||
|
|
||
|
def _get_contact_statistics_fields(self):
|
||
|
""" See super method docstring for more info.
|
||
|
Adds:
|
||
|
- contact_count_sms: all valid sms
|
||
|
- contact_count_blacklisted: override the dict entry to add SMS blacklist condition """
|
||
|
|
||
|
values = super(MailingList, self)._get_contact_statistics_fields()
|
||
|
values.update({
|
||
|
'contact_count_sms': '''
|
||
|
SUM(CASE WHEN
|
||
|
(c.phone_sanitized IS NOT NULL
|
||
|
AND COALESCE(r.opt_out,FALSE) = FALSE
|
||
|
AND bl_sms.id IS NULL)
|
||
|
THEN 1 ELSE 0 END) AS contact_count_sms''',
|
||
|
'contact_count_blacklisted': '''
|
||
|
SUM(CASE WHEN (bl.id IS NOT NULL OR bl_sms.id IS NOT NULL)
|
||
|
THEN 1 ELSE 0 END) AS contact_count_blacklisted'''
|
||
|
})
|
||
|
return values
|
||
|
|
||
|
def _get_contact_statistics_joins(self):
|
||
|
return super(MailingList, self)._get_contact_statistics_joins() + '''
|
||
|
LEFT JOIN phone_blacklist bl_sms ON c.phone_sanitized = bl_sms.number and bl_sms.active
|
||
|
'''
|
||
|
|
||
|
def _mailing_get_opt_out_list_sms(self, mailing):
|
||
|
""" Check subscription on all involved mailing lists. If user is opt_out
|
||
|
on one list but not on another, one opted in and the other one opted out,
|
||
|
send mailing anyway.
|
||
|
|
||
|
:return list: opt-outed record IDs
|
||
|
"""
|
||
|
subscriptions = self.subscription_ids if self else mailing.contact_list_ids.subscription_ids
|
||
|
opt_out_contacts = subscriptions.filtered(lambda sub: sub.opt_out).mapped('contact_id')
|
||
|
opt_in_contacts = subscriptions.filtered(lambda sub: not sub.opt_out).mapped('contact_id')
|
||
|
return list(set(c.id for c in opt_out_contacts if c not in opt_in_contacts))
|