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
def get_rec_name(self, name):
if self.product:
return self.product.rec_name
else:
return self.id
""" record name
"""
return '%(prod)s [%(curr)s/%(unit)s]' % {
'prod': getattr(self.product, 'rec_name', '-'),
'curr': getattr(self.currency, 'rec_name', '-'),
'unit': getattr(self.uom, 'rec_name', '-'),
}
@classmethod
def search_rec_name(cls, name, clause):
@ -324,9 +327,7 @@ class Asset(ModelSQL, ModelView):
for values in vlist:
if 'updtsource' in values.keys():
if values['updtsource'] is None:
values['updttime1'] = None
values['updttime2'] = None
values['updttime3'] = None
values['updttime'] = None
return super(Asset, cls).create(vlist)
@classmethod
@ -338,9 +339,7 @@ class Asset(ModelSQL, ModelView):
for lines, values in zip(actions, actions):
if 'updtsource' in values.keys():
if values['updtsource'] is None:
values['updttime1'] = None
values['updttime2'] = None
values['updttime3'] = None
values['updttime'] = None
super(Asset, cls).write(*args)
# end Asset

View file

@ -219,9 +219,51 @@ class OnlineSource(ModelSQL, ModelView):
def update_rate(cls, asset):
""" read data from inet, write result to rates of asset
"""
pool = Pool()
Rate = pool.get('investment.rate')
if asset.updtsource is None:
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):
""" run regex on html-text, convert result
@ -256,7 +298,7 @@ class OnlineSource(ModelSQL, ModelView):
return result
@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
"""
result = {}

View file

@ -61,7 +61,10 @@ class AssetTestCase(ModuleTestCase):
'currency_digits': 4,
'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_digits, 4)
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 decimal import Decimal
from datetime import time, date
from unittest.mock import MagicMock
from requests import Response
import requests
class SourceTestCase(ModuleTestCase):
'Test online source module'
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()
def test_waitlist_source_check_regex(self):
""" create source, check convert