From 616e7a92ec39b9223f803f8f0635fdcb0286ad8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 9 Aug 2012 10:31:03 +0200 Subject: [PATCH 1/5] [IMP] orm: added a deprecated attribute on fields. If not False, is a string, and make the ORM print a warning telling the field is deprecated. Use: 'my_field': fields.char('Old field', size=64, deprecated="This field will be removed as of version 42 of OpenERP. Please update your module to use 'my_new_field' instead.") bzr revid: tde@openerp.com-20120809083103-pjc9ynvmtojnfnah --- openerp/osv/fields.py | 1 + openerp/osv/orm.py | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 4ff23956050..7717c1fbf51 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -109,6 +109,7 @@ class _column(object): self.selectable = True self.group_operator = args.get('group_operator', False) self.groups = False # CSV list of ext IDs of groups that can access this field + self.deprecated = False # Optional deprecation warning for a in args: if args[a]: setattr(self, a, args[a]) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index d8861a20c26..b47c419d0d4 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -3598,6 +3598,13 @@ class BaseModel(object): record[f] = res2[record['id']] else: record[f] = [] + + # Warn about deprecated fields now that fields_pre and fields_post are computed + for f in fields_pre + fields_post: + field_column = (f != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(f).column) + if field_column and field_column.deprecated: + _logger.warning('Field %s.%s is deprecated: %s', self._name, f, field_column.deprecated) + readonly = None for vals in res: for field in vals.copy(): @@ -3975,6 +3982,9 @@ class BaseModel(object): direct = [] totranslate = context.get('lang', False) and (context['lang'] != 'en_US') for field in vals: + field_column = (f != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(field).column) + if field_column and field_column.deprecated: + _logger.warning('Field %s.%s is deprecated: %s', self._name, field, field_column.deprecated) if field in self._columns: if self._columns[field]._classic_write and not (hasattr(self._columns[field], '_fnct_inv')): if (not totranslate) or not self._columns[field].translate: From 90c695d14191bfa320a44b8dfa49a989a8e209c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 9 Aug 2012 10:41:48 +0200 Subject: [PATCH 2/5] [FIX] f -> field bzr revid: tde@openerp.com-20120809084148-a3wf9cihllhhmo82 --- openerp/osv/orm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index b47c419d0d4..9798b671e1d 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -3982,7 +3982,7 @@ class BaseModel(object): direct = [] totranslate = context.get('lang', False) and (context['lang'] != 'en_US') for field in vals: - field_column = (f != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(field).column) + field_column = (field != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(field).column) if field_column and field_column.deprecated: _logger.warning('Field %s.%s is deprecated: %s', self._name, field, field_column.deprecated) if field in self._columns: From 87625fd7421ead39cef9aa5f888721b11693696d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 9 Aug 2012 14:09:26 +0200 Subject: [PATCH 3/5] [IMP] deprecated feature: added protection against read/write on non-existing columns. The ORM already throws warnings, no need to crash in addition :) . bzr revid: tde@openerp.com-20120809120926-ngl31imcggzz9wzt --- openerp/osv/orm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 9798b671e1d..8c727424890 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -3601,7 +3601,7 @@ class BaseModel(object): # Warn about deprecated fields now that fields_pre and fields_post are computed for f in fields_pre + fields_post: - field_column = (f != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(f).column) + field_column = (f != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(f) and self._all_columns.get(f).column) if field_column and field_column.deprecated: _logger.warning('Field %s.%s is deprecated: %s', self._name, f, field_column.deprecated) @@ -3982,7 +3982,7 @@ class BaseModel(object): direct = [] totranslate = context.get('lang', False) and (context['lang'] != 'en_US') for field in vals: - field_column = (field != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(field).column) + field_column = (field != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(field) and self._all_columns.get(field).column) if field_column and field_column.deprecated: _logger.warning('Field %s.%s is deprecated: %s', self._name, field, field_column.deprecated) if field in self._columns: From 8fef0b9a570cf0cfa5bb003e96e5d31519607deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 10 Aug 2012 09:32:42 +0200 Subject: [PATCH 4/5] [IMP] Removed unnecessary conditions. bzr revid: tde@openerp.com-20120810073242-5nc7h84x9r17kabl --- openerp/osv/orm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 8c727424890..345f26d7cb2 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -3601,7 +3601,7 @@ class BaseModel(object): # Warn about deprecated fields now that fields_pre and fields_post are computed for f in fields_pre + fields_post: - field_column = (f != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(f) and self._all_columns.get(f).column) + field_column = self._all_columns.get(f) and self._all_columns.get(f).column if field_column and field_column.deprecated: _logger.warning('Field %s.%s is deprecated: %s', self._name, f, field_column.deprecated) @@ -3982,7 +3982,7 @@ class BaseModel(object): direct = [] totranslate = context.get('lang', False) and (context['lang'] != 'en_US') for field in vals: - field_column = (field != self.CONCURRENCY_CHECK_FIELD and self._all_columns.get(field) and self._all_columns.get(field).column) + field_column = self._all_columns.get(field) and self._all_columns.get(field).column if field_column and field_column.deprecated: _logger.warning('Field %s.%s is deprecated: %s', self._name, field, field_column.deprecated) if field in self._columns: From e4185c910f449122ca0ee3d7cd26a4d0a0f593b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 14 Aug 2012 11:41:42 +0200 Subject: [PATCH 5/5] [FIX] orm deprecated: added a list cast because we may receive tuples (as seen on runbot). bzr revid: tde@openerp.com-20120814094142-b79hn5xgduhc7w15 --- openerp/osv/orm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 792175fb0fe..3ae9379697b 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -3598,7 +3598,8 @@ class BaseModel(object): record[f] = [] # Warn about deprecated fields now that fields_pre and fields_post are computed - for f in fields_pre + fields_post: + # Explicitly use list() because we may receive tuples + for f in list(fields_pre) + list(fields_post): field_column = self._all_columns.get(f) and self._all_columns.get(f).column if field_column and field_column.deprecated: _logger.warning('Field %s.%s is deprecated: %s', self._name, f, field_column.deprecated)