diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index 7a9db5f50be..2b1a3ff9378 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -44,6 +44,7 @@
import calendar
import copy
import datetime
+import itertools
import logging
import operator
import pickle
@@ -1727,13 +1728,69 @@ class BaseModel(object):
raise except_orm('View error', msg)
return arch, fields
- def __get_default_calendar_view(self):
- """Generate a default calendar view (For internal use only).
- """
- # TODO could return an etree instead of a string
+ def _get_default_form_view(self, cr, user, context=None):
+ """ Generates a default single-line form view using all fields
+ of the current model except the m2m and o2m ones.
- arch = ('\n'
- '\n'
- ' \n'
- '') % (self._rec_name)
-
- return arch
-
- def __get_default_search_view(self, cr, uid, context=None):
+ def _get_default_search_view(self, cr, uid, context=None):
+ """
+ :param cr: database cursor
+ :param int user: user id
+ :param dict context: connection context
+ :returns: an lxml document of the view
+ :rtype: etree._Element
+ """
form_view = self.fields_view_get(cr, uid, False, 'form', context=context)
tree_view = self.fields_view_get(cr, uid, False, 'tree', context=context)
- fields_to_search = set()
# TODO it seems _all_columns could be used instead of fields_get (no need for translated fields info)
fields = self.fields_get(cr, uid, context=context)
- for field in fields:
- if fields[field].get('select'):
- fields_to_search.add(field)
+ fields_to_search = set(
+ field for field, descriptor in fields.iteritems()
+ if descriptor.get('select'))
+
for view in (form_view, tree_view):
view_root = etree.fromstring(view['arch'])
# Only care about select=1 in xpath below, because select=2 is covered
# by the custom advanced search in clients
- fields_to_search = fields_to_search.union(view_root.xpath("//field[@select=1]/@name"))
+ fields_to_search.update(view_root.xpath("//field[@select=1]/@name"))
tree_view_root = view_root # as provided by loop above
- search_view = etree.Element("search", attrib={'string': tree_view_root.get("string", "")})
- field_group = etree.Element("group")
- search_view.append(field_group)
+ search_view = etree.Element("search", string=tree_view_root.get("string", ""))
+ field_group = etree.SubElement(search_view, "group")
for field_name in fields_to_search:
- field_group.append(etree.Element("field", attrib={'name': field_name}))
+ etree.SubElement(field_group, "field", name=field_name)
- #TODO tostring can be removed as fromstring is call directly after...
- return etree.tostring(search_view, encoding="utf-8").replace('\t', '')
+ return search_view
#
# if view_id, view_type is not required
@@ -1990,50 +2038,27 @@ class BaseModel(object):
# if a view was found
if sql_res:
- result['type'] = sql_res['type']
- result['view_id'] = sql_res['id']
-
source = etree.fromstring(encode(sql_res['arch']))
- result['arch'] = apply_view_inheritance(cr, user, source, result['view_id'])
-
- result['name'] = sql_res['name']
- result['field_parent'] = sql_res['field_parent'] or False
+ result.update(
+ arch=apply_view_inheritance(cr, user, source, sql_res['id']),
+ type=sql_res['type'],
+ view_id=sql_res['id'],
+ name=sql_res['name'],
+ field_parent=sql_res['field_parent'] or False)
else:
-
# otherwise, build some kind of default view
- if view_type == 'form':
- # TODO it seems fields_get can be replaced by _all_columns (no need for translation)
- res = self.fields_get(cr, user, context=context)
- xml = ' ' \
- '
"
-
- elif view_type == 'tree':
- _rec_name = self._rec_name
- if _rec_name not in self._columns:
- _rec_name = self._columns.keys()[0]
- xml = '' \
- '' \
- % (self._description, _rec_name)
-
- elif view_type == 'calendar':
- xml = self.__get_default_calendar_view()
-
- elif view_type == 'search':
- xml = self.__get_default_search_view(cr, user, context)
-
- else:
+ try:
+ view = getattr(self, '_get_default_%s_view' % view_type)(
+ cr, user, context)
+ except AttributeError:
# what happens here, graph case?
raise except_orm(_('Invalid Architecture!'), _("There is no view of type '%s' defined for the structure!") % view_type)
- result['arch'] = etree.fromstring(encode(xml))
- result['name'] = 'default'
- result['field_parent'] = False
- result['view_id'] = 0
+
+ result.update(
+ arch=view,
+ name='default',
+ field_parent=False,
+ view_id=0)
if parent_view_model != self._name:
ctx = context.copy()
@@ -2064,14 +2089,13 @@ class BaseModel(object):
resrelate = ir_values_obj.get(cr, user, 'action',
'client_action_relate', [(self._name, False)], False,
context)
- resprint = map(clean, resprint)
- resaction = map(clean, resaction)
- if view_type != 'tree':
- resaction = filter(lambda x: not x.get('multi'), resaction)
- resprint = filter(lambda x: not x.get('multi'), resprint)
+ resaction = [clean(action) for action in resaction
+ if view_type == 'tree' or not action[2].get('multi')]
+ resprint = [clean(print_) for print_ in resprint
+ if view_type == 'tree' or not print_[2].get('multi')]
resrelate = map(lambda x: x[2], resrelate)
- for x in resprint + resaction + resrelate:
+ for x in itertools.chain(resprint, resaction, resrelate):
x['string'] = x['name']
result['toolbar'] = {