Repository
odoo/odoo · module folder
Module version
3.0
Category
Sales/Sales
Folder size
3.38 MB
License
LGPL-3
Application
No
Auto-installable
Yes
Website
None
Last tracking update
2026-08-19 10:15:33
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Xavier Morel, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Aaron Bohy, Alexandre Kühn, Julien Castiaux, Sébastien Theys, Julien Mougenot, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Florian Charlier, Louis Baudoux, luvi, Renaud Thiry, David, alsh-odoo, Maximilien (malb), Victor Piryns (pivi), Pierre-Yves Dufays, Dylan Kiss (dyki), Bruno Boi, nihp-odoo, yagp-odoo, Ricardo Gomes Rodrigues, Anton Romanova (roan), Corentin Heinix (cohe), Renaud Thiry (reth), Thomas Josse (THJO), Krzysztof Magusiak (krma), Basioni (basm), Kadam Darji, ELCO, jsum-odoo, Heshmatkhah - Office, chpa-odoo, Joseph Nechleba (jonec)
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
account_payment_notification, base_automation, calendar_sms, crm_sms, event_sms, hr_presence, hr_recruitment_sms, mass_mailing_event_sms, mass_mailing_event_track_sms, mass_mailing_sms, pos_sms, project_sms, sale_sms, sms_twilio, stock_sms, test_mail_full, test_mail_sms, website_sms
Description
This module gives a framework for SMS text messaging
----------------------------------------------------

The service is provided by the In App Purchase Odoo platform.

Code Analysis

Views touched (18)
XML IDNameModelTypeStatus
iap_account_view_form iap.account.view.form iap.account form Inherits iap.iap_account_view_form
ir_actions_server_view_form ir.actions.server.view.form.inherit.sms ir.actions.server form Inherits base.view_server_action_form
mail_notification_view_form mail.notification.view.form mail.notification form Inherits mail.mail_notification_view_form
mail_notification_view_tree mail.notification.view.list mail.notification list Inherits mail.mail_notification_view_tree
res_config_settings_view_form res.config.settings.view.form.inherit.sms res.config.settings form Inherits base_setup.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.sms res.partner form Inherits base.view_partner_form
sms_account_code_view_form sms.account.code.view.form sms.account.code form New
sms_account_phone_view_form sms.account.phone.view.form sms.account.phone form New
sms_account_sender_view_form sms.account.sender.view.form sms.account.sender form New
sms_composer_view_form sms.composer.view.form sms.composer form New
sms_sms_view_search sms.sms.view.search sms.sms search New
sms_sms_view_tree sms.sms.view.list sms.sms list New
sms_template_preview_form sms.template.preview.form sms.template.preview form New
sms_template_reset_view_form sms.template.reset.view.form sms.template.reset form New
sms_template_view_form sms.template.view.form sms.template form New
sms_template_view_search sms.template.view.search sms.template search New
sms_template_view_tree sms.template.view.list sms.template list New
sms_tsms_view_form sms.sms.view.form sms.sms form New
HTTP endpoints (1)
Route(s)HandlerAuthTypeMethodsFlags
/sms/status SmsController.update_sms_status public jsonrpc ALL sudo
Models touched (18)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • sender_name Char
    help='This is the name that will be displayed as the sender of the SMS.' readonly=True
Public methods (2)
  • action_open_registration_wizard(self)
  • action_open_sender_name_wizard(self)

New fields (3)
  • sms_method Selection
    compute='_compute_sms_method' readonly=False selection=[('sms', 'SMS (without note)'), ('comment', 'SMS (with note)'), ('note', 'Note only')] store=True string='Send SMS As'
  • sms_template_id Many2one → sms.template
    compute='_compute_sms_template_id' domain="[('model_id', '=', model_id)]" ondelete='set null' readonly=False store=True args: 'sms.template', 'SMS Template'
  • state Selection
    ondelete={'sms': 'cascade'} selection_add=[('sms', 'Send SMS'), ('followers')]
Public methods (0)

No public methods.

New fields (1)
  • is_mail_thread_sms Boolean
    compute='_compute_is_mail_thread_sms' default=False help='Whether this model supports messages and notifications through SMS' search='_search_is_mail_thread_sms' store=False string='Mail Thread SMS'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • has_sms_error Boolean
    compute='_compute_has_sms_error' search='_search_has_sms_error' args: 'Has SMS error'
  • message_type Selection
    ondelete={'sms': <expr>} selection_add=[('sms', 'SMS')]
Public methods (0)

No public methods.

New fields (6)
  • failure_type 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'), ('sms_expired', 'Expired'), ('sms_invalid_destination', 'Invalid Destination'), ('sms_not_allowed', 'Not Allowed'), ('sms_not_delivered', 'Not Delivered'), ('sms_rejected', 'Rejected')]
  • notification_type Selection
    ondelete={'sms': 'cascade'} selection_add=[('sms', 'SMS')]
  • sms_id Many2one → sms.sms
    compute='_compute_sms_id' store=False string='SMS' args: 'sms.sms'
  • sms_id_int Integer
    index='btree_not_null' args: 'SMS ID'
  • sms_number Char
    groups='base.group_user' args: 'SMS Number'
  • sms_tracker_ids One2many → sms.tracker
    string='SMS Trackers' args: 'sms.tracker', 'mail_notification_id'
Public methods (0)

No public methods.

New fields (1)
  • message_has_sms_error Boolean
    compute='_compute_message_has_sms_error' help='If checked, some messages have a delivery error.' search='_search_message_has_sms_error' args: 'SMS Delivery error'
Public methods (2)
  • message_post(self, *args, body='', message_type='notification', **kwargs)
  • notify_cancel_by_type(self, notification_type)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • account_id Many2one → iap.account
    required=True args: 'iap.account'
  • verification_code Char
    required=True
Public methods (1)
  • action_register(self)

New fields (2)
  • account_id Many2one → iap.account
    required=True args: 'iap.account'
  • phone_number Char
    required=True
Public methods (1)
  • action_send_verification_code(self)

New fields (2)
  • account_id Many2one → iap.account
    required=True args: 'iap.account'
  • sender_name Char
Public methods (1)
  • action_set_sender_name(self)

New fields (21)
  • body Text
    compute='_compute_body' precompute=True readonly=False required=True store=True args: 'Message'
  • comment_single_recipient Boolean
    compute='_compute_comment_single_recipient' compute_sudo=False help='Indicates if the SMS composer targets a single specific recipient' args: 'Single Mode'
  • composition_mode Selection
    compute='_compute_composition_mode' precompute=True readonly=False required=True store=True string='Composition Mode' args: [('numbers', 'Send to numbers'), ('comment', 'Post on a document'), ('mass', 'Send SMS in batch')]
  • mass_force_send Boolean
    default=False args: 'Send directly'
  • mass_keep_log Boolean
    default=True args: 'Keep a note on document'
  • number_field_name Char
    args: 'Number Field'
  • numbers Char
    args: 'Recipients (Numbers)'
  • recipient_invalid_count Integer
    compute='_compute_recipients' compute_sudo=False args: '# Invalid recipients'
  • recipient_single_description Text
    compute='_compute_recipient_single_non_stored' compute_sudo=False args: 'Recipients (Partners)'
  • recipient_single_number Char
    compute='_compute_recipient_single_non_stored' compute_sudo=False args: 'Stored Recipient Number'
  • recipient_single_number_itf Char
    compute='_compute_recipient_single_stored' compute_sudo=False help="Phone number of the recipient. If changed, it will be recorded on recipient's profile." readonly=False store=True args: 'Recipient Number'
  • recipient_single_valid Boolean
    compute='_compute_recipient_single_valid' compute_sudo=False args: 'Is valid'
  • recipient_valid_count Integer
    compute='_compute_recipients' compute_sudo=False args: '# Valid recipients'
  • res_id Integer
    args: 'Document ID'
  • res_ids Char
    args: 'Document IDs'
  • res_ids_count Integer
    compute='_compute_res_ids_count' compute_sudo=False help='Number of recipients that will receive the SMS if sent in mass mode, without applying the Active Domain value' args: 'Visible records count'
  • res_model Char
    args: 'Document Model Name'
  • res_model_description Char
    compute='_compute_res_model_description' args: 'Document Model Description'
  • sanitized_numbers Char
    compute='_compute_sanitized_numbers' compute_sudo=False args: 'Sanitized Number'
  • template_id Many2one → sms.template
    domain="[('model', '=', res_model)]" string='Use Template' args: 'sms.template'
  • use_exclusion_list Boolean
    copy=False default=True help='Prevent sending messages to blacklisted contacts. Disable only when absolutely necessary.' args: 'Use Exclusion List'
