asset: query für update

This commit is contained in:
Frederik Jaeckel 2022-11-17 22:51:29 +01:00
parent a936d85043
commit f8ba90d633
5 changed files with 211 additions and 117 deletions

153
asset.py
View file

@ -9,6 +9,8 @@ from trytond.pool import Pool
from trytond.pyson import Eval, Bool, And from trytond.pyson import Eval, Bool, And
from decimal import Decimal from decimal import Decimal
from datetime import time from datetime import time
from sql.functions import CurrentTime
from sql.conditionals import Case
class Asset(ModelSQL, ModelView): class Asset(ModelSQL, ModelView):
@ -64,25 +66,13 @@ class Asset(ModelSQL, ModelView):
updtsource = fields.Many2One(string='Update Source', updtsource = fields.Many2One(string='Update Source',
help='Select a source for the course update.', help='Select a source for the course update.',
ondelete='SET NULL', model_name='investment.source') ondelete='SET NULL', model_name='investment.source')
updttime1 = fields.Time(string='Time 1', updttime = fields.Time(string='Time',
states={ states={
'readonly': ~Bool(Eval('updtsource')), 'readonly': ~Bool(Eval('updtsource')),
}, depends=['updtsource']) }, depends=['updtsource'])
updttime2 = fields.Time(string='Time 2', updtneeded = fields.Function(fields.Boolean(string='Course update needed',
states={ readonly=True),
'readonly': ~And( 'on_change_with_updtneeded', searcher='search_updtneeded')
Bool(Eval('updtsource')),
Bool(Eval('updttime1')),
),
}, depends=['updtsource', 'updttime1'])
updttime3 = fields.Time(string='Time 3',
states={
'readonly': ~And(
Bool(Eval('updtsource')),
Bool(Eval('updttime1')),
Bool(Eval('updttime2')),
),
}, depends=['updtsource', 'updttime1', 'updttime2'])
@classmethod @classmethod
def default_currency(cls): def default_currency(cls):
@ -106,31 +96,14 @@ class Asset(ModelSQL, ModelView):
""" """
return 4 return 4
@fields.depends('updtsource', 'updttime1', 'updttime2', 'updttime3') @fields.depends('updtsource', 'updttime')
def on_change_updtsource(self): def on_change_updtsource(self):
""" clear time-fields """ clear time-fields
""" """
if self.updtsource is None: if self.updtsource is None:
self.updttime1 = None self.updttime = None
self.updttime2 = None
self.updttime3 = None
else : else :
self.updttime1 = time(11, 30) self.updttime = time(11, 30)
@fields.depends('updttime1', 'updttime2', 'updttime3')
def on_change_updttime1(self):
""" clear fiels
"""
if self.updttime1 is None:
self.updttime2 = None
self.updttime3 = None
@fields.depends('updttime2', 'updttime3')
def on_change_updttime2(self):
""" clear fiels
"""
if self.updttime2 is None:
self.updttime3 = None
@fields.depends('id', 'currency_digits') @fields.depends('id', 'currency_digits')
def on_change_with_rate(self, name=None): def on_change_with_rate(self, name=None):
@ -165,6 +138,78 @@ class Asset(ModelSQL, ModelView):
if self.currency: if self.currency:
self.currency_digits = self.currency.digits self.currency_digits = self.currency.digits
@fields.depends('product')
def on_change_with_product_uom(self, name=None):
""" get category of product-uom
"""
if self.product:
return self.product.default_uom.category.id
@fields.depends('currency')
def on_change_with_currency_digits(self, name=None):
""" currency of cashbook
"""
if self.currency:
return self.currency.digits
else:
return 2
@fields.depends('company', 'currency')
def on_change_with_company_currency(self, name=None):
""" get company-currency if its different from current
asset-currency
"""
if self.company:
if self.currency:
if self.company.currency.id != self.currency.id:
return self.company.currency.id
@fields.depends('id')
def on_change_with_updtneeded(self, name=None):
""" get state of update
"""
Asset2 = Pool().get('investment.asset')
if self.id:
if Asset2.search_count([
('updtneeded', '=', True),
('id', '=', self.id)
]) == 1:
return True
return False
@classmethod
def search_updtneeded(cls, names, clause):
""" search for assets to update
"""
pool = Pool()
Asset2 = pool.get('investment.asset')
Rate = pool.get('investment.rate')
IrDate = pool.get('ir.date')
tab_asset = Asset2.__table__()
tab_rate = Rate.__table__()
Operator = fields.SQL_OPERATORS[clause[1]]
context = Transaction().context
query_date = context.get('qdate', IrDate.today())
query_time = context.get('qtime', CurrentTime())
query = tab_asset.join(tab_rate,
condition=(tab_asset.id==tab_rate.asset) & \
(tab_rate.date == query_date),
type_ = 'LEFT OUTER',
).select(tab_asset.id,
where=Operator(
Case(
((tab_rate.id == None) & \
(tab_asset.updtsource != None) & \
(tab_asset.updttime <= query_time), True),
default_ = False,
),
clause[2]),
)
return [('id', '=', query)]
@classmethod @classmethod
def get_identifier_sql(cls, tab_asset): def get_identifier_sql(cls, tab_asset):
""" sql-query for identifiers """ sql-query for identifiers
@ -246,32 +291,6 @@ class Asset(ModelSQL, ModelView):
return result return result
@fields.depends('product')
def on_change_with_product_uom(self, name=None):
""" get category of product-uom
"""
if self.product:
return self.product.default_uom.category.id
@fields.depends('currency')
def on_change_with_currency_digits(self, name=None):
""" currency of cashbook
"""
if self.currency:
return self.currency.digits
else:
return 2
@fields.depends('company', 'currency')
def on_change_with_company_currency(self, name=None):
""" get company-currency if its different from current
asset-currency
"""
if self.company:
if self.currency:
if self.company.currency.id != self.currency.id:
return self.company.currency.id
def get_rec_name(self, name): def get_rec_name(self, name):
if self.product: if self.product:
return self.product.rec_name return self.product.rec_name
@ -290,13 +309,11 @@ class Asset(ModelSQL, ModelView):
""" """
pool = Pool() pool = Pool()
Asset2 = pool.get('investment.asset') Asset2 = pool.get('investment.asset')
IrDate = pool.get('ir.date')
assets = Asset2.search([ for asset in Asset2.search([
('updtsource', '!=', None), ('updtneeded', '=', True),
(), ]):
]) pass
print('\n## assets:', assets)
@classmethod @classmethod
def create(cls, vlist): def create(cls, vlist):

