from odoo.addons.web_studio.controllers.main import WebStudioController from odoo.http import _request_stack from odoo.tests.common import TransactionCase from odoo.tools import DotDict class TestReportEditor(TransactionCase): def setUp(self): super(TestReportEditor, self).setUp() self.session = DotDict({'debug': ''}) self.is_frontend = False _request_stack.push(self) # crappy hack to use a fake Request self.WebStudioController = WebStudioController() def test_copy_inherit_report(self): report = self.env['ir.actions.report'].create({ 'name': 'test inherit report user', 'report_name': 'web_studio.test_inherit_report_user', 'model': 'res.users', }) self.env['ir.ui.view'].create({ 'type': 'qweb', 'name': 'web_studio.test_inherit_report_hi', 'key': 'web_studio.test_inherit_report_hi', 'arch': ''' hi ''', }) parent_view = self.env['ir.ui.view'].create({ 'type': 'qweb', 'name': 'web_studio.test_inherit_report_user_parent', 'key': 'web_studio.test_inherit_report_user_parent', 'arch': ''' ! ''', }) self.env['ir.ui.view'].create({ 'type': 'qweb', 'name': 'web_studio.test_inherit_report_user', 'key': 'web_studio.test_inherit_report_user', 'arch': ''' !! ''', 'inherit_id': parent_view.id, }) # check original report render to expected output report_html = report._render_template(report.report_name).decode() self.assertEqual(''.join(report_html.split()), 'hi!hi!!') # duplicate original report report.copy_report_and_template() copy_report = self.env['ir.actions.report'].search([ ('report_name', '=', 'web_studio.test_inherit_report_user_copy_1'), ]) # check duplicated report render to expected output copy_report_html = copy_report._render_template(copy_report.report_name).decode() self.assertEqual(''.join(copy_report_html.split()), 'hi!hi!!') # check that duplicated view is inheritance combination of original view copy_view = self.env['ir.ui.view'].search([ ('key', '=', copy_report.report_name), ]) self.assertFalse(copy_view.inherit_id, 'copied view does not inherit another one') found = len(copy_view.arch_db.split('test_inherit_report_hi_copy_1')) - 1 self.assertEqual(found, 2, 't-call is duplicated one time and used 2 times') def test_duplicate(self): # Inheritance during an upgrade work only with loaded views # The following force the inheritance to work for all views # so the created view is correctly inherited self.env = self.env(context={'load_all_views': True}) # Create a report/view containing "foo" report = self.env['ir.actions.report'].create({ 'name': 'test duplicate', 'report_name': 'web_studio.test_duplicate_foo', 'model': 'res.users',}) self.env['ir.ui.view'].create({ 'type': 'qweb', 'name': 'test_duplicate_foo', 'key': 'web_studio.test_duplicate_foo', 'arch': "foo",}) duplicate_domain = [('report_name', '=like', 'web_studio.test_duplicate_foo_copy_%')] # Duplicate the report and retrieve the duplicated view report.copy_report_and_template() copy1 = self.env['ir.actions.report'].search(duplicate_domain) copy1.ensure_one() # watchdog copy1_view = self.env['ir.ui.view'].search([ ('key', '=', copy1.report_name)]) copy1_view.ensure_one() # watchdog # Inherit the view to replace "foo" by "bar" self.env['ir.ui.view'].create({ 'inherit_id': copy1_view.id, 'key': copy1.report_name, 'arch': ''' bar ''' % copy1.report_name,}) # Assert the duplicated view renders "bar" then unlink the report copy1_html = copy1._render_template(copy1.report_name).decode() self.assertEqual(''.join(copy1_html.split()), 'bar') copy1.unlink() # Re-duplicate the original report, it must renders "foo" report.copy_report_and_template() copy2 = self.env['ir.actions.report'].search(duplicate_domain) copy2.ensure_one() copy2_html = copy2._render_template(copy2.report_name).decode() self.assertEqual(''.join(copy2_html.split()), 'foo') def test_copy_custom_model_rendering(self): report = self.env['ir.actions.report'].search([('report_name', '=', 'base.report_irmodulereference')]) report.copy_report_and_template() copy = self.env['ir.actions.report'].search([('report_name', '=', 'base.report_irmodulereference_copy_1')]) report_model = self.env['ir.actions.report']._get_rendering_context_model(copy) self.assertIsNotNone(report_model) def test_duplicate_keep_translations(self): def create_view(name, **kwargs): arch = '
{}
'.format(name) if kwargs.get('inherit_id'): arch = '{}'.format(arch) name = 'web_studio.test_keep_translations_{}'.format(name) return self.env['ir.ui.view'].create(dict({ 'type': 'qweb', 'name': name, 'key': name, 'arch': arch, }, **kwargs)) report = self.env['ir.actions.report'].create({ 'name': 'test inherit report user', 'report_name': 'web_studio.test_keep_translations_ab', 'model': 'res.users', }).with_context(load_all_views=True) self.env.ref('base.lang_fr').active = True views = report.env['ir.ui.view'] views += create_view("a_") root = views[-1] views += create_view("b_") views += create_view("aa", inherit_id=root.id, mode="primary") views += create_view("ab", inherit_id=root.id) target = views[-1] views += create_view("aba", inherit_id=target.id) views[-1].arch = views[-1].arch.replace('aba', 'a_aba
ab') views += create_view("abb", inherit_id=target.id, mode="primary") for view in views.with_context(lang='fr_FR'): terms = view._fields['arch_db'].get_trans_terms(view.arch_db) view.update_field_translations('arch_db', {'fr_FR': {term: '%s in fr' % term for term in terms}}) combined_arch = '
a_
ab
a_
aba
ab
' self.assertEqual(target._read_template(target.id), combined_arch) # duplicate original report, views will be combined into one report.copy_report_and_template() copy_view = self.env['ir.ui.view'].search([ ('key', '=', 'web_studio.test_keep_translations_ab_copy_1'), ]) self.assertEqual(copy_view.arch, combined_arch) # translations of combined views have been copied to the new view new_arch = '
a_ in fr
ab in fr
a_ in fr
aba in fr
ab in fr
' self.assertEqual(copy_view.with_context(lang='fr_FR').arch, new_arch) def tearDown(self): super(TestReportEditor, self).tearDown() _request_stack.pop()