File: currency.py

package info (click to toggle)
tryton-modules-currency-ro 7.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 332 kB
  • sloc: python: 253; makefile: 11; sh: 3
file content (59 lines) | stat: -rw-r--r-- 1,925 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 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.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'
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'),
                ()),
            ]

    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 {}