Public methods (3)
  • action_send_sms(self)
  • action_send_sms_mass_now(self)
  • default_get(self, fields)
    @api.model

New fields (9)
  • body Text
  • failure_type Selection
    copy=False args: [('unknown', 'Unknown error'), ('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_country_not_supported', 'Country Not Supported'), ('sms_registration_needed', 'Country-specific Registration Required'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate'), ('sms_optout', 'Opted Out')]
  • mail_message_id Many2one → mail.message
    index=True args: 'mail.message'
  • number Char
    args: 'Number'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Customer'
  • sms_tracker_id Many2one → sms.tracker
    compute='_compute_sms_tracker_id' string='SMS trackers' args: 'sms.tracker'
  • state Selection
    copy=False default='outgoing' readonly=True required=True args: [('outgoing', 'In Queue'), ('process', 'Processing'), ('pending', 'Sent'), ('sent', 'Delivered'), ('error', 'Error'), ('canceled', 'Cancelled')], 'SMS Status'
  • to_delete Boolean
    default=False help='Will automatically be deleted, while notifications will not be deleted in any case.' args: 'Marked for deletion'
  • uuid Char
    copy=False default=<expr> help='Alternate way to identify a SMS record, used for delivery reports' readonly=True args: 'UUID'
Public methods (6)
  • action_set_canceled(self)
  • action_set_error(self, failure_type)
  • action_set_outgoing(self)
  • create(self, vals_list)
    @api.model_create_multi
  • resend_failed(self)
  • send(self, unlink_failed=False, unlink_sent=True, raise_exception=False)
    Main API method to send SMS. This contacts an external server. If the transaction fails, it may be retried which can result in sending multiple SMS messages! :param unlink_failed: unlink failed SMS after IAP feedback; :param unlink_sent: unlink sent SMS after IAP feedback; :param raise_exception: raise if there is an issue contacting IAP;

New fields (5)
  • body Char
    required=True translate=True args: 'Body'
  • model Char
    index=True readonly=True related='model_id.model' store=True args: 'Related Document Model'
  • model_id Many2one → ir.model
    domain=['&', ('is_mail_thread_sms', '=', True), ('transient', '=', False)] help='The type of document this template can be used with' ondelete='cascade' required=True string='Applies to' args: 'ir.model'
  • name Char
    translate=True args: 'Name'
  • sidebar_action_id Many2one → ir.actions.act_window
    copy=False help='Sidebar action to make this template available on records of the related document model' readonly=True args: 'ir.actions.act_window', 'Sidebar action'
Public methods (5)
  • action_create_sidebar_action(self)
  • action_unlink_sidebar_action(self)
  • copy_data(self, default=None)
  • default_get(self, fields)
    @api.model
  • unlink(self)

New fields (6)
  • body Char
    compute='_compute_sms_template_fields' args: 'Body'
  • lang Selection
    string='Template Preview Language' args: _selection_languages
  • model_id Many2one → ir.model
    related='sms_template_id.model_id' args: 'ir.model'
  • no_record Boolean
    compute='_compute_no_record' args: 'No Record'
  • resource_ref Reference
    selection='_selection_target_model' string='Record reference'
  • sms_template_id Many2one → sms.template
    ondelete='cascade' required=True args: 'sms.template'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (1)
  • template_ids Many2many → sms.template
    args: 'sms.template'
Public methods (1)
  • reset_template(self)

New fields (2)
  • mail_notification_id Many2one → mail.notification
    index='btree_not_null' ondelete='cascade' args: 'mail.notification'
  • sms_uuid Char
    required=True args: 'SMS uuid'
Public methods (0)

No public methods.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…