diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 28806083d61..a8dc58625fa 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -403,16 +403,20 @@ class DataSet(openerpweb.Controller): return {'result': r} class View(openerpweb.Controller): - def fields_view_get(self, session, model, view_id, view_type, transform=True, toolbar=False, submenu=False): - Model = session.model(model) - r = Model.fields_view_get(view_id, view_type, {}, toolbar, submenu) + def fields_view_get(self, request, model, view_id, view_type, + transform=True, toolbar=False, submenu=False): + Model = request.session.model(model) + fvg = Model.fields_view_get(view_id, view_type, request.context, + toolbar, submenu) if transform: - context = {} # TODO: dict(ctx_sesssion, **ctx_action) - xml = self.transform_view(r['arch'], session, context) + evaluation_context = request.session.evaluation_context( + request.context or {}) + xml = self.transform_view( + fvg['arch'], request.session, evaluation_context) else: - xml = ElementTree.fromstring(r['arch']) - r['arch'] = Xml2Json.convert_element(xml) - return r + xml = ElementTree.fromstring(fvg['arch']) + fvg['arch'] = Xml2Json.convert_element(xml) + return fvg def normalize_attrs(self, elem, context): """ Normalize @attrs, @invisible, @required, @readonly and @states, so @@ -507,7 +511,7 @@ class FormView(View): @openerpweb.jsonrequest def load(self, req, model, view_id, toolbar=False): - fields_view = self.fields_view_get(req.session, model, view_id, 'form', toolbar=toolbar) + fields_view = self.fields_view_get(req, model, view_id, 'form', toolbar=toolbar) return {'fields_view': fields_view} class ListView(View): @@ -515,7 +519,7 @@ class ListView(View): @openerpweb.jsonrequest def load(self, req, model, view_id, toolbar=False): - fields_view = self.fields_view_get(req.session, model, view_id, 'tree', toolbar=toolbar) + fields_view = self.fields_view_get(req, model, view_id, 'tree', toolbar=toolbar) return {'fields_view': fields_view} class SearchView(View): @@ -523,7 +527,7 @@ class SearchView(View): @openerpweb.jsonrequest def load(self, req, model, view_id): - fields_view = self.fields_view_get(req.session, model, view_id, 'search') + fields_view = self.fields_view_get(req, model, view_id, 'search') return {'fields_view': fields_view} class Action(openerpweb.Controller): diff --git a/addons/base/test/test_view.py b/addons/base/test/test_view.py index f20f9e12f61..d8f65ccff99 100644 --- a/addons/base/test/test_view.py +++ b/addons/base/test/test_view.py @@ -1,3 +1,4 @@ +import copy import xml.etree.ElementTree import mock @@ -8,6 +9,11 @@ import base.controllers.main import openerpweb.nonliterals import openerpweb.openerpweb +def field_attrs(fields_view_get, fieldname): + (field,) = filter(lambda f: f['attrs'].get('name') == fieldname, + fields_view_get['arch']['children']) + return field['attrs'] + #noinspection PyCompatibility class DomainsAndContextsTest(unittest2.TestCase): def setUp(self): @@ -130,3 +136,45 @@ class AttrsNormalizationTest(unittest2.TestCase): self.assertEqual( simplejson.loads(element.get('attrs')), {'invisible': [['state', 'not in', ['open', 'closed']]]}) + + def test_transform_invisible(self): + element = xml.etree.ElementTree.Element( + 'field', invisible="context.get('invisible_country', False)") + + empty_context = copy.deepcopy(element) + self.view.normalize_attrs(empty_context, {}) + self.assertEqual(empty_context.get('invisible'), None) + + full_context = copy.deepcopy(element) + self.view.normalize_attrs(full_context, {'invisible_country': True}) + self.assertEqual(full_context.get('invisible'), '1') + + def test_transform_invisible_list_column(self): + req = mock.Mock() + req.context = {'set_editable':True, 'set_visible':True, + 'gtd_visible':True, 'user_invisible':True} + req.session.evaluation_context = \ + openerpweb.openerpweb.OpenERPSession().evaluation_context + req.session.model('project.task').fields_view_get.return_value = { + 'arch': ''' + + + + + + + + + '''} + parsed_view = base.controllers.main.View().fields_view_get( + req, 'project.task', 42, 'tree') + + self.assertTrue(field_attrs(parsed_view, 'sequence')['invisible']) + self.assertTrue(field_attrs(parsed_view, 'user_id')['invisible']) + self.assertTrue( + field_attrs(parsed_view, 'delegated_user_id')['invisible']) + self.assertTrue(field_attrs(parsed_view, 'total_hours')['invisible']) + self.assertTrue( + field_attrs(parsed_view, 'date_deadline')['invisible']) + self.assertTrue(field_attrs(parsed_view, 'type_id')['invisible']) + diff --git a/addons/base_calendar/controllers/main.py b/addons/base_calendar/controllers/main.py index 41081bc7cae..a54d75c5b9b 100644 --- a/addons/base_calendar/controllers/main.py +++ b/addons/base_calendar/controllers/main.py @@ -57,7 +57,7 @@ class CalendarView(View): @openerpweb.jsonrequest def load(self, req, model, view_id): - fields_view = self.fields_view_get(req.session, model, view_id, 'calendar') + fields_view = self.fields_view_get(req, model, view_id, 'calendar') return {'fields_view':fields_view} def convert(self, event): @@ -354,4 +354,3 @@ class CalendarView(View): title = title.strip() description = ', '.join(description).strip() return {'id': event['id'], 'start_date': str(DT.datetime(*starts[:6])), 'end_date': str(DT.datetime(*ends[:6])), 'text': title, 'title': description, 'color': self.colors[event[self.color_field]][-1]} - \ No newline at end of file