From 6f9dcfdb9b24bd7284abb5c91f91fb97fc56015f Mon Sep 17 00:00:00 2001 From: Ronald Portier Date: Tue, 4 Apr 2017 13:17:48 +0200 Subject: [PATCH 1/5] [ADD] Add list_add operation to base_view_inheritance_extension. --- base_view_inheritance_extension/README.rst | 1 + .../models/ir_ui_view.py | 18 ++++++++++++++ .../test_base_view_inheritance_extension.py | 24 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/base_view_inheritance_extension/README.rst b/base_view_inheritance_extension/README.rst index e0186c4bb33..9288bca4505 100644 --- a/base_view_inheritance_extension/README.rst +++ b/base_view_inheritance_extension/README.rst @@ -64,6 +64,7 @@ Contributors ------------ * Holger Brunn +* Ronald Portier Do not contact contributors directly about help with questions or problems concerning this addon, but use the `community mailing list `_ or the `appropriate specialized mailinglist `_ for help, and the bug tracker linked in `Bug Tracker`_ above for technical issues. diff --git a/base_view_inheritance_extension/models/ir_ui_view.py b/base_view_inheritance_extension/models/ir_ui_view.py index 75222007994..76938c4fdf3 100644 --- a/base_view_inheritance_extension/models/ir_ui_view.py +++ b/base_view_inheritance_extension/models/ir_ui_view.py @@ -122,3 +122,21 @@ def inheritance_handler_xpath(self, source, specs, inherit_id): ) target_node.append(node) return source + + @api.model + def inheritance_handler_attributes_list_add( + self, source, specs, inherit_id + ): + """Implement + <$node position="attributes"> + + $new_value + + """ + node = self.locate_node(source, specs) + for attribute_node in specs: + attribute_name = attribute_node.get('name') + old_value = node.get(attribute_name) or '' + new_value = old_value + ',' + attribute_node.text + node.attrib[attribute_name] = new_value + return source diff --git a/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py b/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py index 2429b4f6fd4..eca091754e5 100644 --- a/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py +++ b/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py @@ -6,6 +6,7 @@ class TestBaseViewInheritanceExtension(TransactionCase): + def test_base_view_inheritance_extension(self): view_id = self.env.ref('base.view_partner_form').id fields_view_get = self.env['res.partner'].fields_view_get( @@ -28,3 +29,26 @@ def test_base_view_inheritance_extension(self): view.xpath('//field[@name="child_ids"]')[0].getparent(), view.xpath('//page[@name="my_new_page"]')[0] ) + + def test_list_operations(self): + view_model = self.env['ir.ui.view'] + inherit_id = self.env.ref('base.view_partner_form').id + source = etree.fromstring( + """
+ """ + ) + modified_source = view_model.inheritance_handler_attributes_list_add( + source, specs, inherit_id + ) + button_node = modified_source.xpath('//button[@name="test"]')[0] + # verify list was extended + self.assertEqual(button_node.attrib['states'], 'draft,open,valid') From 86a136ec8f3ad8d3e5bd061cbb592f103acdb51e Mon Sep 17 00:00:00 2001 From: Ronald Portier Date: Tue, 4 Apr 2017 14:21:47 +0200 Subject: [PATCH 2/5] [ADD] Add list_remove operation to base_view_inheritance_extension. Also test list_add with multiple new values. --- .../models/ir_ui_view.py | 23 +++++++++- .../test_base_view_inheritance_extension.py | 45 ++++++++++++++++++- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/base_view_inheritance_extension/models/ir_ui_view.py b/base_view_inheritance_extension/models/ir_ui_view.py index 76938c4fdf3..ec9f223b221 100644 --- a/base_view_inheritance_extension/models/ir_ui_view.py +++ b/base_view_inheritance_extension/models/ir_ui_view.py @@ -138,5 +138,26 @@ def inheritance_handler_attributes_list_add( attribute_name = attribute_node.get('name') old_value = node.get(attribute_name) or '' new_value = old_value + ',' + attribute_node.text - node.attrib[attribute_name] = new_value + node.attrib[attribute_name] = ','.join(filter( + None, old_value.split(',') + attribute_node.text.split(',')) + ) + return source + + @api.model + def inheritance_handler_attributes_list_remove( + self, source, specs, inherit_id + ): + """Implement + <$node position="attributes"> + + $value_to_remove + + """ + node = self.locate_node(source, specs) + for attribute_node in specs: + attribute_name = attribute_node.get('name') + old_values = (node.get(attribute_name) or '').split(',') + remove_values = attribute_node.text.split(',') + new_values = [x for x in old_values if x not in remove_values] + node.attrib[attribute_name] = ','.join(filter(None, new_values)) return source diff --git a/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py b/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py index eca091754e5..9cb0998e466 100644 --- a/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py +++ b/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py @@ -36,6 +36,7 @@ def test_list_operations(self): source = etree.fromstring( """
+ """ + ) + modified_source = view_model.inheritance_handler_attributes_list_add( + source, specs, inherit_id + ) + button_node = modified_source.xpath('//button[@name="test"]')[0] + self.assertEqual( + button_node.attrib['states'], + 'draft,open,valid,payable,paid' + ) + # remove list of values + specs = etree.fromstring( + """\ + + """ + ) + modified_source = view_model.inheritance_handler_attributes_list_add( + source, specs, inherit_id + ) + button_node = modified_source.xpath('//button[@name="test"]')[0] + self.assertEqual( + button_node.attrib['states'], + 'draft,valid,paid' + ) From f958abb25e7449367b6cee0f2401cb3ec3f9de97 Mon Sep 17 00:00:00 2001 From: Ronald Portier Date: Tue, 4 Apr 2017 14:27:33 +0200 Subject: [PATCH 3/5] [ADD] Update README.rst of base_view_inheritance_extension. --- base_view_inheritance_extension/README.rst | 39 ++++++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/base_view_inheritance_extension/README.rst b/base_view_inheritance_extension/README.rst index 9288bca4505..88b4b7a3f39 100644 --- a/base_view_inheritance_extension/README.rst +++ b/base_view_inheritance_extension/README.rst @@ -6,7 +6,8 @@ Extended view inheritance ========================= -This module was written to make it simple to add custom operators for view inheritance. +This module was written to make it simple to add custom operators for view +inheritance. Usage ===== @@ -24,7 +25,8 @@ Change a python dictionary (context for example) $new_value -Note that views are subject to evaluation of xmlids anyways, so if you need to refer to some xmlid, say ``%(xmlid)s``. +Note that views are subject to evaluation of xmlids anyways, so if you need +to refer to some xmlid, say ``%(xmlid)s``. Move an element in the view --------------------------- @@ -33,13 +35,30 @@ Move an element in the view -This can also be used to wrap some element into another, create the target element first, then move the node youwant to wrap there. +This can also be used to wrap some element into another, create the target +element first, then move the node youwant to wrap there. + +Add to values in a list (states for example) +-------------------------------------------- + +.. code-block:: xml + + + $new_value(s) + + +Remove values from a list (states for example) +---------------------------------------------- + +.. code-block:: xml + + + $remove_value(s) + Known issues / Roadmap ====================== -* add ``$value`` -* add ``$index`` * add ``$value`` * support ```` * support an ``eval`` attribute for our new node types @@ -58,7 +77,8 @@ Credits Images ------ -* Odoo Community Association: `Icon `_. +* Odoo Community Association: + `Icon `_. Contributors ------------ @@ -66,7 +86,12 @@ Contributors * Holger Brunn * Ronald Portier -Do not contact contributors directly about help with questions or problems concerning this addon, but use the `community mailing list `_ or the `appropriate specialized mailinglist `_ for help, and the bug tracker linked in `Bug Tracker`_ above for technical issues. +Do not contact contributors directly about help with questions or problems +concerning this addon, but use the +`community mailing list `_ or the +`appropriate specialized mailinglist `_ +for help, and the bug tracker linked in `Bug Tracker`_ above for +technical issues. Maintainer ---------- From 91db038e86c05bda41f195192fcc3f89e3229645 Mon Sep 17 00:00:00 2001 From: Ronald Portier Date: Tue, 4 Apr 2017 14:40:11 +0200 Subject: [PATCH 4/5] [FIX] Repair list_add operation to base_view_inheritance_extension. --- base_view_inheritance_extension/models/ir_ui_view.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/base_view_inheritance_extension/models/ir_ui_view.py b/base_view_inheritance_extension/models/ir_ui_view.py index ec9f223b221..a32baee9d2c 100644 --- a/base_view_inheritance_extension/models/ir_ui_view.py +++ b/base_view_inheritance_extension/models/ir_ui_view.py @@ -138,9 +138,7 @@ def inheritance_handler_attributes_list_add( attribute_name = attribute_node.get('name') old_value = node.get(attribute_name) or '' new_value = old_value + ',' + attribute_node.text - node.attrib[attribute_name] = ','.join(filter( - None, old_value.split(',') + attribute_node.text.split(',')) - ) + node.attrib[attribute_name] = new_value return source @api.model From 165be872bca4393d16aaa407f4dd247c99f20009 Mon Sep 17 00:00:00 2001 From: Ronald Portier Date: Tue, 4 Apr 2017 15:24:04 +0200 Subject: [PATCH 5/5] [FIX] Repair tests for base_view_inheritance_extension. --- .../test_base_view_inheritance_extension.py | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py b/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py index 9cb0998e466..af1e2c6ba42 100644 --- a/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py +++ b/base_view_inheritance_extension/tests/test_base_view_inheritance_extension.py @@ -30,11 +30,15 @@ def test_base_view_inheritance_extension(self): view.xpath('//page[@name="my_new_page"]')[0] ) - def test_list_operations(self): + def test_list_add(self): view_model = self.env['ir.ui.view'] inherit_id = self.env.ref('base.view_partner_form').id source = etree.fromstring( - """
""" ) - modified_source = view_model.inheritance_handler_attributes_list_add( - source, specs, inherit_id - ) + modified_source = \ + view_model.inheritance_handler_attributes_list_add( + source, specs, inherit_id + ) button_node = modified_source.xpath('//button[@name="test"]')[0] self.assertEqual( button_node.attrib['states'], @@ -66,14 +71,26 @@ def test_list_operations(self): """ ) - modified_source = view_model.inheritance_handler_attributes_list_add( - source, specs, inherit_id - ) + modified_source = \ + view_model.inheritance_handler_attributes_list_add( + source, specs, inherit_id + ) button_node = modified_source.xpath('//button[@name="test"]')[0] self.assertEqual( button_node.attrib['states'], 'draft,open,valid,payable,paid' ) + + def test_list_remove(self): + view_model = self.env['ir.ui.view'] + inherit_id = self.env.ref('base.view_partner_form').id + source = etree.fromstring( + """\ +
+
""" ) - modified_source = view_model.inheritance_handler_attributes_list_add( - source, specs, inherit_id - ) + modified_source = \ + view_model.inheritance_handler_attributes_list_remove( + source, specs, inherit_id + ) button_node = modified_source.xpath('//button[@name="test"]')[0] self.assertEqual( button_node.attrib['states'],