line: anzig+einstellungen ok + test

This commit is contained in:
Frederik Jaeckel 2022-11-05 00:19:41 +01:00
parent 4d0dc9e7ac
commit a2d715a54d
10 changed files with 338 additions and 120 deletions

View file

@ -46,6 +46,7 @@ class Evaluation(ModelSQL, ModelView):
dtype = fields.Selection(string='Data type', required=True,
sort=False, selection=sel_etype,
help='Type of data displayed')
dtype_string = dtype.translated('dtype')
chart = fields.Selection(string='Chart type', required=True,
sort=False, selection=sel_chart,
help='Type of graphical presentation.')
@ -185,7 +186,7 @@ class Evaluation(ModelSQL, ModelView):
else 'color="%s"' % evaluation.maincolor,
'lines': template_view_line % {
'fill': '1',
'string': evaluation.dtype,
'string': evaluation.dtype_string,
},
},
}])

View file

@ -5,27 +5,12 @@ full copyright notices and license terms. -->
<tryton>
<data>
<!-- graph-view with context-form -->
<!-- context-form for graph-view -->
<record model="ir.ui.view" id="evaluation_context_form">
<field name="model">cashbook_report.evaluation.context</field>
<field name="type">form</field>
<field name="name">evaluation_context_form</field>
</record>
<!-- action view - cashbook-graph -->
<record model="ir.action.act_window" id="act_evaluation_graph_view">
<field name="name">Evaluation</field>
<field name="res_model">cashbook_report.eval_line</field>
<field name="context_model">cashbook_report.evaluation.context</field>
<field name="domain"
eval="[('evaluation', '=', Eval('evaluation', -1))]"
pyson="1"/>
</record>
<record model="ir.action.act_window.view" id="act_evaluation_graph_view-1">
<field name="sequence" eval="10"/>
<field name="view" ref="evalline_view_graph"/>
<field name="act_window" ref="act_evaluation_graph_view"/>
</record>
</data>
</tryton>

91
line.py
View file

