rate-update ok
This commit is contained in:
parent
ffba5c2a45
commit
38b9847ccc
4 changed files with 129 additions and 13 deletions
19
asset.py
19
asset.py
|
@ -292,10 +292,13 @@ class Asset(ModelSQL, ModelView):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def get_rec_name(self, name):
|
def get_rec_name(self, name):
|
||||||
if self.product:
|
""" record name
|
||||||
return self.product.rec_name
|
"""
|
||||||
else:
|
return '%(prod)s [%(curr)s/%(unit)s]' % {
|
||||||
return self.id
|
'prod': getattr(self.product, 'rec_name', '-'),
|
||||||
|
'curr': getattr(self.currency, 'rec_name', '-'),
|
||||||
|
'unit': getattr(self.uom, 'rec_name', '-'),
|
||||||
|
}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def search_rec_name(cls, name, clause):
|
def search_rec_name(cls, name, clause):
|
||||||
|
@ -324,9 +327,7 @@ class Asset(ModelSQL, ModelView):
|
||||||
for values in vlist:
|
for values in vlist:
|
||||||
if 'updtsource' in values.keys():
|
if 'updtsource' in values.keys():
|
||||||
if values['updtsource'] is None:
|
if values['updtsource'] is None:
|
||||||
values['updttime1'] = None
|
values['updttime'] = None
|
||||||
values['updttime2'] = None
|
|
||||||
values['updttime3'] = None
|
|
||||||
return super(Asset, cls).create(vlist)
|
return super(Asset, cls).create(vlist)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -338,9 +339,7 @@ class Asset(ModelSQL, ModelView):
|
||||||
for lines, values in zip(actions, actions):
|
for lines, values in zip(actions, actions):
|
||||||
if 'updtsource' in values.keys():
|
if 'updtsource' in values.keys():
|
||||||
if values['updtsource'] is None:
|
if values['updtsource'] is None:
|
||||||
values['updttime1'] = None
|
values['updttime'] = None
|
||||||
values['updttime2'] = None
|
|
||||||
values['updttime3'] = None
|
|
||||||
super(Asset, cls).write(*args)
|
super(Asset, cls).write(*args)
|
||||||
|
|
||||||
# end Asset
|
# end Asset
|
||||||
|
|
|
@ -219,9 +219,51 @@ class OnlineSource(ModelSQL, ModelView):
|
||||||
def update_rate(cls, asset):
|
def update_rate(cls, asset):
|
||||||
""" read data from inet, write result to rates of asset
|
""" read data from inet, write result to rates of asset
|
||||||
"""
|
"""
|
||||||
|
pool = Pool()
|
||||||
|
Rate = pool.get('investment.rate')
|
||||||
|
|
||||||
if asset.updtsource is None:
|
if asset.updtsource is None:
|
||||||
return
|
return
|
||||||
rate_data = cls.read_from_website(asset.updtsource)
|
rate_data = cls.read_from_website(
|
||||||
|
asset.updtsource,
|
||||||
|
isin = asset.isin,
|
||||||
|
nsin = asset.wkn,
|
||||||
|
symbol = asset.secsymb,
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(asset.updtsource.rgxident or '') > 0:
|
||||||
|
# check result - same code?
|
||||||
|
code = rate_data.get('code', None)
|
||||||
|
if code:
|
||||||
|
asset_code = getattr(asset, {
|
||||||
|
'isin': 'isin',
|
||||||
|
'nsin': 'wkn',
|
||||||
|
'symbol': 'secsymb',
|
||||||
|
}[asset.updtsource.rgxidtype])
|
||||||
|
if (asset_code or '').lower() != code.lower():
|
||||||
|
# fail
|
||||||
|
logger.warning(
|
||||||
|
'update_rate: got wrong code "%(wrong)s" - expected "%(exp)s"' % {
|
||||||
|
'exp': asset_code,
|
||||||
|
'wrong': code,
|
||||||
|
})
|
||||||
|
return False
|
||||||
|
|
||||||
|
to_create = {
|
||||||
|
'date': rate_data.get('date', None),
|
||||||
|
'rate': rate_data.get('rate', None),
|
||||||
|
'asset': asset.id,
|
||||||
|
}
|
||||||
|
if (to_create['date'] is not None) and \
|
||||||
|
(to_create['rate'] is not None):
|
||||||
|
# check if exists
|
||||||
|
if Rate.search_count([
|
||||||
|
('asset.id', '=', asset.id),
|
||||||
|
('date', '=', to_create['date']),
|
||||||
|
]) == 0:
|
||||||
|
Rate.create([to_create])
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def get_regex_result(self, html_text, field_name):
|
def get_regex_result(self, html_text, field_name):
|
||||||
""" run regex on html-text, convert result
|
""" run regex on html-text, convert result
|
||||||
|
@ -256,7 +298,7 @@ class OnlineSource(ModelSQL, ModelView):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def read_from_website(cls, updtsource, isin=None, nsin=None, symbol=None, debug=True):
|
def read_from_website(cls, updtsource, isin=None, nsin=None, symbol=None, debug=False):
|
||||||
""" read from url, extract values
|
""" read from url, extract values
|
||||||
"""
|
"""
|
||||||
result = {}
|
result = {}
|
||||||
|
|
|
@ -61,7 +61,10 @@ class AssetTestCase(ModuleTestCase):
|
||||||
'currency_digits': 4,
|
'currency_digits': 4,
|
||||||
'uom': product.default_uom.id,
|
'uom': product.default_uom.id,
|
||||||
}])
|
}])
|
||||||
self.assertEqual(asset.rec_name, product.name)
|
self.assertEqual(asset.rec_name, '%s [usd/%s]' % (
|
||||||
|
product.rec_name,
|
||||||
|
asset.uom.rec_name,
|
||||||
|
))
|
||||||
self.assertEqual(asset.currency.rec_name, 'usd')
|
self.assertEqual(asset.currency.rec_name, 'usd')
|
||||||
self.assertEqual(asset.currency_digits, 4)
|
self.assertEqual(asset.currency_digits, 4)
|
||||||
self.assertEqual(asset.product.rec_name, product.name)
|
self.assertEqual(asset.product.rec_name, product.name)
|
||||||
|
|
|
@ -9,12 +9,84 @@ from trytond.modules.company.tests import create_company
|
||||||
from trytond.transaction import Transaction
|
from trytond.transaction import Transaction
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from datetime import time, date
|
from datetime import time, date
|
||||||
|
from unittest.mock import MagicMock
|
||||||
|
from requests import Response
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
class SourceTestCase(ModuleTestCase):
|
class SourceTestCase(ModuleTestCase):
|
||||||
'Test online source module'
|
'Test online source module'
|
||||||
module = 'investment'
|
module = 'investment'
|
||||||
|
|
||||||
|
@with_transaction()
|
||||||
|
def test_waitlist_source_request(self):
|
||||||
|
""" create source, call server
|
||||||
|
"""
|
||||||
|
pool = Pool()
|
||||||
|
OSource = pool.get('investment.source')
|
||||||
|
Asset = pool.get('investment.asset')
|
||||||
|
Product = pool.get('product.product')
|
||||||
|
|
||||||
|
company = self.prep_asset_company()
|
||||||
|
osource, = OSource.create([{
|
||||||
|
'name': 'Source 1',
|
||||||
|
'url': 'https://foo.bar/${isin}/${nsin}/${symbol}',
|
||||||
|
'rgxdate': 'Course Date (\\d+.\\d+.\\d+) Today',
|
||||||
|
'rgxdatefmt': '%d.%m.%Y',
|
||||||
|
'rgxrate': 'High (\\d+,\\d+) EUR',
|
||||||
|
'rgxdecimal': ',',
|
||||||
|
}])
|
||||||
|
self.assertEqual(osource.rec_name, 'Source 1')
|
||||||
|
|
||||||
|
product = self.prep_asset_product(
|
||||||
|
name='Product 1',
|
||||||
|
description='some asset')
|
||||||
|
|
||||||
|
Product.write(*[
|
||||||
|
[product],
|
||||||
|
{
|
||||||
|
'identifiers': [('create', [{
|
||||||
|
'type': 'wkn',
|
||||||
|
'code': '965515',
|
||||||
|
}, {
|
||||||
|
'type': 'secsymb',
|
||||||
|
'code': '1472977',
|
||||||
|
}, {
|
||||||
|
'type': 'isin',
|
||||||
|
'code': 'XC0009655157',
|
||||||
|
}, ])],
|
||||||
|
}])
|
||||||
|
|
||||||
|
asset = self.prep_asset_item(
|
||||||
|
company=company,
|
||||||
|
product = product)
|
||||||
|
|
||||||
|
Asset.write(*[
|
||||||
|
[asset],
|
||||||
|
{
|
||||||
|
'updtsource': osource.id,
|
||||||
|
}])
|
||||||
|
self.assertEqual(asset.wkn, '965515')
|
||||||
|
self.assertEqual(asset.isin, 'XC0009655157')
|
||||||
|
self.assertEqual(asset.secsymb, '1472977')
|
||||||
|
self.assertEqual(asset.updtsource.rec_name, 'Source 1')
|
||||||
|
self.assertEqual(len(asset.rates), 0)
|
||||||
|
|
||||||
|
# fake server-response
|
||||||
|
resp1 = Response()
|
||||||
|
resp1._content = """<html><body>Response from finance-server
|
||||||
|
Course Date 14.08.2022 Today
|
||||||
|
High 34,87 EUR
|
||||||
|
</body></html>""".encode('utf8')
|
||||||
|
resp1.status_code = 200
|
||||||
|
resp1.reason = 'OK'
|
||||||
|
requests.get = MagicMock(return_value=resp1)
|
||||||
|
|
||||||
|
OSource.update_rate(asset)
|
||||||
|
self.assertEqual(len(asset.rates), 1)
|
||||||
|
self.assertEqual(asset.rates[0].date, date(2022, 8, 14))
|
||||||
|
self.assertEqual(asset.rates[0].rate, Decimal('34.87'))
|
||||||
|
|
||||||
@with_transaction()
|
@with_transaction()
|
||||||
def test_waitlist_source_check_regex(self):
|
def test_waitlist_source_check_regex(self):
|
||||||
""" create source, check convert
|
""" create source, check convert
|
||||||
|
|
Loading…
Reference in a new issue