Files
odoo_source/addons/payment_flutterwave/models/payment_provider.py
T
Valentin Vallaeys (vava) 90af85c2e4 [IMP] payment(_*): show available currencies for payment providers
Before this commit, the lists of supported currencies by payment
provider were hard-coded in the Python scripts, which made them
unavailable to the users.

With this commit, the implemented initial lists of supported currencies
are displayed on the form view and are editable, because Odoo lists may
not be up-to-date. Empty lists do not trigger any filtering on the
payment providers to access payment methods.

For Authorize.net and Asiapay payment providers, the specific
`(authorize,asiapay)_currency_id` are removed and the generic payment
provider field `available_currency_ids` is restricted to a single-item
list when one of those providers is enabled.

task-2926016

closes odoo/odoo#101018

Related: odoo/enterprise#34158
Related: odoo/documentation#2788
Related: odoo/upgrade#4069
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2023-01-05 16:51:56 +01:00

107 lines
4.0 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
import pprint
import requests
from werkzeug.urls import url_join
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
from odoo.addons.payment_flutterwave.const import SUPPORTED_CURRENCIES
_logger = logging.getLogger(__name__)
class PaymentProvider(models.Model):
_inherit = 'payment.provider'
code = fields.Selection(
selection_add=[('flutterwave', "Flutterwave")], ondelete={'flutterwave': 'set default'}
)
flutterwave_public_key = fields.Char(
string="Flutterwave Public Key",
help="The key solely used to identify the account with Flutterwave.",
required_if_provider='flutterwave',
)
flutterwave_secret_key = fields.Char(
string="Flutterwave Secret Key",
required_if_provider='flutterwave',
groups='base.group_system',
)
flutterwave_webhook_secret = fields.Char(
string="Flutterwave Webhook Secret",
required_if_provider='flutterwave',
groups='base.group_system',
)
#=== COMPUTE METHODS ===#
def _compute_feature_support_fields(self):
""" Override of `payment` to enable additional features. """
super()._compute_feature_support_fields()
self.filtered(lambda p: p.code == 'flutterwave').update({
'support_tokenization': True,
})
# === BUSINESS METHODS ===#
@api.model
def _get_compatible_providers(self, *args, is_validation=False, **kwargs):
""" Override of `payment` to filter out Flutterwave providers for validation operations. """
providers = super()._get_compatible_providers(*args, is_validation=is_validation, **kwargs)
if is_validation:
providers = providers.filtered(lambda p: p.code != 'flutterwave')
return providers
def _get_supported_currencies(self):
""" Override of `payment` to return the supported currencies. """
supported_currencies = super()._get_supported_currencies()
if self.code == 'flutterwave':
supported_currencies = supported_currencies.filtered(
lambda c: c.name in SUPPORTED_CURRENCIES
)
return supported_currencies
def _flutterwave_make_request(self, endpoint, payload=None, method='POST'):
""" Make a request to Flutterwave API at the specified endpoint.
Note: self.ensure_one()
:param str endpoint: The endpoint to be reached by the request.
:param dict payload: The payload of the request.
:param str method: The HTTP method of the request.
:return The JSON-formatted content of the response.
:rtype: dict
:raise ValidationError: If an HTTP error occurs.
"""
self.ensure_one()
url = url_join('https://api.flutterwave.com/v3/', endpoint)
headers = {'Authorization': f'Bearer {self.flutterwave_secret_key}'}
try:
if method == 'GET':
response = requests.get(url, params=payload, headers=headers, timeout=10)
else:
response = requests.post(url, json=payload, headers=headers, timeout=10)
try:
response.raise_for_status()
except requests.exceptions.HTTPError:
_logger.exception(
"Invalid API request at %s with data:\n%s", url, pprint.pformat(payload),
)
raise ValidationError("Flutterwave: " + _(
"The communication with the API failed. Flutterwave gave us the following "
"information: '%s'", response.json().get('message', '')
))
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
_logger.exception("Unable to reach endpoint at %s", url)
raise ValidationError(
"Flutterwave: " + _("Could not establish the connection to the API.")
)
return response.json()