diff --git a/README.rst b/README.rst index 1f48f27..f6ecf30 100644 --- a/README.rst +++ b/README.rst @@ -22,6 +22,14 @@ You can define the course sources yourself. Changes ======= +*6.8.26 - 06.12.2023* + +- add: columns optional + +*6.8.25 - 01.12.2023* + +- code/speed optimized + *6.8.24 - 07.06.2023* - portet to Tryton 6.8 diff --git a/asset.py b/asset.py index d599d7b..dd62caa 100644 --- a/asset.py +++ b/asset.py @@ -15,6 +15,7 @@ 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 @@ -100,8 +101,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView): string='URL', help='URL for data retrieval.', states={ - 'invisible': Eval('updturl_enable', False) == False, - 'required': Eval('updturl_enable', False) == True, + 'invisible': ~Eval('updturl_enable', False), + 'required': Eval('updturl_enable', False), }, depends=['updturl_enable']) updturl_enable = fields.Function(fields.Boolean( string='URL required', readonly=True, @@ -191,7 +192,7 @@ class Asset(SymbolMixin, ModelSQL, ModelView): query = tab_asset.select( tab_asset.id, tab_asset.updtsource, - where=tab_asset.updtsource != None, + where=tab_asset.updtsource != DEF_NONE, ) cursor.execute(*query) records = cursor.fetchall() @@ -330,23 +331,24 @@ 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} - for record in records: - values = { - 'name': record[1], - 'product_uom': record[2], - 'symbol': record[3], - 'asset_symbol': record[0], - } + (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 name in names: - result[name][record[0]] = values[name] + 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] return result @classmethod @@ -384,32 +386,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} - for record in records: - (id1, rate1, date1, id_rate) = record + 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} - asset = Asset2(id1) - exp = Decimal(Decimal(1) / 10 ** (asset.currency_digits or 4)) + cursor.execute(*query) + records = cursor.fetchall() - values = { - 'rate': record[1].quantize(exp), - 'date': record[2], - 'change_symbol': id_rate, - } + for record in records: + (id1, rate1, date1, id_rate) = record - for name in names: - result[name][record[0]] = values[name] + curr_dig = curr_digits.get(id1, 4) + exp = Decimal(Decimal(1) / 10 ** curr_dig) + 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 @@ -472,8 +474,6 @@ 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 @@ -481,17 +481,14 @@ 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_asset.id.in_(asset_ids) + where_asset &= tab_rate1.asset.in_(asset_ids) - tab_today = tab_asset.join( - tab_rate1, - condition=tab_asset.id == tab_rate1.asset, - ).select( - tab_asset.id, + tab_today = tab_rate1.select( + tab_rate1.asset.as_('id'), tab_rate1.date, tab_rate1.rate, - distinct_on=[tab_asset.id], - order_by=[tab_asset.id, tab_rate1.date.desc], + distinct_on=[tab_rate1.asset], + order_by=[tab_rate1.asset, tab_rate1.date.desc], where=where_asset, ) @@ -612,23 +609,24 @@ class Asset(SymbolMixin, ModelSQL, ModelView): exp = Decimal(Decimal(1) / 10 ** digits_percent) asset_id_lst = [x.id for x in assets] - 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() + 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 record in records: - result[x][record[0]] = record[3].quantize(exp) \ - if record[3] is not None else None + for record in records: + result[x][record[0]] = record[3].quantize(exp) \ + if record[3] is not None else None return result @classmethod @@ -841,7 +839,7 @@ class Asset(SymbolMixin, ModelSQL, ModelView): ).select( tab_asset.id, where=Operator(field_qu, clause[2]) & - (field_qu != None), + (field_qu != DEF_NONE), ) return [('id', 'in', query)] @@ -856,20 +854,19 @@ 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]) - 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() - 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 x in l1: + (id1, wkn, secsymb, isin) = x + r1 = {'wkn': wkn, 'secsymb': secsymb, 'isin': isin} + for n in names: + result[n][id1] = r1[n] return result def get_rec_name(self, name): diff --git a/const.py b/const.py new file mode 100644 index 0000000..a01e781 --- /dev/null +++ b/const.py @@ -0,0 +1,8 @@ +# -*- 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 514a2ad..08c7cab 100644 --- a/diagram.py +++ b/diagram.py @@ -60,16 +60,16 @@ class GraphDef(metaclass=PoolMeta): return None if self.scaling == 'alldata': - query = [('asset.id', '=', self.asset.id)] + query = [('asset', '=', self.asset.id)] elif self.scaling == 'view': query = [ - ('asset.id', '=', self.asset.id), + ('asset', '=', self.asset.id), ('date', '>=', self.chart.used_start_date()), ('date', '<=', self.chart.used_end_date()), ] elif self.scaling == 'six': query = [ - ('asset.id', '=', self.asset.id), + ('asset', '=', self.asset.id), ('date', '>=', self.chart.used_start_date() - timedelta(days=180)), ('date', '<=', self.chart.used_end_date()), @@ -104,12 +104,12 @@ class ChartPoint(metaclass=PoolMeta): before = Rate.search([ ('date', '<', query_date), - ('asset.id', '=', asset_id), + ('asset', '=', asset_id), ], limit=1, order=[('date', 'DESC')]) after = Rate.search([ ('date', '>', query_date), - ('asset.id', '=', asset_id), + ('asset', '=', 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 72e7d4e..4722557 100644 --- a/import_wiz.py +++ b/import_wiz.py @@ -173,7 +173,8 @@ 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/onlinesource.py b/onlinesource.py index c881aa5..a74696a 100644 --- a/onlinesource.py +++ b/onlinesource.py @@ -86,7 +86,8 @@ 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', diff --git a/rate.py b/rate.py index eef697c..6379e6b 100644 --- a/rate.py +++ b/rate.py @@ -53,6 +53,13 @@ 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/tryton.cfg b/tryton.cfg index 4ba63f6..b7b3c7d 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -1,5 +1,5 @@ [tryton] -version=6.8.24 +version=6.8.26 depends: ir res @@ -21,3 +21,4 @@ xml: import_wiz.xml menu.xml cron.xml + diff --git a/view/asset_list.xml b/view/asset_list.xml index daee4c5..7837d85 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. --> - - - - - - - - + + + + + + + +