rate-update ok

This commit is contained in:
Frederik Jaeckel 2022-11-22 22:43:28 +01:00
parent ffba5c2a45
commit 38b9847ccc
4 changed files with 129 additions and 13 deletions

View file

@ -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

View file

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

View file

@ -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)

View file

@ -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