asset: spalten tag/monat/3monate... ok + test

This commit is contained in:
Frederik Jaeckel 2022-11-25 21:55:43 +01:00
parent 64b8383096
commit 6311dce3d1
6 changed files with 377 additions and 177 deletions

339
asset.py
View file

@ -10,7 +10,7 @@ from trytond.pyson import Eval, Bool, And, If
from trytond.report import Report from trytond.report import Report
from decimal import Decimal from decimal import Decimal
from datetime import time from datetime import time
from sql.functions import CurrentDate, CurrentTimestamp from sql.functions import CurrentDate, CurrentTimestamp, Round
from sql.conditionals import Case, Coalesce from sql.conditionals import Case, Coalesce
from sql import Literal from sql import Literal
@ -78,31 +78,31 @@ class Asset(ModelSQL, ModelView):
states={ states={
'readonly': ~Bool(Eval('updtsource')), 'readonly': ~Bool(Eval('updtsource')),
}, depends=['updtsource']) }, depends=['updtsource'])
nextupdtate = fields.Function(fields.DateTime(string='Next Update', nextupdate = fields.Function(fields.DateTime(string='Next Update',
readonly=True), readonly=True),
'get_nextupdtates', searcher='search_nextupdtate') 'get_nextupdates', searcher='search_nextupdate')
# percentage change # percentage change
change_day1 = fields.Function(fields.Numeric(string='Previous Day', change_day1 = fields.Function(fields.Numeric(string='Previous Day',
help='percentage change in value compared to the previous day', help='percentage change in value compared to the previous day',
readonly=True, digits=(16,digits_percent)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change', searcher='search_percentage')
change_month1 = fields.Function(fields.Numeric(string='1 Month', change_month1 = fields.Function(fields.Numeric(string='1 Month',
help='percentage change in value compared to last month', help='percentage change in value compared to last month',
readonly=True, digits=(16,digits_percent)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change', searcher='search_percentage')
change_month3 = fields.Function(fields.Numeric(string='3 Months', change_month3 = fields.Function(fields.Numeric(string='3 Months',
help='percentage change in value during 3 months', help='percentage change in value during 3 months',
readonly=True, digits=(16,digits_percent)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change', searcher='search_percentage')
change_month6 = fields.Function(fields.Numeric(string='6 Months', change_month6 = fields.Function(fields.Numeric(string='6 Months',
help='percentage change in value during 6 months', help='percentage change in value during 6 months',
readonly=True, digits=(16,digits_percent)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change', searcher='search_percentage')
change_month12 = fields.Function(fields.Numeric(string='1 Year', change_month12 = fields.Function(fields.Numeric(string='1 Year',
help='percentage change in value during 1 year', help='percentage change in value during 1 year',
readonly=True, digits=(16,digits_percent)), readonly=True, digits=(16,digits_percent)),
'get_percentage_change') 'get_percentage_change', searcher='search_percentage')
@classmethod @classmethod
def view_attributes(cls): def view_attributes(cls):
@ -136,137 +136,10 @@ class Asset(ModelSQL, ModelView):
return 4 return 4
@classmethod @classmethod
def get_percentage_sql(cls, table_asset, name_lst): def default_updttime(cls):
""" get table for percentages and dates """ 14 o'clock UTC
generate adapted query
""" """
pool = Pool() return time(14, 0)
Rate = pool.get('investment.rate')
tab_rate_today = Rate.__table__()
rate_tab = {
'day1': {'tab': Rate.__table__(), 'day': 0},
'month1': {'tab': Rate.__table__(), 'day': 30},
'month3': {'tab': Rate.__table__(), 'day': 3*30},
'month6': {'tab': Rate.__table__(), 'day': 6*30},
'month12': {'tab': Rate.__table__(), 'day': 12*30},
}
context = Transaction().context
# create tables to query percentual changes for
# 1 day, 30 days, 3 months, 6 months, 1 year
query_date = context.get('qdate', CurrentDate())
query_today = table_asset.join(tab_rate_today,
condition=table_asset.id==tab_rate_today.asset,
).select(
table_asset.id,
tab_rate_today.date,
tab_rate_today.rate,
distinct_on=[table_asset.id],
order_by=[table_asset.id, tab_rate_today.date.desc],
where=tab_rate_today.date <= query_date,
)
# create join for requested fields, to minimize database-load
query = query_today
for name in name_lst:
query = query.join(rate_tab[name]['tab'],
# select newest date from <period> until 3 days older
condition=(query_today.id==rate_tab[name]['tab'].asset) & \
(query_today.date > (rate_tab[name]['tab'].date + Literal(rate_tab[name]['day']))) & \
(query_today.date < (rate_tab[name]['tab'].date + Literal(rate_tab[name]['day'] + 3))),
type_ = 'LEFT OUTER')
# add select for requested fields to join
select_lst = [
query_today.id,
query_today.date,
]
for name in name_lst:
select_lst.append(
Case(
((rate_tab[name]['tab'].rate != None) & (query_today.rate != None) & \
(rate_tab[name]['tab'].rate != Literal(0.0)),
query_today.rate * Literal(100.0) / rate_tab[name]['tab'].rate - Literal(100.0)),
else_ = None,
).as_(name))
order_by_lst = [query_today.id]
order_by_lst.extend([
rate_tab[name]['tab'].date.desc for name in name_lst
])
query = query.select(
*select_lst,
distinct_on=[query_today.id],
order_by=order_by_lst,
)
# ~ query = query_today.join(tab_rate_1day,
# ~ # select newest date from yesterday until 3 days old
# ~ condition=(query_today.id==tab_rate_1day.asset) & \
# ~ (query_today.date > tab_rate_1day.date) & \
# ~ (query_today.date < tab_rate_1day.date + Literal(3)),
# ~ type_ = 'LEFT OUTER',
# ~ ).join(tab_rate_1month,
# ~ # select newest date from 1 month ago until +3 days old
# ~ condition=(query_today.id==tab_rate_1month.asset) & \
# ~ (query_today.date > tab_rate_1month.date + Literal(30)) & \
# ~ (query_today.date < tab_rate_1month.date + Literal(33)),
# ~ type_ = 'LEFT OUTER',
# ~ ).select(
# ~ query_today.id,
# ~ query_today.date,
# ~ Case(
# ~ ((tab_rate_1day.rate != None) & (query_today.rate != None) & \
# ~ (tab_rate_1day.rate != Literal(0.0)),
# ~ query_today.rate * Literal(100.0) / tab_rate_1day.rate - Literal(100.0)),
# ~ else_ = None,
# ~ ).as_('day1'),
# ~ Case(
# ~ ((tab_rate_1month.rate != None) & (query_today.rate != None) & \
# ~ (tab_rate_1month.rate != Literal(0.0)),
# ~ query_today.rate * Literal(100.0) / tab_rate_1month.rate - Literal(100.0)),
# ~ else_ = None,
# ~ ).as_('month1'),
# ~ distinct_on=[query_today.id],
# ~ order_by=[
# ~ query_today.id,
# ~ tab_rate_1day.date.desc,
# ~ tab_rate_1month.date.desc,
# ~ ],
# ~ )
return query
@classmethod
def get_percentage_change(cls, assets, names):
""" get percentage per period
"""
pool = Pool()
Asset = pool.get('investment.asset')
tab_asset = Asset.__table__()
cursor = Transaction().connection.cursor()
name_lst = [x[len('change_'):] for x in names]
tab_percent = cls.get_percentage_sql(tab_asset, name_lst)
query = tab_percent.select(
tab_percent.id,
*[getattr(tab_percent, x) for x in name_lst],
where=tab_percent.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}
exp = Decimal(Decimal(1) / 10 ** digits_percent)
for record in records:
cnt1 = 1
for x in name_lst:
result['change_%s' % x][record[0]] = record[cnt1].quantize(exp) \
if record[cnt1] is not None else None
cnt1 += 1
return result
@classmethod @classmethod
def get_rate_data(cls, assets, names): def get_rate_data(cls, assets, names):
@ -365,6 +238,185 @@ class Asset(ModelSQL, ModelView):
if self.company.currency.id != self.currency.id: if self.company.currency.id != self.currency.id:
return self.company.currency.id return self.company.currency.id
@classmethod
def get_percentage_sql(cls, name_lst):
""" get table for percentages and dates,
generate adapted query
"""
pool = Pool()
Rate = pool.get('investment.rate')
Asset = pool.get('investment.asset')
tab_asset = Asset.__table__()
tab_rate_today = Rate.__table__()
rate_tab = {
'day1': {'tab': Rate.__table__(), 'day': 0},
'month1': {'tab': Rate.__table__(), 'day': 30},
'month3': {'tab': Rate.__table__(), 'day': 3*30},
'month6': {'tab': Rate.__table__(), 'day': 6*30},
'month12': {'tab': Rate.__table__(), 'day': 12*30},
}
context = Transaction().context
# create tables to query percentual changes for
# 1 day, 30 days, 3 months, 6 months, 1 year
query_date = context.get('qdate', CurrentDate())
query_today = tab_asset.join(tab_rate_today,
condition=tab_asset.id==tab_rate_today.asset,
).select(
tab_asset.id,
tab_rate_today.date,
tab_rate_today.rate,
distinct_on=[tab_asset.id],
order_by=[tab_asset.id, tab_rate_today.date.desc],
where=tab_rate_today.date <= query_date,
)
# create join for requested fields, to minimize database-load
query = query_today
for name in name_lst:
query = query.join(rate_tab[name]['tab'],
# select newest date from <period> until 5 days older
condition=(query_today.id==rate_tab[name]['tab'].asset) & \
(query_today.date > (rate_tab[name]['tab'].date + Literal(rate_tab[name]['day']))) & \
(query_today.date <= (rate_tab[name]['tab'].date + Literal(rate_tab[name]['day'] + 5))),
type_ = 'LEFT OUTER')
# add select for requested fields to join
select_lst = [
query_today.id,
query_today.date,
]
for name in name_lst:
select_lst.append(
Case(
((rate_tab[name]['tab'].rate != None) & (query_today.rate != None) & \
(rate_tab[name]['tab'].rate != Literal(0.0)),
query_today.rate * Literal(100.0) / rate_tab[name]['tab'].rate - Literal(100.0)),
else_ = None,
).as_(name))
order_by_lst = [query_today.id]
order_by_lst.extend([
rate_tab[name]['tab'].date.desc for name in name_lst
])
query = query.select(
*select_lst,
distinct_on=[query_today.id],
order_by=order_by_lst,
)
return query
@staticmethod
def order_change_day1(tables):
""" order day1
"""
Assert = Pool().get('investment.asset')
tab_asset = Asset.get_percentage_sql(['day1'])
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'day1'),
where=tab_asset.id==table.id,
)
return [query]
@staticmethod
def order_change_month1(tables):
""" order month1
"""
Assert = Pool().get('investment.asset')
tab_asset = Asset.get_percentage_sql(['month1'])
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'month1'),
where=tab_asset.id==table.id,
)
return [query]
@staticmethod
def order_change_month3(tables):
""" order month1
"""
Assert = Pool().get('investment.asset')
tab_asset = Asset.get_percentage_sql(['month3'])
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'month3'),
where=tab_asset.id==table.id,
)
return [query]
@staticmethod
def order_change_month6(tables):
""" order month1
"""
Assert = Pool().get('investment.asset')
tab_asset = Asset.get_percentage_sql(['month6'])
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'month6'),
where=tab_asset.id==table.id,
)
return [query]
@staticmethod
def order_change_month12(tables):
""" order month1
"""
Assert = Pool().get('investment.asset')
tab_asset = Asset.get_percentage_sql(['month12'])
table, _ = tables[None]
query = tab_asset.select(
getattr(tab_asset, 'month12'),
where=tab_asset.id==table.id,
)
return [query]
@classmethod
def search_percentage(cls, names, clause):
""" search for percentages
"""
Operator = fields.SQL_OPERATORS[clause[1]]
field_name = clause[0][len('change_'):]
tab_percent = cls.get_percentage_sql([field_name])
query = tab_percent.select(tab_percent.id,
where=Operator(Round(getattr(tab_percent, field_name), 2),
clause[2]))
return [('id', 'in', query)]
@classmethod
def get_percentage_change(cls, assets, names):
""" get percentage per period
"""
cursor = Transaction().connection.cursor()
name_lst = [x[len('change_'):] for x in names]
tab_percent = cls.get_percentage_sql(name_lst)
query = tab_percent.select(
tab_percent.id,
*[getattr(tab_percent, x) for x in name_lst],
where=tab_percent.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}
exp = Decimal(Decimal(1) / 10 ** digits_percent)
for record in records:
cnt1 = 1
for x in name_lst:
result['change_%s' % x][record[0]] = record[cnt1].quantize(exp) \
if record[cnt1] is not None else None
cnt1 += 1
return result
@classmethod @classmethod
def get_next_update_datetime_sql(cls): def get_next_update_datetime_sql(cls):
""" get sql for datetime of next planned update """ get sql for datetime of next planned update
@ -391,7 +443,7 @@ class Asset(ModelSQL, ModelView):
return query return query
@classmethod @classmethod
def get_nextupdtates(cls, assets, names): def get_nextupdates(cls, assets, names):
""" get timestamp of next update """ get timestamp of next update
""" """
Asset2 = Pool().get('investment.asset') Asset2 = Pool().get('investment.asset')
@ -410,21 +462,19 @@ class Asset(ModelSQL, ModelView):
for record in records: for record in records:
(id1, updt) = record (id1, updt) = record
r1 = {'nextupdtate': updt} r1 = {'nextupdate': updt}
for n in names: for n in names:
result[n][id1] = r1[n] result[n][id1] = r1[n]
return result return result
@classmethod @classmethod
def search_nextupdtate(cls, names, clause): def search_nextupdate(cls, names, clause):
""" search for assets to update """ search for assets to update
""" """
Asset2 = Pool().get('investment.asset') Asset2 = Pool().get('investment.asset')
tab_updt = Asset2.get_next_update_datetime_sql() tab_updt = Asset2.get_next_update_datetime_sql()
Operator = fields.SQL_OPERATORS[clause[1]] Operator = fields.SQL_OPERATORS[clause[1]]
context = Transaction().context
query = tab_updt.select( query = tab_updt.select(
tab_updt.id, tab_updt.id,
@ -539,10 +589,11 @@ class Asset(ModelSQL, ModelView):
pool = Pool() pool = Pool()
Asset2 = pool.get('investment.asset') Asset2 = pool.get('investment.asset')
OnlineSource = pool.get('investment.source') OnlineSource = pool.get('investment.source')
context = Transaction().context
query_time = context.get('qdatetime', CurrentTimestamp()) query_time = context.get('qdatetime', CurrentTimestamp())
for asset in Asset2.search([ for asset in Asset2.search([
('updttime', '<=', query_time), ('nextupdate', '<=', query_time),
]): ]):
OnlineSource.update_rate(asset) OnlineSource.update_rate(asset)

View file

@ -194,7 +194,7 @@ msgctxt "field:investment.asset,updttime:"
msgid "Time" msgid "Time"
msgstr "Zeitpunkt" msgstr "Zeitpunkt"
msgctxt "field:investment.asset,nextupdtate:" msgctxt "field:investment.asset,nextupdate:"
msgid "Next Update" msgid "Next Update"
msgstr "nächste Aktualisierung" msgstr "nächste Aktualisierung"

View file

@ -166,7 +166,7 @@ msgctxt "field:investment.asset,updttime:"
msgid "Time" msgid "Time"
msgstr "Time" msgstr "Time"
msgctxt "field:investment.asset,nextupdtate:" msgctxt "field:investment.asset,nextupdate:"
msgid "Next Update" msgid "Next Update"
msgstr "Next Update" msgstr "Next Update"

View file

@ -112,8 +112,9 @@ class AssetTestCase(ModuleTestCase):
self.assertEqual(asset.rec_name, 'Product 1 - 2.4500 usd/Unit [05/15/2022]') self.assertEqual(asset.rec_name, 'Product 1 - 2.4500 usd/Unit [05/15/2022]')
@with_transaction() @with_transaction()
def test_asset_percentges(self): def test_asset_percentages_daterange(self):
""" create asset, add rates, check percentages """ create asset, add rates, check selection of
value
""" """
Asset = Pool().get('investment.asset') Asset = Pool().get('investment.asset')
@ -156,8 +157,148 @@ class AssetTestCase(ModuleTestCase):
]) ])
self.assertEqual(asset1.rec_name, 'Product 1 - 2.6000 usd/Unit [05/16/2022]') self.assertEqual(asset1.rec_name, 'Product 1 - 2.6000 usd/Unit [05/16/2022]')
self.assertEqual(asset2.rec_name, 'Product 1 - 5.2500 usd/Unit [05/15/2022]') self.assertEqual(asset2.rec_name, 'Product 1 - 5.2500 usd/Unit [05/15/2022]')
self.assertEqual(asset1.change_day1, Decimal('6.1')) self.assertEqual(asset1.change_day1, Decimal('6.12'))
self.assertEqual(asset2.change_day1, Decimal('-8.7')) self.assertEqual(asset2.change_day1, Decimal('-8.7'))
self.assertEqual(asset1.change_month1, None)
self.assertEqual(asset2.change_month1, None)
self.assertEqual(asset1.change_month3, None)
self.assertEqual(asset2.change_month3, None)
self.assertEqual(asset1.change_month6, None)
self.assertEqual(asset2.change_month6, None)
self.assertEqual(asset1.change_month12, None)
self.assertEqual(asset2.change_month12, None)
# check ordering
assets = Asset.search([
('change_day1', '!=', Decimal('0.0')),
], order=[('change_day1', 'ASC')])
self.assertEqual(len(assets), 2)
self.assertEqual(assets[0].change_day1, Decimal('-8.7'))
self.assertEqual(assets[1].change_day1, Decimal('6.12'))
assets = Asset.search([
('change_day1', '!=', Decimal('0.0')),
], order=[('change_day1', 'DESC')])
self.assertEqual(len(assets), 2)
self.assertEqual(assets[0].change_day1, Decimal('6.12'))
self.assertEqual(assets[1].change_day1, Decimal('-8.7'))
# check 5-day-range
# four days
Asset.write(*[
[asset1],
{
'rates': [('write', [asset1.rates[1]], {
'date': date(2022, 5, 12),
})],
}])
self.assertEqual(asset1.rates[0].date, date(2022, 5, 16))
self.assertEqual(asset1.rates[1].date, date(2022, 5, 12))
self.assertEqual(asset1.change_day1, Decimal('6.12'))
# five days
Asset.write(*[
[asset1],
{
'rates': [('write', [asset1.rates[1]], {
'date': date(2022, 5, 11),
})],
}])
self.assertEqual(asset1.rates[0].date, date(2022, 5, 16))
self.assertEqual(asset1.rates[1].date, date(2022, 5, 11))
self.assertEqual(asset1.change_day1, Decimal('6.12'))
# six days
Asset.write(*[
[asset1],
{
'rates': [('write', [asset1.rates[1]], {
'date': date(2022, 5, 10),
})],
}])
self.assertEqual(asset1.rates[0].date, date(2022, 5, 16))
self.assertEqual(asset1.rates[1].date, date(2022, 5, 10))
self.assertEqual(asset1.change_day1, None)
@with_transaction()
def test_asset_percentges_values(self):
""" create asset, add rates, check percentages
"""
Asset = Pool().get('investment.asset')
company = self.prep_asset_company()
product = self.prep_asset_product(
name='Product 1',
description='some asset')
asset1 = self.prep_asset_item(
company=company,
product = product)
self.assertEqual(asset1.rec_name, 'Product 1 - - usd/Unit [-]')
Asset.write(*[
[asset1],
{
'rates': [('create', [{
'date': date(2022, 5, 15),
'rate': Decimal('2.45'),
}, {
'date': date(2022, 5, 16),
'rate': Decimal('2.6'),
}, {
'date': date(2022, 4, 14),
'rate': Decimal('2.2'),
}, {
'date': date(2022, 2, 14),
'rate': Decimal('2.8'),
},])],
}])
self.assertEqual(asset1.rec_name, 'Product 1 - 2.6000 usd/Unit [05/16/2022]')
self.assertEqual(len(asset1.rates), 4)
self.assertEqual(asset1.rates[0].date, date(2022, 5, 16))
self.assertEqual(asset1.rates[1].date, date(2022, 5, 15))
self.assertEqual(asset1.rates[2].date, date(2022, 4, 14))
self.assertEqual(asset1.rates[3].date, date(2022, 2, 14))
self.assertEqual(asset1.change_day1, Decimal('6.12'))
self.assertEqual(asset1.change_month1, Decimal('18.18'))
self.assertEqual(asset1.change_month3, Decimal('-7.14'))
self.assertEqual(asset1.change_month6, None)
self.assertEqual(asset1.change_month12, None)
# call order-functions
Asset.search([], order=[('change_day1', 'ASC')])
Asset.search([], order=[('change_month1', 'ASC')])
Asset.search([], order=[('change_month3', 'ASC')])
Asset.search([], order=[('change_month6', 'ASC')])
Asset.search([], order=[('change_month12', 'ASC')])
# searcher
self.assertEqual(
Asset.search_count([('change_day1', '>', Decimal('6.1'))]),
1)
self.assertEqual(
Asset.search_count([('change_day1', '>', Decimal('6.15'))]),
0)
self.assertEqual(
Asset.search_count([('change_day1', '=', Decimal('6.12'))]),
1)
self.assertEqual(
Asset.search_count([('change_month1', '>', Decimal('18.0'))]),
1)
self.assertEqual(
Asset.search_count([('change_month1', '>', Decimal('18.18'))]),
0)
self.assertEqual(
Asset.search_count([('change_month1', '=', Decimal('18.18'))]),
1)
self.assertEqual(
Asset.search_count([('change_month3', '=', Decimal('-7.14'))]),
1)
self.assertEqual(
Asset.search_count([('change_month6', '=', None)]),
1)
@with_transaction() @with_transaction()
def test_asset_check_onlinesource_onoff(self): def test_asset_check_onlinesource_onoff(self):
@ -181,7 +322,7 @@ class AssetTestCase(ModuleTestCase):
}]) }])
self.assertEqual(asset.updtsource, None) self.assertEqual(asset.updtsource, None)
self.assertEqual(asset.updttime, None) self.assertEqual(asset.updttime, time(14,0))
asset.updtsource = o_source asset.updtsource = o_source
asset.updttime = time(10, 45) asset.updttime = time(10, 45)
@ -231,13 +372,13 @@ class AssetTestCase(ModuleTestCase):
self.assertEqual(asset2.updtsource.rec_name, 'Source 1') self.assertEqual(asset2.updtsource.rec_name, 'Source 1')
self.assertEqual(asset2.updttime, time(10, 45)) self.assertEqual(asset2.updttime, time(10, 45))
self.assertEqual(len(asset2.rates), 0) self.assertEqual(len(asset2.rates), 0)
self.assertEqual(asset2.nextupdtate, datetime(2022, 10, 15, 10, 45)) self.assertEqual(asset2.nextupdate, datetime(2022, 10, 15, 10, 45))
self.assertEqual( self.assertEqual(
Asset.search_count([('nextupdtate', '<', datetime(2022, 10, 15, 10, 45))]), Asset.search_count([('nextupdate', '<', datetime(2022, 10, 15, 10, 45))]),
0) 0)
self.assertEqual( self.assertEqual(
Asset.search_count([('nextupdtate', '>=', datetime(2022, 10, 15, 10, 45))]), Asset.search_count([('nextupdate', '>=', datetime(2022, 10, 15, 10, 45))]),
1) 1)
# add rate at yesterday # add rate at yesterday
@ -256,13 +397,13 @@ class AssetTestCase(ModuleTestCase):
self.assertEqual(asset.updttime, time(10, 45)) self.assertEqual(asset.updttime, time(10, 45))
self.assertEqual(len(asset.rates), 1) self.assertEqual(len(asset.rates), 1)
self.assertEqual(asset.rates[0].date, date(2022, 10, 14)) self.assertEqual(asset.rates[0].date, date(2022, 10, 14))
self.assertEqual(asset.nextupdtate, datetime(2022, 10, 15, 10, 45)) self.assertEqual(asset.nextupdate, datetime(2022, 10, 15, 10, 45))
self.assertEqual( self.assertEqual(
Asset.search_count([('nextupdtate', '<', datetime(2022, 10, 15, 10, 45))]), Asset.search_count([('nextupdate', '<', datetime(2022, 10, 15, 10, 45))]),
0) 0)
self.assertEqual( self.assertEqual(
Asset.search_count([('nextupdtate', '>=', datetime(2022, 10, 15, 10, 45))]), Asset.search_count([('nextupdate', '>=', datetime(2022, 10, 15, 10, 45))]),
1) 1)
# add rate at today # add rate at today
@ -281,13 +422,13 @@ class AssetTestCase(ModuleTestCase):
self.assertEqual(asset2.updttime, time(10, 45)) self.assertEqual(asset2.updttime, time(10, 45))
self.assertEqual(len(asset2.rates), 2) self.assertEqual(len(asset2.rates), 2)
self.assertEqual(asset2.rates[0].date, date(2022, 10, 15)) self.assertEqual(asset2.rates[0].date, date(2022, 10, 15))
self.assertEqual(asset2.nextupdtate, datetime(2022, 10, 16, 10, 45)) self.assertEqual(asset2.nextupdate, datetime(2022, 10, 16, 10, 45))
self.assertEqual( self.assertEqual(
Asset.search_count([('nextupdtate', '<', datetime(2022, 10, 15, 10, 45))]), Asset.search_count([('nextupdate', '<', datetime(2022, 10, 15, 10, 45))]),
0) 0)
self.assertEqual( self.assertEqual(
Asset.search_count([('nextupdtate', '>=', datetime(2022, 10, 15, 10, 45))]), Asset.search_count([('nextupdate', '>=', datetime(2022, 10, 15, 10, 45))]),
1) 1)
@with_transaction() @with_transaction()

