[IMP] use model._fields instead of model._all_columns to cover all fields
[odoo/odoo.git] / addons / mail / mail_thread.py
index 4356ee6..fa4d7cf 100644 (file)
@@ -460,12 +460,12 @@ class mail_thread(osv.AbstractModel):
     def _get_tracked_fields(self, cr, uid, updated_fields, context=None):
         """ Return a structure of tracked fields for the current model.
             :param list updated_fields: modified field names
-            :return list: a list of (field_name, column_info obj), containing
+            :return dict: a dict mapping field name to description, containing
                 always tracked fields and modified on_change fields
         """
         tracked_fields = []
-        for name, column_info in self._all_columns.items():
-            visibility = getattr(column_info.column, 'track_visibility', False)
+        for name, field in self._fields.items():
+            visibility = getattr(field, 'track_visibility', False)
             if visibility == 'always' or (visibility == 'onchange' and name in updated_fields) or name in self._track:
                 tracked_fields.append(name)
 
@@ -507,17 +507,22 @@ class mail_thread(osv.AbstractModel):
 
             # generate tracked_values data structure: {'col_name': {col_info, new_value, old_value}}
             for col_name, col_info in tracked_fields.items():
+                field = self._fields[col_name]
                 initial_value = initial[col_name]
                 record_value = getattr(browse_record, col_name)
 
-                if record_value == initial_value and getattr(self._all_columns[col_name].column, 'track_visibility', None) == 'always':
-                    tracked_values[col_name] = dict(col_info=col_info['string'],
-                                                        new_value=convert_for_display(record_value, col_info))
+                if record_value == initial_value and getattr(field, 'track_visibility', None) == 'always':
+                    tracked_values[col_name] = dict(
+                        col_info=col_info['string'],
+                        new_value=convert_for_display(record_value, col_info),
+                    )
                 elif record_value != initial_value and (record_value or initial_value):  # because browse null != False
-                    if getattr(self._all_columns[col_name].column, 'track_visibility', None) in ['always', 'onchange']:
-                        tracked_values[col_name] = dict(col_info=col_info['string'],
-                                                            old_value=convert_for_display(initial_value, col_info),
-                                                            new_value=convert_for_display(record_value, col_info))
+                    if getattr(field, 'track_visibility', None) in ['always', 'onchange']:
+                        tracked_values[col_name] = dict(
+                            col_info=col_info['string'],
+                            old_value=convert_for_display(initial_value, col_info),
+                            new_value=convert_for_display(record_value, col_info),
+                        )
                     if col_name in tracked_fields:
                         changes.add(col_name)
             if not changes:
@@ -681,11 +686,11 @@ class mail_thread(osv.AbstractModel):
         res = {}
         for record in self.browse(cr, SUPERUSER_ID, ids, context=context):
             recipient_ids, email_to, email_cc = set(), False, False
-            if 'partner_id' in self._all_columns and record.partner_id:
+            if 'partner_id' in self._fields and record.partner_id:
                 recipient_ids.add(record.partner_id.id)
-            elif 'email_from' in self._all_columns and record.email_from:
+            elif 'email_from' in self._fields and record.email_from:
                 email_to = record.email_from
-            elif 'email' in self._all_columns:
+            elif 'email' in self._fields:
                 email_to = record.email
             res[record.id] = {'partner_ids': list(recipient_ids), 'email_to': email_to, 'email_cc': email_cc}
         return res
@@ -1398,11 +1403,11 @@ class mail_thread(osv.AbstractModel):
         """ Returns suggested recipients for ids. Those are a list of
             tuple (partner_id, partner_name, reason), to be managed by Chatter. """
         result = dict((res_id, []) for res_id in ids)
-        if self._all_columns.get('user_id'):
+        if 'user_id' in self._fields:
             for obj in self.browse(cr, SUPERUSER_ID, ids, context=context):  # SUPERUSER because of a read on res.users that would crash otherwise
                 if not obj.user_id or not obj.user_id.partner_id:
                     continue
-                self._message_add_suggested_recipient(cr, uid, result, obj, partner=obj.user_id.partner_id, reason=self._all_columns['user_id'].column.string, context=context)
+                self._message_add_suggested_recipient(cr, uid, result, obj, partner=obj.user_id.partner_id, reason=self._fields['user_id'].string, context=context)
         return result
 
     def _find_partner_from_emails(self, cr, uid, id, emails, model=None, context=None, check_followers=True):
@@ -1775,8 +1780,8 @@ class mail_thread(osv.AbstractModel):
         if auto_follow_fields is None:
             auto_follow_fields = ['user_id']
         user_field_lst = []
-        for name, column_info in self._all_columns.items():
-            if name in auto_follow_fields and name in updated_fields and getattr(column_info.column, 'track_visibility', False) and column_info.column._obj == 'res.users':
+        for name, field in self._fields.items():
+            if name in auto_follow_fields and name in updated_fields and getattr(field, 'track_visibility', False) and field.comodel_name == 'res.users':
                 user_field_lst.append(name)
         return user_field_lst
 
@@ -1916,7 +1921,7 @@ class mail_thread(osv.AbstractModel):
 
         # TDE HACK: originally by MAT from portal/mail_mail.py but not working until the inheritance graph bug is not solved in trunk
         # TDE FIXME: relocate in portal when it won't be necessary to reload the hr.employee model in an additional bridge module
-        if self.pool['res.groups']._all_columns.get('is_portal'):
+        if 'is_portal' in self.pool['res.groups']._fields:
             user = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context)
             if any(group.is_portal for group in user.groups_id):
                 return []