diff --git a/asset.py b/asset.py index ea955b5..4d658b0 100644 --- a/asset.py +++ b/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 diff --git a/onlinesource.py b/onlinesource.py index 0defc19..cf9a858 100644 --- a/onlinesource.py +++ b/onlinesource.py @@ -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 = {} diff --git a/tests/test_asset.py b/tests/test_asset.py index 8d7e412..a7c791c 100644 --- a/tests/test_asset.py +++ b/tests/test_asset.py @@ -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) diff --git a/tests/test_source.py b/tests/test_source.py index 6468eed..e68361a 100644 --- a/tests/test_source.py +++ b/tests/test_source.py @@ -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 = """Response from finance-server +Course Date 14.08.2022 Today +High 34,87 EUR +""".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