Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
228 changes: 228 additions & 0 deletions usability_api_connector/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
=========================
Usability - API Connector
=========================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:3b395dc9128b2117c3f81eee9443ce16ff816c3c80fc798f35ac9779a9635af2
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-ecosoft--odoo%2Fecosoft--addons-lightgray.png?logo=github
:target: https://github.com/ecosoft-odoo/ecosoft-addons/tree/18.0/usability_api_connector
:alt: ecosoft-odoo/ecosoft-addons

|badge1| |badge2| |badge3|

This module is base webhooks standard and keep all log that interface

Step to see logs:

1. Go to Settings > Technical > API Configuration > API Logs
2. this table will keep all log that interface '/api/create_data' or '/api/create_update_data'
3. Users can used this table for test API by click 'Update API'

**Table of contents**

.. contents::
:local:

Usage
=====

Before sending a REST API request to Odoo, an initial call to authenticate the API is necessary.
You can achieve this by calling the ``/web/session/authenticate`` route.

The authentication format requires a header with ``Content-type`` set to ``application/json``,
and the body should include:

.. code-block:: python

{
"jsonrpc": "2.0",
"method": "call",
"params": {
"db": "<db_name>",
"login": "<username>",
"password": "<password>"
}
}

Following successful authentication, you can proceed with five API routes:

1. ``/api/create_data``: This route allows the creation of new data only.
The format for creating data should be in the following structure:

.. code-block:: python

{
"params": {
"model": "<model name>",
"vals": {
"payload": {
"field1": "value1",
...
},
"result_field": ["field1", ...] # optional
}
}
}

2. ``/api/create_update_data``: This route facilitates updating data.
If the data does not exist, it will automatically create it.
The format follows that of ``create_data``, but it requires a unique key in the field to update the values.

.. code-block:: python

{
"params": {
"model": "<model name>",
"vals": {
"search_key": {
"<key_field>": "value", # can be ID or name search string
},
"payload": {
"field1": "value1",
...
},
"result_field": ["field1", ...] # optional
}
}
}

3. ``/api/update_data``: This route allows updating existing data,
using a unique key in the field to find the desired data and update values in that recordset.

.. code-block:: python

{
"params": {
"model": "<model name>",
"vals": {
"search_key": {
"<key_field>": "value", # can be ID or name search string
},
"payload": {
"field1": "value1",
...
}
}
}
}

4. ``/api/search_data``: This route allows you to search for the value of a desired field in a model
by using a search domain to find the desired recordset. You can also limit and order the resulting data.

.. code-block:: python

{
"params": {
"model": "<model name>",
"vals": {
"payload": {
"search_field": ["field1", "field2", "field3{subfield1, subfield2}", ...],
"search_domain": "[('field', 'operator', 'value')]",
"limit": 1,
"order": "field1 , field2 desc, ..."
}
}
}
}

5. ``/api/call_function``: This route allows you to call a function on a model object based on the provided input.

**Parameters**:
- **name** (*str*): The name of the model to perform the function on.
- **method** (*str*): The name of the function to call.
- **parameter** (*dict*): A dictionary containing the arguments to pass to the function (if any).

.. code-block:: python

{
"params": {
"model": "<model name>",
"vals": {
"search_key": {
"<key_field>": "value", # can be ID or name search string
},
"payload": {
"method": "<method>",
"parameter": {"<key>": "<value>", ...}
}
}
}
}

**Note**:
If you want to attach a file to a record, you can add the key "attachment_ids" at any level of the payload.

**Example Request with Attachment**:

.. code-block:: python

{
"params": {
"model": "<model name>",
"vals": {
"search_key": {
"<key_field>": "value", # can be ID or name search string
},
"payload": {
"attachment_ids": [
{
"name": "<file_name>",
"datas": "<base64_encoded_data>"
}
],
...
}
}
}
}

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/ecosoft-odoo/ecosoft-addons/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/ecosoft-odoo/ecosoft-addons/issues/new?body=module:%20usability_api_connector%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
~~~~~~~

* Ecosoft

Contributors
~~~~~~~~~~~~

* Kitti Upariphutthiphong <[email protected]>
* Saran Lim. <[email protected]>

Maintainers
~~~~~~~~~~~

.. |maintainer-Saran440| image:: https://github.com/Saran440.png?size=40px
:target: https://github.com/Saran440
:alt: Saran440

Current maintainer:

|maintainer-Saran440|

This module is part of the `ecosoft-odoo/ecosoft-addons <https://github.com/ecosoft-odoo/ecosoft-addons/tree/18.0/usability_api_connector>`_ project on GitHub.

You are welcome to contribute.
3 changes: 3 additions & 0 deletions usability_api_connector/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import models
17 changes: 17 additions & 0 deletions usability_api_connector/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copyright 2022 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "Usability - API Connector",
"version": "18.0.1.0.0",
"license": "AGPL-3",
"category": "Tools",
"author": "Ecosoft, Odoo Community Association (OCA)",
"website": "https://github.com/ecosoft-odoo/ecosoft-addons",
"depends": ["base", "mail", "account"],
"data": [
"security/ir.model.access.csv",
"views/api_config_views.xml",
],
"maintainers": ["Saran440"],
}
4 changes: 4 additions & 0 deletions usability_api_connector/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import common_base_api
from . import api_config
67 changes: 67 additions & 0 deletions usability_api_connector/models/api_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Copyright 2025 Ecosoft Co., Ltd. (https://ecosoft.co.th)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).

from odoo import fields, models


class ApiConfig(models.Model):
_name = "api.config"
_inherit = "common.base.api" # For test api
_description = "API Configuration"

name = fields.Char(required=True, translate=True)
code = fields.Char()
api_type = fields.Selection(
selection=[
("xmlrpc", "XML-RPC"),
("rest_api", "Rest API"),
],
string="API Type",
required=True,
)
description = fields.Char()
model_id = fields.Many2one(
comodel_name="ir.model",
ondelete="cascade",
)
endpoint_system = fields.Selection(
selection=[("odoo", "Odoo")],
)
endpoint_url = fields.Char(string="Endpoint URL")
callback_url = fields.Char(string="Callback URL")
disable_ssl = fields.Boolean(
string="Disable SSL Verification",
help="Disable SSL verification for API calls",
)
route_path = fields.Char()
method = fields.Selection(
selection=[
("get", "GET"),
("post", "POST"),
("put", "PUT"),
("delete", "DELETE"),
]
)
active = fields.Boolean(default=True)
auth_required = fields.Boolean()
auth_username = fields.Char(string="Username")
auth_password = fields.Char(string="Password")
auth_db = fields.Char(string="Database")
auth_token = fields.Char()

# XML-RPC
execute_model = fields.Char()
execute_method = fields.Char()
execute_context = fields.Char(default='{"context": {}}')

# Rest API
headers = fields.Text()

# Python code
python_code = fields.Text(
help="Write Python code that the action will execute. Some variables are "
"available for use; help about python expression is given in the help tab."
)

def action_test_call_api(self):
return self.action_call_api(self.code)
Loading