61 lines
1.9 KiB
Python
61 lines
1.9 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
|
|
|
|
import trytond.config as config
|
|
from trytond.modules.currency.currency import CronFetchError
|
|
from trytond.pool import PoolMeta
|
|
from trytond.pyson import Eval, If
|
|
|
|
URL_10DAYS = 'https://bnr.ro/nbrfxrates10days.xml'
|
|
URL_YEAR = 'https://bnr.ro/files/xml/years/nbrfxrates%s.xml'
|
|
|
|
|
|
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'),
|
|
()),
|
|
]
|
|
|
|
def fetch_bnr_ro(self, date):
|
|
if (dt.date.today() - date).days < 10:
|
|
url = URL_10DAYS
|
|
else:
|
|
url = URL_YEAR % date.year
|
|
timeout = config.getfloat(
|
|
'currency_ro', 'requests_timeout', default=300)
|
|
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 {}
|