diff --git a/evaluation.py b/evaluation.py index 4408491..b36b8b3 100644 --- a/evaluation.py +++ b/evaluation.py @@ -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, }, }, }]) diff --git a/evaluation_context.xml b/evaluation_context.xml index 0b72704..3313c72 100644 --- a/evaluation_context.xml +++ b/evaluation_context.xml @@ -5,27 +5,12 @@ full copyright notices and license terms. --> - + cashbook_report.evaluation.context form evaluation_context_form - - - Evaluation - cashbook_report.eval_line - cashbook_report.evaluation.context - - - - - - - - diff --git a/line.py b/line.py index fa187b0..cb86ba8 100644 --- a/line.py +++ b/line.py @@ -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) diff --git a/line.xml b/line.xml index 5a5ca44..5aac1dd 100644 --- a/line.xml +++ b/line.xml @@ -9,15 +9,43 @@ full copyright notices and license terms. --> cashbook_report.eval_line graph - evalline_graph cashbook_report.eval_line tree - evalline_list + + cashbook_report.eval_line + form + evalline_form + + + + + Evaluation + cashbook_report.eval_line + cashbook_report.evaluation.context + + + + + + + + + + + + + + + + + diff --git a/locale/de.po b/locale/de.po index a878790..f01597e 100644 --- a/locale/de.po +++ b/locale/de.po @@ -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" diff --git a/locale/en.po b/locale/en.po index 975a1a4..6af9624 100644 --- a/locale/en.po +++ b/locale/en.po @@ -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" diff --git a/tests/test_report.py b/tests/test_report.py index 845e344..584f56a 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -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): - + """) diff --git a/view/evalline_form.xml b/view/evalline_form.xml new file mode 100644 index 0000000..14d9011 --- /dev/null +++ b/view/evalline_form.xml @@ -0,0 +1,11 @@ + + +
+