Files
tryton/currency.py
T
Cédric Krier 747cc5ce16 Add currency_ro module
issue10689
review373371002
2021-10-09 12:20:16 +02:00

63 lines
2.0 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import datetime as dt
from decimal import Decimal
import requests
from lxml import etree
from trytond.config import config
from trytond.pool import PoolMeta
from trytond.pyson import Eval, If
from trytond.modules.currency.currency import CronFetchError
URL_10DAYS = 'https://bnr.ro/nbrfxrates10days.xml'
URL_YEAR = 'https://bnr.ro/files/xml/years/nbrfxrates%s.xml'
TIMEOUT = config.getfloat('currency_ro', 'requests_timeout', default=300)
class Cron(metaclass=PoolMeta):
__name__ = 'currency.cron'
@classmethod
def __setup__(cls):
super().__setup__()
cls.source.selection.append(('bnr_ro', "Romanian National Bank"))
cls.currency.domain = [
cls.currency.domain or [],
If(Eval('source') == 'bnr_ro',
('code', '=', 'RON'),
()),
]
if 'source' not in cls.currency.depends:
cls.currency.depends.append('source')
def fetch_bnr_ro(self, date):
if (dt.date.today() - date).days < 10:
url = URL_10DAYS
else:
url = URL_YEAR % date.year
try:
response = requests.get(url, timeout=TIMEOUT)
except requests.HTTPError as e:
raise CronFetchError() from e
tree = etree.fromstring(response.content)
origin, = tree.xpath(
'//x:Body/x:OrigCurrency',
namespaces={'x': 'http://www.bnr.ro/xsd'})
assert origin.text == self.currency.code
cubes = tree.xpath(
'//x:Body/x:Cube[@date="%s"]' % date.isoformat(),
namespaces={'x': 'http://www.bnr.ro/xsd'})
if cubes:
cube, = cubes
return {
r.get('currency'): (
Decimal(r.get('multiplier', 1)) / Decimal(r.text))
for r in cube.iter('{*}Rate')}
else:
return {}