diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py index 999b3f824b0..50146c79a66 100644 --- a/addons/mass_mailing/models/mailing.py +++ b/addons/mass_mailing/models/mailing.py @@ -40,7 +40,7 @@ class MassMailing(models.Model): A mass mailing is an occurence of sending emails. """ _name = 'mailing.mailing' _description = 'Mass Mailing' - _inherit = [ 'mail.thread', 'mail.activity.mixin', 'mail.render.mixin'] + _inherit = ['mail.thread', 'mail.activity.mixin', 'mail.render.mixin'] # number of periods for tracking mail_mail statistics _period_number = 6 _order = 'sent_date DESC' @@ -56,16 +56,6 @@ class MassMailing(models.Model): except ValueError: return False - @api.model - def default_get(self, fields): - res = super(MassMailing, self).default_get(fields) - if 'reply_to_mode' in fields and not 'reply_to_mode' in res and res.get('mailing_model_real'): - if res['mailing_model_real'] in ['res.partner', 'mailing.contact']: - res['reply_to_mode'] = 'email' - else: - res['reply_to_mode'] = 'thread' - return res - active = fields.Boolean(default=True, tracking=True) subject = fields.Char('Subject', help='Subject of emails to send', required=True, translate=True) email_from = fields.Char(string='Send From', required=True, @@ -81,7 +71,10 @@ class MassMailing(models.Model): campaign_id = fields.Many2one('utm.campaign', string='UTM Campaign') source_id = fields.Many2one('utm.source', string='Source', required=True, ondelete='cascade', help="This is the link source, e.g. Search Engine, another domain, or name of email list") - medium_id = fields.Many2one('utm.medium', string='Medium', help="Delivery method: Email") + medium_id = fields.Many2one( + 'utm.medium', string='Medium', + compute='_compute_medium_id', readonly=False, store=True, + help="UTM Medium: delivery method (email, sms, ...)") clicks_ratio = fields.Integer(compute="_compute_clicks_ratio", string="Number of Clicks") state = fields.Selection([('draft', 'Draft'), ('in_queue', 'In Queue'), ('sending', 'Sending'), ('done', 'Sent')], string='Status', required=True, tracking=True, copy=False, default='draft', group_expand='_group_expand_states') @@ -89,21 +82,30 @@ class MassMailing(models.Model): user_id = fields.Many2one('res.users', string='Responsible', tracking=True, default=lambda self: self.env.user) # mailing options mailing_type = fields.Selection([('mail', 'Email')], string="Mailing Type", default="mail", required=True) - reply_to_mode = fields.Selection( - [('thread', 'Recipient Followers'), ('email', 'Specified Email Address')], string='Reply-To Mode', required=True) - reply_to = fields.Char(string='Reply To', help='Preferred Reply-To Address', - default=lambda self: self.env.user.email_formatted) + reply_to_mode = fields.Selection([ + ('thread', 'Recipient Followers'), ('email', 'Specified Email Address')], + string='Reply-To Mode', compute='_compute_reply_to_mode', + readonly=False, store=True, + help='Thread: replies go to target document. Email: replies are routed to a given email.') + reply_to = fields.Char( + string='Reply To', compute='_compute_reply_to', readonly=False, store=True, + help='Preferred Reply-To Address') # recipients - mailing_model_real = fields.Char(compute='_compute_model', string='Recipients Real Model', default='mailing.contact', required=True) - mailing_model_id = fields.Many2one('ir.model', string='Recipients Model', domain=[('model', 'in', MASS_MAILING_BUSINESS_MODELS)], + mailing_model_real = fields.Char(string='Recipients Real Model', compute='_compute_model') + mailing_model_id = fields.Many2one( + 'ir.model', string='Recipients Model', ondelete='cascade', required=True, + domain=[('model', 'in', MASS_MAILING_BUSINESS_MODELS)], default=lambda self: self.env.ref('mass_mailing.model_mailing_list').id) - mailing_model_name = fields.Char(related='mailing_model_id.model', string='Recipients Model Name', readonly=True, related_sudo=True) - mailing_domain = fields.Char(string='Domain', default=[]) + mailing_model_name = fields.Char( + string='Recipients Model Name', related='mailing_model_id.model', + readonly=True, related_sudo=True) + mailing_domain = fields.Char( + string='Domain', compute='_compute_mailing_domain', + readonly=False, store=True) mail_server_id = fields.Many2one('ir.mail_server', string='Mail Server', default=_get_default_mail_server_id, help="Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.") - contact_list_ids = fields.Many2many('mailing.list', 'mail_mass_mailing_list_rel', - string='Mailing Lists') + contact_list_ids = fields.Many2many('mailing.list', 'mail_mass_mailing_list_rel', string='Mailing Lists') contact_ab_pc = fields.Integer(string='A/B Testing percentage', help='Percentage of the contacts that will be mailed. Recipients will be taken randomly.', default=100) unique_ab_testing = fields.Boolean(string='Allow A/B Testing', default=False, @@ -128,7 +130,7 @@ class MassMailing(models.Model): replied_ratio = fields.Integer(compute="_compute_statistics", string='Replied Ratio') bounced_ratio = fields.Integer(compute="_compute_statistics", string='Bounced Ratio') next_departure = fields.Datetime(compute="_compute_next_departure", string='Scheduled date') - + def _compute_total(self): for mass_mailing in self: mass_mailing.total = len(mass_mailing.sudo()._get_recipients()) @@ -147,11 +149,6 @@ class MassMailing(models.Model): for mass_mailing in self: mass_mailing.clicks_ratio = mapped_data.get(mass_mailing.id, 0) - @api.depends('mailing_model_id') - def _compute_model(self): - for record in self: - record.mailing_model_real = (record.mailing_model_name != 'mailing.list') and record.mailing_model_name or 'mailing.contact' - def _compute_statistics(self): """ Compute statistics of the mass mailing """ self.env.cr.execute(""" @@ -197,30 +194,53 @@ class MassMailing(models.Model): else: mass_mailing.next_departure = cron_time - @api.onchange('mailing_model_name', 'contact_list_ids') - def _onchange_model_and_list(self): - mailing_domain = literal_eval(self.mailing_domain) if self.mailing_domain else [] - if self.mailing_model_name: - if mailing_domain: - try: - self.env[self.mailing_model_name].search(mailing_domain, limit=1) - except: - mailing_domain = [] - if not mailing_domain: - if self.mailing_model_name == 'mailing.list' and self.contact_list_ids: - mailing_domain = [('list_ids', 'in', self.contact_list_ids.ids)] - elif 'is_blacklisted' in self.env[self.mailing_model_name]._fields and not self.mailing_domain: - mailing_domain = [('is_blacklisted', '=', False)] - elif 'opt_out' in self.env[self.mailing_model_name]._fields and not self.mailing_domain: - mailing_domain = [('opt_out', '=', False)] - else: - mailing_domain = [] - self.mailing_domain = repr(mailing_domain) + @api.depends('mailing_type') + def _compute_medium_id(self): + for mailing in self: + if mailing.mailing_type == 'mail' and not mailing.medium_id: + mailing.medium_id = self.env.ref('utm.utm_medium_email').id - @api.onchange('mailing_type') - def _onchange_mailing_type(self): - if self.mailing_type == 'mail' and not self.medium_id: - self.medium_id = self.env.ref('utm.utm_medium_email').id + @api.depends('mailing_model_id') + def _compute_model(self): + for record in self: + record.mailing_model_real = (record.mailing_model_name != 'mailing.list') and record.mailing_model_name or 'mailing.contact' + + @api.depends('mailing_model_real') + def _compute_reply_to_mode(self): + for mailing in self: + if mailing.mailing_model_real in ['res.partner', 'mailing.contact']: + mailing.reply_to_mode = 'email' + else: + mailing.reply_to_mode = 'thread' + + @api.depends('reply_to_mode') + def _compute_reply_to(self): + for mailing in self: + if mailing.reply_to_mode == 'email' and not mailing.reply_to: + mailing.reply_to = self.env.user.email_formatted + elif mailing.reply_to_mode == 'thread': + mailing.reply_to = False + + @api.depends('mailing_model_name', 'contact_list_ids') + def _compute_mailing_domain(self): + for mailing in self: + mailing_domain = literal_eval(mailing.mailing_domain) if mailing.mailing_domain else [] + if mailing.mailing_model_name: + if mailing_domain: + try: + self.env[mailing.mailing_model_name].search(mailing_domain, limit=1) + except: + mailing_domain = [] + if not mailing_domain: + if mailing.mailing_model_name == 'mailing.list' and mailing.contact_list_ids: + mailing_domain = [('list_ids', 'in', mailing.contact_list_ids.ids)] + elif 'is_blacklisted' in self.env[mailing.mailing_model_name]._fields and not mailing.mailing_domain: + mailing_domain = [('is_blacklisted', '=', False)] + elif 'opt_out' in self.env[mailing.mailing_model_name]._fields and not mailing.mailing_domain: + mailing_domain = [('opt_out', '=', False)] + else: + mailing_domain = [] + mailing.mailing_domain = repr(mailing_domain) # ------------------------------------------------------ # ORM @@ -232,8 +252,6 @@ class MassMailing(models.Model): values['name'] = "%s %s" % (values['subject'], datetime.strftime(fields.datetime.now(), tools.DEFAULT_SERVER_DATETIME_FORMAT)) if values.get('body_html'): values['body_html'] = self._convert_inline_images_to_urls(values['body_html']) - if 'medium_id' not in values and values.get('mailing_type', 'mail') == 'mail': - values['medium_id'] = self.env.ref('utm.utm_medium_email').id return super(MassMailing, self).create(values) def write(self, values): diff --git a/addons/mass_mailing/views/mailing_mailing_views.xml b/addons/mass_mailing/views/mailing_mailing_views.xml index 53f60fcbbb6..414248e5034 100644 --- a/addons/mass_mailing/views/mailing_mailing_views.xml +++ b/addons/mass_mailing/views/mailing_mailing_views.xml @@ -144,7 +144,7 @@