SMS gateway

sms
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/sms
VERSION
VERSION 3.0
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Xavier Morel, 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, alsh-odoo, David, 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, Heshmatkhah - Office, chpa-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:45
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - iap_mail
    - iap
    - web
    - base_setup
    - mail
    - bus
    - web_tour
    - html_editor
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 xpath Inherits iap.iap_account_view_form
ir_actions_server_view_form ir.actions.server.view.form.inherit.sms ir.actions.server xpath Inherits base.view_server_action_form
mail_notification_view_form mail.notification.view.form mail.notification xpath Inherits mail.mail_notification_view_form
mail_notification_view_tree mail.notification.view.list mail.notification xpath Inherits mail.mail_notification_view_tree
res_config_settings_view_form res.config.settings.view.form.inherit.sms res.config.settings setting Inherits base_setup.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.sms res.partner xpath 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
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.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/sms
VERSION
VERSION 3.0
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Aaron Bohy, Odoo Online, Alexandre Kühn, Adrien Dieudonné, Sébastien Theys, std-odoo, Tiffany Chang (tic), Gorash, Didier (did), Florian Charlier, Louis Baudoux, Vincent Larcin, bve-odoo, alsh-odoo, Louis Wicket (wil), Maximilien (malb), Dylan Kiss (dyki), omra-odoo, Andrzej(pian), Joris Makauskis, maad-odoo, lase@odoo.com, Bastien Fafchamps (bafa), Louis (wil), mano-odoo, yagp-odoo, Ricardo Gomes Rodrigues, Pierre Pulinckx (pipu), Corentin Heinix (cohe), Renaud Thiry (reth), kusi-odoo, Krzysztof Magusiak (krma), gito-odoo, Heshmatkhah - Office
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - iap_mail
    - iap
    - web
    - base_setup
    - mail
    - bus
    - web_tour
    - html_editor
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (20)
XML IDNameModelTypeStatus
iap_account_view_form iap.account.view.form iap.account xpath Inherits iap.iap_account_view_form
ir_actions_server_view_form ir.actions.server.view.form.inherit.sms ir.actions.server xpath Inherits base.view_server_action_form
mail_notification_view_form mail.notification.view.form mail.notification xpath Inherits mail.mail_notification_view_form
mail_notification_view_tree mail.notification.view.list mail.notification xpath Inherits mail.mail_notification_view_tree
mail_resend_message_view_form sms.resend.form sms.resend form New
res_config_settings_view_form res.config.settings.view.form.inherit.sms res.config.settings setting Inherits base_setup.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.sms res.partner xpath Inherits base.view_partner_form
res_partner_view_search res.partner.view.search.inherit.sms res.partner xpath Inherits base.view_res_partner_filter
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
Models touched (21)

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)
    @api.returns('mail.message', <expr>)
  • notify_cancel_by_type(self, notification_type)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

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'
  • mass_use_blacklist Boolean
    default=True args: 'Use blacklist'
  • 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'
Public methods (3)
  • action_send_sms(self)
  • action_send_sms_mass_now(self)
  • default_get(self, fields)
    @api.model

New fields (6)
  • can_cancel Boolean
    compute='_compute_can_cancel'
  • can_resend Boolean
    compute='_compute_can_resend'
  • has_insufficient_credit Boolean
    compute='_compute_has_insufficient_credit'
  • has_unregistered_account Boolean
    compute='_compute_has_unregistered_account'
  • mail_message_id Many2one → mail.message
    readonly=True required=True args: 'mail.message', 'Message'
  • recipient_ids One2many → sms.resend.recipient
    string='Recipients' args: 'sms.resend.recipient', 'sms_resend_id'
Public methods (4)
  • action_buy_credits(self)
  • action_cancel(self)
  • action_resend(self)
  • default_get(self, fields)
    @api.model

New fields (7)
  • failure_type Selection
    readonly=True related='notification_id.failure_type' related_sudo=True string='Error Message'
  • notification_id Many2one → mail.notification
    ondelete='cascade' required=True args: 'mail.notification'
  • partner_id Many2one → res.partner
    readonly=True related='notification_id.res_partner_id' args: 'res.partner', 'Partner'
  • partner_name Char
    readonly=True string='Recipient Name'
  • resend Boolean
    default=True string='Try Again'
  • sms_number Char
    string='Phone Number'
  • sms_resend_id Many2one → sms.resend
    required=True args: 'sms.resend'
Public methods (0)

No public methods.

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 (5)
  • action_set_canceled(self)
  • action_set_error(self, failure_type)
  • action_set_outgoing(self)
  • resend_failed(self)
  • send(self, unlink_failed=False, unlink_sent=True, auto_commit=False, raise_exception=False)
    Main API method to send SMS. :param unlink_failed: unlink failed SMS after IAP feedback; :param unlink_sent: unlink sent SMS after IAP feedback; :param auto_commit: commit after each batch of SMS; :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
    ondelete='cascade' args: 'mail.notification'
  • sms_uuid Char
    required=True args: 'SMS uuid'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/sms
