# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. import logging from odoo import fields, models, api, _ from odoo.exceptions import UserError _logger = logging.getLogger(__name__) class EventMail(models.Model): _inherit = 'event.mail' notification_type = fields.Selection(selection_add=[('social_post', 'Social Post')]) template_ref = fields.Reference(ondelete={'social.post.template': 'cascade'}, selection_add=[('social.post.template', 'Social Post')]) @api.constrains('template_ref', 'interval_type') def _check_interval_type(self): """Cannot select "after_sub" if the notification type is "social_post".""" for mail in self: if mail.notification_type == 'social_post' and mail.interval_type == 'after_sub': raise UserError(_('As social posts have no recipients, they cannot be triggered by registrations.')) def _compute_notification_type(self): super()._compute_notification_type() social_schedulers = self.filtered(lambda scheduler: scheduler.template_ref and scheduler.template_ref._name == 'social.post.template') social_schedulers.notification_type = 'social_post' def _execute_event_based(self, mail_slot=False): # event-based social post: slot or not, just post once, based on first # slot, ignore other slots social_schedulers = self.filtered(lambda scheduler: scheduler.notification_type == 'social_post') if social_schedulers: self.env['social.post'].sudo().create([ scheduler.template_ref._prepare_social_post_values() for scheduler in social_schedulers ])._action_post() for scheduler in social_schedulers: scheduler.update({ 'mail_done': True, 'mail_count_done': len(scheduler.template_ref.account_ids), }) if scheduler.mail_slot_ids: scheduler.mail_slot_ids.update({ 'mail_done': True, 'mail_count_done': len(scheduler.template_ref.account_ids), }) # do not call super for social schedulers as they have their own # computation for mail_done / mail_count_done; also avoid singleton errors remaining = self - social_schedulers if remaining: return super(EventMail, remaining)._execute_event_based(mail_slot=mail_slot) def _filter_template_ref(self): """ Check for valid template reference: existing, working template """ valid = super()._filter_template_ref() invalid = valid.filtered( lambda scheduler: scheduler.notification_type == "social_post" and not scheduler.template_ref.account_ids ) for scheduler in invalid: _logger.warning( "Cannot process scheduler %s (event %s - ID %s) as it refers to social post template %s (ID %s) that has no linked accounts", scheduler.id, scheduler.event_id.name, scheduler.event_id.id, scheduler.template_ref.name, scheduler.template_ref.id) return valid - invalid def _template_model_by_notification_type(self): info = super()._template_model_by_notification_type() info["social_post"] = "social.post.template" return info