Skip to content

Commit

Permalink
[3875][ADD] base_api_connection (#132)
Browse files Browse the repository at this point in the history
[ADD] base_api_connection
  • Loading branch information
AungKoKoLin1997 authored Jun 13, 2024
1 parent 234aecb commit 3aad901
Show file tree
Hide file tree
Showing 13 changed files with 644 additions and 0 deletions.
58 changes: 58 additions & 0 deletions base_api_connection/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
===================
Base API Connection
===================

.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-qrtl%2Faxls--oca-lightgray.png?logo=github
:target: https://github.com/qrtl/axls-oca/tree/16.0/base_api_connection
:alt: qrtl/axls-oca

|badge1| |badge2| |badge3|

This module facilitates API connections between Odoo and other web services. It is not usable on its own; rather, it is a low-level module intended to serve as a base for others. An example of such a module is 'project_task_capture'.

**Table of contents**

.. contents::
:local:

Configuration
=============

1. Go to Settings > API Connection > API Configuration.
2. Create an API configuration record with 'base_url', 'header_api_key_string', 'code', and 'x_api_key'.

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

Bugs are tracked on `GitHub Issues <https://github.com/qrtl/axls-oca/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/qrtl/axls-oca/issues/new?body=module:%20base_api_connection%0Aversion:%2016.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
~~~~~~~

* Quartile Limited

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

This module is part of the `qrtl/axls-oca <https://github.com/qrtl/axls-oca/tree/16.0/base_api_connection>`_ project on GitHub.

You are welcome to contribute.
1 change: 1 addition & 0 deletions base_api_connection/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
16 changes: 16 additions & 0 deletions base_api_connection/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Copyright 2023 Quartile Limited
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
{
"name": "Base API Connection",
"version": "16.0.1.0.0",
"category": "API",
"website": "https://www.quartile.co",
"author": "Quartile Limited, Odoo Community Association (OCA)",
"license": "LGPL-3",
"depends": ["base"],
"data": [
"security/ir.model.access.csv",
"views/api_config_views.xml",
],
"installable": True,
}
2 changes: 2 additions & 0 deletions base_api_connection/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import api_config
from . import api_call_mixin
56 changes: 56 additions & 0 deletions base_api_connection/models/api_call_mixin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Copyright 2023 Quartile Limited
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).

import logging

import requests

from odoo import _, models
from odoo.exceptions import UserError

_logger = logging.getLogger(__name__)


class APICallMixin(models.AbstractModel):
_name = "api.call.mixin"
_description = "API Call Mixin"

def get_api_key(self, config):
return config.api_key

def make_api_call(
self,
code,
external_system="generic",
endpoint=None,
custom_headers=None,
params=None,
json=None,
http_method="get",
):
config = self.env["api.config"].search(
[("external_system", "=", external_system), ("code", "=", code)], limit=1
)
if not config:
raise UserError(_("API configuration not found."))
url = f"{config.base_url}/{endpoint}"
headers = {"Content-Type": "application/json"}
if custom_headers:
headers.update(custom_headers)
api_key = self.get_api_key(config)
headers[config.header_api_key_string] = api_key
function = getattr(requests, http_method)
kwargs = {"headers": headers, "params": params}
if json:
kwargs["json"] = json
try:
response = function(url, **kwargs)
response.raise_for_status() # Raises HTTPError for bad responses
_logger.info(
f"Successful API call to {url}. Response status code: {response.status_code}"
)
except requests.exceptions.HTTPError as e:
raise UserError(f"HTTP Error: {str(e)}") from e
except requests.exceptions.RequestException as e:
raise UserError(f"Request Error: {str(e)}") from e
return response
35 changes: 35 additions & 0 deletions base_api_connection/models/api_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright 2023 Quartile Limited
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).

from odoo import _, api, fields, models
from odoo.exceptions import ValidationError


class ApiConfig(models.Model):
_name = "api.config"
_description = "API Configuration"

name = fields.Char(required=True)
code = fields.Char(
required=True,
help="Expected to act as an identifier of the API configuration "
"record along with External System.",
)
base_url = fields.Char(string="URL")
header_api_key_string = fields.Char(
required=True,
help="This string will be used as the key in the API header for the API key value.",
)
external_system = fields.Selection(
[("generic", "Generic")], default="generic", required=True
)
api_key = fields.Char(string="Api Key or Token", required=True)

@api.constrains("code")
def _check_code(self):
for record in self:
existing_rec = self.search(
[("code", "=", record.code), ("id", "!=", record.id)],
)
if existing_rec:
raise ValidationError(_("Code must be unique."))
2 changes: 2 additions & 0 deletions base_api_connection/readme/CONFIGURE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
1. Go to Settings > API Connection > API Configuration.
2. Create an API configuration record with 'base_url', 'header_api_key_string', 'code', and 'x_api_key'.
1 change: 1 addition & 0 deletions base_api_connection/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This module facilitates API connections between Odoo and other web services. It is not usable on its own; rather, it is a low-level module intended to serve as a base for others. An example of such a module is 'project_task_capture'.
2 changes: 2 additions & 0 deletions base_api_connection/security/ir.model.access.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_api_config_manager,api.config,model_api_config,base.group_system,1,1,1,1
Loading

0 comments on commit 3aad901

Please sign in to comment.