[IMP] add a bunch of tests for transformation of invisible fields, make View.fields_view_get take a request so it can use the request context for its evaluations

bzr revid: xmo@openerp.com-20110411103118-msx5plh2lnz5obps
This commit is contained in:
Xavier Morel 2011-04-11 12:31:18 +02:00
parent d99bacbd60
commit 3412b89d95
3 changed files with 64 additions and 13 deletions

View File

@ -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):

View File

@ -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': '''
<tree colors="grey:state in ('cancelled','done');blue:state == 'pending';red:date_deadline and (date_deadline&lt;current_date) and (state in ('draft','pending','open'))" string="Tasks">
<field name="sequence" invisible="not context.get('seq_visible', False)"/>
<field name="user_id" invisible="context.get('user_invisible', False)"/>
<field name="delegated_user_id" invisible="context.get('show_delegated', True)"/>
<field name="total_hours" invisible="1"/>
<field name="date_deadline" invisible="context.get('deadline_visible',True)"/>
<field name="type_id" invisible="context.get('set_visible',False)"/>
</tree>
'''}
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'])

View File

@ -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]}