1# -*- coding: utf-8 -*- 2# Part of Odoo. See LICENSE file for full copyright and licensing details. 3 4import logging 5 6from odoo import api, fields, models, _ 7 8_logger = logging.getLogger(__name__) 9 10 11class CalendarEvent(models.Model): 12 _inherit = 'calendar.event' 13 14 def _sms_get_default_partners(self): 15 """ Method overridden from mail.thread (defined in the sms module). 16 SMS text messages will be sent to attendees that haven't declined the event(s). 17 """ 18 return self.mapped('attendee_ids').filtered(lambda att: att.state != 'declined').mapped('partner_id') 19 20 def _do_sms_reminder(self): 21 """ Send an SMS text reminder to attendees that haven't declined the event """ 22 for event in self: 23 event._message_sms_with_template( 24 template_xmlid='calendar_sms.sms_template_data_calendar_reminder', 25 template_fallback=_("Event reminder: %(name)s, %(time)s.", name=event.name, time=event.display_time), 26 partner_ids=self._sms_get_default_partners().ids, 27 put_in_queue=False 28 ) 29 30 31class CalendarAlarm(models.Model): 32 _inherit = 'calendar.alarm' 33 34 alarm_type = fields.Selection(selection_add=[ 35 ('sms', 'SMS Text Message') 36 ], ondelete={'sms': 'set default'}) 37 38 39class AlarmManager(models.AbstractModel): 40 _inherit = 'calendar.alarm_manager' 41 42 @api.model 43 def get_next_mail(self): 44 """ Cron method, overridden here to send SMS reminders as well 45 """ 46 result = super(AlarmManager, self).get_next_mail() 47 48 cron = self.env.ref('calendar.ir_cron_scheduler_alarm', raise_if_not_found=False) 49 if not cron: 50 # Like the super method, do nothing if cron doesn't exist anymore 51 return result 52 53 now = fields.Datetime.to_string(fields.Datetime.now()) 54 last_sms_cron = cron.lastcall 55 56 interval_to_second = { 57 "weeks": 7 * 24 * 60 * 60, 58 "days": 24 * 60 * 60, 59 "hours": 60 * 60, 60 "minutes": 60, 61 "seconds": 1 62 } 63 64 cron_interval = cron.interval_number * interval_to_second[cron.interval_type] 65 events_data = self._get_next_potential_limit_alarm('sms', seconds=cron_interval) 66 67 for event in self.env['calendar.event'].browse(events_data): 68 max_delta = events_data[event.id]['max_duration'] 69 event_start = fields.Datetime.from_string(event.start) 70 for alert in self.do_check_alarm_for_one_date(event_start, event, max_delta, 0, 'sms', after=last_sms_cron, missing=True): 71 event.browse(alert['event_id'])._do_sms_reminder() 72 return result 73