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 decimal import Decimal
from datetime import time
from sql.functions import CurrentTime
from sql.conditionals import Case
class Asset(ModelSQL, ModelView):
@ -64,25 +66,13 @@ class Asset(ModelSQL, ModelView):
updtsource = fields.Many2One(string='Update Source',
help='Select a source for the course update.',
ondelete='SET NULL', model_name='investment.source')
updttime1 = fields.Time(string='Time 1',
updttime = fields.Time(string='Time',
states={
'readonly': ~Bool(Eval('updtsource')),
}, depends=['updtsource'])
updttime2 = fields.Time(string='Time 2',
states={
'readonly': ~And(
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'])
updtneeded = fields.Function(fields.Boolean(string='Course update needed',
readonly=True),
'on_change_with_updtneeded', searcher='search_updtneeded')
@classmethod
def default_currency(cls):
@ -106,31 +96,14 @@ class Asset(ModelSQL, ModelView):
"""
return 4
@fields.depends('updtsource', 'updttime1', 'updttime2', 'updttime3')
@fields.depends('updtsource', 'updttime')
def on_change_updtsource(self):
""" clear time-fields
"""
if self.updtsource is None:
self.updttime1 = None
self.updttime2 = None
self.updttime3 = None
self.updttime = None
else :
self.updttime1 = 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
self.updttime = time(11, 30)
@fields.depends('id', 'currency_digits')
def on_change_with_rate(self, name=None):
@ -165,6 +138,78 @@ class Asset(ModelSQL, ModelView):
if self.currency:
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
def get_identifier_sql(cls, tab_asset):
""" sql-query for identifiers
@ -246,32 +291,6 @@ class Asset(ModelSQL, ModelView):
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):
if self.product:
return self.product.rec_name
@ -290,13 +309,11 @@ class Asset(ModelSQL, ModelView):
"""
pool = Pool()
Asset2 = pool.get('investment.asset')
IrDate = pool.get('ir.date')
assets = Asset2.search([
('updtsource', '!=', None),
(),
])
print('\n## assets:', assets)
for asset in Asset2.search([
('updtneeded', '=', True),
]):
pass
@classmethod
def create(cls, vlist):

View file

@ -78,10 +78,6 @@ msgctxt "view:investment.asset:"
msgid "Course Update"
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:"
msgid "Company"
msgstr "Unternehmen"
@ -158,17 +154,13 @@ msgctxt "help:investment.asset,updtsource:"
msgid "Select a source for the course update."
msgstr "Wählen Sie eine Quelle für die Kursaktualisierung aus."
msgctxt "field:investment.asset,updttime1:"
msgid "Time 1"
msgstr "Zeitpunkt 1"
msgctxt "field:investment.asset,updttime:"
msgid "Time"
msgstr "Zeitpunkt"
msgctxt "field:investment.asset,updttime2:"
msgid "Time 2"
msgstr "Zeitpunkt 2"
msgctxt "field:investment.asset,updttime3:"
msgid "Time 3"
msgstr "Zeitpunkt 3"
msgctxt "field:investment.asset,updtneeded:"
msgid "Course update needed"
msgstr "Kursaktualisierung nötig"
###################

View file

@ -54,10 +54,6 @@ msgctxt "view:investment.asset:"
msgid "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:"
msgid "Company"
msgstr "Company"
@ -134,17 +130,13 @@ msgctxt "help:investment.asset,updtsource:"
msgid "Select a source for the course update."
msgstr "Select a source for the course update."
msgctxt "field:investment.asset,updttime1:"
msgid "Time 1"
msgstr "Time 1"
msgctxt "field:investment.asset,updttime:"
msgid "Time"
msgstr "Time"
msgctxt "field:investment.asset,updttime2:"
msgid "Time 2"
msgstr "Time 2"
msgctxt "field:investment.asset,updttime3:"
msgid "Time 3"
msgstr "Time 3"
msgctxt "field:investment.asset,updtneeded:"
msgid "Course update needed"
msgstr "Course update needed"
msgctxt "model:investment.rate,name:"
msgid "Rate"

View file

@ -6,8 +6,9 @@
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
from trytond.pool import Pool
from trytond.modules.company.tests import create_company
from trytond.transaction import Transaction
from decimal import Decimal
from datetime import time
from datetime import time, date
class AssetTestCase(ModuleTestCase):
@ -102,20 +103,121 @@ class AssetTestCase(ModuleTestCase):
}])
self.assertEqual(asset.updtsource, None)
self.assertEqual(asset.updttime1, None)
self.assertEqual(asset.updttime2, None)
self.assertEqual(asset.updttime3, None)
self.assertEqual(asset.updttime, None)
asset.updtsource = o_source
asset.updttime1 = time(10, 45)
asset.updttime = time(10, 45)
asset.save()
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.on_change_updtsource()
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()
def test_asset_indentifiers(self):
@ -188,7 +290,7 @@ class AssetTestCase(ModuleTestCase):
@with_transaction()
def test_asset_check_product_update(self):
""" create asset
""" check update of product on asset
"""
company = self.prep_asset_company()
product1 = self.prep_asset_product(

View file

@ -32,20 +32,11 @@ full copyright notices and license terms. -->
<page name="rates" col="1" string="Rates">
<field name="rates" mode="tree,form,graph"/>
</page>
<page id="pgupdate" col="6" string="Course Update">
<page id="pgupdate" col="4" string="Course Update">
<label name="updtsource"/>
<field name="updtsource" colspan="3"/>
<newline/>
<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."/>
<field name="updtsource"/>
<label name="updttime"/>
<field name="updttime"/>
</page>
</notebook>