diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 96577bb104a..05da0efa5ae 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -399,12 +399,13 @@
res.partner
+
diff --git a/openerp/fields.py b/openerp/fields.py
index 0c1f058ca91..94eb790ef73 100644
--- a/openerp/fields.py
+++ b/openerp/fields.py
@@ -658,7 +658,7 @@ class Field(object):
self.column = fields.property(**args)
elif self.column:
# let the column provide a valid column for the given parameters
- self.column = self.column.new(**args)
+ self.column = self.column.new(_computed_field=bool(self.compute), **args)
else:
# create a fresh new column of the right type
self.column = getattr(fields, self.type)(**args)
@@ -677,7 +677,6 @@ class Field(object):
_column_groups = property(attrgetter('groups'))
_column_change_default = property(attrgetter('change_default'))
_column_deprecated = property(attrgetter('deprecated'))
- _column_compute = property(lambda self: bool(self.compute))
############################################################################
#
diff --git a/openerp/models.py b/openerp/models.py
index cff7e390251..8d2aff9df3a 100644
--- a/openerp/models.py
+++ b/openerp/models.py
@@ -64,7 +64,7 @@ from .api import Environment
from .exceptions import AccessError, MissingError, ValidationError, UserError
from .osv import fields
from .osv.query import Query
-from .tools import lazy_property, ormcache
+from .tools import frozendict, lazy_property, ormcache
from .tools.config import config
from .tools.misc import CountingStream, DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
from .tools.safe_eval import safe_eval as eval
@@ -633,6 +633,7 @@ class BaseModel(object):
'_register': False,
'_columns': None, # recomputed in _setup_fields()
'_defaults': None, # recomputed in _setup_base()
+ '_fields': frozendict(), # idem
'_inherits': dict(cls._inherits),
'_depends': dict(cls._depends),
'_constraints': list(cls._constraints),
diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py
index c8a961c68f5..2924f0f4db4 100644
--- a/openerp/osv/fields.py
+++ b/openerp/osv/fields.py
@@ -115,6 +115,7 @@ class _column(object):
"""
args0 = {
'string': string,
+ 'help': args.pop('help', None),
'required': required,
'readonly': readonly,
'_domain': domain,
@@ -127,6 +128,9 @@ class _column(object):
'translate': translate,
'select': select,
'manual': manual,
+ 'group_operator': args.pop('group_operator', None),
+ 'groups': args.pop('groups', None),
+ 'deprecated': args.pop('deprecated', None),
}
for key, val in args0.iteritems():
if val:
@@ -140,30 +144,23 @@ class _column(object):
if not self._classic_write or self.deprecated or self.manual:
self._prefetch = False
- def new(self, **args):
- """ return a column like `self` with the given parameters """
+ def new(self, _computed_field=False, **args):
+ """ Return a column like `self` with the given parameters; the parameter
+ `_computed_field` tells whether the corresponding field is computed.
+ """
# memory optimization: reuse self whenever possible; you can reduce the
# average memory usage per registry by 10 megabytes!
- return self if self.same_parameters(args) else type(self)(**args)
-
- def same_parameters(self, args):
- dummy = object()
- return all(
- # either both are falsy, or they are equal
- (not val1 and not val) or (val1 == val)
- for key, val in args.iteritems()
- for val1 in [getattr(self, key, getattr(self, '_' + key, dummy))]
- )
+ column = type(self)(**args)
+ return self if self.to_field_args() == column.to_field_args() else column
def to_field(self):
""" convert column `self` to a new-style field """
from openerp.fields import Field
- return Field.by_type[self._type](**self.to_field_args())
+ return Field.by_type[self._type](column=self, **self.to_field_args())
def to_field_args(self):
""" return a dictionary with all the arguments to pass to the field """
base_items = [
- ('column', self), # field interfaces self
('copy', self.copy),
]
truthy_items = filter(itemgetter(1), [
@@ -349,7 +346,7 @@ class float(_column):
# synopsis: digits_compute(cr) -> (precision, scale)
self.digits_compute = digits_compute
- def new(self, **args):
+ def new(self, _computed_field=False, **args):
# float columns are database-dependent, so always recreate them
return type(self)(**args)
@@ -1292,9 +1289,9 @@ class function(_column):
self._symbol_f = type_class._symbol_f
self._symbol_set = type_class._symbol_set
- def new(self, **args):
- if args.get('compute'):
- # field is computed, we need an instance of the given type
+ def new(self, _computed_field=False, **args):
+ if _computed_field:
+ # field is computed, we need an instance of a non-function column
type_class = globals()[self._type]
return type_class(**args)
else: