Compare commits

...

13 commits
main ... 6.8

Author SHA1 Message Date
Frederik Jaeckel
5a320e57da Etikett ver 6.8.26 zum Änderungssatz c44e42da0955 hinzugefügt 2023-12-06 22:38:54 +01:00
Frederik Jaeckel
c84c2d2907 Version 6.8.26 2023-12-06 22:37:56 +01:00
Frederik Jaeckel
e63023170f asset: columns optional 2023-12-03 18:20:22 +01:00
Frederik Jaeckel
4656a4c65c Etikett ver 6.8.25 zum Änderungssatz 7e16130066c0 hinzugefügt 2023-12-01 13:40:37 +01:00
Frederik Jaeckel
214edfd070 Version 6.8.25 2023-12-01 13:40:14 +01:00
Frederik Jaeckel
530d382905 formatting 2023-12-01 13:29:46 +01:00
Frederik Jaeckel
6d72822526 asset-list: remove percent-symbol to speed up list view 2023-06-23 21:40:55 +02:00
Frederik Jaeckel
41a86155a1 diagram: simplify queries 2023-06-23 16:41:39 +02:00
Frederik Jaeckel
0b774fc6e2 asset: avoid exceptions in get_identifiers() 2023-06-23 16:29:10 +02:00
Frederik Jaeckel
c06c2b8260 asset/rate: speed up percent-queries 2023-06-23 16:02:31 +02:00
Frederik Jaeckel
8eaddc9b28 asset: fixed possible exceptions 2023-06-22 17:28:58 +02:00
Frederik Jaeckel
4f9fdb6fe7 Etikett ver 6.8.24 zum Änderungssatz 81540c6c6c42 hinzugefügt 2023-06-07 21:58:47 +02:00
Frederik Jaeckel
922c650a71 Version 6.8.24 2023-06-07 21:58:32 +02:00
9 changed files with 112 additions and 89 deletions

View file

@ -22,6 +22,14 @@ You can define the course sources yourself.
Changes 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* *6.8.24 - 07.06.2023*
- portet to Tryton 6.8 - portet to Tryton 6.8

143
asset.py
View file

