[FIX] [CLEAN] Various: fixed / cleaned use of dict.fromkeys.

Indeed using fromkeys with a list / dict as argument leads to the creation
of shared list / dict. This could create some ugly side effects when
used in loops. This commit fixes or cleans this kind of statement to avoid
unwanted side effects.
This commit is contained in:
Thibault Delavallée 2014-09-18 10:18:05 +02:00
parent f0c3856be2
commit 7cad4baa84
12 changed files with 18 additions and 17 deletions

View File

@ -95,7 +95,7 @@ class gamification_badge(osv.Model):
the total number of time this badge was granted the total number of time this badge was granted
the total number of users this badge was granted to the total number of users this badge was granted to
""" """
result = dict.fromkeys(ids, {'stat_count':0, 'stat_count_distinct':0, 'unique_owner_ids':[]}) result = dict((res_id, {'stat_count': 0, 'stat_count_distinct': 0, 'unique_owner_ids': []}) for res_id in ids)
cr.execute(""" cr.execute("""
SELECT badge_id, count(user_id) as stat_count, SELECT badge_id, count(user_id) as stat_count,

View File

@ -68,7 +68,7 @@ class hr_holidays_status(osv.osv):
if employee_id: if employee_id:
res = self.get_days(cr, uid, ids, employee_id, context=context) res = self.get_days(cr, uid, ids, employee_id, context=context)
else: else:
res = dict.fromkeys(ids, {'leaves_taken': 0, 'remaining_leaves': 0, 'max_leaves': 0}) res = dict((res_id, {'leaves_taken': 0, 'remaining_leaves': 0, 'max_leaves': 0}) for res_id in ids)
return res return res
_columns = { _columns = {

View File

@ -153,7 +153,7 @@ class hr_applicant(osv.Model):
return result, fold return result, fold
def _compute_day(self, cr, uid, ids, fields, args, context=None): def _compute_day(self, cr, uid, ids, fields, args, context=None):
res = dict.fromkeys(ids, dict()) res = dict((res_id, {}) for res_id in ids)
for issue in self.browse(cr, uid, ids, context=context): for issue in self.browse(cr, uid, ids, context=context):
values = { values = {
'day_open': 0.0, 'day_open': 0.0,

View File

@ -698,7 +698,7 @@ class mail_message(osv.Model):
partner_id = self.pool['res.users'].browse(cr, SUPERUSER_ID, uid, context=None).partner_id.id partner_id = self.pool['res.users'].browse(cr, SUPERUSER_ID, uid, context=None).partner_id.id
# Read mail_message.ids to have their values # Read mail_message.ids to have their values
message_values = dict.fromkeys(ids, {}) message_values = dict((res_id, {}) for res_id in ids)
cr.execute('SELECT DISTINCT id, model, res_id, author_id, parent_id FROM "%s" WHERE id = ANY (%%s)' % self._table, (ids,)) cr.execute('SELECT DISTINCT id, model, res_id, author_id, parent_id FROM "%s" WHERE id = ANY (%%s)' % self._table, (ids,))
for id, rmod, rid, author_id, parent_id in cr.fetchall(): for id, rmod, rid, author_id, parent_id in cr.fetchall():
message_values[id] = {'model': rmod, 'res_id': rid, 'author_id': author_id, 'parent_id': parent_id} message_values[id] = {'model': rmod, 'res_id': rid, 'author_id': author_id, 'parent_id': parent_id}

View File

@ -1388,7 +1388,7 @@ class mail_thread(osv.AbstractModel):
def message_get_suggested_recipients(self, cr, uid, ids, context=None): def message_get_suggested_recipients(self, cr, uid, ids, context=None):
""" Returns suggested recipients for ids. Those are a list of """ Returns suggested recipients for ids. Those are a list of
tuple (partner_id, partner_name, reason), to be managed by Chatter. """ tuple (partner_id, partner_name, reason), to be managed by Chatter. """
result = dict.fromkeys(ids, list()) result = dict((res_id, []) for res_id in ids)
if self._all_columns.get('user_id'): if self._all_columns.get('user_id'):
for obj in self.browse(cr, SUPERUSER_ID, ids, context=context): # SUPERUSER because of a read on res.users that would crash otherwise 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: if not obj.user_id or not obj.user_id.partner_id:

View File

@ -150,7 +150,7 @@ class res_users(osv.Model):
return self.pool.get('mail.thread').message_get_partner_info_from_emails(cr, uid, emails, link_mail=link_mail, context=context) return self.pool.get('mail.thread').message_get_partner_info_from_emails(cr, uid, emails, link_mail=link_mail, context=context)
def message_get_suggested_recipients(self, cr, uid, ids, context=None): def message_get_suggested_recipients(self, cr, uid, ids, context=None):
return dict.fromkeys(ids, list()) return dict((res_id, list()) for res_id in ids)
def stop_showing_groups_suggestions(self, cr, uid, user_id, context=None): def stop_showing_groups_suggestions(self, cr, uid, user_id, context=None):
"""Update display_groups_suggestions value to False""" """Update display_groups_suggestions value to False"""

View File

@ -133,7 +133,7 @@ class project_issue(osv.Model):
""" """
Calendar = self.pool['resource.calendar'] Calendar = self.pool['resource.calendar']
res = dict.fromkeys(ids, dict()) res = dict((res_id, {}) for res_id in ids)
for issue in self.browse(cr, uid, ids, context=context): for issue in self.browse(cr, uid, ids, context=context):
values = { values = {
'day_open': 0.0, 'day_close': 0.0, 'day_open': 0.0, 'day_close': 0.0,

View File

@ -32,7 +32,7 @@ class purchase_requisition(osv.osv):
_inherit = ['mail.thread', 'ir.needaction_mixin'] _inherit = ['mail.thread', 'ir.needaction_mixin']
def _get_po_line(self, cr, uid, ids, field_names, arg=None, context=None): def _get_po_line(self, cr, uid, ids, field_names, arg=None, context=None):
result = {}.fromkeys(ids, []) result = dict((res_id, []) for res_id in ids)
for element in self.browse(cr, uid, ids, context=context): for element in self.browse(cr, uid, ids, context=context):
for po in element.purchase_ids: for po in element.purchase_ids:
result[element.id] += [po_line.id for po_line in po.order_line] result[element.id] += [po_line.id for po_line in po.order_line]

View File

@ -3623,7 +3623,7 @@ class stock_package(osv.osv):
def _get_package_info(self, cr, uid, ids, name, args, context=None): def _get_package_info(self, cr, uid, ids, name, args, context=None):
default_company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id default_company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id
res = {}.fromkeys(ids, {'location_id': False, 'company_id': default_company_id, 'owner_id': False}) res = dict((res_id, {'location_id': False, 'company_id': default_company_id, 'owner_id': False}) for res_id in ids)
for pack in self.browse(cr, uid, ids, context=context): for pack in self.browse(cr, uid, ids, context=context):
if pack.quant_ids: if pack.quant_ids:
res[pack.id]['location_id'] = pack.quant_ids[0].location_id.id res[pack.id]['location_id'] = pack.quant_ids[0].location_id.id
@ -4113,7 +4113,7 @@ class stock_picking_type(osv.osv):
def _get_tristate_values(self, cr, uid, ids, field_name, arg, context=None): def _get_tristate_values(self, cr, uid, ids, field_name, arg, context=None):
picking_obj = self.pool.get('stock.picking') picking_obj = self.pool.get('stock.picking')
res = dict.fromkeys(ids, []) res = {}
for picking_type_id in ids: for picking_type_id in ids:
#get last 10 pickings of this type #get last 10 pickings of this type
picking_ids = picking_obj.search(cr, uid, [('picking_type_id', '=', picking_type_id), ('state', '=', 'done')], order='date_done desc', limit=10, context=context) picking_ids = picking_obj.search(cr, uid, [('picking_type_id', '=', picking_type_id), ('state', '=', 'done')], order='date_done desc', limit=10, context=context)

View File

@ -132,7 +132,7 @@ class event_event(osv.osv):
} }
def _get_tracks_tag_ids(self, cr, uid, ids, field_names, arg=None, context=None): def _get_tracks_tag_ids(self, cr, uid, ids, field_names, arg=None, context=None):
res = dict.fromkeys(ids, []) res = dict((res_id, []) for res_id in ids)
for event in self.browse(cr, uid, ids, context=context): for event in self.browse(cr, uid, ids, context=context):
for track in event.track_ids: for track in event.track_ids:
res[event.id] += [tag.id for tag in track.tag_ids] res[event.id] += [tag.id for tag in track.tag_ids]

View File

@ -34,12 +34,13 @@ class MailGroup(http.Controller):
groups = group_obj.browse(cr, uid, group_ids, context) groups = group_obj.browse(cr, uid, group_ids, context)
# compute statistics # compute statistics
month_date = datetime.datetime.today() - relativedelta.relativedelta(months=1) month_date = datetime.datetime.today() - relativedelta.relativedelta(months=1)
group_data = dict.fromkeys(group_ids, dict()) group_data = dict()
for group in groups: for group in groups:
group_data[group.id]['monthly_message_nbr'] = mail_message_obj.search( group_data[group.id] = {
cr, SUPERUSER_ID, 'monthly_message_nbr': mail_message_obj.search(
[('model', '=', 'mail.group'), ('res_id', '=', group.id), ('date', '>=', month_date.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT))], cr, SUPERUSER_ID,
count=True, context=context) [('model', '=', 'mail.group'), ('res_id', '=', group.id), ('date', '>=', month_date.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT))],
count=True, context=context)}
values = {'groups': groups, 'group_data': group_data} values = {'groups': groups, 'group_data': group_data}
return request.website.render('website_mail_group.mail_groups', values) return request.website.render('website_mail_group.mail_groups', values)

View File

@ -70,7 +70,7 @@ class Graph(dict):
return return
# update the graph with values from the database (if exist) # update the graph with values from the database (if exist)
## First, we set the default values for each package in graph ## First, we set the default values for each package in graph
additional_data = dict.fromkeys(self.keys(), {'id': 0, 'state': 'uninstalled', 'dbdemo': False, 'installed_version': None}) additional_data = dict((key, {'id': 0, 'state': 'uninstalled', 'dbdemo': False, 'installed_version': None}) for key in self.keys())
## Then we get the values from the database ## Then we get the values from the database
cr.execute('SELECT name, id, state, demo AS dbdemo, latest_version AS installed_version' cr.execute('SELECT name, id, state, demo AS dbdemo, latest_version AS installed_version'
' FROM ir_module_module' ' FROM ir_module_module'