first commit
This commit is contained in:
60
modules/currency_ro/currency.py
Normal file
60
modules/currency_ro/currency.py
Normal file
@@ -0,0 +1,60 @@
|
||||
# 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 {}
|
||||
Reference in New Issue
Block a user