Files
odoo_source/addons/event_sms/models/event_mail.py
T
Andrzej(pian) 78aea4c0d6 [FIX] event: Include unregistered attendee emails in total sent count
Before this commit the Email Sent Count (located in the Communication
tab of the event view) wasn't including emails sent to the attendees who
weren't confirmed.

[This commit changes]
Event mail scheduler will include seats_uncofirmed into calculation of
the mail_count_done which is the count of emails sent. This is
reflecting the actual number of emails sent.

[Reproduce]
- Install event_mail,event_sms
- Create event E starting in time T (Events/Events)
- Add an "Unconfirmed" attendee (Modify state via database write)
- Add an E-Mail in the Communication tab of the event E
	- Set Interval time > T,
	- Template: "Email Reminder"
	- Trigger "Before the event"
- Run scheduled Action sending email (Scheduled Actions / Event: Mail Scheduler)
- BUG: email sent, but not included in the sent count in the communication tab of the event E

opw-3693626

closes odoo/odoo#157229

Signed-off-by: Andrzej Pietrusiak (pian) <pian@odoo.com>
2024-03-13 09:14:09 +00:00

94 lines
4.0 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
class EventTypeMail(models.Model):
_inherit = 'event.type.mail'
@api.model
def _selection_template_model(self):
return super(EventTypeMail, self)._selection_template_model() + [('sms.template', 'SMS')]
notification_type = fields.Selection(selection_add=[('sms', 'SMS')], ondelete={'sms': 'set default'})
@api.depends('notification_type')
def _compute_template_model_id(self):
sms_model = self.env['ir.model']._get('sms.template')
sms_mails = self.filtered(lambda mail: mail.notification_type == 'sms')
sms_mails.template_model_id = sms_model
super(EventTypeMail, self - sms_mails)._compute_template_model_id()
class EventMailScheduler(models.Model):
_inherit = 'event.mail'
@api.model
def _selection_template_model(self):
return super(EventMailScheduler, self)._selection_template_model() + [('sms.template', 'SMS')]
def _selection_template_model_get_mapping(self):
return {**super(EventMailScheduler, self)._selection_template_model_get_mapping(), 'sms': 'sms.template'}
notification_type = fields.Selection(selection_add=[('sms', 'SMS')], ondelete={'sms': 'set default'})
@api.depends('notification_type')
def _compute_template_model_id(self):
sms_model = self.env['ir.model']._get('sms.template')
sms_mails = self.filtered(lambda mail: mail.notification_type == 'sms')
sms_mails.template_model_id = sms_model
super(EventMailScheduler, self - sms_mails)._compute_template_model_id()
def execute(self):
for scheduler in self:
now = fields.Datetime.now()
if scheduler.interval_type != 'after_sub' and scheduler.notification_type == 'sms':
# before or after event -> one shot email
if scheduler.mail_done:
continue
# no template -> ill configured, skip and avoid crash
if not scheduler.template_ref:
continue
# Do not send SMS if the communication was scheduled before the event but the event is over
if scheduler.scheduled_date <= now and (scheduler.interval_type != 'before_event' or scheduler.event_id.date_end > now):
scheduler.event_id.registration_ids.filtered(lambda registration: registration.state != 'cancel')._message_sms_schedule_mass(
template=scheduler.template_ref,
mass_keep_log=True
)
scheduler.update({
'mail_done': True,
'mail_count_done': len(scheduler.event_id.registration_ids.filtered(lambda r: r.state != 'cancel'))
})
return super(EventMailScheduler, self).execute()
@api.onchange('notification_type')
def set_template_ref_model(self):
super().set_template_ref_model()
mail_model = self.env['sms.template']
if self.notification_type == 'sms':
record = mail_model.search([('model', '=', 'event.registration')], limit=1)
self.template_ref = "{},{}".format('sms.template', record.id) if record else False
class EventMailRegistration(models.Model):
_inherit = 'event.mail.registration'
def execute(self):
now = fields.Datetime.now()
todo = self.filtered(lambda reg_mail:
not reg_mail.mail_sent and \
reg_mail.registration_id.state in ['open', 'done'] and \
(reg_mail.scheduled_date and reg_mail.scheduled_date <= now) and \
reg_mail.scheduler_id.notification_type == 'sms'
)
for reg_mail in todo:
reg_mail.registration_id._message_sms_schedule_mass(
template=reg_mail.scheduler_id.template_ref,
mass_keep_log=True
)
todo.write({'mail_sent': True})
return super(EventMailRegistration, self).execute()