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
|
||||
|
||||
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
|
||||
|
|
|
@ -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 = {}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue