From baf8d2d9a9b46c2216bf90bec48d68efb19d9acb Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 31 Mar 2011 17:25:31 +0200 Subject: [PATCH] [IMP] server behavior fix: split tree view mode into tree and list based on view_type, nuke view_type bzr revid: xmo@openerp.com-20110331152531-cpff6js0k8v4dtk9 --- addons/base/controllers/main.py | 30 +++++++++++++++++ addons/base/static/src/js/list.js | 2 +- addons/base/static/src/js/views.js | 8 +++++ addons/base/test/test_menu.py | 52 ++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 1 deletion(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 40d1c7f5823..6e99aed0c36 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -230,8 +230,38 @@ class Menu(openerpweb.Controller): req.session.evaluation_context( action['context'])) or [] + self.fix_view_modes(action) + return {"action": actions} + def fix_view_modes(self, action): + """ For historical reasons, OpenERP has weird dealings in relation to + view_mode and the view_type attribute (on window actions): + + * one of the view modes is ``tree``, which stands for both list views + and tree views + * the choice is made by checking ``view_type``, which is either + ``form`` for a list view or ``tree`` for an actual tree view + + This methods simply folds the view_type into view_mode by adding a + new view mode ``list`` which is the result of the ``tree`` view_mode + in conjunction with the ``form`` view_type. + + TODO: this should go into the doc, some kind of "peculiarities" section + + :param dict action: an action descriptor + :returns: nothing, the action is modified in place + """ + if action.pop('view_type') != 'form': + return + + action['view_mode'] = ','.join( + mode if mode != 'tree' else 'list' + for mode in action['view_mode'].split(',')) + action['views'] = [ + [id, mode if mode != 'tree' else 'list'] + for id, mode in action['views'] + ] class DataSet(openerpweb.Controller): _cp_path = "/base/dataset" diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 986470e0f0b..2f82f9b50ed 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1,7 +1,7 @@ openerp.base.list = function (openerp) { -openerp.base.views.add('tree', 'openerp.base.ListView'); +openerp.base.views.add('list', 'openerp.base.ListView'); openerp.base.ListView = openerp.base.Controller.extend({ init: function(session, element_id, dataset, view_id) { this._super(session, element_id); diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 55e99d9fef9..a66bf3ab4e9 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -250,6 +250,14 @@ openerp.base.GanttView = openerp.base.Controller.extend({ // Dhtmlx gantt ? }); +openerp.base.views.add('tree', 'openerp.base.TreeView'); +/** + * Genuine tree view (the one displayed as a tree, not the list) + */ +openerp.base.TreeView = openerp.base.Controller.extend({ + +}); + openerp.base.DiagramView = openerp.base.Controller.extend({ // }); diff --git a/addons/base/test/test_menu.py b/addons/base/test/test_menu.py index c63b19591aa..8f2c5bc42fc 100644 --- a/addons/base/test/test_menu.py +++ b/addons/base/test/test_menu.py @@ -97,3 +97,55 @@ class LoadTest(unittest2.TestCase): }] }] ) + +class ActionMungerTest(unittest2.TestCase): + def setUp(self): + self.menu = base.controllers.main.Menu() + def test_actual_treeview(self): + action = { + "views": [[False, "tree"], [False, "form"], + [False, "calendar"]], + "view_type": "tree", + "view_id": False, + "view_mode": "tree,form,calendar" + } + changed = action.copy() + del action['view_type'] + self.menu.fix_view_modes(changed) + + self.assertEqual(changed, action) + + def test_list_view(self): + action = { + "views": [[False, "tree"], [False, "form"], + [False, "calendar"]], + "view_type": "form", + "view_id": False, + "view_mode": "tree,form,calendar" + } + self.menu.fix_view_modes(action) + + self.assertEqual(action, { + "views": [[False, "list"], [False, "form"], + [False, "calendar"]], + "view_id": False, + "view_mode": "list,form,calendar" + }) + + def test_redundant_views(self): + + action = { + "views": [[False, "tree"], [False, "form"], + [False, "calendar"], [42, "tree"]], + "view_type": "form", + "view_id": False, + "view_mode": "tree,form,calendar" + } + self.menu.fix_view_modes(action) + + self.assertEqual(action, { + "views": [[False, "list"], [False, "form"], + [False, "calendar"], [42, "list"]], + "view_id": False, + "view_mode": "list,form,calendar" + })