@ -56,7 +56,6 @@ class EvaluationLine(ModelSQL, ModelView):
def set_name_data(cls, lines, name, value):
""" store updated name
"""
print('\n## set_name_data', lines, name, value)
cls.write(*[
lines,
{
@ -185,31 +184,35 @@ class EvaluationLine(ModelSQL, ModelView):
(self.eval_currency is None) or (self.currency_digits is None):
return None
lines = Lines.search([
('cashbook.btype.id', '=', self.dtype.id),
('cashbook.state', '=', 'open'),
('cashbook.owner.id', '=', Transaction().user),
], query=True)
query = lines.join(tab_line, condition=lines.id==tab_line.id,
).join(tab_book, condition=tab_book.id==tab_line.cashbook,
).select(
tab_book.currency,
Sum(tab_line.credit - tab_line.debit).as_('balance'),
group_by=[tab_book.currency],
)
cursor.execute(*query)
balances = cursor.fetchall()
total_amount = Decimal('0.0')
for balance in balances:
(id_currency, bal1) = balance
with Transaction().set_context({
'_check_access': True,
}):
lines = Lines.search([
('cashbook.btype.id', '=', self.dtype.id),
('cashbook.state', '=', 'open'),
('cashbook.owner.id', '=', Transaction().user),
], query=True)
total_amount += Currency.compute(
Currency(id_currency),
bal1,
self.eval_currency,
query = lines.join(tab_line, condition=lines.id==tab_line.id,
).join(tab_book, condition=tab_book.id==tab_line.cashbook,
).select(
tab_book.currency,
Sum(tab_line.credit - tab_line.debit).as_('balance'),
group_by=[tab_book.currency],
)
cursor.execute(*query)
balances = cursor.fetchall()
for balance in balances:
(id_currency, bal1) = balance
if bal1 is not None:
total_amount += Currency.compute(
Currency(id_currency),
bal1,
self.eval_currency,
)
exp = Decimal(Decimal(1) / 10 ** self.currency_digits)
return total_amount.quantize(exp)
@ -227,28 +230,32 @@ class EvaluationLine(ModelSQL, ModelView):
(self.eval_currency is None) or (self.currency_digits is None):
return None
lines = Lines.search([
('cashbook.currency.id', '=', self.currency.id),
('cashbook.state', '=', 'open'),
('cashbook.owner.id', '=', Transaction().user),
], query=True)
query = lines.join(tab_line, condition=lines.id==tab_line.id,
).select(
Sum(tab_line.credit - tab_line.debit).as_('balance'),
)
cursor.execute(*query)
balances = cursor.fetchall()
total_amount = Decimal('0.0')
for balance in balances:
(bal1,) = balance
with Transaction().set_context({
'_check_access': True,
}):
lines = Lines.search([
('cashbook.currency.id', '=', self.currency.id),
('cashbook.state', '=', 'open'),
('cashbook.owner.id', '=', Transaction().user),
], query=True)
total_amount += Currency.compute(
self.currency,
bal1,
self.eval_currency,
query = lines.join(tab_line, condition=lines.id==tab_line.id,
).select(
Sum(tab_line.credit - tab_line.debit).as_('balance'),
)
cursor.execute(*query)
balances = cursor.fetchall()
for balance in balances:
(bal1,) = balance
if bal1 is not None:
total_amount += Currency.compute(
self.currency,
bal1,
self.eval_currency,
)
exp = Decimal(Decimal(1) / 10 ** self.currency_digits)
return total_amount.quantize(exp)

View file

@ -9,15 +9,43 @@ full copyright notices and license terms. -->
<record model="ir.ui.view" id="evalline_view_graph">
<field name="model">cashbook_report.eval_line</field>
<field name="type">graph</field>
<field name="priority" eval="10"/>
<field name="name">evalline_graph</field>
</record>
<record model="ir.ui.view" id="evalline_view_list">
<field name="model">cashbook_report.eval_line</field>
<field name="type">tree</field>
<field name="priority" eval="20"/>
<field name="name">evalline_list</field>
</record>
<record model="ir.ui.view" id="evalline_view_form">
<field name="model">cashbook_report.eval_line</field>
<field name="type">form</field>
<field name="name">evalline_form</field>
</record>
<!-- action view - for graph view -->
<record model="ir.action.act_window" id="act_evaluation_graph_view">
<field name="name">Evaluation</field>
<field name="res_model">cashbook_report.eval_line</field>
<field name="context_model">cashbook_report.evaluation.context</field>
<field name="domain"
eval="[('evaluation', '=', Eval('evaluation', -1))]"
pyson="1"/>
</record>
<record model="ir.action.act_window.view" id="act_evaluation_graph_view-1">
<field name="sequence" eval="10"/>
<field name="view" ref="evalline_view_graph"/>
<field name="act_window" ref="act_evaluation_graph_view"/>
</record>
<record model="ir.action.act_window.view" id="act_evaluation_graph_view-2">
<field name="sequence" eval="20"/>
<field name="view" ref="evalline_view_list"/>
<field name="act_window" ref="act_evaluation_graph_view"/>
</record>
<record model="ir.action.act_window.view" id="act_evaluation_graph_view-3">
<field name="sequence" eval="30"/>
<field name="view" ref="evalline_view_form"/>
<field name="act_window" ref="act_evaluation_graph_view"/>
</record>
</data>
</tryton>

View file

@ -233,3 +233,15 @@ msgstr "Zeilenwerte"
msgctxt "field:cashbook_report.evaluation,currency:"
msgid "Currency"
msgstr "Währung"
######################################
# cashbook_report.evaluation.context #
######################################
msgctxt "model:cashbook_report.evaluation.context,name:"
msgid "Evaluation Context"
msgstr "Auswertung Kontext"
msgctxt "field:cashbook_report.evaluation.context,evaluation:"
msgid "Evaluation"
msgstr "Auswertung"

View file

@ -18,6 +18,10 @@ msgctxt "model:ir.message,text:msg_dtype_currency"
msgid "Currencies"
msgstr "Currencies"
msgctxt "model:ir.message,text:msg_name_graph"
msgid "Graph: %(gname)s"
msgstr "Graph: %(gname)s"
msgctxt "model:ir.rule.group,name:rg_eval_write_adm"
msgid "Administrators: Evaluation read/write"
msgstr "Administrators: Evaluation read/write"
@ -34,74 +38,46 @@ msgctxt "model:ir.ui.menu,name:menu_evaluation"
msgid "Evaluation"
msgstr "Evaluation"
msgctxt "model:cashbook_report.eval_book,name:"
msgid "Evaluation Cashbook Relation"
msgstr "Evaluation Cashbook Relation"
msgctxt "model:cashbook_report.eval_line,name:"
msgid "Evaluation Line Relation"
msgstr "Evaluation Line Relation"
msgctxt "field:cashbook_report.eval_book,evaluation:"
msgctxt "field:cashbook_report.eval_line,evaluation:"
msgid "Evaluation"
msgstr "Evaluation"
msgctxt "field:cashbook_report.eval_book,cashbook:"
msgctxt "field:cashbook_report.eval_line,cashbook:"
msgid "Cashbook"
msgstr "Cashbook"
msgctxt "field:cashbook_report.eval_book,eval_currency:"
msgctxt "field:cashbook_report.eval_line,dtype:"
msgid "Data type"
msgstr "Data type"
msgctxt "field:cashbook_report.eval_line,currency:"
msgid "Currency"
msgstr "Currency"
msgctxt "field:cashbook_report.eval_book,currency_digits:"
msgctxt "field:cashbook_report.eval_line,eval_currency:"
msgid "Currency"
msgstr "Currency"
msgctxt "field:cashbook_report.eval_line,currency_digits:"
msgid "Currency Digits"
msgstr "Currency Digits"
msgctxt "model:cashbook_report.eval_type,name:"
msgid "Evaluation Type Relation"
msgstr "Evaluation Type Relation"
msgctxt "field:cashbook_report.eval_line,eval_dtype:"
msgid "Data type"
msgstr "Data type"
msgctxt "field:cashbook_report.eval_type,evaluation:"
msgid "Evaluation"
msgstr "Evaluation"
msgctxt "field:cashbook_report.eval_type,dtype:"
msgid "Type"
msgstr "Type"
msgctxt "field:cashbook_report.eval_type,name:"
msgctxt "field:cashbook_report.eval_line,name:"
msgid "Name"
msgstr "Name"
msgctxt "field:cashbook_report.eval_type,balance:"
msgctxt "field:cashbook_report.eval_line,balance:"
msgid "Balance"
msgstr "Balance"
msgctxt "field:cashbook_report.eval_type,eval_currency:"
msgid "Currency"
msgstr "Currency"
msgctxt "field:cashbook_report.eval_type,currency_digits:"
msgid "Currency Digits"
msgstr "Currency Digits"
msgctxt "model:cashbook_report.eval_currency,name:"
msgid "Evaluation Currency Relation"
msgstr "Evaluation Currency Relation"
msgctxt "field:cashbook_report.eval_currency,evaluation:"
msgid "Evaluation"
msgstr "Evaluation"
msgctxt "field:cashbook_report.eval_currency,currency:"
msgid "Currency"
msgstr "Currency"
msgctxt "field:cashbook_report.eval_currency,eval_currency:"
msgid "Currency"
msgstr "Currency"
msgctxt "field:cashbook_report.eval_currency,currency_digits:"
msgid "Currency Digits"
msgstr "Currency Digits"
msgctxt "model:cashbook_report.evaluation,name:"
msgid "Evaluation"
msgstr "Evaluation"
@ -226,15 +202,19 @@ msgctxt "field:cashbook_report.evaluation,types:"
msgid "Types"
msgstr "Types"
msgctxt "field:cashbook_report.evaluation,type_values:"
msgid "Type Values"
msgstr "Type Values"
msgctxt "field:cashbook_report.evaluation,currencies:"
msgid "Currencies"
msgstr "Currencies"
msgctxt "field:cashbook_report.evaluation,currency_values:"
msgid "Currency Values"
msgstr "Currency Values"
msgctxt "field:cashbook_report.evaluation,line_values:"
msgid "Line Values"
msgstr "Line Values"
msgctxt "field:cashbook_report.evaluation,currency:"
msgid "Currency"
msgstr "Currency"
msgctxt "model:cashbook_report.evaluation.context,name:"
msgid "Evaluation Context"
msgstr "Evaluation Context"

View file

@ -170,6 +170,195 @@ class ReportTestCase(CashbookTestCase):
('cashbook_hasbookings', '=', True)
]), 0)
@with_transaction()
def test_report_check_limited_access(self):
""" check query of cashbook-lines selected by
cashbook-type, limited by user-permissions
"""
pool = Pool()
ResUser = pool.get('res.user')
ResGroup = pool.get('res.group')
ModelData = pool.get('ir.model.data')
Currency = pool.get('currency.currency')
Evaluation = pool.get('cashbook_report.evaluation')
Type = pool.get('cashbook.type')
Cashbook = pool.get('cashbook.book')
Line = pool.get('cashbook_report.eval_line')
books = self.prep_report_3books()
company = self.prep_company()
# add 2x user, set owner of cashbooks to them
group_cashbook = ResGroup(ModelData.get_id('cashbook', 'group_cashbook'))
users = ResUser.create([{
'name': 'User 1',
'login': 'user1',
'password': 'test1234',
'groups': [('add', [group_cashbook.id])],
'company': company.id,
'companies': [('add', [company.id])],
}, {
'name': 'User 2',
'login': 'user2',
'password': 'test1234',
'groups': [('add', [group_cashbook.id])],
'company': company.id,
'companies': [('add', [company.id])],
}])
Cashbook.write(*[
[books[0], books[1]],
{
'owner': users[0].id,
},
[books[2]],
{
'owner': users[1].id,
},
])
# check access to data
with Transaction().set_user(users[0].id):
with Transaction().set_context({
'_check_access': True,
'company': company.id,
}):
books_owner1 = Cashbook.search([])
self.assertEqual(len(books_owner1), 2)
self.assertEqual(books_owner1[0].name, 'Book 1')
self.assertEqual(books_owner1[0].balance, Decimal('25.0'))
self.assertEqual(books_owner1[1].name, 'Book 2')
self.assertEqual(books_owner1[1].balance, Decimal('12.5'))
evaluation1, = Evaluation.create([{
'name': 'Evaluation User 1 - Cashbooks',
'dtype': 'cashbooks',
'cashbooks': [('add', [x.id for x in books_owner1])],
}])
self.assertEqual(len(evaluation1.cashbooks), 2)
self.assertEqual(evaluation1.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation1.line_values), 2)
self.assertEqual(evaluation1.line_values[0].name, 'Book 1 | 25.00 usd | Open')
self.assertEqual(evaluation1.line_values[0].balance, Decimal('23.81'))
self.assertEqual(evaluation1.line_values[1].name, 'Book 2 | 12.50 usd | Open')
self.assertEqual(evaluation1.line_values[1].balance, Decimal('11.9'))
evaluation2, = Evaluation.create([{
'name': 'Evaluation User 1 - Types',
'dtype': 'types',
'types': [('add', [x.id for x in Type.search([])])],
}])
self.assertEqual(len(evaluation2.types), 2)
self.assertEqual(evaluation2.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation2.line_values), 2)
self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank')
self.assertEqual(evaluation2.line_values[0].balance, Decimal('0.0'))
self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash')
self.assertEqual(evaluation2.line_values[1].balance, Decimal('35.71'))
evaluation3, = Evaluation.create([{
'name': 'Evaluation User 1 - Currencies',
'dtype': 'currencies',
'currencies': [('add', [x.id for x in Currency.search([])])],
}])
self.assertEqual(len(evaluation3.currencies), 2)
self.assertEqual(evaluation3.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation3.line_values), 2)
self.assertEqual(evaluation3.line_values[0].name, 'Euro')
self.assertEqual(evaluation3.line_values[0].balance, Decimal('0.0'))
self.assertEqual(evaluation3.line_values[1].name, 'usd')
self.assertEqual(evaluation3.line_values[1].balance, Decimal('35.71'))
with Transaction().set_user(users[1].id):
with Transaction().set_context({
'_check_access': True,
'company': company.id,
}):
books_owner2 = Cashbook.search([])
self.assertEqual(len(books_owner2), 1)
self.assertEqual(books_owner2[0].name, 'Book 3')
evaluation1, = Evaluation.create([{
'name': 'Evaluation User 2 - Cashbooks',
'dtype': 'cashbooks',
'cashbooks': [('add', [x.id for x in books_owner2])],
}])
self.assertEqual(len(evaluation1.cashbooks), 1)
self.assertEqual(evaluation1.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation1.line_values), 1)
self.assertEqual(evaluation1.line_values[0].name, 'Book 3 | 23.00 € | Open')
self.assertEqual(evaluation1.line_values[0].balance, Decimal('23.0'))
evaluation2, = Evaluation.create([{
'name': 'Evaluation User 2 - Types',
'dtype': 'types',
'types': [('add', [x.id for x in Type.search([])])],
}])
self.assertEqual(len(evaluation2.types), 2)
self.assertEqual(evaluation2.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation2.line_values), 2)
self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank')
self.assertEqual(evaluation2.line_values[0].balance, Decimal('23.0'))
self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash')
self.assertEqual(evaluation2.line_values[1].balance, Decimal('0.0'))
evaluation3, = Evaluation.create([{
'name': 'Evaluation User 3 - Currencies',
'dtype': 'currencies',
'currencies': [('add', [x.id for x in Currency.search([])])],
}])
self.assertEqual(len(evaluation3.currencies), 2)
self.assertEqual(evaluation3.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation3.line_values), 2)
self.assertEqual(evaluation3.line_values[0].name, 'Euro')
self.assertEqual(evaluation3.line_values[0].balance, Decimal('23.0'))
self.assertEqual(evaluation3.line_values[1].name, 'usd')
self.assertEqual(evaluation3.line_values[1].balance, Decimal('0.0'))
@with_transaction()
def test_report_update_name_of_line(self):
""" check replace rec_name-value on line with
manually updates value
"""
pool = Pool()
Evaluation = pool.get('cashbook_report.evaluation')
Line = pool.get('cashbook_report.eval_line')
books = self.prep_report_3books()
company = self.prep_company()
with Transaction().set_context({
'company': company.id,
}):
evaluation, = Evaluation.create([{
'name': 'Evaluation 1',
'dtype': 'cashbooks',
'cashbooks': [('add', [x.id for x in books])],
}])
self.assertEqual(len(evaluation.cashbooks), 3)
self.assertEqual(len(evaluation.line_values), 3)
self.assertEqual(evaluation.line_values[0].name, 'Book 1 | 25.00 usd | Open')
self.assertEqual(evaluation.line_values[0].name_line, None)
# update 'name'
Line.write(*[
[evaluation.line_values[0]],
{
'name': 'Book updated',
}])
self.assertEqual(evaluation.line_values[0].name, 'Book updated')
self.assertEqual(evaluation.line_values[0].name_line, 'Book updated')
# delete 'name' value to reset to origin
Line.write(*[
[evaluation.line_values[0]],
{
'name': None,
}])
self.assertEqual(evaluation.line_values[0].name, 'Book 1 | 25.00 usd | Open')
self.assertEqual(evaluation.line_values[0].name_line, None)
@with_transaction()
def test_report_dtype_update(self):
""" check unlink of cashbooks/types/currencies
@ -317,7 +506,7 @@ class ReportTestCase(CashbookTestCase):
<field name="name"/>
</x>
<y>
<field name="balance" fill="1" empty="0" string="cashbooks"/>
<field name="balance" fill="1" empty="0" string="Cashbooks"/>
</y>
</graph>
""")

11
view/evalline_form.xml Normal file
View file

@ -0,0 +1,11 @@
<?xml version="1.0"?>
<!-- This file is part of the cashbook-module from m-ds for Tryton.
The COPYRIGHT file at the top level of this repository contains the
full copyright notices and license terms. -->
<form>
<label name="name"/>
<field name="name"/>
<label name="balance"/>
<field name="balance"/>
<field name="name_line"/>
</form>

View file

@ -2,7 +2,6 @@
<!-- This file is part of the cashbook-module from m-ds for Tryton.
The COPYRIGHT file at the top level of this repository contains the
full copyright notices and license terms. -->
<form col="2">
<label name="evaluation"/>
<field name="evaluation"/>
<form>
<field name="evaluation" invisible="1"/>
</form>

View file

@ -18,6 +18,12 @@ full copyright notices and license terms. -->
<label name="legend"/>
<field name="legend"/>
<label name="bgcolor"/>
<field name="bgcolor"/>
<label name="posted"/>
<field name="posted"/>
<newline/>
<field name="cashbooks" colspan="6"/>
<field name="types" colspan="6"/>
<field name="currencies" colspan="6"/>