diff --git a/README.rst b/README.rst index db3f6ab..1f48f27 100644 --- a/README.rst +++ b/README.rst @@ -9,7 +9,7 @@ pip install mds-investment Requires ======== -- Tryton 7.0 +- Tryton 6.8 How to ====== @@ -22,6 +22,6 @@ You can define the course sources yourself. Changes ======= -*7.0.0 - 01.12.2023* +*6.8.24 - 07.06.2023* -- compatibility to Tryton 7.0 +- portet to Tryton 6.8 diff --git a/asset.py b/asset.py index 578de36..d599d7b 100644 --- a/asset.py +++ b/asset.py @@ -15,7 +15,6 @@ from sql.functions import CurrentDate, CurrentTimestamp, Round, Extract from sql.conditionals import Case, Coalesce, NullIf from sql import Literal from .diagram import Concat2 -from .const import DEF_NONE digits_percent = 2 @@ -32,7 +31,7 @@ class Asset(SymbolMixin, ModelSQL, ModelView): name = fields.Function(fields.Char( string='Name', readonly=True), - 'get_name_symbol', searcher='search_rec_name') + 'get_name_symbol', searcher='search_rec_name') company = fields.Many2One( string='Company', model_name='company.company', required=True, ondelete="RESTRICT") @@ -46,9 +45,12 @@ class Asset(SymbolMixin, ModelSQL, ModelView): uom = fields.Many2One( string='UOM', required=True, model_name='product.uom', ondelete='RESTRICT', - states={'readonly': ~Bool(Eval('product'))}, - domain=[('category', '=', Eval('product_uom'))], - depends=['product_uom', 'product']) + states={ + 'readonly': ~Bool(Eval('product')), + }, + domain=[ + ('category', '=', Eval('product_uom')), + ], depends=['product_uom', 'product']) symbol = fields.Function(fields.Char( string='UOM', readonly=True), 'get_name_symbol', searcher='search_uom_symbol') @@ -71,7 +73,9 @@ class Asset(SymbolMixin, ModelSQL, ModelView): model_name='currency.currency', ondelete='RESTRICT') currency_digits = fields.Integer( string='Digits', required=True, - domain=[('currency_digits', '>=', 0), ('currency_digits', '<=', 6)]) + domain=[ + ('currency_digits', '>=', 0), + ('currency_digits', '<=', 6)]) wkn = fields.Function(fields.Char( string='NSIN', readonly=True, @@ -96,8 +100,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): string='URL', help='URL for data retrieval.', states={ - 'invisible': ~Eval('updturl_enable', False), - 'required': Eval('updturl_enable', False), + '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, @@ -107,8 +111,9 @@ class Asset(SymbolMixin, ModelSQL, ModelView): string='Select days', required=True, selection=sel_updtdays) updttime = fields.Time( string='Time', - states={'readonly': ~Bool(Eval('updtsources'))}, - depends=['updtsources']) + states={ + 'readonly': ~Bool(Eval('updtsources')), + }, depends=['updtsources']) nextupdate = fields.Function(fields.DateTime( string='Next Update', readonly=True), 'get_nextupdates', searcher='search_nextupdate') @@ -186,7 +191,7 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_asset.select( tab_asset.id, tab_asset.updtsource, - where=tab_asset.updtsource != DEF_NONE, + where=tab_asset.updtsource != None, ) cursor.execute(*query) records = cursor.fetchall() @@ -195,7 +200,7 @@ class Asset(SymbolMixin, ModelSQL, ModelView): 'source': x[1], } for x in records] - if to_create: + if len(to_create) > 0: AssetSourceRel.create(to_create) asset_table.drop_column('updtsource') @@ -256,7 +261,7 @@ class Asset(SymbolMixin, ModelSQL, ModelView): def on_change_updtsources(self): """ clear time-fields """ - if not self.updtsources: + if len(self.updtsources) == 0: self.updttime = None else: self.updttime = time(11, 30) @@ -325,24 +330,23 @@ class Asset(SymbolMixin, ModelSQL, ModelView): """ cursor = Transaction().connection.cursor() + (query, tab_asset) = cls.get_name_symbol_sql() + query.where = tab_asset.id.in_([x.id for x in assets]) + + cursor.execute(*query) + records = cursor.fetchall() result = {x: {y.id: None for y in assets} for x in names} - (query, tab_asset) = cls.get_name_symbol_sql() - if assets: - query.where = tab_asset.id.in_([x.id for x in assets]) - cursor.execute(*query) - records = cursor.fetchall() + for record in records: + values = { + 'name': record[1], + 'product_uom': record[2], + 'symbol': record[3], + 'asset_symbol': record[0], + } - for record in records: - values = { - 'name': record[1], - 'product_uom': record[2], - 'symbol': record[3], - 'asset_symbol': record[0], - } - - for name in names: - result[name][record[0]] = values[name] + for name in names: + result[name][record[0]] = values[name] return result @classmethod @@ -380,32 +384,32 @@ class Asset(SymbolMixin, ModelSQL, ModelView): def get_rate_data(cls, assets, names): """ get date and rate of asset """ + Asset2 = Pool().get('investment.asset') + cursor = Transaction().connection.cursor() + (query, tab_asset) = cls.get_rate_data_sql() + query.where = tab_asset.id.in_([x.id for x in assets]) + + cursor.execute(*query) + records = cursor.fetchall() result = {x: {y.id: None for y in assets} for x in names} - if assets: - (query, tab_asset) = cls.get_rate_data_sql() - query.where = tab_asset.id.in_([x.id for x in assets]) - curr_digits = {x.id: x.currency_digits for x in assets} + for record in records: + (id1, rate1, date1, id_rate) = record - cursor.execute(*query) - records = cursor.fetchall() + asset = Asset2(id1) + exp = Decimal(Decimal(1) / 10 ** (asset.currency_digits or 4)) - for record in records: - (id1, rate1, date1, id_rate) = record + values = { + 'rate': record[1].quantize(exp), + 'date': record[2], + 'change_symbol': id_rate, + } - curr_dig = curr_digits.get(id1, 4) - exp = Decimal(Decimal(1) / 10 ** curr_dig) + for name in names: + result[name][record[0]] = values[name] - values = { - 'rate': record[1].quantize(exp), - 'date': record[2], - 'change_symbol': id_rate, - } - - for name in names: - result[name][record[0]] = values[name] return result @classmethod @@ -417,7 +421,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_query.select( tab_query.id, - where=Operator(tab_query.date, clause[2])) + where=Operator(tab_query.date, clause[2]), + ) return [('id', 'in', query)] @classmethod @@ -429,7 +434,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_query.select( tab_query.id, - where=Operator(tab_query.rate, clause[2])) + where=Operator(tab_query.rate, clause[2]), + ) return [('id', 'in', query)] @staticmethod @@ -441,7 +447,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_query.select( tab_query.date, - where=tab_query.id == table.id) + where=tab_query.id == table.id, + ) return [query] @staticmethod @@ -453,7 +460,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_query.select( tab_query.rate, - where=tab_query.id == table.id) + where=tab_query.id == table.id, + ) return [query] @classmethod @@ -464,6 +472,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): """ pool = Pool() Rate = pool.get('investment.rate') + Asset2 = pool.get('investment.asset') + tab_asset = Asset2.__table__() tab_rate1 = Rate.__table__() tab_rate2 = Rate.__table__() context = Transaction().context @@ -471,15 +481,19 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query_date = context.get('qdate', CurrentDate()) where_asset = tab_rate1.date <= query_date if isinstance(asset_ids, list): - where_asset &= tab_rate1.asset.in_(asset_ids) + where_asset &= tab_asset.id.in_(asset_ids) - tab_today = tab_rate1.select( - tab_rate1.asset.as_('id'), + tab_today = tab_asset.join( + tab_rate1, + condition=tab_asset.id == tab_rate1.asset, + ).select( + tab_asset.id, tab_rate1.date, tab_rate1.rate, - distinct_on=[tab_rate1.asset], - order_by=[tab_rate1.asset, tab_rate1.date.desc], - where=where_asset) + distinct_on=[tab_asset.id], + order_by=[tab_asset.id, tab_rate1.date.desc], + where=where_asset, + ) days_diff = days + 5 query = tab_today.join( @@ -495,7 +509,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): (tab_today.rate * 100.0 / NullIf(tab_rate2.rate, 0.00) - 100.0).as_('percent'), distinct_on=[tab_today.id], - order_by=[tab_today.id, tab_rate2.date.desc]) + order_by=[tab_today.id, tab_rate2.date.desc] + ) return query @staticmethod @@ -508,7 +523,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_asset.select( tab_asset.percent, - where=tab_asset.id == table.id) + where=tab_asset.id == table.id, + ) return [query] @staticmethod @@ -521,7 +537,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_asset.select( tab_asset.percent, - where=tab_asset.id == table.id) + where=tab_asset.id == table.id, + ) return [query] @staticmethod @@ -534,7 +551,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_asset.select( tab_asset.percent, - where=tab_asset.id == table.id) + where=tab_asset.id == table.id, + ) return [query] @staticmethod @@ -547,7 +565,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_asset.select( tab_asset.percent, - where=tab_asset.id == table.id) + where=tab_asset.id == table.id, + ) return [query] @staticmethod @@ -560,7 +579,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_asset.select( tab_asset.percent, - where=tab_asset.id == table.id) + where=tab_asset.id == table.id, + ) return [query] @classmethod @@ -592,22 +612,22 @@ class Asset(SymbolMixin, ModelSQL, ModelView): exp = Decimal(Decimal(1) / 10 ** digits_percent) asset_id_lst = [x.id for x in assets] - if asset_id_lst and names: - for x in names: - tab_percent = cls.get_percentage_sql( - days={ - 'change_day1': 0, - 'change_month1': 30, - 'change_month3': 90, - 'change_month6': 180, - 'change_month12': 365, - }[x], - asset_ids=asset_id_lst) - cursor.execute(*tab_percent) - records = cursor.fetchall() + for x in names: + tab_percent = cls.get_percentage_sql( + days={ + 'change_day1': 0, + 'change_month1': 30, + 'change_month3': 90, + 'change_month6': 180, + 'change_month12': 365, + }[x], + asset_ids=asset_id_lst, + ) + cursor.execute(*tab_percent) + records = cursor.fetchall() - for record in records: - result[x][record[0]] = record[3].quantize(exp) \ + for record in records: + result[x][record[0]] = record[3].quantize(exp) \ if record[3] is not None else None return result @@ -642,7 +662,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): tab_asset.updtdays, tab_asset.updttime, distinct_on=[tab_asset.id], - order_by=[tab_asset.id, tab_rate.date.desc]) + order_by=[tab_asset.id, tab_rate.date.desc], + ) query = tab_date.select( tab_date.id, @@ -654,7 +675,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): (Extract('dow', tab_date.date) == 6), tab_date.date + Literal(2)), else_=tab_date.date, - ) + tab_date.updttime).as_('updttime')) + ) + tab_date.updttime).as_('updttime'), + ) return query @classmethod @@ -668,7 +690,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_updt.select( tab_updt.id, tab_updt.updttime, - where=tab_updt.id.in_([x.id for x in assets])) + where=tab_updt.id.in_([x.id for x in assets]), + ) cursor.execute(*query) records = cursor.fetchall() @@ -692,7 +715,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_updt.select( tab_updt.id, - where=Operator(tab_updt.updttime, clause[2])) + where=Operator(tab_updt.updttime, clause[2]), + ) return [('id', 'in', query)] @classmethod @@ -729,7 +753,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): tab_asset.id, tab_wkn.code.as_('wkn'), tab_secsymb.code.as_('secsymb'), - tab_isin.code.as_('isin')) + tab_isin.code.as_('isin'), + ) return query @staticmethod @@ -753,7 +778,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): condition=tab_templ.id == tab_prod.template ).select( tab_templ.name, - where=tab_asset.id == table.id) + where=tab_asset.id == table.id + ) return [query] @staticmethod @@ -766,7 +792,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_ids.select( getattr(tab_ids, 'wkn'), - where=tab_ids.id == table.id) + where=tab_ids.id == table.id, + ) return [query] @staticmethod @@ -779,7 +806,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_ids.select( getattr(tab_ids, 'isin'), - where=tab_ids.id == table.id) + where=tab_ids.id == table.id, + ) return [query] @staticmethod @@ -792,7 +820,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_ids.select( getattr(tab_ids, 'secsymb'), - where=tab_ids.id == table.id) + where=tab_ids.id == table.id, + ) return [query] @classmethod @@ -812,7 +841,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): ).select( tab_asset.id, where=Operator(field_qu, clause[2]) & - (field_qu != DEF_NONE)) + (field_qu != None), + ) return [('id', 'in', query)] @@ -826,19 +856,20 @@ class Asset(SymbolMixin, ModelSQL, ModelView): cursor = Transaction().connection.cursor() result = {x: {y.id: None for y in assets} for x in names} - if assets: - query = cls.get_identifier_sql(tab_asset) - query.where = tab_asset.id.in_([x.id for x in assets]) - cursor.execute(*query) - l1 = cursor.fetchall() + query = cls.get_identifier_sql(tab_asset) + query.where = tab_asset.id.in_([x.id for x in assets]) - for x in l1: - (id1, wkn, secsymb, isin) = x - r1 = {'wkn': wkn, 'secsymb': secsymb, 'isin': isin} + cursor.execute(*query) + l1 = cursor.fetchall() + + for x in l1: + (id1, wkn, secsymb, isin) = x + r1 = {'wkn': wkn, 'secsymb': secsymb, 'isin': isin} + + for n in names: + result[n][id1] = r1[n] - for n in names: - result[n][id1] = r1[n] return result def get_rec_name(self, name): @@ -885,7 +916,7 @@ class Asset(SymbolMixin, ModelSQL, ModelView): if OnlineSource.update_rate(asset): to_run_activities.append(asset) - if to_run_activities: + if len(to_run_activities) > 0: cls.after_update_actions(to_run_activities) # end Asset diff --git a/const.py b/const.py deleted file mode 100644 index a01e781..0000000 --- a/const.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -# This file is part of the cashbook-module from m-ds.de for Tryton. -# The COPYRIGHT file at the top level of this repository contains the -# full copyright notices and license terms. - - -DEF_TRUE = True -DEF_NONE = None diff --git a/diagram.py b/diagram.py index 1d654e9..514a2ad 100644 --- a/diagram.py +++ b/diagram.py @@ -60,16 +60,16 @@ class GraphDef(metaclass=PoolMeta): return None if self.scaling == 'alldata': - query = [('asset', '=', self.asset.id)] + query = [('asset.id', '=', self.asset.id)] elif self.scaling == 'view': query = [ - ('asset', '=', self.asset.id), + ('asset.id', '=', self.asset.id), ('date', '>=', self.chart.used_start_date()), ('date', '<=', self.chart.used_end_date()), ] elif self.scaling == 'six': query = [ - ('asset', '=', self.asset.id), + ('asset.id', '=', self.asset.id), ('date', '>=', self.chart.used_start_date() - timedelta(days=180)), ('date', '<=', self.chart.used_end_date()), @@ -95,7 +95,7 @@ class ChartPoint(metaclass=PoolMeta): """ Rate = Pool().get('investment.rate') - if not keyname: + if keyname is None: return None # check if query is for us @@ -104,12 +104,12 @@ class ChartPoint(metaclass=PoolMeta): before = Rate.search([ ('date', '<', query_date), - ('asset', '=', asset_id), + ('asset.id', '=', asset_id), ], limit=1, order=[('date', 'DESC')]) after = Rate.search([ ('date', '>', query_date), - ('asset', '=', asset_id), + ('asset.id', '=', asset_id), ], limit=1, order=[('date', 'ASC')]) if (len(before) == 1) and (len(after) == 1): diff --git a/import_wiz.py b/import_wiz.py index 5a4d097..72e7d4e 100644 --- a/import_wiz.py +++ b/import_wiz.py @@ -84,14 +84,14 @@ class ImportWizard(Wizard): pool = Pool() ImportWiz = pool.get('investment.imp_wiz', type='wizard') - if self.start.file_: + if self.start.file_ is not None: (lines, max_date, min_date) = ImportWiz.read_csv_file( - self.start.file_.decode('utf8'), - dec_divider=self.start.dec_divider, - date_fmt=self.start.date_fmt, - delimiter=self.start.field_delimiter) + self.start.file_.decode('utf8'), + dec_divider=self.start.dec_divider, + date_fmt=self.start.date_fmt, + delimiter=self.start.field_delimiter) - if lines: + if len(lines) > 0: ImportWiz.upload_rates( self.start.asset, lines, min_date, max_date) @@ -173,8 +173,7 @@ class ImportWizard(Wizard): datefmt='dd%sdd' % dec_divider, colnr='2')) - if isinstance(date_val, date) and isinstance( - rate_val, Decimal): + if isinstance(date_val, date) and isinstance(rate_val, Decimal): result.append({'date': date_val, 'rate': rate_val}) # date range diff --git a/locale/de.po b/locale/de.po index 2e027be..5d55abe 100644 --- a/locale/de.po +++ b/locale/de.po @@ -50,10 +50,6 @@ 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." -msgctxt "model:ir.message,text:msg_bug_in_regexquery" -msgid "Error in regex code of field '%(fname)s': %(errmsg)s [%(code)s]" -msgstr "Fehler in Regex-Code des Feldes '%(fname)s': %(errmsg)s [%(code)s]" - ############## # ir.ui.menu # diff --git a/locale/en.po b/locale/en.po index 7d76175..7e0923e 100644 --- a/locale/en.po +++ b/locale/en.po @@ -38,10 +38,6 @@ 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.message,text:msg_bug_in_regexquery" -msgid "Error in regex code of field '%(fname)s': %(errmsg)s [%(code)s]" -msgstr "Error in regex code of field '%(fname)s': %(errmsg)s [%(code)s]" - msgctxt "model:ir.ui.menu,name:menu_investment" msgid "Investment" msgstr "Investment" @@ -298,18 +294,6 @@ msgctxt "selection:investment.asset,updtdays:" msgid "Mon - Sun" msgstr "Mon - Sun" -msgctxt "field:investment.asset,updturl:" -msgid "URL" -msgstr "URL" - -msgctxt "help:investment.asset,updturl:" -msgid "URL for data retrieval." -msgstr "URL for data retrieval." - -msgctxt "field:investment.asset,updturl_enable:" -msgid "URL required" -msgstr "URL required" - msgctxt "model:investment.asset_source_rel,name:" msgid "Asset Source Relation" msgstr "Asset Source Relation" diff --git a/message.xml b/message.xml index 2d681ef..2ef9571 100644 --- a/message.xml +++ b/message.xml @@ -23,9 +23,6 @@ full copyright notices and license terms. --> URL for the online source '%(oname)s' is missing. - - Error in regex code of field '%(fname)s': %(errmsg)s [%(code)s] - diff --git a/onlinesource.py b/onlinesource.py index abda8b4..c881aa5 100644 --- a/onlinesource.py +++ b/onlinesource.py @@ -63,14 +63,16 @@ class OnlineSource(ModelSQL, ModelView): 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, + 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.', - states={'invisible': STATES_WEB['invisible']}, - depends=DEPENDS_WEB) + states={ + 'invisible': STATES_WEB['invisible'], + }, depends=DEPENDS_WEB) rgxdate = fields.Char( string='Date', help='Regex code to find the date in the downloaded HTML file.', @@ -84,14 +86,14 @@ class OnlineSource(ModelSQL, ModelView): states=STATES_WEB, depends=DEPENDS_WEB) rgxdecimal = fields.Selection( string='Decimal Separator', - help='Decimal separator for converting the market ' + - 'value into a number.', + help='Decimal separator for converting the market value into a number.', selection=sel_rgxdecimal, states=STATES_WEB, depends=DEPENDS_WEB) rgxident = fields.Char( string='Identifier', help='Regex code to find the identifier in the downloaded HTML file.', - states={'invisible': STATES_WEB['invisible']}, - depends=DEPENDS_WEB) + states={ + 'invisible': STATES_WEB['invisible'], + }, depends=DEPENDS_WEB) rgxidtype = fields.Selection( string='ID-Type', selection=sel_rgxidtype, help='Type of identifier used to validate the result.', @@ -240,13 +242,16 @@ class OnlineSource(ModelSQL, ModelView): isin=self.isin, nsin=self.nsin, symbol=self.symbol, - url=self.url) + url=self.url, + ) @classmethod def get_query_methods(cls): """ get list of query-methods """ - return [('web', gettext('investment.msg_querytype_web'))] + return [ + ('web', gettext('investment.msg_querytype_web')), + ] @classmethod def set_test_value(cls, record, name, value): @@ -254,15 +259,6 @@ class OnlineSource(ModelSQL, ModelView): """ pass - @classmethod - def validate(cls, records): - """ check regex-code - """ - for record in records: - for x in ['rgxdate', 'rgxrate', 'rgxident']: - if x: - record.get_regex_result('', x) - @classmethod def run_query_method(cls, osource, isin, nsin, symbol, url, debug=False): """ run selected query to retrive data @@ -283,7 +279,8 @@ class OnlineSource(ModelSQL, ModelView): nsin=nsin, symbol=symbol, debug=debug, - url=url) + url=url, + ) def call_online_source(self): """ use updated values to call online-source, @@ -294,7 +291,7 @@ class OnlineSource(ModelSQL, ModelView): result = OSourc.run_query_method( self, self.isin, self.nsin, self.url, self.symbol, debug=True) - if result: + if result is not None: self.text = result.get('text', None) self.http_state = result.get('http_state', None) self.fnddate = result.get('date', None) @@ -306,17 +303,19 @@ class OnlineSource(ModelSQL, ModelView): """ generate url """ if self.fixed_url is True: - if not url: + if url is None: raise UserError(gettext( 'investment.msg_missing_url', - oname=self.rec_name)) + oname=self.rec_name, + )) return 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 ''}) + 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): @@ -335,7 +334,8 @@ class OnlineSource(ModelSQL, ModelView): isin=asset.isin, nsin=asset.wkn, symbol=asset.secsymb, - url=asset.updturl) + url=asset.updturl, + ) if len(updtsource.rgxident or '') > 0: # check result - same code? @@ -352,13 +352,15 @@ class OnlineSource(ModelSQL, ModelView): 'update_rate: got wrong code ' + '"%(wrong)s" - expected "%(exp)s"' % { 'exp': asset_code, - 'wrong': code}) + 'wrong': code, + }) continue to_create = { 'date': rate_data.get('date', None), 'rate': rate_data.get('rate', None), - 'asset': asset.id} + 'asset': asset.id, + } if (to_create['date'] is not None) and \ (to_create['rate'] is not None): # check if exists @@ -377,22 +379,13 @@ class OnlineSource(ModelSQL, ModelView): def get_regex_result(self, html_text, field_name): """ run regex on html-text, convert result """ - OSource = Pool().get('investment.source') - rgxcode = getattr(self, field_name) or '' if len(rgxcode) == 0: return None - try: - search_result = re.compile(rgxcode).search(html_text) - if search_result is None: - return None - except Exception as e1: - raise UserError(gettext( - 'investment.msg_bug_in_regexquery', - errmsg=str(e1), - fname=getattr(OSource, field_name).string, - code=rgxcode)) + search_result = re.compile(rgxcode).search(html_text) + if search_result is None: + return None try: result = search_result.group(1) @@ -433,7 +426,8 @@ class OnlineSource(ModelSQL, ModelView): isin=isin, nsin=nsin, symbol=symbol, - url=url), + url=url, + ), allow_redirects=True, timeout=5.0) @@ -442,7 +436,7 @@ class OnlineSource(ModelSQL, ModelView): 'msg': res1.reason, } - if res1.status_code in [200, 204, 410]: + if res1.status_code in [200, 204]: html = res1.text # remove html-tags diff --git a/rate.py b/rate.py index 6379e6b..eef697c 100644 --- a/rate.py +++ b/rate.py @@ -53,13 +53,6 @@ class Rate(SymbolMixin, ModelSQL, ModelView): Index( t, (t.rate, Index.Range())), - Index( - t, - (t.asset, Index.Equality())), - Index( - t, - (t.asset, Index.Equality()), - (t.date, Index.Range(order='DESC'))), }) @classmethod diff --git a/setup.py b/setup.py index 29f2a96..58979c0 100644 --- a/setup.py +++ b/setup.py @@ -39,8 +39,8 @@ with open(path.join(here, 'versiondep.txt'), encoding='utf-8') as f: modversion[l2[0]] = {'min': l2[1], 'max': l2[2], 'prefix': l2[3]} # tryton-version -major_version = 7 -minor_version = 0 +major_version = 6 +minor_version = 8 requires = ['requests>=2.26', 'html2text'] for dep in info.get('depends', []): diff --git a/sources_def.xml b/sources_def.xml index ff5959a..1f49541 100644 --- a/sources_def.xml +++ b/sources_def.xml @@ -71,9 +71,9 @@ full copyright notices and license terms. --> www.sbroker.de https://www.sbroker.de/sbl/mdaten_analyse/dksuche_a?SEARCH_VALUE=${isin} - \nDatum\s*(?:\/ Uhrzeit)*: (\d+\.\d+\.\d+)\s*(?:\/ \d+:\d+)*\s*\n + \nDatum / Uhrzeit: (\d+\.\d+\.\d+) / \d+:\d+\s+\n %d.%m.%y - (?:Kurs aktuell|Rucknahmepreis)\s+[()\w\./\[\]!]+\s+(\d+,\d+)\s+(EUR|€) + Kurs aktuell .* (\d+,\d+)\s+EUR.*\n , \nWKN / ISIN: [A-Z,0-9]+ / ([A-Z,0-9]+)\s+\n isin diff --git a/tests/source.py b/tests/source.py index 43ac22b..f784e4c 100644 --- a/tests/source.py +++ b/tests/source.py @@ -6,7 +6,6 @@ from trytond.tests.test_tryton import with_transaction from trytond.pool import Pool from trytond.transaction import Transaction -from trytond.exceptions import UserError from decimal import Decimal from datetime import time, date, datetime from unittest.mock import MagicMock @@ -132,54 +131,5 @@ High 34,87 EUR 'rgxdate' ), date(2022, 3, 14)) - @with_transaction() - def test_waitlist_source_check_regex_validate(self): - """ create source, check validation of regex-code - """ - pool = Pool() - OSource = pool.get('investment.source') - - self.assertRaisesRegex( - UserError, - r"Error in regex code of field 'Date': nothing to repeat " + - r"at position 0 \[\*+ multiple repeat\]", - OSource.create, - [{ - 'name': 'Check date', - 'rgxdate': '** multiple repeat', - 'rgxrate': 'rate -- multiple repeat', - 'rgxident': 'identifiert ** multiple repeat', - }]) - - self.assertRaisesRegex( - UserError, - r"Error in regex code of field 'Rate': multiple repeat " + - r"at position 6 \[rate \*+ multiple repeat\]", - OSource.create, - [{ - 'name': 'Check rate', - 'rgxdate': '-- multiple repeat', - 'rgxrate': 'rate ** multiple repeat', - 'rgxident': 'identifiert -- multiple repeat', - }]) - - self.assertRaisesRegex( - UserError, - r"Error in regex code of field 'Identifier': multiple " + - r"repeat at position 13 \[identifiert \*+ multiple repeat\]", - OSource.create, - [{ - 'name': 'Check rgxident', - 'rgxdate': '-- multiple repeat', - 'rgxrate': 'rate -- multiple repeat', - 'rgxident': 'identifiert ** multiple repeat', - }]) - - OSource.create([{ - 'name': 'Check rgxident', - 'rgxdate': '-- multiple repeat', - 'rgxrate': 'rate -- multiple repeat', - 'rgxident': 'identifiert -- multiple repeat', - }]) # end SourceTestCase diff --git a/tryton.cfg b/tryton.cfg index 39f64d0..4650f07 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -1,5 +1,5 @@ [tryton] -version=7.0.0 +version=6.8.24 depends: ir res @@ -21,3 +21,4 @@ xml: import_wiz.xml menu.xml cron.xml + diff --git a/update_wiz.py b/update_wiz.py index 50a36a3..64f9359 100644 --- a/update_wiz.py +++ b/update_wiz.py @@ -29,7 +29,7 @@ class UpdateSoureWizard(Wizard): if OnlineSource.update_rate(asset): to_run_activities.append(asset) - if to_run_activities: + if len(to_run_activities) > 0: Asset.after_update_actions(to_run_activities) return 'end' diff --git a/view/asset_list.xml b/view/asset_list.xml index 7837d85..daee4c5 100644 --- a/view/asset_list.xml +++ b/view/asset_list.xml @@ -4,12 +4,12 @@ The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. --> - - - - - - - - + + + + + + + +