diff --git a/asset.py b/asset.py
index 1f10a45..d6f4bba 100644
--- a/asset.py
+++ b/asset.py
@@ -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):
diff --git a/locale/de.po b/locale/de.po
index f8db2fd..0089953 100644
--- a/locale/de.po
+++ b/locale/de.po
@@ -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"
###################
diff --git a/locale/en.po b/locale/en.po
index b687860..ffe1d99 100644
--- a/locale/en.po
+++ b/locale/en.po
@@ -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"
diff --git a/tests/test_asset.py b/tests/test_asset.py
index 345bb1c..8d7e412 100644
--- a/tests/test_asset.py
+++ b/tests/test_asset.py
@@ -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(
diff --git a/view/asset_form.xml b/view/asset_form.xml
index 6b44cef..8ae2bdb 100644
--- a/view/asset_form.xml
+++ b/view/asset_form.xml
@@ -32,20 +32,11 @@ full copyright notices and license terms. -->
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+