asset: Felder wkn, isin, symobl + suche + test
This commit is contained in:
parent
13007f30c8
commit
353df93a9e
8 changed files with 267 additions and 3 deletions
|
@ -5,8 +5,10 @@
|
||||||
|
|
||||||
from trytond.pool import Pool
|
from trytond.pool import Pool
|
||||||
from .asset import Asset
|
from .asset import Asset
|
||||||
|
from .identifier import Identifier
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
Pool.register(
|
Pool.register(
|
||||||
Asset,
|
Asset,
|
||||||
|
Identifier,
|
||||||
module='investment', type_='model')
|
module='investment', type_='model')
|
||||||
|
|
93
asset.py
93
asset.py
|
@ -4,8 +4,6 @@
|
||||||
# full copyright notices and license terms.
|
# full copyright notices and license terms.
|
||||||
|
|
||||||
from trytond.model import ModelView, ModelSQL, fields
|
from trytond.model import ModelView, ModelSQL, fields
|
||||||
from trytond.exceptions import UserError
|
|
||||||
from trytond.i18n import gettext
|
|
||||||
from trytond.transaction import Transaction
|
from trytond.transaction import Transaction
|
||||||
from trytond.pool import Pool
|
from trytond.pool import Pool
|
||||||
from trytond.pyson import Eval, Bool
|
from trytond.pyson import Eval, Bool
|
||||||
|
@ -46,6 +44,16 @@ class Asset(ModelSQL, ModelView):
|
||||||
currency_digits = fields.Integer(string='Currency Digits',
|
currency_digits = fields.Integer(string='Currency Digits',
|
||||||
required=True)
|
required=True)
|
||||||
|
|
||||||
|
wkn = fields.Function(fields.Char(string='NSIN', readonly=True,
|
||||||
|
help='National Securities Identifying Number'),
|
||||||
|
'get_identifiers', searcher='search_identifier')
|
||||||
|
isin = fields.Function(fields.Char(string='ISIN', readonly=True,
|
||||||
|
help='International Securities Identification Number'),
|
||||||
|
'get_identifiers', searcher='search_identifier')
|
||||||
|
secsymb = fields.Function(fields.Char(string='Symbol', readonly=True,
|
||||||
|
help='Stock market symbol'),
|
||||||
|
'get_identifiers', searcher='search_identifier')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def default_currency(cls):
|
def default_currency(cls):
|
||||||
""" currency of company
|
""" currency of company
|
||||||
|
@ -84,6 +92,87 @@ class Asset(ModelSQL, ModelView):
|
||||||
if self.currency:
|
if self.currency:
|
||||||
self.currency_digits = self.currency.digits
|
self.currency_digits = self.currency.digits
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_identifier_sql(cls, tab_asset):
|
||||||
|
""" sql-query for identifiers
|
||||||
|
"""
|
||||||
|
pool = Pool()
|
||||||
|
Product = pool.get('product.product')
|
||||||
|
Identifier = pool.get('product.identifier')
|
||||||
|
tab_prod = Product.__table__()
|
||||||
|
tab_wkn = Identifier.__table__()
|
||||||
|
tab_secsymb = Identifier.__table__()
|
||||||
|
tab_isin = Identifier.__table__()
|
||||||
|
|
||||||
|
query = tab_asset.join(tab_prod,
|
||||||
|
condition=tab_asset.product==tab_prod.id,
|
||||||
|
).join(tab_wkn,
|
||||||
|
condition=(tab_prod.id==tab_wkn.product) & \
|
||||||
|
(tab_wkn.type == 'wkn'),
|
||||||
|
type_ = 'LEFT OUTER',
|
||||||
|
).join(tab_secsymb,
|
||||||
|
condition=(tab_prod.id==tab_secsymb.product) & \
|
||||||
|
(tab_secsymb.type == 'secsymb'),
|
||||||
|
type_ = 'LEFT OUTER',
|
||||||
|
).join(tab_isin,
|
||||||
|
condition=(tab_prod.id==tab_isin.product) & \
|
||||||
|
(tab_isin.type == 'isin'),
|
||||||
|
type_ = 'LEFT OUTER',
|
||||||
|
).select(
|
||||||
|
tab_asset.id,
|
||||||
|
tab_wkn.code.as_('wkn'),
|
||||||
|
tab_secsymb.code.as_('secsymb'),
|
||||||
|
tab_isin.code.as_('isin'),
|
||||||
|
)
|
||||||
|
return query
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def search_identifier(cls, names, clause):
|
||||||
|
""" search in identifier
|
||||||
|
"""
|
||||||
|
pool = Pool()
|
||||||
|
Asset = pool.get('investment.asset')
|
||||||
|
tab_asset = Asset.__table__()
|
||||||
|
Operator = fields.SQL_OPERATORS[clause[1]]
|
||||||
|
tab_ids = cls.get_identifier_sql(tab_asset)
|
||||||
|
|
||||||
|
field_qu = getattr(tab_ids, names)
|
||||||
|
query = tab_ids.join(tab_asset,
|
||||||
|
condition=tab_ids.id==tab_asset.id,
|
||||||
|
).select(
|
||||||
|
tab_asset.id,
|
||||||
|
where=Operator(field_qu, clause[2]) & \
|
||||||
|
(field_qu != None),
|
||||||
|
)
|
||||||
|
|
||||||
|
return [('id', 'in', query)]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_identifiers(cls, assets, names):
|
||||||
|
""" get identifiers of assets
|
||||||
|
"""
|
||||||
|
pool = Pool()
|
||||||
|
Asset = pool.get('investment.asset')
|
||||||
|
tab_asset = Asset.__table__()
|
||||||
|
cursor = Transaction().connection.cursor()
|
||||||
|
|
||||||
|
result = {x:{y.id: None for y in assets} for x in names}
|
||||||
|
|
||||||
|
query = cls.get_identifier_sql(tab_asset)
|
||||||
|
query.where = tab_asset.id.in_([x.id for x in assets])
|
||||||
|
|
||||||
|
cursor.execute(*query)
|
||||||
|
l1 = cursor.fetchall()
|
||||||
|
|
||||||
|
for x in l1:
|
||||||
|
(id1, wkn, secsymb, isin) = x
|
||||||
|
r1 = {'wkn': wkn, 'secsymb': secsymb, 'isin': isin}
|
||||||
|
|
||||||
|
for n in names:
|
||||||
|
result[n][id1] = r1[n]
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
@fields.depends('product')
|
@fields.depends('product')
|
||||||
def on_change_with_product_uom(self, name=None):
|
def on_change_with_product_uom(self, name=None):
|
||||||
""" get category of product-uom
|
""" get category of product-uom
|
||||||
|
|
21
identifier.py
Normal file
21
identifier.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# This file is part of the investment-module from m-ds for Tryton.
|
||||||
|
# The COPYRIGHT file at the top level of this repository contains the
|
||||||
|
# full copyright notices and license terms.
|
||||||
|
|
||||||
|
from trytond.model import fields
|
||||||
|
from trytond.pool import PoolMeta
|
||||||
|
|
||||||
|
|
||||||
|
class Identifier(metaclass=PoolMeta):
|
||||||
|
__name__ = 'product.identifier'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def __setup__(cls):
|
||||||
|
super(Identifier, cls).__setup__()
|
||||||
|
cls.type.selection.extend([
|
||||||
|
('wkn', 'National Securities Identifying Number (NSIN)'),
|
||||||
|
('secsymb', 'Stock market symbol'),
|
||||||
|
])
|
||||||
|
|
||||||
|
# end Identifier
|
39
locale/de.po
39
locale/de.po
|
@ -46,6 +46,10 @@ msgctxt "view:investment.asset:"
|
||||||
msgid "Currency and Units"
|
msgid "Currency and Units"
|
||||||
msgstr "Währung und Einheiten"
|
msgstr "Währung und Einheiten"
|
||||||
|
|
||||||
|
msgctxt "view:investment.asset:"
|
||||||
|
msgid "Identifiers"
|
||||||
|
msgstr "Bezeichner"
|
||||||
|
|
||||||
msgctxt "field:investment.asset,company:"
|
msgctxt "field:investment.asset,company:"
|
||||||
msgid "Company"
|
msgid "Company"
|
||||||
msgstr "Unternehmen"
|
msgstr "Unternehmen"
|
||||||
|
@ -82,3 +86,38 @@ msgctxt "field:investment.asset,uom:"
|
||||||
msgid "UOM"
|
msgid "UOM"
|
||||||
msgstr "Einheit"
|
msgstr "Einheit"
|
||||||
|
|
||||||
|
msgctxt "field:investment.asset,wkn:"
|
||||||
|
msgid "NSIN"
|
||||||
|
msgstr "WKN"
|
||||||
|
|
||||||
|
msgctxt "help:investment.asset,wkn:"
|
||||||
|
msgid "National Securities Identifying Number"
|
||||||
|
msgstr "Wertpapierkennnummer"
|
||||||
|
|
||||||
|
msgctxt "field:investment.asset,isin:"
|
||||||
|
msgid "ISIN"
|
||||||
|
msgstr "ISIN"
|
||||||
|
|
||||||
|
msgctxt "help:investment.asset,isin:"
|
||||||
|
msgid "International Securities Identification Number"
|
||||||
|
msgstr "Internationale Wertpapierkennnummer"
|
||||||
|
|
||||||
|
msgctxt "field:investment.asset,secsymb:"
|
||||||
|
msgid "Symbol"
|
||||||
|
msgstr "Symbol"
|
||||||
|
|
||||||
|
msgctxt "help:investment.asset,secsymb:"
|
||||||
|
msgid "Stock market symbol"
|
||||||
|
msgstr "Börsensymbol"
|
||||||
|
|
||||||
|
|
||||||
|
######################
|
||||||
|
# product.identifier #
|
||||||
|
######################
|
||||||
|
msgctxt "selection:product.identifier,type:"
|
||||||
|
msgid "National Securities Identifying Number (NSIN)"
|
||||||
|
msgstr "Wertpapierkennnummer (WKN)"
|
||||||
|
|
||||||
|
msgctxt "selection:product.identifier,type:"
|
||||||
|
msgid "Stock market symbol"
|
||||||
|
msgstr "Börsensymbol"
|
||||||
|
|
32
locale/en.po
32
locale/en.po
|
@ -30,6 +30,10 @@ msgctxt "view:investment.asset:"
|
||||||
msgid "Currency and Units"
|
msgid "Currency and Units"
|
||||||
msgstr "Currency and Units"
|
msgstr "Currency and Units"
|
||||||
|
|
||||||
|
msgctxt "view:investment.asset:"
|
||||||
|
msgid "Identifiers"
|
||||||
|
msgstr "Identifiers"
|
||||||
|
|
||||||
msgctxt "field:investment.asset,company:"
|
msgctxt "field:investment.asset,company:"
|
||||||
msgid "Company"
|
msgid "Company"
|
||||||
msgstr "Company"
|
msgstr "Company"
|
||||||
|
@ -66,3 +70,31 @@ msgctxt "field:investment.asset,uom:"
|
||||||
msgid "UOM"
|
msgid "UOM"
|
||||||
msgstr "UOM"
|
msgstr "UOM"
|
||||||
|
|
||||||
|
msgctxt "field:investment.asset,wkn:"
|
||||||
|
msgid "NSIN"
|
||||||
|
msgstr "NSIN"
|
||||||
|
|
||||||
|
msgctxt "help:investment.asset,wkn:"
|
||||||
|
msgid "National Securities Identifying Number"
|
||||||
|
msgstr "National Securities Identifying Number"
|
||||||
|
|
||||||
|
msgctxt "field:investment.asset,isin:"
|
||||||
|
msgid "ISIN"
|
||||||
|
msgstr "ISIN"
|
||||||
|
|
||||||
|
msgctxt "help:investment.asset,isin:"
|
||||||
|
msgid "International Securities Identification Number"
|
||||||
|
msgstr "International Securities Identification Number"
|
||||||
|
|
||||||
|
msgctxt "field:investment.asset,secsymb:"
|
||||||
|
msgid "Symbol"
|
||||||
|
msgstr "Symbol"
|
||||||
|
|
||||||
|
msgctxt "help:investment.asset,secsymb:"
|
||||||
|
msgid "Stock market symbol"
|
||||||
|
msgstr "Stock market symbol"
|
||||||
|
|
||||||
|
msgctxt "selection:product.identifier,type:"
|
||||||
|
msgid "National Securities Identifying Number (NSIN)"
|
||||||
|
msgstr "National Securities Identifying Number (NSIN)"
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
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.transaction import Transaction
|
from trytond.transaction import Transaction
|
||||||
from trytond.exceptions import UserError
|
|
||||||
from trytond.modules.company.tests import create_company
|
from trytond.modules.company.tests import create_company
|
||||||
from datetime import date
|
from datetime import date
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
@ -82,6 +81,75 @@ class AssetTestCase(ModuleTestCase):
|
||||||
company=company,
|
company=company,
|
||||||
product = product)
|
product = product)
|
||||||
|
|
||||||
|
@with_transaction()
|
||||||
|
def test_asset_indentifiers(self):
|
||||||
|
""" create asset, add identifiers
|
||||||
|
"""
|
||||||
|
pool = Pool()
|
||||||
|
Product = pool.get('product.product')
|
||||||
|
Asset = pool.get('investment.asset')
|
||||||
|
|
||||||
|
company = self.prep_asset_company()
|
||||||
|
product1 = self.prep_asset_product(
|
||||||
|
name='Product unit', unit='u')
|
||||||
|
product2 = self.prep_asset_product(
|
||||||
|
name='Product gram', unit='g')
|
||||||
|
|
||||||
|
asset1 = self.prep_asset_item(
|
||||||
|
company=company,
|
||||||
|
product = product1)
|
||||||
|
asset2 = self.prep_asset_item(
|
||||||
|
company=company,
|
||||||
|
product = product2)
|
||||||
|
|
||||||
|
Product.write(*[
|
||||||
|
[product1],
|
||||||
|
{
|
||||||
|
'identifiers': [('create', [{
|
||||||
|
'type': 'wkn',
|
||||||
|
'code': '965515',
|
||||||
|
}, {
|
||||||
|
'type': 'secsymb',
|
||||||
|
'code': '1472977',
|
||||||
|
}, {
|
||||||
|
'type': 'isin',
|
||||||
|
'code': 'XC0009655157',
|
||||||
|
}, ])],
|
||||||
|
},
|
||||||
|
[product2],
|
||||||
|
{
|
||||||
|
'identifiers': [('create', [{
|
||||||
|
'type': 'wkn',
|
||||||
|
'code': '965310',
|
||||||
|
}, {
|
||||||
|
'type': 'secsymb',
|
||||||
|
'code': '1431157',
|
||||||
|
}, {
|
||||||
|
'type': 'isin',
|
||||||
|
'code': 'XC0009653103',
|
||||||
|
}, ])],
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
self.assertEqual(asset1.wkn, '965515')
|
||||||
|
self.assertEqual(asset1.isin, 'XC0009655157')
|
||||||
|
self.assertEqual(asset1.secsymb, '1472977')
|
||||||
|
|
||||||
|
self.assertEqual(Asset.search_count([('wkn', '=', '965515')]), 1)
|
||||||
|
self.assertEqual(Asset.search_count([('isin', '=', 'XC0009655157')]), 1)
|
||||||
|
self.assertEqual(Asset.search_count([('secsymb', '=', '1472977')]), 1)
|
||||||
|
|
||||||
|
self.assertEqual(Asset.search_count([
|
||||||
|
('wkn', 'ilike', '9655%'),
|
||||||
|
]), 1)
|
||||||
|
self.assertEqual(Asset.search_count([
|
||||||
|
('wkn', 'ilike', '965%'),
|
||||||
|
]), 2)
|
||||||
|
|
||||||
|
self.assertEqual(asset2.wkn, '965310')
|
||||||
|
self.assertEqual(asset2.isin, 'XC0009653103')
|
||||||
|
self.assertEqual(asset2.secsymb, '1431157')
|
||||||
|
|
||||||
@with_transaction()
|
@with_transaction()
|
||||||
def test_asset_check_product_update(self):
|
def test_asset_check_product_update(self):
|
||||||
""" create asset
|
""" create asset
|
||||||
|
|
|
@ -18,4 +18,14 @@ full copyright notices and license terms. -->
|
||||||
<label name="product_uom" />
|
<label name="product_uom" />
|
||||||
<field name="product_uom" />
|
<field name="product_uom" />
|
||||||
|
|
||||||
|
<separator id="sepids" colspan="4" string="Identifiers"/>
|
||||||
|
<label name="wkn" />
|
||||||
|
<field name="wkn" />
|
||||||
|
<label name="secsymb" />
|
||||||
|
<field name="secsymb" />
|
||||||
|
|
||||||
|
<label name="isin" />
|
||||||
|
<field name="isin" />
|
||||||
|
<newline/>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -4,6 +4,9 @@ The COPYRIGHT file at the top level of this repository contains the
|
||||||
full copyright notices and license terms. -->
|
full copyright notices and license terms. -->
|
||||||
<tree>
|
<tree>
|
||||||
<field name="rec_name"/>
|
<field name="rec_name"/>
|
||||||
|
<field name="isin"/>
|
||||||
|
<field name="secsymb"/>
|
||||||
|
<field name="wkn"/>
|
||||||
<field name="currency"/>
|
<field name="currency"/>
|
||||||
<field name="uom"/>
|
<field name="uom"/>
|
||||||
</tree>
|
</tree>
|
||||||
|
|
Loading…
Reference in a new issue