diff --git a/CHANGELOG b/CHANGELOG index 8fe440b9bd..474ab85fb2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Remove empty pages from notebook * Allow to store Dict as JSON on the database Version 4.4.0 - 2017-05-01 diff --git a/trytond/model/modelview.py b/trytond/model/modelview.py index 3c8be21359..845f2ab4ff 100644 --- a/trytond/model/modelview.py +++ b/trytond/model/modelview.py @@ -410,6 +410,11 @@ class ModelView(Model): if colspan is not None: element.attrib['colspan'] = colspan + # Remove empty pages + if type == 'form': + for page in tree.xpath('//page[not(descendant::*)]'): + page.getparent().remove(page) + if type == 'tree': ViewTreeWidth = pool.get('ir.ui.view_tree_width') viewtreewidth_ids = ViewTreeWidth.search([ diff --git a/trytond/tests/__init__.py b/trytond/tests/__init__.py index 17a5ca191d..724f09300e 100644 --- a/trytond/tests/__init__.py +++ b/trytond/tests/__init__.py @@ -139,6 +139,7 @@ def register(): ModelViewChangedValuesTarget, ModelViewButton, ModelViewRPC, + ModelViewEmptyPage, MPTT, ImportDataBoolean, ImportDataInteger, diff --git a/trytond/tests/modelview.py b/trytond/tests/modelview.py index b7c53d70be..1f28fcc561 100644 --- a/trytond/tests/modelview.py +++ b/trytond/tests/modelview.py @@ -10,6 +10,7 @@ __all__ = [ 'ModelViewChangedValuesTarget', 'ModelViewButton', 'ModelViewRPC', + 'ModelViewEmptyPage', ] @@ -106,3 +107,8 @@ class ModelViewRPC(ModelView): @classmethod def get_function_reference(cls): pass + + +class ModelViewEmptyPage(ModelView): + 'ModelView Empty Page' + __name__ = 'test.modelview.empty_page' diff --git a/trytond/tests/modelview.xml b/trytond/tests/modelview.xml new file mode 100644 index 0000000000..3d165f279a --- /dev/null +++ b/trytond/tests/modelview.xml @@ -0,0 +1,19 @@ + + + + test.modelview.empty_page + form + + + + + diff --git a/trytond/tests/test_modelview.py b/trytond/tests/test_modelview.py index 4a7ac0a115..a108da9845 100644 --- a/trytond/tests/test_modelview.py +++ b/trytond/tests/test_modelview.py @@ -3,6 +3,7 @@ import unittest from mock import patch +from lxml import etree from trytond.tests.test_tryton import activate_module, with_transaction from trytond.pool import Pool @@ -297,6 +298,19 @@ class ModelView(unittest.TestCase): self.assertIn(rpc_name, TestModel.__rpc__) check_rpc(TestModel.__rpc__[rpc_name], rpc_attrs) + @with_transaction() + def test_remove_empty_page(self): + "Testing the removal of empty pages" + pool = Pool() + EmptyPage = pool.get('test.modelview.empty_page') + + arch = EmptyPage.fields_view_get(view_type='form')['arch'] + parser = etree.XMLParser() + tree = etree.fromstring(arch, parser=parser) + pages = tree.xpath('//page') + self.assertEqual(len(pages), 1) + self.assertEqual(pages[0].attrib['id'], 'non-empty') + def suite(): func = unittest.TestLoader().loadTestsFromTestCase diff --git a/trytond/tests/tryton.cfg b/trytond/tests/tryton.cfg index 6bb32ecae3..56e40e7099 100644 --- a/trytond/tests/tryton.cfg +++ b/trytond/tests/tryton.cfg @@ -7,3 +7,4 @@ xml: sequence.xml workflow.xml wizard.xml + modelview.xml