Mercado Libre Connector
connector_mercadolibre · OCA/connector-mercadolibre
-
Security19/252 minor findings
-
Activity25/25Human commit this month
-
Required by5/250 modules depend on it
-
Maturity5/25In 1 Odoo series since 19.0
Heuristic over the facts below, not an audit · How it's computed
Migration considerations
- Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `SELECT id FROM mercadolibre_backend WHERE id = %s FOR UPDATE` - re-check the table/column names still match after upgrading. migration-raw-sql-write · source
Migration review checklist, not a compatibility verdict. "Migrating to X.0" applies once you upgrade to that version; "Since X.0" means this version already ignores or rejects that code. Methodology
Description
Connect an Odoo company to a Mercado Libre seller account.
This is the core of the connector. It stores the seller backend, authorizes the
application with OAuth 2.0, refreshes access tokens, and receives Mercado Libre
notifications. Listing, stock, and sale synchronization live in
connector_mercadolibre_product and connector_mercadolibre_sale.
A notification is stored and acknowledged in the HTTP request. The work runs afterwards in an OCA queue job.
Dependencies
Code analysis
Extracted from the source by best-effort static analysis (no code is executed); details may be incomplete.
Views touched 6
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
mercadolibre_backend_view_form |
mercadolibre.backend.form | mercadolibre.backend | form | New |
mercadolibre_backend_view_list |
mercadolibre.backend.list | mercadolibre.backend | list | New |
mercadolibre_backend_view_search |
mercadolibre.backend.search | mercadolibre.backend | search | New |
mercadolibre_notification_view_form |
mercadolibre.notification.form | mercadolibre.notification | form | New |
mercadolibre_notification_view_list |
mercadolibre.notification.list | mercadolibre.notification | list | New |
mercadolibre_notification_view_search |
mercadolibre.notification.search | mercadolibre.notification | search | New |
HTTP endpoints 2
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/mercadolibre/notification/<int:backend_id> |
MercadoLibreController.notification |
public | http | GET, POST | csrf off sudo |
/mercadolibre/oauth/callback |
MercadoLibreController.oauth_callback |
user | http | GET | csrf off |
Models touched 3
-
access_tokenCharcopy=Falsegroups='connector_mercadolibre.group_mercadolibre_manager' -
access_token_expires_atDatetimecopy=False -
activeBooleandefault=True -
auth_errorTextcopy=Falsereadonly=True -
client_idCharrequired=Truestring='Client ID' -
client_secretCharcopy=Falsegroups='connector_mercadolibre.group_mercadolibre_manager'required=True -
code_verifierCharcopy=Falsegroups='connector_mercadolibre.group_mercadolibre_manager' -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>index=Truerequired=True -
nameCharrequired=True -
nicknameCharcopy=Falsereadonly=True -
notification_countIntegercompute='_compute_notification_count' -
notification_idsOne2many → mercadolibre.notificationcomodel_name='mercadolibre.notification'inverse_name='backend_id' -
redirect_uriCharrequired=True -
refresh_tokenCharcopy=Falsegroups='connector_mercadolibre.group_mercadolibre_manager' -
seller_idCharcopy=Falseindex=Truereadonly=Truestring='Seller ID' -
site_idSelectionrequired=Trueselection='_select_sites' -
stateSelectiondefault='draft'required=Trueselection=[('draft', 'Draft'), ('connected', 'Connected'), ('error', 'Error')]tracking=True -
user_payloadJsoncopy=Falsegroups='connector_mercadolibre.group_mercadolibre_manager'readonly=True -
versionsSelectiondefault='user_product'required=Trueselection='_select_versions'
-
action_view_notifications(self) -
button_connect(self) -
button_disconnect(self) -
button_refresh_token(self) -
cron_refresh_tokens(self)@api.model -
write(self, vals)
-
error_messageTextreadonly=True -
stateSelectiondefault='pending'index=Truerequired=Trueselection=[('pending', 'Pending'), ('synced', 'Synced'), ('error', 'Error')]
-
button_retry(self)Reset the binding. Concrete models enqueue the next job. -
mark_error(self, message) -
mark_synced(self)
-
actionsChar -
application_idChar -
attemptsInteger -
backend_idMany2one → mercadolibre.backendcomodel_name='mercadolibre.backend'index=Trueondelete='cascade'required=True -
company_idMany2one → res.companycomodel_name='res.company'index=Truerelated='backend_id.company_id'store=True -
error_messageTextreadonly=True -
payloadJson -
resourceCharrequired=True -
sentDatetime -
stateSelectiondefault='received'index=Truerequired=Trueselection=[('received', 'Received'), ('enqueued', 'Enqueued'), ('done', 'Done'), ('skipped', 'Skipped'), ('error', 'Error')] -
topicCharindex=Truerequired=True -
user_idCharstring='Mercado Libre User'
-
button_requeue(self) -
create_from_payload(self, backend, payload)@api.model -
receive(self, backend_id, payload)@api.modelStore a callback. This method does not call Mercado Libre.