Also impacts test_mail_sms. Purpose: let a cron do delete records to end the sending transaction sooner. Removing the foreign key between sms_sms and mailing_trace is necessary as traces may have to be updated due to delivery reports. This is why we do it here and not with notifications because only traces will trigger updates of a possibly massive number of records and repeated concurrent updates. We also replace the now obsolete "sms_sms_X" prefix as there are not many "sms_id" to distinguish from. Task-2560666 Part-of: odoo/odoo#133392
45 lines
2.0 KiB
Python
45 lines
2.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 MailNotification(models.Model):
|
|
_inherit = 'mail.notification'
|
|
|
|
notification_type = fields.Selection(selection_add=[
|
|
('sms', 'SMS')
|
|
], ondelete={'sms': 'cascade'})
|
|
sms_id_int = fields.Integer('SMS ID', index='btree_not_null')
|
|
# Used to give links on form view without foreign key. In most cases, you'd want to use sms_id_int or sms_tracker_ids.sms_uuid.
|
|
sms_id = fields.Many2one('sms.sms', string='SMS', store=False, compute='_compute_sms_id')
|
|
sms_tracker_ids = fields.One2many('sms.tracker', 'mail_notification_id', string="SMS Trackers")
|
|
sms_number = fields.Char('SMS Number')
|
|
failure_type = fields.Selection(selection_add=[
|
|
('sms_number_missing', 'Missing Number'),
|
|
('sms_number_format', 'Wrong Number Format'),
|
|
('sms_credit', 'Insufficient Credit'),
|
|
('sms_country_not_supported', 'Country Not Supported'),
|
|
('sms_registration_needed', 'Country-specific Registration Required'),
|
|
('sms_server', 'Server Error'),
|
|
('sms_acc', 'Unregistered Account'),
|
|
# delivery report errors
|
|
('sms_expired', 'Expired'),
|
|
('sms_invalid_destination', 'Invalid Destination'),
|
|
('sms_not_allowed', 'Not Allowed'),
|
|
('sms_not_delivered', 'Not Delivered'),
|
|
('sms_rejected', 'Rejected'),
|
|
])
|
|
|
|
@api.depends('sms_id_int', 'notification_type')
|
|
def _compute_sms_id(self):
|
|
self.sms_id = False
|
|
sms_notifications = self.filtered(lambda n: n.notification_type == 'sms' and bool(n.sms_id_int))
|
|
if not sms_notifications:
|
|
return
|
|
existing_sms_ids = self.env['sms.sms'].sudo().search([
|
|
('id', 'in', sms_notifications.mapped('sms_id_int')), ('to_delete', '!=', True)
|
|
]).ids
|
|
for sms_notification in sms_notifications.filtered(lambda n: n.sms_id_int in set(existing_sms_ids)):
|
|
sms_notification.sms_id = sms_notification.sms_id_int
|