TIP: You can type at any time to perform a new search.
SMS gateway
sms · odoo/odoo
🛠 Migration considerations
- Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `DELETE FROM sms_sms WHERE to_delete = TRUE` - re-check the table/column names still match after upgrading. migration-raw-sql-write · source
Found by automated static analysis: patterns worth a look before/after upgrading this module to a newer Odoo version.
- Repository
- odoo/odoo · module folder
- Module version
- 3.0
- Category
- Sales/Sales
- Folder size
- 3.38 MB
- License
- LGPL-3
- Application
- No
- Auto-installable
- Yes
- Website
- None
- Last tracking update
- 2026-08-19 10:15:33
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Aaron Bohy, Alexandre Kühn, Julien Castiaux, Sébastien Theys, Julien Mougenot, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Florian Charlier, Louis Baudoux, luvi, Renaud Thiry, David, alsh-odoo, Maximilien (malb), Victor Piryns (pivi), Pierre-Yves Dufays, Dylan Kiss (dyki), Bruno Boi, nihp-odoo, yagp-odoo, Ricardo Gomes Rodrigues, Anton Romanova (roan), Corentin Heinix (cohe), Renaud Thiry (reth), Thomas Josse (THJO), Krzysztof Magusiak (krma), Basioni (basm), Kadam Darji, ELCO, jsum-odoo, Heshmatkhah - Office, chpa-odoo, Joseph Nechleba (jonec)
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- account_payment_notification, base_automation, calendar_sms, crm_sms, event_sms, hr_presence, hr_recruitment_sms, mass_mailing_event_sms, mass_mailing_event_track_sms, mass_mailing_sms, pos_sms, project_sms, sale_sms, sms_twilio, stock_sms, test_mail_full, test_mail_sms, website_sms
- Description
This module gives a framework for SMS text messaging ---------------------------------------------------- The service is provided by the In App Purchase Odoo platform.
Code Analysis ⓘ
Views touched (18)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
iap_account_view_form |
iap.account.view.form | iap.account | form | Inherits iap.iap_account_view_form |
ir_actions_server_view_form |
ir.actions.server.view.form.inherit.sms | ir.actions.server | form | Inherits base.view_server_action_form |
mail_notification_view_form |
mail.notification.view.form | mail.notification | form | Inherits mail.mail_notification_view_form |
mail_notification_view_tree |
mail.notification.view.list | mail.notification | list | Inherits mail.mail_notification_view_tree |
res_config_settings_view_form |
res.config.settings.view.form.inherit.sms | res.config.settings | form | Inherits base_setup.res_config_settings_view_form |
res_partner_view_form |
res.partner.view.form.inherit.sms | res.partner | form | Inherits base.view_partner_form |
sms_account_code_view_form |
sms.account.code.view.form | sms.account.code | form | New |
sms_account_phone_view_form |
sms.account.phone.view.form | sms.account.phone | form | New |
sms_account_sender_view_form |
sms.account.sender.view.form | sms.account.sender | form | New |
sms_composer_view_form |
sms.composer.view.form | sms.composer | form | New |
sms_sms_view_search |
sms.sms.view.search | sms.sms | search | New |
sms_sms_view_tree |
sms.sms.view.list | sms.sms | list | New |
sms_template_preview_form |
sms.template.preview.form | sms.template.preview | form | New |
sms_template_reset_view_form |
sms.template.reset.view.form | sms.template.reset | form | New |
sms_template_view_form |
sms.template.view.form | sms.template | form | New |
sms_template_view_search |
sms.template.view.search | sms.template | search | New |
sms_template_view_tree |
sms.template.view.list | sms.template | list | New |
sms_tsms_view_form |
sms.sms.view.form | sms.sms | form | New |
HTTP endpoints (1)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/sms/status |
SmsController.update_sms_status |
public | jsonrpc | ALL | sudo |
Models touched (18)
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (1)
-
sender_nameCharhelp='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)
New fields (3)
-
sms_methodSelectioncompute='_compute_sms_method'readonly=Falseselection=[('sms', 'SMS (without note)'), ('comment', 'SMS (with note)'), ('note', 'Note only')]store=Truestring='Send SMS As' -
sms_template_idMany2one → sms.templatecompute='_compute_sms_template_id'domain="[('model_id', '=', model_id)]"ondelete='set null'readonly=Falsestore=True args: 'sms.template', 'SMS Template' -
stateSelectionondelete={'sms': 'cascade'}selection_add=[('sms', 'Send SMS'), ('followers')]
No public methods.
New fields (1)
-
is_mail_thread_smsBooleancompute='_compute_is_mail_thread_sms'default=Falsehelp='Whether this model supports messages and notifications through SMS'search='_search_is_mail_thread_sms'store=Falsestring='Mail Thread SMS'
No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (2)
-
has_sms_errorBooleancompute='_compute_has_sms_error'search='_search_has_sms_error' args: 'Has SMS error' -
message_typeSelectionondelete={'sms': <expr>}selection_add=[('sms', 'SMS')]
No public methods.
New fields (6)
-
failure_typeSelectionselection_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_typeSelectionondelete={'sms': 'cascade'}selection_add=[('sms', 'SMS')] -
sms_idMany2one → sms.smscompute='_compute_sms_id'store=Falsestring='SMS' args: 'sms.sms' -
sms_id_intIntegerindex='btree_not_null' args: 'SMS ID' -
sms_numberChargroups='base.group_user' args: 'SMS Number' -
sms_tracker_idsOne2many → sms.trackerstring='SMS Trackers' args: 'sms.tracker', 'mail_notification_id'
No public methods.
New fields (1)
-
message_has_sms_errorBooleancompute='_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)@api.model
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (2)
-
account_idMany2one → iap.accountrequired=True args: 'iap.account' -
verification_codeCharrequired=True
-
action_register(self)
New fields (2)
-
account_idMany2one → iap.accountrequired=True args: 'iap.account' -
phone_numberCharrequired=True
-
action_send_verification_code(self)
New fields (2)
-
account_idMany2one → iap.accountrequired=True args: 'iap.account' -
sender_nameChar
-
action_set_sender_name(self)
New fields (21)
-
bodyTextcompute='_compute_body'precompute=Truereadonly=Falserequired=Truestore=True args: 'Message' -
comment_single_recipientBooleancompute='_compute_comment_single_recipient'compute_sudo=Falsehelp='Indicates if the SMS composer targets a single specific recipient' args: 'Single Mode' -
composition_modeSelectioncompute='_compute_composition_mode'precompute=Truereadonly=Falserequired=Truestore=Truestring='Composition Mode' args: [('numbers', 'Send to numbers'), ('comment', 'Post on a document'), ('mass', 'Send SMS in batch')] -
mass_force_sendBooleandefault=False args: 'Send directly' -
mass_keep_logBooleandefault=True args: 'Keep a note on document' -
number_field_nameCharargs: 'Number Field' -
numbersCharargs: 'Recipients (Numbers)' -
recipient_invalid_countIntegercompute='_compute_recipients'compute_sudo=False args: '# Invalid recipients' -
recipient_single_descriptionTextcompute='_compute_recipient_single_non_stored'compute_sudo=False args: 'Recipients (Partners)' -
recipient_single_numberCharcompute='_compute_recipient_single_non_stored'compute_sudo=False args: 'Stored Recipient Number' -
recipient_single_number_itfCharcompute='_compute_recipient_single_stored'compute_sudo=Falsehelp="Phone number of the recipient. If changed, it will be recorded on recipient's profile."readonly=Falsestore=True args: 'Recipient Number' -
recipient_single_validBooleancompute='_compute_recipient_single_valid'compute_sudo=False args: 'Is valid' -
recipient_valid_countIntegercompute='_compute_recipients'compute_sudo=False args: '# Valid recipients' -
res_idIntegerargs: 'Document ID' -
res_idsCharargs: 'Document IDs' -
res_ids_countIntegercompute='_compute_res_ids_count'compute_sudo=Falsehelp='Number of recipients that will receive the SMS if sent in mass mode, without applying the Active Domain value' args: 'Visible records count' -
res_modelCharargs: 'Document Model Name' -
res_model_descriptionCharcompute='_compute_res_model_description' args: 'Document Model Description' -
sanitized_numbersCharcompute='_compute_sanitized_numbers'compute_sudo=False args: 'Sanitized Number' -
template_idMany2one → sms.templatedomain="[('model', '=', res_model)]"string='Use Template' args: 'sms.template' -
use_exclusion_listBooleancopy=Falsedefault=Truehelp='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)@api.model
New fields (9)
-
bodyText -
failure_typeSelectioncopy=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_idMany2one → mail.messageindex=True args: 'mail.message' -
numberCharargs: 'Number' -
partner_idMany2one → res.partnerargs: 'res.partner', 'Customer' -
sms_tracker_idMany2one → sms.trackercompute='_compute_sms_tracker_id'string='SMS trackers' args: 'sms.tracker' -
stateSelectioncopy=Falsedefault='outgoing'readonly=Truerequired=True args: [('outgoing', 'In Queue'), ('process', 'Processing'), ('pending', 'Sent'), ('sent', 'Delivered'), ('error', 'Error'), ('canceled', 'Cancelled')], 'SMS Status' -
to_deleteBooleandefault=Falsehelp='Will automatically be deleted, while notifications will not be deleted in any case.' args: 'Marked for deletion' -
uuidCharcopy=Falsedefault=<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)@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)
-
bodyCharrequired=Truetranslate=True args: 'Body' -
modelCharindex=Truereadonly=Truerelated='model_id.model'store=True args: 'Related Document Model' -
model_idMany2one → ir.modeldomain=['&', ('is_mail_thread_sms', '=', True), ('transient', '=', False)]help='The type of document this template can be used with'ondelete='cascade'required=Truestring='Applies to' args: 'ir.model' -
nameChartranslate=True args: 'Name' -
sidebar_action_idMany2one → ir.actions.act_windowcopy=Falsehelp='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)@api.model -
unlink(self)
New fields (6)
-
bodyCharcompute='_compute_sms_template_fields' args: 'Body' -
langSelectionstring='Template Preview Language' args: _selection_languages -
model_idMany2one → ir.modelrelated='sms_template_id.model_id' args: 'ir.model' -
no_recordBooleancompute='_compute_no_record' args: 'No Record' -
resource_refReferenceselection='_selection_target_model'string='Record reference' -
sms_template_idMany2one → sms.templateondelete='cascade'required=True args: 'sms.template'
-
default_get(self, fields)@api.model
New fields (1)
-
template_idsMany2many → sms.templateargs: 'sms.template'
-
reset_template(self)
New fields (2)
-
mail_notification_idMany2one → mail.notificationindex='btree_not_null'ondelete='cascade' args: 'mail.notification' -
sms_uuidCharrequired=True args: 'SMS uuid'
No public methods.
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…