| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/19.0/sms |
| VERSION | |
| VERSION | 3.0 |
| CATEGORY | |
| CATEGORY | Sales/Sales |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | Yes |
| AUTHORS | |
| AUTHORS | Odoo S.A. |
| MAINTAINERS | |
| MAINTAINERS | Odoo S.A. |
| COMMITTERS | |
| COMMITTERS | Raphael 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 UPDATE | 2026-07-06 01:51:45 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - iap_mail - iap - web - base_setup - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (0)No public methods.
sender_name
Char
help='This is the name that will be displayed as the sender of the SMS.'
readonly=True
action_open_registration_wizard(self)
action_open_sender_name_wizard(self)
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')]
No public methods.
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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')]
No public methods.
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'
No public methods.
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'
message_post(self, *args, body='', message_type='notification', **kwargs)
notify_cancel_by_type(self, notification_type)
No new fields.
Public methods (0)No public methods.
account_id
Many2one → iap.account
required=True
args: 'iap.account'
verification_code
Char
required=True
action_register(self)
account_id
Many2one → iap.account
required=True
args: 'iap.account'
phone_number
Char
required=True
action_send_verification_code(self)
account_id
Many2one → iap.account
required=True
args: 'iap.account'
sender_name
Char
action_set_sender_name(self)
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
numbers
Char
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
res_ids
Char
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
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'
action_send_sms(self)
action_send_sms_mass_now(self)
default_get(self, fields)
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
partner_id
Many2one → res.partner
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'
action_set_canceled(self)
action_set_error(self, failure_type)
action_set_outgoing(self)
create(self, vals_list)
resend_failed(self)
send(self, unlink_failed=False, unlink_sent=True, raise_exception=False)
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'
action_create_sidebar_action(self)
action_unlink_sidebar_action(self)
copy_data(self, default=None)
default_get(self, fields)
unlink(self)
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'
default_get(self, fields)
template_ids
Many2many → sms.template
reset_template(self)
mail_notification_id
Many2one → mail.notification
index='btree_not_null'
ondelete='cascade'
args: 'mail.notification'
sms_uuid
Char
required=True
args: 'SMS uuid'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/18.0/sms |
| VERSION | |
| VERSION | 3.0 |
| CATEGORY | |
| CATEGORY | Hidden/Tools |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | Yes |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael 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 UPDATE | 2026-07-06 01:25:58 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - iap_mail - iap - web - base_setup - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (0)No public methods.
sender_name
Char
help='This is the name that will be displayed as the sender of the SMS.'
readonly=True
action_open_registration_wizard(self)
action_open_sender_name_wizard(self)
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')]
No public methods.
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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')]
No public methods.
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'
No public methods.
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'
message_post(self, *args, body='', message_type='notification', **kwargs)
notify_cancel_by_type(self, notification_type)
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
account_id
Many2one → iap.account
required=True
args: 'iap.account'
verification_code
Char
required=True
action_register(self)
account_id
Many2one → iap.account
required=True
args: 'iap.account'
phone_number
Char
required=True
action_send_verification_code(self)
account_id
Many2one → iap.account
required=True
args: 'iap.account'
sender_name
Char
action_set_sender_name(self)
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
numbers
Char
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
res_ids
Char
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
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'
action_send_sms(self)
action_send_sms_mass_now(self)
default_get(self, fields)
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'
action_buy_credits(self)
action_cancel(self)
action_resend(self)
default_get(self, fields)
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'
No public methods.
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
partner_id
Many2one → res.partner
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'
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)
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'
action_create_sidebar_action(self)
action_unlink_sidebar_action(self)
copy_data(self, default=None)
default_get(self, fields)
unlink(self)
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'
default_get(self, fields)
template_ids
Many2many → sms.template
reset_template(self)
mail_notification_id
Many2one → mail.notification
ondelete='cascade'
args: 'mail.notification'
sms_uuid
Char
required=True
args: 'SMS uuid'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/17.0/sms |
| VERSION | |
| VERSION | 3.0 |
| CATEGORY | |
| CATEGORY | Hidden/Tools |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | Yes |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael 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 UPDATE | 2026-07-06 01:02:09 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - iap_mail - iap - web - base_setup - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (0)No public methods.
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')]
No public methods.
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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')]
message_format(self, format_reply=True, msg_vals=None)
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'
No public methods.
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'
message_post(self, *args, body='', message_type='notification', **kwargs)
notify_cancel_by_type(self, notification_type)
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
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
numbers
Char
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
res_ids
Char
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
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'
action_send_sms(self)
action_send_sms_mass_now(self)
default_get(self, fields)
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'
action_buy_credits(self)
action_cancel(self)
action_resend(self)
default_get(self, fields)
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'
No public methods.
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
partner_id
Many2one → res.partner
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'
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)
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'
action_create_sidebar_action(self)
action_unlink_sidebar_action(self)
copy(self, default=None)
default_get(self, fields)
unlink(self)
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'
default_get(self, fields)
template_ids
Many2many → sms.template
reset_template(self)
mail_notification_id
Many2one → mail.notification
ondelete='cascade'
args: 'mail.notification'
sms_uuid
Char
required=True
args: 'SMS uuid'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/16.0/sms |
| VERSION | |
| VERSION | 2.4 |
| CATEGORY | |
| CATEGORY | Hidden/Tools |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | Yes |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael 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 UPDATE | 2026-07-06 00:40:52 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - iap_mail - iap - web - base_setup - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (0)No public methods.
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')]
No public methods.
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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')]
message_format(self, format_reply=True)
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'
No public methods.
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'
message_post(self, *args, body='', message_type='notification', **kwargs)
notify_cancel_by_type(self, notification_type)
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
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
numbers
Char
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
res_ids
Char
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
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'
action_send_sms(self)
action_send_sms_mass_now(self)
default_get(self, fields)
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'
action_buy_credits(self)
action_cancel(self)
action_resend(self)
default_get(self, fields)
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'
No public methods.
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
partner_id
Many2one → res.partner
state
Selection
copy=False
default='outgoing'
readonly=True
required=True
args: [('outgoing', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'SMS Status'
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)
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'
action_create_sidebar_action(self)
action_unlink_sidebar_action(self)
copy(self, default=None)
default_get(self, fields)
unlink(self)
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'
default_get(self, fields)
template_ids
Many2many → sms.template
reset_template(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/15.0/sms |
| VERSION | |
| VERSION | 2.2 |
| CATEGORY | |
| CATEGORY | Hidden/Tools |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | Yes |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Odoo 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 UPDATE | 2026-07-06 00:25:29 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - iap_mail - iap - web - base_setup - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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')]
No public methods.
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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')]
message_format(self, format_reply=True)
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
No public methods.
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'
message_post(self, *args, body='', message_type='notification', **kwargs)
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
help_message
Char
compute='_compute_help_message'
string='Help message'
model
Char
required=True
string='Model'
action_cancel(self)
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
numbers
Char
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
res_ids
Char
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
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
action_send_sms(self)
action_send_sms_mass_now(self)
create(self, values)
default_get(self, fields)
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'
action_buy_credits(self)
action_cancel(self)
action_resend(self)
default_get(self, fields)
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
sms_resend_id
Many2one → sms.resend
required=True
args: 'sms.resend'
No public methods.
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
partner_id
Many2one → res.partner
state
Selection
copy=False
default='outgoing'
readonly=True
required=True
args: [('outgoing', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'SMS Status'
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)
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'
action_create_sidebar_action(self)
action_unlink_sidebar_action(self)
copy(self, default=None)
default_get(self, fields)
unlink(self)
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'
default_get(self, fields)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/14.0/sms |
| VERSION | |
| VERSION | 2.1 |
| CATEGORY | |
| CATEGORY | Hidden/Tools |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | Yes |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael 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 UPDATE | 2026-07-06 00:14:30 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - iap_mail - iap - web - base_setup - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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')]
No public methods.
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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')]
message_format(self)
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
No public methods.
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'
No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
help_message
Char
compute='_compute_help_message'
string='Help message'
model
Char
required=True
string='Model'
action_cancel(self)
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
numbers
Char
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
res_ids
Char
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
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
action_send_sms(self)
action_send_sms_mass_now(self)
create(self, values)
default_get(self, fields)
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'
action_buy_credits(self)
action_cancel(self)
action_resend(self)
default_get(self, fields)
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
sms_resend_id
Many2one → sms.resend
required=True
args: 'sms.resend'
No public methods.
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
partner_id
Many2one → res.partner
state
Selection
copy=False
default='outgoing'
readonly=True
required=True
args: [('outgoing', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'SMS Status'
cancel(self)
send(self, delete_all=False, auto_commit=False, raise_exception=False)
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'
action_create_sidebar_action(self)
action_unlink_sidebar_action(self)
copy(self, default=None)
default_get(self, fields)
unlink(self)
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'
default_get(self, fields)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/13.0/sms |
| VERSION | |
| VERSION | 2.0 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | Yes |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael 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 UPDATE | 2026-07-06 00:06:43 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - iap - web - base_setup - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
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')]
run_action_sms_multi(self, action, eval_context=None)
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'
No public methods.
No new fields.
Public methods (0)No public methods.
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')]
message_format(self)
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
No public methods.
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'
No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
help_message
Char
compute='_compute_help_message'
string='Help message'
model
Char
required=True
string='Model'
action_cancel(self)
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
partner_ids
Many2many → 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
res_ids
Char
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
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
action_send_sms(self)
action_send_sms_mass_now(self)
default_get(self, fields)
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'
action_buy_credits(self)
action_cancel(self)
action_resend(self)
default_get(self, fields)
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
sms_resend_id
Many2one → sms.resend
required=True
args: 'sms.resend'
No public methods.
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
partner_id
Many2one → res.partner
state
Selection
copy=False
default='outgoing'
readonly=True
required=True
args: [('outgoing', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'SMS Status'
cancel(self)
send(self, delete_all=False, auto_commit=False, raise_exception=False)
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'
action_create_sidebar_action(self)
action_unlink_sidebar_action(self)
copy(self, default=None)
default_get(self, fields)
unlink(self)
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
default_get(self, fields)
on_change_resource_ref(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/12.0/sms |
| VERSION | |
| VERSION | 0.1.0 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | Yes |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Odoo 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 UPDATE | 2026-07-05 23:57:01 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - iap - web - web_settings_dashboard - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (1)message_post_send_sms(self, sms_message, numbers=None, partners=None, note_msg=None, log_error=False)
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
message
Text
required=True
args: 'Message'
recipients
Char
required=True
args: 'Recipients'
action_send_sms(self)
default_get(self, fields)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/11.0/sms |
| VERSION | |
| VERSION | 0.1.0 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | Yes |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Odoo 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 UPDATE | 2026-07-05 23:53:43 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - iap - web - 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (1)message_post_send_sms(self, sms_message, numbers=None, partners=None, note_msg=None, log_error=False)
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
message
Text
required=True
args: 'Message'
recipients
Char
required=True
args: 'Recipients'
action_send_sms(self)
default_get(self, fields)