From 82f9d3a792c3b5d9592cdb9afab990556c3438c9 Mon Sep 17 00:00:00 2001 From: Frederik Jaeckel Date: Fri, 21 Apr 2023 16:55:51 +0200 Subject: [PATCH] asset/onlinesource: add fixed url, pre defned online sources: add FAZ.net --- asset.py | 26 ++++++++++++++++++++++-- locale/de.po | 24 ++++++++++++++++++++++ locale/en.po | 12 +++++++++++ message.xml | 3 +++ onlinesource.py | 48 ++++++++++++++++++++++++++++++++++---------- sources_def.xml | 12 +++++++++++ view/asset_form.xml | 5 +++++ view/source_form.xml | 3 +++ 8 files changed, 120 insertions(+), 13 deletions(-) diff --git a/asset.py b/asset.py index 4a96599..ea4e1bf 100644 --- a/asset.py +++ b/asset.py @@ -8,6 +8,7 @@ from trytond.transaction import Transaction from trytond.pool import Pool from trytond.pyson import Eval, Bool, If, Date from trytond.report import Report +from trytond.exceptions import UserError from decimal import Decimal from datetime import time @@ -84,8 +85,19 @@ class Asset(SymbolMixin, ModelSQL, ModelView): help='Select sources for the course update. The course sources are tried until a valid value has been read.', relation_name='investment.asset_source_rel', origin='asset', target='source') - updtdays = fields.Selection(string='Select days', required=True, - selection=sel_updtdays) + updturl = fields.Char( + string='URL', + help='URL for data retrieval.', + states={ + 'invisible': Eval('updturl_enable', False) == False, + 'required': Eval('updturl_enable', False) == True, + }, depends=['updturl_enable']) + updturl_enable = fields.Function(fields.Boolean( + string='URL required', readonly=True, + states={'invisible': True}), + 'on_change_with_updturl_enable') + updtdays = fields.Selection( + string='Select days', required=True, selection=sel_updtdays) updttime = fields.Time(string='Time', states={ 'readonly': ~Bool(Eval('updtsources')), @@ -206,6 +218,16 @@ class Asset(SymbolMixin, ModelSQL, ModelView): """ return 'work' + @fields.depends('updtsources') + def on_change_with_updturl_enable(self, name=None): + """ return True if a source has fixed-url + """ + if self.updtsources: + for usource in self.updtsources: + if usource.fixed_url == True: + return True + return False + @fields.depends('updtsources', 'updttime') def on_change_updtsources(self): """ clear time-fields diff --git a/locale/de.po b/locale/de.po index 01e0604..5d55abe 100644 --- a/locale/de.po +++ b/locale/de.po @@ -46,6 +46,10 @@ msgctxt "model:ir.message,text:msg_querytype_web" msgid "Extract from web page" msgstr "aus Webseite auslesen" +msgctxt "model:ir.message,text:msg_missing_url" +msgid "URL for the online source '%(oname)s' is missing." +msgstr "URL für die Onlinequelle '%(oname)s' fehlt." + ############## # ir.ui.menu # @@ -330,6 +334,18 @@ msgctxt "selection:investment.asset,updtdays:" msgid "Mon - Sun" msgstr "Mo - So" +msgctxt "field:investment.asset,updturl:" +msgid "URL" +msgstr "URL" + +msgctxt "help:investment.asset,updturl:" +msgid "URL for data retrieval." +msgstr "URL für Datenabruf." + +msgctxt "field:investment.asset,updturl_enable:" +msgid "URL required" +msgstr "URL required" + ############################### # investment.asset-source-rel # @@ -530,6 +546,14 @@ msgctxt "help:investment.source,query_method:" msgid "Select the method to retrieve the data." msgstr "Wählen Sie die Methode zum Abruf der Daten." +msgctxt "field:investment.source,fixed_url:" +msgid "Fixed URL" +msgstr "feste URL" + +msgctxt "help:investment.source,fixed_url:" +msgid "URL must be defined at investment record." +msgstr "Die URL muss im Investitionsdatensatz definiert werden." + ################### # investment.rate # diff --git a/locale/en.po b/locale/en.po index fda56d9..7e0923e 100644 --- a/locale/en.po +++ b/locale/en.po @@ -34,6 +34,10 @@ msgctxt "model:ir.message,text:msg_querytype_web" msgid "Extract from web page" msgstr "Extract from web page" +msgctxt "model:ir.message,text:msg_missing_url" +msgid "URL for the online source '%(oname)s' is missing." +msgstr "URL for the online source '%(oname)s' is missing." + msgctxt "model:ir.ui.menu,name:menu_investment" msgid "Investment" msgstr "Investment" @@ -482,6 +486,14 @@ msgctxt "help:investment.source,query_method:" msgid "Select the method to retrieve the data." msgstr "Select the method to retrieve the data." +msgctxt "field:investment.source,fixed_url:" +msgid "Fixed URL" +msgstr "Fixed URL" + +msgctxt "help:investment.source,fixed_url:" +msgid "URL must be defined at investment record." +msgstr "URL must be defined at investment record." + msgctxt "model:investment.rate,name:" msgid "Rate" msgstr "Rate" diff --git a/message.xml b/message.xml index dae31b6..2ef9571 100644 --- a/message.xml +++ b/message.xml @@ -20,6 +20,9 @@ full copyright notices and license terms. --> Extract from web page + + URL for the online source '%(oname)s' is missing. + diff --git a/onlinesource.py b/onlinesource.py index ad5c0e4..a21d658 100644 --- a/onlinesource.py +++ b/onlinesource.py @@ -14,6 +14,7 @@ from trytond.model import ModelView, ModelSQL, fields from trytond.pool import Pool from trytond.pyson import Eval, Bool from trytond.i18n import gettext +from trytond.exceptions import UserError logger = logging.getLogger(__name__) @@ -60,6 +61,12 @@ class OnlineSource(ModelSQL, ModelView): help='Select the method to retrieve the data.', selection='get_query_methods') url = fields.Char(string='URL', states=STATES_WEB, depends=DEPENDS_WEB) + fixed_url = fields.Boolean( + string='Fixed URL', + states={ + 'invisible': Eval('query_method', '') != 'web', + }, depends=DEPENDS_WEB, + help='URL must be defined at investment record.') nohtml = fields.Boolean( string='Remove HTML', help='Removes HTML tags before the text is interpreted.', @@ -178,6 +185,12 @@ class OnlineSource(ModelSQL, ModelView): """ return True + @classmethod + def default_fixed_url(cls): + """ default: False + """ + return False + @fields.depends(*fields_check) def on_change_nsin(self): """ run request @@ -220,7 +233,7 @@ class OnlineSource(ModelSQL, ModelView): def on_change_with_symbol(self, name=None): return '' - @fields.depends('url', 'isin', 'nsin', 'symbol') + @fields.depends('url', 'isin', 'nsin', 'symbol', 'fixed_url') def on_change_with_used_url(self, name=None): """ get url for testing """ @@ -229,6 +242,7 @@ class OnlineSource(ModelSQL, ModelView): isin=self.isin, nsin=self.nsin, symbol=self.symbol, + url=self.url, ) @classmethod @@ -246,7 +260,7 @@ class OnlineSource(ModelSQL, ModelView): pass @classmethod - def run_query_method(cls, osource, isin, nsin, symbol, debug=False): + def run_query_method(cls, osource, isin, nsin, symbol, url, debug=False): """ run selected query to retrive data result: { 'text': raw-text from query - for debug, @@ -265,6 +279,7 @@ class OnlineSource(ModelSQL, ModelView): nsin=nsin, symbol=symbol, debug=debug, + url=url, ) def call_online_source(self): @@ -274,7 +289,7 @@ class OnlineSource(ModelSQL, ModelView): OSourc = Pool().get('investment.source') result = OSourc.run_query_method( - self, self.isin, self.nsin, + self, self.isin, self.nsin, self.url, self.symbol, debug=True) if result is not None: self.text = result.get('text', None) @@ -283,15 +298,24 @@ class OnlineSource(ModelSQL, ModelView): self.fndrate = result.get('rate', None) self.fndident = result.get('code', None) - def get_url_with_parameter(self, isin=None, nsin=None, symbol=None): + def get_url_with_parameter( + self, isin=None, nsin=None, symbol=None, url=None): """ generate url """ - if self.url: - return Template(self.url).substitute({ - 'isin': isin if isin is not None else '', - 'nsin': nsin if nsin is not None else '', - 'symbol': symbol if symbol is not None else '', - }) + if self.fixed_url is True: + if url is None: + raise UserError(gettext( + 'investment.msg_missing_url', + oname=self.rec_name, + )) + return url + else : + if self.url: + return Template(self.url).substitute({ + 'isin': isin if isin is not None else '', + 'nsin': nsin if nsin is not None else '', + 'symbol': symbol if symbol is not None else '', + }) @classmethod def update_rate(cls, asset): @@ -310,6 +334,7 @@ class OnlineSource(ModelSQL, ModelView): isin=asset.isin, nsin=asset.wkn, symbol=asset.secsymb, + url=asset.updturl, ) if len(updtsource.rgxident or '') > 0: @@ -387,7 +412,7 @@ class OnlineSource(ModelSQL, ModelView): @classmethod def read_from_website( cls, updtsource, isin=None, nsin=None, - symbol=None, debug=False): + symbol=None, url=None, debug=False): """ read from url, extract values """ result = {} @@ -401,6 +426,7 @@ class OnlineSource(ModelSQL, ModelView): isin=isin, nsin=nsin, symbol=symbol, + url=url, ), allow_redirects=True, timeout=5.0) diff --git a/sources_def.xml b/sources_def.xml index edac5b1..1f49541 100644 --- a/sources_def.xml +++ b/sources_def.xml @@ -78,6 +78,18 @@ full copyright notices and license terms. --> \nWKN / ISIN: [A-Z,0-9]+ / ([A-Z,0-9]+)\s+\n isin + + FAZ + https://www.faz.net/aktuell/finanzen/kurs/etf/ + + + (\d{2}\.\d{2}\.\d{4}) + %d.%m.%y + \nKurs(\d+.\d+)\s+€\s+\n + , + \nWKN:.*\sISIN: ([A-Z,0-9]+).*\n + isin + diff --git a/view/asset_form.xml b/view/asset_form.xml index 5233998..e2230bb 100644 --- a/view/asset_form.xml +++ b/view/asset_form.xml @@ -60,6 +60,11 @@ full copyright notices and license terms. -->