@ -15,6 +15,7 @@ from sql.functions import CurrentDate, CurrentTimestamp, Round, Extract
from sql.conditionals import Case, Coalesce, NullIf from sql.conditionals import Case, Coalesce, NullIf
from sql import Literal from sql import Literal
from .diagram import Concat2 from .diagram import Concat2
from .const import DEF_NONE
digits_percent = 2 digits_percent = 2
@ -100,8 +101,8 @@ class Asset(SymbolMixin, ModelSQL, ModelView):
string='URL', string='URL',
help='URL for data retrieval.', help='URL for data retrieval.',
states={ states={
'invisible': Eval('updturl_enable', False) == False, 'invisible': ~Eval('updturl_enable', False),
'required': Eval('updturl_enable', False) == True, 'required': Eval('updturl_enable', False),
}, depends=['updturl_enable']) }, depends=['updturl_enable'])
updturl_enable = fields.Function(fields.Boolean( updturl_enable = fields.Function(fields.Boolean(
string='URL required', readonly=True, string='URL required', readonly=True,
@ -191,7 +192,7 @@ class Asset(SymbolMixin, ModelSQL, ModelView):
query = tab_asset.select( query = tab_asset.select(
tab_asset.id, tab_asset.id,
tab_asset.updtsource, tab_asset.updtsource,
where=tab_asset.updtsource != None, where=tab_asset.updtsource != DEF_NONE,
) )
cursor.execute(*query) cursor.execute(*query)
records = cursor.fetchall() records = cursor.fetchall()
@ -330,23 +331,24 @@ class Asset(SymbolMixin, ModelSQL, ModelView):
""" """
cursor = Transaction().connection.cursor() 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} result = {x: {y.id: None for y in assets} for x in names}
for record in records: (query, tab_asset) = cls.get_name_symbol_sql()
values = { if assets:
'name': record[1], query.where = tab_asset.id.in_([x.id for x in assets])
'product_uom': record[2], cursor.execute(*query)
'symbol': record[3], records = cursor.fetchall()
'asset_symbol': record[0],
}
for name in names: for record in records:
result[name][record[0]] = values[name] 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 return result
@classmethod @classmethod
@ -384,32 +386,32 @@ class Asset(SymbolMixin, ModelSQL, ModelView):
def get_rate_data(cls, assets, names): def get_rate_data(cls, assets, names):
""" get date and rate of asset """ get date and rate of asset
""" """
Asset2 = Pool().get('investment.asset')
cursor = Transaction().connection.cursor() 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} result = {x: {y.id: None for y in assets} for x in names}
for record in records: if assets:
(id1, rate1, date1, id_rate) = record (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) cursor.execute(*query)
exp = Decimal(Decimal(1) / 10 ** (asset.currency_digits or 4)) records = cursor.fetchall()
values = { for record in records:
'rate': record[1].quantize(exp), (id1, rate1, date1, id_rate) = record
'date': record[2],
'change_symbol': id_rate,
}
for name in names: curr_dig = curr_digits.get(id1, 4)
result[name][record[0]] = values[name] 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 return result
@classmethod @classmethod
@ -472,8 +474,6 @@ class Asset(SymbolMixin, ModelSQL, ModelView):
""" """
pool = Pool() pool = Pool()
Rate = pool.get('investment.rate') Rate = pool.get('investment.rate')
Asset2 = pool.get('investment.asset')
tab_asset = Asset2.__table__()
tab_rate1 = Rate.__table__() tab_rate1 = Rate.__table__()
tab_rate2 = Rate.__table__() tab_rate2 = Rate.__table__()
context = Transaction().context context = Transaction().context
@ -481,17 +481,14 @@ class Asset(SymbolMixin, ModelSQL, ModelView):
query_date = context.get('qdate', CurrentDate()) query_date = context.get('qdate', CurrentDate())
where_asset = tab_rate1.date <= query_date where_asset = tab_rate1.date <= query_date
if isinstance(asset_ids, list): 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_today = tab_rate1.select(
tab_rate1, tab_rate1.asset.as_('id'),
condition=tab_asset.id == tab_rate1.asset,
).select(
tab_asset.id,
tab_rate1.date, tab_rate1.date,
tab_rate1.rate, tab_rate1.rate,
distinct_on=[tab_asset.id], distinct_on=[tab_rate1.asset],
order_by=[tab_asset.id, tab_rate1.date.desc], order_by=[tab_rate1.asset, tab_rate1.date.desc],
where=where_asset, where=where_asset,
) )
@ -612,23 +609,24 @@ class Asset(SymbolMixin, ModelSQL, ModelView):
exp = Decimal(Decimal(1) / 10 ** digits_percent) exp = Decimal(Decimal(1) / 10 ** digits_percent)
asset_id_lst = [x.id for x in assets] asset_id_lst = [x.id for x in assets]
for x in names: if asset_id_lst and names:
tab_percent = cls.get_percentage_sql( for x in names:
days={ tab_percent = cls.get_percentage_sql(
'change_day1': 0, days={
'change_month1': 30, 'change_day1': 0,
'change_month3': 90, 'change_month1': 30,
'change_month6': 180, 'change_month3': 90,
'change_month12': 365, 'change_month6': 180,
}[x], 'change_month12': 365,
asset_ids=asset_id_lst, }[x],
) asset_ids=asset_id_lst,
cursor.execute(*tab_percent) )
records = cursor.fetchall() cursor.execute(*tab_percent)
records = cursor.fetchall()
for record in records: for record in records:
result[x][record[0]] = record[3].quantize(exp) \ result[x][record[0]] = record[3].quantize(exp) \
if record[3] is not None else None if record[3] is not None else None
return result return result
@classmethod @classmethod
@ -841,7 +839,7 @@ class Asset(SymbolMixin, ModelSQL, ModelView):
).select( ).select(
tab_asset.id, tab_asset.id,
where=Operator(field_qu, clause[2]) & where=Operator(field_qu, clause[2]) &
(field_qu != None), (field_qu != DEF_NONE),
) )
return [('id', 'in', query)] return [('id', 'in', query)]
@ -856,20 +854,19 @@ class Asset(SymbolMixin, ModelSQL, ModelView):
cursor = Transaction().connection.cursor() cursor = Transaction().connection.cursor()
result = {x: {y.id: None for y in assets} for x in names} 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) cursor.execute(*query)
query.where = tab_asset.id.in_([x.id for x in assets]) l1 = cursor.fetchall()
cursor.execute(*query) for x in l1:
l1 = cursor.fetchall() (id1, wkn, secsymb, isin) = x
r1 = {'wkn': wkn, 'secsymb': secsymb, 'isin': isin}
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 return result
def get_rec_name(self, name): def get_rec_name(self, name):

