From 911369822abb9779193137301326e61242b9daa7 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 11 Apr 2011 13:14:51 +0200 Subject: [PATCH] [ADD] processing of context['set_editable'] on list view bzr revid: xmo@openerp.com-20110411111451-5j6ve9f1wjiuzjfx --- addons/base/controllers/main.py | 49 +++++++++++++++++++++++++++++++ addons/base/static/src/js/list.js | 11 ++++++- addons/base/test/test_view.py | 27 +++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index a8dc58625fa..36e9b0feaee 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import glob, os +import pprint from xml.etree import ElementTree from cStringIO import StringIO @@ -522,6 +523,54 @@ class ListView(View): fields_view = self.fields_view_get(req, model, view_id, 'tree', toolbar=toolbar) return {'fields_view': fields_view} + def fields_view_get(self, request, model, view_id, view_type="tree", + transform=True, toolbar=False, submenu=False): + """ Sets @editable on the view's arch if it isn't already set and + ``set_editable`` is present in the request context + """ + view = super(ListView, self).fields_view_get( + request, model, view_id, view_type, transform, toolbar, submenu) + + view_attributes = view['arch']['attrs'] + if request.context.get('set_editable')\ + and 'editable' not in view_attributes: + view_attributes['editable'] = 'bottom' + return view + + @openerpweb.jsonrequest + def fill(self, request, model, id, domain, + offset=0, limit=False): + return self.do_fill(request, model, id, domain, offset, limit) + + def do_fill(self, request, model, id, domain, + offset=0, limit=False): + """ Returns all information needed to fill a table: + + * view with processed ``editable`` flag + * fields (columns) with processed ``invisible`` flag + * rows with processed ``attrs`` and ``colors`` + + .. note:: context is passed through ``request`` parameter + + :param request: OpenERP request + :type request: openerpweb.openerpweb.JsonRequest + :type str model: OpenERP model for this list view + :type int id: view_id, or False if none provided + :param list domain: the search domain to search for + :param int offset: search offset, for pagination + :param int limit: search limit, for pagination + :returns: hell if I have any idea yet + """ + view = self.fields_view_get(request, model, id) + + rows = DataSet().do_search_read(request, model, + offset=offset, limit=limit, + domain=domain) + # rows pipe + # process_attrs + # process_colors + return rows + class SearchView(View): _cp_path = "/base/searchview" diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 4fc3ef07720..247b2d535d9 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -160,7 +160,16 @@ openerp.base.ListView = openerp.base.Controller.extend( // TODO: handle non-empty results.group_by with read_group self.dataset.context = results.context; self.dataset.domain = results.domain; - self.dataset.read_slice(self.dataset.fields, 0, self.limit, self.do_fill_table); + // TODO: need to do 5 billion tons of pre-processing, bypass + // DataSet for now + //self.dataset.read_slice(self.dataset.fields, 0, self.limit, + // self.do_fill_table); + self.rpc('/base/listview/fill', { + 'model': self.dataset.model, + 'id': self.view_id, + 'context': results.context, + 'domain': results.domain + }, self.do_fill_table); }); }, do_update: function () { diff --git a/addons/base/test/test_view.py b/addons/base/test/test_view.py index d8f65ccff99..141bbd5e0db 100644 --- a/addons/base/test/test_view.py +++ b/addons/base/test/test_view.py @@ -178,3 +178,30 @@ class AttrsNormalizationTest(unittest2.TestCase): field_attrs(parsed_view, 'date_deadline')['invisible']) self.assertTrue(field_attrs(parsed_view, 'type_id')['invisible']) +class ListViewTest(unittest2.TestCase): + def setUp(self): + self.view = base.controllers.main.ListView() + self.request = mock.Mock() + self.request.context = {'set_editable': True} + def test_no_editable_editable_context(self): + self.request.session.model('fake').fields_view_get.return_value = \ + {'arch': ''} + view = self.view.fields_view_get(self.request, 'fake', False) + + self.assertEqual(view['arch']['attrs']['editable'], + 'bottom') + def test_editable_top_editable_context(self): + self.request.session.model('fake').fields_view_get.return_value = \ + {'arch': ''} + view = self.view.fields_view_get(self.request, 'fake', False) + + self.assertEqual(view['arch']['attrs']['editable'], + 'top') + + def test_editable_bottom_editable_context(self): + self.request.session.model('fake').fields_view_get.return_value = \ + {'arch': ''} + view = self.view.fields_view_get(self.request, 'fake', False) + + self.assertEqual(view['arch']['attrs']['editable'], + 'bottom')