[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:
Julien Castiaux
2021-01-29 15:38:24 +00:00
parent 6b701552a2
commit 193fee519c
5 changed files with 40 additions and 46 deletions
+1 -1
View File
@@ -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,
+13 -4
View File
@@ -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()
+6 -28
View File
@@ -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()