View file

@ -8,7 +8,7 @@ from trytond.pool import Pool
from trytond.modules.company.tests import create_company from trytond.modules.company.tests import create_company
from trytond.transaction import Transaction from trytond.transaction import Transaction
from decimal import Decimal from decimal import Decimal
from datetime import time, date from datetime import time, date, datetime
from unittest.mock import MagicMock from unittest.mock import MagicMock
from requests import Response from requests import Response
import requests import requests
@ -66,26 +66,34 @@ class SourceTestCase(ModuleTestCase):
{ {
'updtsource': osource.id, '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 with Transaction().set_context({
resp1 = Response() 'qdate': date(2022, 10, 1),
resp1._content = """<html><body>Response from finance-server 'qdatetime': datetime(2022, 10, 2, 10, 0, 0),
}):
asset2, = Asset.browse([asset])
self.assertEqual(asset2.wkn, '965515')
self.assertEqual(asset2.isin, 'XC0009655157')
self.assertEqual(asset2.secsymb, '1472977')
self.assertEqual(asset2.updttime, time(14, 0))
self.assertEqual(asset2.updtsource.rec_name, 'Source 1')
self.assertEqual(asset2.nextupdate, datetime(2022, 10, 2, 14, 0))
self.assertEqual(len(asset.rates), 0)
# fake server-response
resp1 = Response()
resp1._content = """<html><body>Response from finance-server
Course Date 14.08.2022 Today Course Date 14.08.2022 Today
High 34,87 EUR High 34,87 EUR
</body></html>""".encode('utf8') </body></html>""".encode('utf8')
resp1.status_code = 200 resp1.status_code = 200
resp1.reason = 'OK' resp1.reason = 'OK'
requests.get = MagicMock(return_value=resp1) requests.get = MagicMock(return_value=resp1)
OSource.update_rate(asset) OSource.update_rate(asset)
self.assertEqual(len(asset.rates), 1) self.assertEqual(len(asset.rates), 1)
self.assertEqual(asset.rates[0].date, date(2022, 8, 14)) self.assertEqual(asset.rates[0].date, date(2022, 8, 14))
self.assertEqual(asset.rates[0].rate, Decimal('34.87')) self.assertEqual(asset.rates[0].rate, Decimal('34.87'))
@with_transaction() @with_transaction()
def test_waitlist_source_check_regex(self): def test_waitlist_source_check_regex(self):

View file

@ -9,8 +9,8 @@ full copyright notices and license terms. -->
<field name="rate" symbol="currency"/> <field name="rate" symbol="currency"/>
<label id="labdate" string=" "/> <label id="labdate" string=" "/>
<label name="nextupdtate" colspan="2"/> <label name="nextupdate" colspan="2"/>
<field name="nextupdtate"/> <field name="nextupdate"/>
<label name="date" /> <label name="date" />
<field name="date"/> <field name="date"/>