VERSION
VERSION 3.0
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Aaron Bohy, Damien Bouvy, Odoo Online, Jorge Pinna Puissant, Alexandre Kühn, Aurélien Warnon, Xavier-Do, Victor Feyens, Sébastien Theys, Joseph Caburnay, Samuel Degueldre, Nasreddin Boulif (bon), Tiffany Chang (tic), Gorash, Pierre Paridans, Antoine Guenet, Florian Charlier, Louis Baudoux, Abdelouahab (abla), luvi, Renaud Thiry, niyasraphy, bve-odoo, alsh-odoo, Louis Wicket (wil), Maximilien (malb), Dylan Kiss (dyki), Sébastien Geelen (sge), Kamlesh Pathekar, FrancoisGe, Michael (mcm), Brieuc-brd, Andrzej(pian), Joris Makauskis, Eteil Djoumatchoua(etdj), lase@odoo.com, Eteil Djoumatchoua (etdj), Julien Carion (juca), Louis (wil), mano-odoo, yagp-odoo, Ricardo Gomes Rodrigues, Pierre Pulinckx (pipu), Corentin Heinix (cohe), Renaud Thiry (reth)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - iap_mail
    - iap
    - web
    - base_setup
    - mail
    - bus
    - web_tour
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (16)
XML IDNameModelTypeStatus
ir_actions_server_view_form ir.actions.server.view.form.inherit.sms ir.actions.server xpath Inherits base.view_server_action_form
mail_notification_view_form mail.notification.view.form mail.notification xpath Inherits mail.mail_notification_view_form
mail_notification_view_tree mail.notification.view.tree mail.notification xpath Inherits mail.mail_notification_view_tree
mail_resend_message_view_form sms.resend.form sms.resend form New
res_config_settings_view_form res.config.settings.view.form.inherit.sms res.config.settings setting Inherits base_setup.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.sms res.partner xpath Inherits base.view_partner_form
res_partner_view_search res.partner.view.search.inherit.sms res.partner xpath Inherits base.view_res_partner_filter
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.tree sms.sms tree 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.tree sms.template tree New
sms_tsms_view_form sms.sms.view.form sms.sms form New
Models touched (17)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (1)
  • message_format(self, format_reply=True, msg_vals=None)
    Override in order to retrieves data about SMS (recipient name and SMS status) TDE FIXME: clean the overall message_format thingy

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)
    @api.returns('mail.message', <expr>)
  • notify_cancel_by_type(self, notification_type)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

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'
  • mass_use_blacklist Boolean
    default=True args: 'Use blacklist'
  • 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'
Public methods (3)
  • action_send_sms(self)
  • action_send_sms_mass_now(self)
  • default_get(self, fields)
    @api.model

New fields (6)
  • can_cancel Boolean
    compute='_compute_can_cancel'
  • can_resend Boolean
    compute='_compute_can_resend'
  • has_insufficient_credit Boolean
    compute='_compute_has_insufficient_credit'
  • has_unregistered_account Boolean
    compute='_compute_has_unregistered_account'
  • mail_message_id Many2one → mail.message
    readonly=True required=True args: 'mail.message', 'Message'
  • recipient_ids One2many → sms.resend.recipient
    string='Recipients' args: 'sms.resend.recipient', 'sms_resend_id'
Public methods (4)
  • action_buy_credits(self)
  • action_cancel(self)
  • action_resend(self)
  • default_get(self, fields)
    @api.model

New fields (7)
  • failure_type Selection
    readonly=True related='notification_id.failure_type' related_sudo=True string='Error Message'
  • notification_id Many2one → mail.notification
    ondelete='cascade' required=True args: 'mail.notification'
  • partner_id Many2one → res.partner
    readonly=True related='notification_id.res_partner_id' args: 'res.partner', 'Partner'
  • partner_name Char
    readonly=True string='Recipient Name'
  • resend Boolean
    default=True string='Try Again'
  • sms_number Char
    string='Phone Number'
  • sms_resend_id Many2one → sms.resend
    required=True args: 'sms.resend'
Public methods (0)

No public methods.

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', 'Canceled')], '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 (5)
  • action_set_canceled(self)
  • action_set_error(self, failure_type)
  • action_set_outgoing(self)
  • resend_failed(self)
  • send(self, unlink_failed=False, unlink_sent=True, auto_commit=False, raise_exception=False)
    Main API method to send SMS. :param unlink_failed: unlink failed SMS after IAP feedback; :param unlink_sent: unlink sent SMS after IAP feedback; :param auto_commit: commit after each batch of SMS; :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(self, default=None)
    @api.returns('self', <expr>)
  • 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
    ondelete='cascade' args: 'mail.notification'
  • sms_uuid Char
    required=True args: 'SMS uuid'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/sms
VERSION
VERSION 2.4
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Fabien Meghazi, Aaron Bohy, Dharmraj Jhala, Christophe Monniez, Alexandre Kühn, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Sébastien Theys, Joseph Caburnay, Nikunj Ladava, Samuel Degueldre, Nasreddin Boulif (bon), Prakash Prajapati, Tiffany Chang (tic), Gorash, Philippe Wauthy, Antoine Guenet, Florian Charlier, Louis Baudoux, Abdelouahab (abla), luvi, Renaud Thiry, Julien Banken, niyasraphy, bve-odoo, Louis Wicket (wil), tsm-odoo, Maximilien (malb), Simon Genin (ges), Pierre-Yves Dufays, Sébastien Geelen (sge), Mitul Shah, Kamlesh Pathekar, FrancoisGe, Rahul Prajapati, Chong Wang (cwg), Nguyễn Đại Dương, Andrzej(pian), Eteil Djoumatchoua(etdj), Eteil Djoumatchoua (etdj), Matthieu Stockbauer, Martin Trigaux (mat), Ricardo Gomes Rodrigues, Renaud Thiry (reth)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:52
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - iap_mail
    - iap
    - web
    - base_setup
    - mail
    - bus
    - web_tour
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (16)
XML IDNameModelTypeStatus
ir_actions_server_view_form ir.actions.server.view.form.inherit.sms ir.actions.server xpath Inherits base.view_server_action_form
mail_notification_view_form mail.notification.view.form mail.notification xpath Inherits mail.mail_notification_view_form
mail_notification_view_tree mail.notification.view.tree mail.notification xpath Inherits mail.mail_notification_view_tree
mail_resend_message_view_form sms.resend.form sms.resend form New
res_config_settings_view_form res.config.settings.view.form.inherit.sms res.config.settings div Inherits base_setup.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.sms res.partner xpath Inherits base.view_partner_form
res_partner_view_search res.partner.view.search.inherit.sms res.partner xpath Inherits base.view_res_partner_filter
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.tree sms.sms tree 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.tree sms.template tree New
sms_tsms_view_form sms.sms.view.form sms.sms form New
Models touched (17)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • sms_method Selection
    compute='_compute_sms_method' help='Choose method for SMS sending:\nSMS: mass SMS\nPost as Message: log on document\nPost as Note: mass SMS with archives' readonly=False selection=[('sms', 'SMS'), ('comment', 'Post as Message'), ('note', 'Post as Note')] store=True string='Send as (SMS)'
  • 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 Text Message')]
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 (1)
  • message_format(self, format_reply=True)
    Override in order to retrieves data about SMS (recipient name and SMS status) TDE FIXME: clean the overall message_format thingy

New fields (4)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account')]
  • notification_type Selection
    ondelete={'sms': 'cascade'} selection_add=[('sms', 'SMS')]
  • sms_id Many2one → sms.sms
    index='btree_not_null' ondelete='set null' string='SMS' args: 'sms.sms'
  • sms_number Char
    groups='base.group_user' args: 'SMS Number'
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)
    @api.returns('mail.message', <expr>)
  • notify_cancel_by_type(self, notification_type)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

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'
  • mass_use_blacklist Boolean
    default=True args: 'Use blacklist'
  • 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' compute_sudo=False args: 'Recipients (Partners)'
  • recipient_single_number Char
    compute='_compute_recipient_single' compute_sudo=False args: 'Stored Recipient Number'
  • recipient_single_number_itf Char
    compute='_compute_recipient_single' 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'
Public methods (3)
  • action_send_sms(self)
  • action_send_sms_mass_now(self)
  • default_get(self, fields)
    @api.model

New fields (6)
  • can_cancel Boolean
    compute='_compute_can_cancel'
  • can_resend Boolean
    compute='_compute_can_resend'
  • has_insufficient_credit Boolean
    compute='_compute_has_insufficient_credit'
  • has_unregistered_account Boolean
    compute='_compute_has_unregistered_account'
  • mail_message_id Many2one → mail.message
    readonly=True required=True args: 'mail.message', 'Message'
  • recipient_ids One2many → sms.resend.recipient
    string='Recipients' args: 'sms.resend.recipient', 'sms_resend_id'
Public methods (4)
  • action_buy_credits(self)
  • action_cancel(self)
  • action_resend(self)
  • default_get(self, fields)
    @api.model

New fields (7)
  • failure_type Selection
    readonly=True related='notification_id.failure_type' related_sudo=True string='Error Message'
  • notification_id Many2one → mail.notification
    ondelete='cascade' required=True args: 'mail.notification'
  • partner_id Many2one → res.partner
    readonly=True related='notification_id.res_partner_id' args: 'res.partner', 'Partner'
  • partner_name Char
    readonly='True' string='Recipient Name'
  • resend Boolean
    default=True string='Try Again'
  • sms_number Char
    string='Phone Number'
  • sms_resend_id Many2one → sms.resend
    required=True args: 'sms.resend'