View file

@ -78,10 +78,6 @@ msgctxt "view:investment.asset:"
msgid "Course Update" msgid "Course Update"
msgstr "Kursaktualisierung" msgstr "Kursaktualisierung"
msgctxt "view:investment.asset:"
msgid "You can have the course updated up to three times a day. The results are averaged."
msgstr "Sie können den Kurs bis zu dreimal täglich aktualisieren lassen. Die Ergebnisse werden gemittelt."
msgctxt "field:investment.asset,company:" msgctxt "field:investment.asset,company:"
msgid "Company" msgid "Company"
msgstr "Unternehmen" msgstr "Unternehmen"
@ -158,17 +154,13 @@ msgctxt "help:investment.asset,updtsource:"
msgid "Select a source for the course update." msgid "Select a source for the course update."
msgstr "Wählen Sie eine Quelle für die Kursaktualisierung aus." msgstr "Wählen Sie eine Quelle für die Kursaktualisierung aus."
msgctxt "field:investment.asset,updttime1:" msgctxt "field:investment.asset,updttime:"
msgid "Time 1" msgid "Time"
msgstr "Zeitpunkt 1" msgstr "Zeitpunkt"
msgctxt "field:investment.asset,updttime2:" msgctxt "field:investment.asset,updtneeded:"
msgid "Time 2" msgid "Course update needed"
msgstr "Zeitpunkt 2" msgstr "Kursaktualisierung nötig"
msgctxt "field:investment.asset,updttime3:"
msgid "Time 3"
msgstr "Zeitpunkt 3"
################### ###################

View file

@ -54,10 +54,6 @@ msgctxt "view:investment.asset:"
msgid "Course Update" msgid "Course Update"
msgstr "Course Update" msgstr "Course Update"
msgctxt "view:investment.asset:"
msgid "You can have the course updated up to three times a day. The results are averaged."
msgstr "You can have the course updated up to three times a day. The results are averaged."
msgctxt "field:investment.asset,company:" msgctxt "field:investment.asset,company:"
msgid "Company" msgid "Company"
msgstr "Company" msgstr "Company"
@ -134,17 +130,13 @@ msgctxt "help:investment.asset,updtsource:"
msgid "Select a source for the course update." msgid "Select a source for the course update."
msgstr "Select a source for the course update." msgstr "Select a source for the course update."
msgctxt "field:investment.asset,updttime1:" msgctxt "field:investment.asset,updttime:"
msgid "Time 1" msgid "Time"
msgstr "Time 1" msgstr "Time"
msgctxt "field:investment.asset,updttime2:" msgctxt "field:investment.asset,updtneeded:"
msgid "Time 2" msgid "Course update needed"
msgstr "Time 2" msgstr "Course update needed"
msgctxt "field:investment.asset,updttime3:"
msgid "Time 3"
msgstr "Time 3"
msgctxt "model:investment.rate,name:" msgctxt "model:investment.rate,name:"
msgid "Rate" msgid "Rate"

View file