8
const.py Normal file
View file

@ -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

View file

@ -60,16 +60,16 @@ class GraphDef(metaclass=PoolMeta):
return None return None
if self.scaling == 'alldata': if self.scaling == 'alldata':
query = [('asset.id', '=', self.asset.id)] query = [('asset', '=', self.asset.id)]
elif self.scaling == 'view': elif self.scaling == 'view':
query = [ query = [
('asset.id', '=', self.asset.id), ('asset', '=', self.asset.id),
('date', '>=', self.chart.used_start_date()), ('date', '>=', self.chart.used_start_date()),
('date', '<=', self.chart.used_end_date()), ('date', '<=', self.chart.used_end_date()),
] ]
elif self.scaling == 'six': elif self.scaling == 'six':
query = [ query = [
('asset.id', '=', self.asset.id), ('asset', '=', self.asset.id),
('date', '>=', self.chart.used_start_date() - ('date', '>=', self.chart.used_start_date() -
timedelta(days=180)), timedelta(days=180)),
('date', '<=', self.chart.used_end_date()), ('date', '<=', self.chart.used_end_date()),
@ -104,12 +104,12 @@ class ChartPoint(metaclass=PoolMeta):
before = Rate.search([ before = Rate.search([
('date', '<', query_date), ('date', '<', query_date),
('asset.id', '=', asset_id), ('asset', '=', asset_id),
], limit=1, order=[('date', 'DESC')]) ], limit=1, order=[('date', 'DESC')])
after = Rate.search([ after = Rate.search([
('date', '>', query_date), ('date', '>', query_date),
('asset.id', '=', asset_id), ('asset', '=', asset_id),
], limit=1, order=[('date', 'ASC')]) ], limit=1, order=[('date', 'ASC')])
if (len(before) == 1) and (len(after) == 1): if (len(before) == 1) and (len(after) == 1):

View file

@ -173,7 +173,8 @@ class ImportWizard(Wizard):
datefmt='dd%sdd' % dec_divider, datefmt='dd%sdd' % dec_divider,
colnr='2')) 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}) result.append({'date': date_val, 'rate': rate_val})
# date range # date range

View file

@ -86,7 +86,8 @@ class OnlineSource(ModelSQL, ModelView):
states=STATES_WEB, depends=DEPENDS_WEB) states=STATES_WEB, depends=DEPENDS_WEB)
rgxdecimal = fields.Selection( rgxdecimal = fields.Selection(
string='Decimal Separator', 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) selection=sel_rgxdecimal, states=STATES_WEB, depends=DEPENDS_WEB)
rgxident = fields.Char( rgxident = fields.Char(
string='Identifier', string='Identifier',

View file

@ -53,6 +53,13 @@ class Rate(SymbolMixin, ModelSQL, ModelView):
Index( Index(
t, t,
(t.rate, Index.Range())), (t.rate, Index.Range())),
Index(
t,
(t.asset, Index.Equality())),
Index(
t,
(t.asset, Index.Equality()),
(t.date, Index.Range(order='DESC'))),
}) })
@classmethod @classmethod

View file

@ -1,5 +1,5 @@
[tryton] [tryton]
version=6.8.24 version=6.8.26
depends: depends:
ir ir
res res
@ -21,3 +21,4 @@ xml:
import_wiz.xml import_wiz.xml
menu.xml menu.xml
cron.xml cron.xml

View file

@ -4,12 +4,12 @@ The COPYRIGHT file at the top level of this repository contains the
full copyright notices and license terms. --> full copyright notices and license terms. -->
<tree> <tree>
<field name="name" expand="1"/> <field name="name" expand="1"/>
<field name="change_day1" symbol="change_symbol"/> <field name="change_day1" optional="0"/>
<field name="change_month1" symbol="change_symbol"/> <field name="change_month1" optional="0"/>
<field name="change_month3" symbol="change_symbol"/> <field name="change_month3" optional="0"/>
<field name="change_month6" symbol="change_symbol"/> <field name="change_month6" optional="0"/>
<field name="date"/> <field name="date" optional="0"/>
<field name="rate" symbol="asset_symbol"/> <field name="rate" symbol="asset_symbol" optional="0"/>
<field name="isin"/> <field name="isin" optional="0"/>
<field name="wkn" /> <field name="wkn" optional="0"/>
</tree> </tree>