[FIX] calendar: missing cron compat fom sms_calendar
Fine tunning of c8f031ad77, this commit has the missing code
compatibility for sms_calendar.
closes odoo/odoo#65064
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
<field name="name">Calendar: Event Reminder</field>
|
||||
<field name="model_id" ref="model_calendar_alarm_manager"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model._send_reminder_email()</field>
|
||||
<field name="code">model._send_reminder()</field>
|
||||
<field eval="True" name="active" />
|
||||
<field name="user_id" ref="base.user_root" />
|
||||
<field name="interval_number">1</field>
|
||||
|
||||
@@ -135,9 +135,16 @@ class AlarmManager(models.AbstractModel):
|
||||
})
|
||||
return result
|
||||
|
||||
@api.model
|
||||
def _send_reminder_email(self, partners=None):
|
||||
# Executed via cron
|
||||
def _get_events_to_notify(self, ttype):
|
||||
"""
|
||||
Get the events with an alarm of the given type between the cron
|
||||
last call and now.
|
||||
|
||||
Please note that all new reminders created since the cron last
|
||||
call with an alarm prior to the cron last call are skipped by
|
||||
design. The attendees receive an invitation for any new event
|
||||
already.
|
||||
"""
|
||||
self.env.cr.execute('''
|
||||
SELECT "event"."id"
|
||||
FROM "calendar_event" AS "event"
|
||||
@@ -146,20 +153,20 @@ class AlarmManager(models.AbstractModel):
|
||||
JOIN "calendar_alarm" AS "alarm"
|
||||
ON "event_alarm_rel"."calendar_alarm_id" = "alarm"."id"
|
||||
WHERE (
|
||||
"alarm"."alarm_type" = 'email'
|
||||
"alarm"."alarm_type" = %s
|
||||
AND "event"."active"
|
||||
AND "event"."start" - CAST("alarm"."duration" || ' ' || "alarm"."interval" AS Interval) >= %s
|
||||
AND "event"."start" - CAST("alarm"."duration" || ' ' || "alarm"."interval" AS Interval) < now() at time zone 'utc'
|
||||
)''', [self.env.context['lastcall']])
|
||||
)''', [ttype, self.env.context['lastcall']])
|
||||
|
||||
domain = [
|
||||
("event_id", "in", self.env.cr.fetchall()),
|
||||
("state", "!=", "declined"),
|
||||
]
|
||||
if partners is not None:
|
||||
domain.append(("partner_id", "in", partners.ids))
|
||||
ids = [row[0] for row in self.env.cr.fetchall()]
|
||||
return self.env['calendar.event'].browse(ids)
|
||||
|
||||
attendees = self.env["calendar.attendee"].search(domain)
|
||||
@api.model
|
||||
def _send_reminder(self):
|
||||
# Executed via cron
|
||||
events = self._get_events_to_notify('email')
|
||||
attendees = events.attendee_ids.filtered(lambda a: a.state != 'declined')
|
||||
attendees._send_mail_to_attendees(
|
||||
'calendar.calendar_template_meeting_reminder',
|
||||
force_send=True,
|
||||
|
||||
@@ -688,14 +688,23 @@ class Meeting(models.Model):
|
||||
|
||||
return True
|
||||
|
||||
def _get_trigger_alarm_types(self):
|
||||
return ['email']
|
||||
|
||||
def _setup_alarms(self):
|
||||
""" Trigger the cron in the future for every email reminder """
|
||||
""" Schedule cron triggers for future events """
|
||||
cron = self.env.ref('calendar.ir_cron_scheduler_alarm')
|
||||
alarm_manager = self.env['calendar.alarm_manager']
|
||||
alarm_types = self._get_trigger_alarm_types()
|
||||
|
||||
for event in self:
|
||||
for alarm in (alarm for alarm in event.alarm_ids if alarm.alarm_type == 'email'):
|
||||
cron._trigger(at=event.start-timedelta(minutes=alarm.duration_minutes))
|
||||
for alarm in (alarm for alarm in event.alarm_ids if alarm.alarm_type in alarm_types):
|
||||
at = event.start - timedelta(minutes=alarm.duration_minutes)
|
||||
if not cron.lastcall or at > cron.lastcall:
|
||||
# Don't trigger for past alarms, they would be skipped by design
|
||||
cron._trigger(at=at)
|
||||
if any(alarm.alarm_type == 'notification' for alarm in event.alarm_ids):
|
||||
self.env['calendar.alarm_manager']._notify_next_alarm(event.partner_ids.ids)
|
||||
alarm_manager._notify_next_alarm(event.partner_ids.ids)
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
|
||||
@@ -169,4 +169,4 @@ class TestEventNotifications(TransactionCase, MailCase):
|
||||
'message_type': 'user_notification',
|
||||
'subtype': 'mail.mt_note',
|
||||
}):
|
||||
self.env['calendar.alarm_manager'].with_context(lastcall=now - relativedelta(minutes=15))._send_reminder_email(self.partner)
|
||||
self.env['calendar.alarm_manager'].with_context(lastcall=now - relativedelta(minutes=15))._send_reminder()
|
||||
|
||||
@@ -27,6 +27,9 @@ class CalendarEvent(models.Model):
|
||||
put_in_queue=False
|
||||
)
|
||||
|
||||
def _get_trigger_alarm_types(self):
|
||||
return super()._get_trigger_alarm_types() + ['sms']
|
||||
|
||||
|
||||
class CalendarAlarm(models.Model):
|
||||
_inherit = 'calendar.alarm'
|
||||
@@ -40,33 +43,8 @@ class AlarmManager(models.AbstractModel):
|
||||
_inherit = 'calendar.alarm_manager'
|
||||
|
||||
@api.model
|
||||
def get_next_mail(self):
|
||||
def _send_reminder(self):
|
||||
""" Cron method, overridden here to send SMS reminders as well
|
||||
"""
|
||||
result = super(AlarmManager, self).get_next_mail()
|
||||
|
||||
cron = self.env.ref('calendar.ir_cron_scheduler_alarm', raise_if_not_found=False)
|
||||
if not cron:
|
||||
# Like the super method, do nothing if cron doesn't exist anymore
|
||||
return result
|
||||
|
||||
now = fields.Datetime.to_string(fields.Datetime.now())
|
||||
last_sms_cron = cron.lastcall
|
||||
|
||||
interval_to_second = {
|
||||
"weeks": 7 * 24 * 60 * 60,
|
||||
"days": 24 * 60 * 60,
|
||||
"hours": 60 * 60,
|
||||
"minutes": 60,
|
||||
"seconds": 1
|
||||
}
|
||||
|
||||
cron_interval = cron.interval_number * interval_to_second[cron.interval_type]
|
||||
events_data = self._get_next_potential_limit_alarm('sms', seconds=cron_interval)
|
||||
|
||||
for event in self.env['calendar.event'].browse(events_data):
|
||||
max_delta = events_data[event.id]['max_duration']
|
||||
event_start = fields.Datetime.from_string(event.start)
|
||||
for alert in self.do_check_alarm_for_one_date(event_start, event, max_delta, 0, 'sms', after=last_sms_cron, missing=True):
|
||||
event.browse(alert['event_id'])._do_sms_reminder()
|
||||
return result
|
||||
super()._send_reminder()
|
||||
self._get_events_to_notify(ttype='sms')._do_sms_reminder()
|
||||
|
||||
Reference in New Issue
Block a user