Public methods (0)

No public methods.

New fields (6)
  • body Text
  • failure_type Selection
    copy=False args: [('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('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'
  • state Selection
    copy=False default='outgoing' readonly=True required=True args: [('outgoing', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'SMS Status'
Public methods (5)
  • action_set_canceled(self)
  • action_set_error(self, failure_type)
  • action_set_outgoing(self)
  • resend_failed(self)
  • send(self, unlink_failed=False, unlink_sent=True, auto_commit=False, raise_exception=False)
    Main API method to send SMS. :param unlink_failed: unlink failed SMS after IAP feedback; :param unlink_sent: unlink sent SMS after IAP feedback; :param auto_commit: commit after each batch of SMS; :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(self, default=None)
    @api.returns('self', <expr>)
  • 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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/sms
VERSION
VERSION 2.2
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Thibault Francois, Lucas Perais (lpe), Barad Mahendra, Yannick Tivisse, Dharmraj Jhala, Christophe Monniez, Aurélien Warnon, Priyanka Kakadiya, Xavier-Do, Xavier Dubuc, Sébastien Theys, Julien Mougenot, Samuel Degueldre, Nasreddin Boulif (bon), Tiffany Chang (tic), yograj tandel, nounoubensebia, Kevin Baptiste, Didier (did), Florian Charlier, Abdelouahab (abla), Nicolas Bayet, Michael Mattiello (mcm), bve-odoo, Mariska Archielli (ram), maximilien(malb), Qiuyu (QHO), Munaf Khan, Krina Oza, Kamlesh Pathekar, Pratik Awasthi, Zelong Lin
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - iap_mail
    - iap
    - web
    - base_setup
    - mail
    - bus
    - web_tour
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (16)
XML IDNameModelTypeStatus
ir_actions_server_view_form ir.actions.server.view.form.inherit.sms ir.actions.server xpath Inherits base.view_server_action_form
mail_notification_view_form mail.notification.view.form mail.notification xpath Inherits mail.mail_notification_view_form
mail_notification_view_tree mail.notification.view.tree mail.notification xpath Inherits mail.mail_notification_view_tree
mail_resend_message_view_form sms.resend.form sms.resend form New
res_config_settings_view_form res.config.settings.view.form.inherit.sms res.config.settings div Inherits base_setup.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.sms res.partner xpath Inherits base.view_partner_form
res_partner_view_search res.partner.view.search.inherit.sms res.partner xpath Inherits base.view_res_partner_filter
sms_cancel sms.cancel.form sms.cancel 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.tree sms.sms tree New
sms_template_preview_form sms.template.preview.form sms.template.preview 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.tree sms.template tree New
sms_tsms_view_form sms.sms.view.form sms.sms form New
Models touched (16)

New fields (3)
  • sms_mass_keep_log Boolean
    default=True args: 'Log as Note'
  • sms_template_id Many2one → sms.template
    domain="[('model_id', '=', model_id)]" ondelete='set null' args: 'sms.template', 'SMS Template'
  • state Selection
    ondelete={'sms': 'cascade'} selection_add=[('sms', 'Send SMS Text Message')]
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' help='Has error' search='_search_has_sms_error' args: 'Has SMS error'
  • message_type Selection
    ondelete={'sms': <expr>} selection_add=[('sms', 'SMS')]
Public methods (1)
  • message_format(self, format_reply=True)
    Override in order to retrieves data about SMS (recipient name and SMS status) TDE FIXME: clean the overall message_format thingy

New fields (4)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account')]
  • notification_type Selection
    ondelete={'sms': 'cascade'} selection_add=[('sms', 'SMS')]
  • sms_id Many2one → sms.sms
    index=True ondelete='set null' string='SMS' args: 'sms.sms'
  • sms_number Char
    args: 'SMS Number'
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 (1)
  • message_post(self, *args, body='', message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • help_message Char
    compute='_compute_help_message' string='Help message'
  • model Char
    required=True string='Model'
Public methods (1)
  • action_cancel(self)

New fields (23)
  • active_domain Text
    readonly=True args: 'Active domain'
  • active_domain_count Integer
    compute='_compute_recipients_count' compute_sudo=False help='Number of records found when searching with the value in Active Domain' args: 'Active records count'
  • body Text
    compute='_compute_body' 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' 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'
  • mass_use_blacklist Boolean
    default=True args: 'Use blacklist'
  • 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' compute_sudo=False args: 'Recipients (Partners)'
  • recipient_single_number Char
    compute='_compute_recipient_single' compute_sudo=False args: 'Stored Recipient Number'
  • recipient_single_number_itf Char
    compute='_compute_recipient_single' compute_sudo=False help='UX field allowing to edit the recipient number. If changed it will be stored onto the recipient.' 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_recipients_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'
  • 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_active_domain Boolean
    args: 'Use active domain'
Public methods (4)
  • action_send_sms(self)
  • action_send_sms_mass_now(self)
  • create(self, values)
    @api.model
  • default_get(self, fields)
    @api.model

New fields (5)
  • has_cancel Boolean
    compute='_compute_has_cancel'
  • has_insufficient_credit Boolean
    compute='_compute_has_insufficient_credit'
  • has_unregistered_account Boolean
    compute='_compute_has_unregistered_account'
  • mail_message_id Many2one → mail.message
    readonly=True required=True args: 'mail.message', 'Message'
  • recipient_ids One2many → sms.resend.recipient
    string='Recipients' args: 'sms.resend.recipient', 'sms_resend_id'
Public methods (4)
  • action_buy_credits(self)
  • action_cancel(self)
  • action_resend(self)
  • default_get(self, fields)
    @api.model

New fields (7)
  • failure_type Selection
    readonly=True related='notification_id.failure_type' related_sudo=True
  • notification_id Many2one → mail.notification
    ondelete='cascade' required=True args: 'mail.notification'
  • partner_id Many2one → res.partner
    readonly=True related='notification_id.res_partner_id' args: 'res.partner', 'Partner'
  • partner_name Char
    readonly='True' args: 'Recipient'
  • resend Boolean
    default=True string='Resend'
  • sms_number Char
    args: 'Number'
  • sms_resend_id Many2one → sms.resend
    required=True args: 'sms.resend'
Public methods (0)

No public methods.

New fields (6)
  • body Text
  • failure_type Selection
    copy=False args: [('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('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'
  • state Selection
    copy=False default='outgoing' readonly=True required=True args: [('outgoing', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'SMS Status'
Public methods (5)
  • action_set_canceled(self)
  • action_set_error(self, failure_type)
  • action_set_outgoing(self)
  • resend_failed(self)
  • send(self, unlink_failed=False, unlink_sent=True, auto_commit=False, raise_exception=False)
    Main API method to send SMS. :param unlink_failed: unlink failed SMS after IAP feedback; :param unlink_sent: unlink sent SMS after IAP feedback; :param auto_commit: commit after each batch of SMS; :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(self, default=None)
    @api.returns('self', <expr>)
  • 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
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/sms
VERSION
VERSION 2.1
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Mohammed Shekha, Thibault Francois, Aaron Bohy, GitHub, Lucas Perais (lpe), Yannick Tivisse, Adrian Torres, Rémi Rahir, Priyanka Kakadiya, Xavier-Do, Victor Feyens, Xavier Dubuc, Sébastien Theys, Julien Mougenot, Jason Van Malder, fw-bot, std-odoo, Nasreddin Boulif (bon), Tiffany Chang (tic), Gorash, Kevin Baptiste, Didier (did), Abdelouahab (abla), bve-odoo, Mariska Archielli (ram), maximilien(malb), Kamlesh Pathekar, Pratik Awasthi
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - iap_mail
    - iap
    - web
    - base_setup
    - mail
    - bus
    - web_tour
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (17)
XML IDNameModelTypeStatus
assets_backend sms_assets ir.ui.view qweb Inherits web.assets_backend
ir_actions_server_view_form ir.actions.server.view.form.inherit.sms ir.actions.server xpath Inherits base.view_server_action_form
mail_notification_view_form mail.notification.view.form mail.notification xpath Inherits mail.mail_notification_view_form
mail_notification_view_tree mail.notification.view.tree mail.notification xpath Inherits mail.mail_notification_view_tree
mail_resend_message_view_form sms.resend.form sms.resend form New
qunit_suite sms_widget_tests ir.ui.view qweb Inherits web.qunit_suite_tests
res_config_settings_view_form res.config.settings.view.form.inherit.sms res.config.settings div Inherits base_setup.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.sms res.partner xpath Inherits base.view_partner_form
sms_cancel sms.cancel.form sms.cancel 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.tree sms.sms tree New
sms_template_preview_form sms.template.preview.form sms.template.preview 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.tree sms.template tree New
sms_tsms_view_form sms.sms.view.form sms.sms form New
Models touched (16)

New fields (3)
  • sms_mass_keep_log Boolean
    default=True args: 'Log as Note'
  • sms_template_id Many2one → sms.template
    domain="[('model_id', '=', model_id)]" ondelete='set null' args: 'sms.template', 'SMS Template'
  • state Selection
    ondelete={'sms': 'cascade'} selection_add=[('sms', 'Send SMS Text Message')]
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' help='Has error' search='_search_has_sms_error' args: 'Has SMS error'
  • message_type Selection
    ondelete={'sms': <expr>} selection_add=[('sms', 'SMS')]
Public methods (1)
  • message_format(self)
    Override in order to retrieves data about SMS (recipient name and SMS status) TDE FIXME: clean the overall message_format thingy

New fields (4)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account')]
  • notification_type Selection
    ondelete={'sms': 'set default'} selection_add=[('sms', 'SMS')]
  • sms_id Many2one → sms.sms
    index=True ondelete='set null' string='SMS' args: 'sms.sms'
  • sms_number Char
    args: 'SMS Number'
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 (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • help_message Char
    compute='_compute_help_message' string='Help message'
  • model Char
    required=True string='Model'
Public methods (1)
  • action_cancel(self)

New fields (23)
  • active_domain Text
    readonly=True args: 'Active domain'
  • active_domain_count Integer
    compute='_compute_recipients_count' compute_sudo=False help='Number of records found when searching with the value in Active Domain' args: 'Active records count'
  • body Text
    compute='_compute_body' 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' 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'
  • mass_use_blacklist Boolean
    default=True args: 'Use blacklist'
  • 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' compute_sudo=False args: 'Recipients (Partners)'
  • recipient_single_number Char
    compute='_compute_recipient_single' compute_sudo=False args: 'Stored Recipient Number'
  • recipient_single_number_itf Char
    compute='_compute_recipient_single' compute_sudo=False help='UX field allowing to edit the recipient number. If changed it will be stored onto the recipient.' 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_recipients_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'
  • 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_active_domain Boolean
    args: 'Use active domain'
Public methods (4)
  • action_send_sms(self)
  • action_send_sms_mass_now(self)
  • create(self, values)
    @api.model
  • default_get(self, fields)
    @api.model

New fields (5)
  • has_cancel Boolean
    compute='_compute_has_cancel'
  • has_insufficient_credit Boolean
    compute='_compute_has_insufficient_credit'
  • has_unregistered_account Boolean
    compute='_compute_has_unregistered_account'
  • mail_message_id Many2one → mail.message
    readonly=True required=True args: 'mail.message', 'Message'
  • recipient_ids One2many → sms.resend.recipient
    string='Recipients' args: 'sms.resend.recipient', 'sms_resend_id'
Public methods (4)
  • action_buy_credits(self)
  • action_cancel(self)
  • action_resend(self)
  • default_get(self, fields)
    @api.model

New fields (7)
  • failure_type Selection
    readonly=True related='notification_id.failure_type' related_sudo=True
  • notification_id Many2one → mail.notification
    ondelete='cascade' required=True args: 'mail.notification'
  • partner_id Many2one → res.partner
    readonly=True related='notification_id.res_partner_id' args: 'res.partner', 'Partner'
  • partner_name Char
    readonly='True' args: 'Recipient'
  • resend Boolean
    default=True string='Resend'
  • sms_number Char
    args: 'Number'
  • sms_resend_id Many2one → sms.resend
    required=True args: 'sms.resend'
Public methods (0)

No public methods.

New fields (6)
  • body Text
  • error_code Selection
    copy=False args: [('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_acc', 'Unregistered Account'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate')]
  • mail_message_id Many2one → mail.message
    index=True args: 'mail.message'
  • number Char
    args: 'Number'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Customer'
  • state Selection
    copy=False default='outgoing' readonly=True required=True args: [('outgoing', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'SMS Status'
Public methods (2)
  • cancel(self)
  • send(self, delete_all=False, auto_commit=False, raise_exception=False)
    Main API method to send SMS. :param delete_all: delete all SMS (sent or not); otherwise delete only sent SMS; :param auto_commit: commit after each batch of SMS; :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(self, default=None)
    @api.returns('self', <expr>)
  • 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
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/sms
VERSION
VERSION 2.0
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Thibault Francois, Aaron Bohy, Yannick Tivisse, Pierre Masereel, RomainLibert, Adrian Torres, Xavier-Do, Jason Van Malder, sri-odoo, fja-odoo, Benjamin Vray, ryv-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - iap
    - web
    - base_setup
    - mail
    - bus
    - web_tour
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (15)
XML IDNameModelTypeStatus
assets_backend sms_assets ir.ui.view qweb Inherits web.assets_backend
ir_actions_server_view_form ir.actions.server.view.form.inherit.sms ir.actions.server xpath Inherits base.view_server_action_form
mail_resend_message_view_form sms.resend.form sms.resend form New
qunit_suite sms_widget_tests ir.ui.view qweb Inherits web.qunit_suite
res_config_settings_view_form res.config.settings.view.form.inherit.sms res.config.settings div Inherits base_setup.res_config_settings_view_form
res_partner_view_form res.partner.view.form.inherit.sms res.partner xpath Inherits base.view_partner_form
sms_cancel sms.cancel.form sms.cancel 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.tree sms.sms tree New
sms_template_preview_form sms.template.preview.form sms.template.preview 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.tree sms.template tree New
sms_tsms_view_form sms.sms.view.form sms.sms form New
Models touched (16)

New fields (3)
  • sms_mass_keep_log Boolean
    default=True args: 'Log a note'
  • sms_template_id Many2one → sms.template
    domain="[('model_id', '=', model_id)]" ondelete='set null' args: 'sms.template', 'SMS Template'
  • state Selection
    selection_add=[('sms', 'Send SMS Text Message')]
Public methods (1)
  • run_action_sms_multi(self, action, eval_context=None)
    @api.model

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' help='Has error' search='_search_has_sms_error' args: 'Has SMS error'
  • message_type Selection
    selection_add=[('sms', 'SMS')]
Public methods (1)
  • message_format(self)
    Override in order to retrieves data about SMS (recipient name and SMS status) TDE FIXME: clean the overall message_format thingy

New fields (4)
  • failure_type Selection
    selection_add=[('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error')]
  • notification_type Selection
    selection_add=[('sms', 'SMS')]
  • sms_id Many2one → sms.sms
    index=True ondelete='set null' string='SMS' args: 'sms.sms'
  • sms_number Char
    args: 'SMS Number'
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 (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • help_message Char
    compute='_compute_help_message' string='Help message'
  • model Char
    required=True string='Model'
Public methods (1)
  • action_cancel(self)

New fields (20)
  • active_domain Text
    readonly=True args: 'Active domain'
  • active_domain_count Integer
    compute='_compute_recipients_count' compute_sudo=False help='UX field computing the number of recipients in mass mode based on given active domain' args: 'Active records count'
  • body Text
    required=True args: 'Message'
  • composition_mode Selection
    default='comment' required=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'
  • mass_use_blacklist Boolean
    default=True args: 'Use blacklist'
  • number_field_name Char
    string='Field holding number'
  • numbers Char
    args: 'Recipients (Numbers)'
  • partner_ids Many2many → res.partner
    args: 'res.partner'
  • recipient_count Integer
    compute='_compute_recipients' compute_sudo=False args: '# Valid recipients'
  • recipient_description Text
    compute='_compute_recipients' compute_sudo=False args: 'Recipients (Partners)'
  • recipient_invalid_count Integer
    compute='_compute_recipients' compute_sudo=False args: '# Invalid recipients'
  • res_id Integer
    args: 'Document ID'
  • res_ids Char
    args: 'Document IDs'
  • res_ids_count Integer
    compute='_compute_recipients_count' compute_sudo=False help='UX field computing the number of recipients in mass mode without active domain' args: 'Visible records count'
  • res_model Char
    args: 'Document Model Name'
  • 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_active_domain Boolean
    args: 'Use active domain'
Public methods (3)
  • action_send_sms(self)
  • action_send_sms_mass_now(self)
  • default_get(self, fields)
    @api.model

New fields (4)
  • has_cancel Boolean
    compute='_compute_has_cancel'
  • has_insufficient_credit Boolean
    compute='_compute_has_insufficient_credit'
  • mail_message_id Many2one → mail.message
    readonly=True required=True args: 'mail.message', 'Message'
  • recipient_ids One2many → sms.resend.recipient
    string='Recipients' args: 'sms.resend.recipient', 'sms_resend_id'
Public methods (4)
  • action_buy_credits(self)
  • action_cancel(self)
  • action_resend(self)
  • default_get(self, fields)
    @api.model

New fields (7)
  • failure_type Selection
    readonly=True related='notification_id.failure_type' related_sudo=True args: [('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error')]
  • notification_id Many2one → mail.notification
    ondelete='cascade' required=True args: 'mail.notification'
  • partner_id Many2one → res.partner
    readonly=True related='notification_id.res_partner_id' args: 'res.partner', 'Partner'
  • partner_name Char
    readonly='True' args: 'Recipient'
  • resend Boolean
    default=True string='Resend'
  • sms_number Char
    args: 'Number'
  • sms_resend_id Many2one → sms.resend
    required=True args: 'sms.resend'
Public methods (0)

No public methods.

New fields (6)
  • body Text
  • error_code Selection
    copy=False args: [('sms_number_missing', 'Missing Number'), ('sms_number_format', 'Wrong Number Format'), ('sms_credit', 'Insufficient Credit'), ('sms_server', 'Server Error'), ('sms_blacklist', 'Blacklisted'), ('sms_duplicate', 'Duplicate')]
  • mail_message_id Many2one → mail.message
    index=True args: 'mail.message'
  • number Char
    args: 'Number'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Customer'
  • state Selection
    copy=False default='outgoing' readonly=True required=True args: [('outgoing', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'SMS Status'
Public methods (2)
  • cancel(self)
  • send(self, delete_all=False, auto_commit=False, raise_exception=False)
    Main API method to send SMS. :param delete_all: delete all SMS (sent or not); otherwise delete only sent SMS; :param auto_commit: commit after each batch of SMS; :param raise_exception: raise if there is an issue contacting IAP;

New fields (11)
  • body Char
    required=True translate=True args: 'Body'
  • copyvalue Char
    help='Final placeholder expression, to be copy-pasted in the desired template field.' store=False args: 'Placeholder Expression'
  • lang Char
    help='Use this field to either force a specific language (ISO code) or dynamically detect the language of your recipient by a placeholder expression (e.g. ${object.partner_id.lang})' args: 'Language'
  • 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' required=True string='Applies to' args: 'ir.model'
  • model_object_field Many2one → ir.model.fields
    help='Select target field from the related document model.\nIf it is a relationship field you will be able to select a target field at the destination of the relationship.' store=False string='Field' args: 'ir.model.fields'
  • name Char
    translate=True args: 'Name'
  • null_value Char
    help='Optional value to use if the target field is empty' store=False args: 'Default Value'
  • 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'
  • sub_model_object_field Many2one → ir.model.fields
    help='When a relationship field is selected as first field, this field lets you select the target field within the destination document model (sub-model).' store=False args: 'ir.model.fields', 'Sub-field'
  • sub_object Many2one → ir.model
    help='When a relationship field is selected as first field, this field shows the document model the relationship goes to.' readonly=True store=False args: 'ir.model', 'Sub-model'
Public methods (5)
  • action_create_sidebar_action(self)
  • action_unlink_sidebar_action(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • default_get(self, fields)
    @api.model
  • unlink(self)

New fields (5)
  • lang Selection
    string='Template Preview Language' args: _selection_languages
  • model_id Many2one → ir.model
    related='sms_template_id.model_id' args: 'ir.model'
  • res_id Integer
    string='Record ID'
  • resource_ref Reference
    compute='_compute_resource_ref' inverse='_inverse_resource_ref' selection='_selection_target_model' string='Record reference'
  • sms_template_id Many2one → sms.template
    args: 'sms.template'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • on_change_resource_ref(self)
    @api.onchange('lang', 'resource_ref')
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/sms
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Christophe Simonis, Goffin Simon, GitHub, Yannick Tivisse, qsm-odoo, Rémi Rahir, Xavier-Do
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - iap
    - web
    - web_settings_dashboard
    - mail
    - base_setup
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (4)
XML IDNameModelTypeStatus
assets_backend sms_assets ir.ui.view qweb Inherits web.assets_backend
partner_form_send_sms_form_view res.partner.form.send.sms res.partner xpath Inherits base.view_partner_form
qunit_suite sms_widget_tests ir.ui.view qweb Inherits web.qunit_suite
send_sms_view_form sms_send_sms.form sms.send_sms form New
Models touched (4)

New fields (0)

No new fields.

Public methods (1)
  • message_post_send_sms(self, sms_message, numbers=None, partners=None, note_msg=None, log_error=False)
    Send an SMS text message and post an internal note in the chatter if successfull :param sms_message: plaintext message to send by sms :param partners: the numbers to send to, if none are given it will take those from partners or _get_default_sms_recipients :param partners: the recipients partners, if none are given it will take those from _get_default_sms_recipients, this argument is ignored if numbers is defined :param note_msg: message to log in the chatter, if none is given a default one containing the sms_message is logged

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • message Text
    required=True args: 'Message'
  • recipients Char
    required=True args: 'Recipients'
Public methods (2)
  • action_send_sms(self)
  • default_get(self, fields)
    @api.model
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/sms
VERSION
VERSION 0.1.0
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Antony Lesuisse, Olivier Dony, Thibault Delavallée, xmo-odoo, Jeremy Kersten, Rémi Rahir
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - iap
    - web
    - mail
    - base_setup
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (4)
XML IDNameModelTypeStatus
assets_backend sms_assets ir.ui.view qweb Inherits web.assets_backend
partner_form_send_sms_form_view res.partner.form.send.sms res.partner xpath Inherits base.view_partner_form
qunit_suite sms_widget_tests ir.ui.view qweb Inherits web.qunit_suite
send_sms_view_form sms_send_sms.form sms.send_sms form New
Models touched (4)

New fields (0)

No new fields.

Public methods (1)
  • message_post_send_sms(self, sms_message, numbers=None, partners=None, note_msg=None, log_error=False)
    Send an SMS text message and post an internal note in the chatter if successfull :param sms_message: plaintext message to send by sms :param partners: the numbers to send to, if none are given it will take those from partners or _get_default_sms_recipients :param partners: the recipients partners, if none are given it will take those from _get_default_sms_recipients, this argument is ignored if numbers is defined :param note_msg: message to log in the chatter, if none is given a default one containing the sms_message is logged

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • message Text
    required=True args: 'Message'
  • recipients Char
    required=True args: 'Recipients'
Public methods (2)
  • action_send_sms(self)
  • default_get(self, fields)
    @api.model