asset: query für update
This commit is contained in:
parent
a936d85043
commit
f8ba90d633
5 changed files with 211 additions and 117 deletions
153
asset.py
153
asset.py
|
@ -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):
|
||||||
|
|
20
locale/de.po
20
locale/de.po
|
@ -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"
|
|
||||||
|
|
||||||
|
|
||||||
###################
|
###################
|
||||||
|
|
20
locale/en.po
20
locale/en.po
|
@ -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"
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue