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. --> - +