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