@ -6,8 +6,9 @@
from trytond.tests.test_tryton import ModuleTestCase, with_transaction from trytond.tests.test_tryton import ModuleTestCase, with_transaction
from trytond.pool import Pool 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 decimal import Decimal from decimal import Decimal
from datetime import time from datetime import time, date
class AssetTestCase(ModuleTestCase): class AssetTestCase(ModuleTestCase):
@ -102,20 +103,121 @@ class AssetTestCase(ModuleTestCase):
}]) }])
self.assertEqual(asset.updtsource, None) self.assertEqual(asset.updtsource, None)
self.assertEqual(asset.updttime1, None) self.assertEqual(asset.updttime, None)
self.assertEqual(asset.updttime2, None)
self.assertEqual(asset.updttime3, None)
asset.updtsource = o_source asset.updtsource = o_source
asset.updttime1 = time(10, 45) asset.updttime = time(10, 45)
asset.save() asset.save()
self.assertEqual(asset.updtsource.rec_name, 'Source 1') self.assertEqual(asset.updtsource.rec_name, 'Source 1')
self.assertEqual(asset.updttime1, time(10, 45)) self.assertEqual(asset.updttime, time(10, 45))
asset.updtsource = None asset.updtsource = None
asset.on_change_updtsource() asset.on_change_updtsource()
self.assertEqual(asset.updtsource, None) self.assertEqual(asset.updtsource, None)
self.assertEqual(asset.updttime1, None) self.assertEqual(asset.updttime, None)
@with_transaction()
def test_asset_check_update_select(self):
""" create asset, add online-source,
check selection of assets to update
"""
pool = Pool()
OnlineSource = pool.get('investment.source')
Asset = pool.get('investment.asset')
company = self.prep_asset_company()
product = self.prep_asset_product(
name='Product 1',
description='some asset')
asset = self.prep_asset_item(
company=company,
product = product)
o_source, = OnlineSource.create([{
'name': 'Source 1',
}])
Asset.write(*[
[asset],
{
'updtsource': o_source.id,
'updttime': time(10, 45),
}])
self.assertEqual(asset.updtsource.rec_name, 'Source 1')
self.assertEqual(asset.updttime, time(10, 45))
self.assertEqual(len(asset.rates), 0)
with Transaction().set_context({
'qdate': date(2022, 10, 15),
'qtime': time(10, 30),
}):
# no rates exists - wait for 10:45
self.assertEqual(asset.updtneeded, True)
self.assertEqual(
Asset.search_count([('updtneeded', '=', True)]),
0)
with Transaction().set_context({
'qdate': date(2022, 10, 15),
'qtime': time(10, 46),
}):
# no rates exists - run at 10:46
self.assertEqual(asset.updtneeded, True)
self.assertEqual(
Asset.search_count([('updtneeded', '=', True)]),
1)
# add rate at yesterday
Asset.write(*[
[asset],
{
'rates': [('create', [{
'date': date(2022, 10, 14),
'rate': Decimal('1.5'),
}])],
}])
self.assertEqual(len(asset.rates), 1)
with Transaction().set_context({
'qdate': date(2022, 10, 15),
'qtime': time(10, 30),
}):
# 1x rate exists - run at 10:30
self.assertEqual(asset.updtneeded, True)
self.assertEqual(
Asset.search_count([('updtneeded', '=', True)]),
0)
with Transaction().set_context({
'qdate': date(2022, 10, 15),
'qtime': time(10, 46),
}):
# 1x rate exists yesterday - run at 10:46
self.assertEqual(asset.updtneeded, True)
self.assertEqual(
Asset.search_count([('updtneeded', '=', True)]),
1)
# add rate at today
Asset.write(*[
[asset],
{
'rates': [('create', [{
'date': date(2022, 10, 15),
'rate': Decimal('1.5'),
}])],
}])
self.assertEqual(len(asset.rates), 2)
with Transaction().set_context({
'qdate': date(2022, 10, 15),
'qtime': time(10, 47),
}):
# 1x rate exists today - run at 10:47
self.assertEqual(asset.updtneeded, True)
self.assertEqual(
Asset.search_count([('updtneeded', '=', True)]),
0)
@with_transaction() @with_transaction()
def test_asset_indentifiers(self): def test_asset_indentifiers(self):
@ -188,7 +290,7 @@ class AssetTestCase(ModuleTestCase):
@with_transaction() @with_transaction()
def test_asset_check_product_update(self): def test_asset_check_product_update(self):
""" create asset """ check update of product on asset
""" """
company = self.prep_asset_company() company = self.prep_asset_company()
product1 = self.prep_asset_product( product1 = self.prep_asset_product(

View file

@ -32,20 +32,11 @@ full copyright notices and license terms. -->
<page name="rates" col="1" string="Rates"> <page name="rates" col="1" string="Rates">
<field name="rates" mode="tree,form,graph"/> <field name="rates" mode="tree,form,graph"/>
</page> </page>
<page id="pgupdate" col="6" string="Course Update"> <page id="pgupdate" col="4" string="Course Update">
<label name="updtsource"/> <label name="updtsource"/>
<field name="updtsource" colspan="3"/> <field name="updtsource"/>
<newline/> <label name="updttime"/>
<field name="updttime"/>
<label name="updttime1"/>
<field name="updttime1"/>
<label name="updttime2"/>
<field name="updttime2"/>
<label name="updttime3"/>
<field name="updttime3"/>
<label id="lab1" colspan="6" xalign="0.0"
string="You can have the course updated up to three times a day. The results are averaged."/>
</page> </page>
</notebook> </notebook>