From 7cad4baa84b7d5c1648842f4891501d672406b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 18 Sep 2014 10:18:05 +0200 Subject: [PATCH] [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. --- addons/gamification/models/badge.py | 2 +- addons/hr_holidays/hr_holidays.py | 2 +- addons/hr_recruitment/hr_recruitment.py | 2 +- addons/mail/mail_message.py | 2 +- addons/mail/mail_thread.py | 2 +- addons/mail/res_users.py | 2 +- addons/project_issue/project_issue.py | 2 +- addons/purchase_requisition/purchase_requisition.py | 2 +- addons/stock/stock.py | 4 ++-- addons/website_event_track/models/event.py | 2 +- addons/website_mail_group/controllers/main.py | 11 ++++++----- openerp/modules/graph.py | 2 +- 12 files changed, 18 insertions(+), 17 deletions(-) diff --git a/addons/gamification/models/badge.py b/addons/gamification/models/badge.py index 4eb58b86a9f..1f21c03194a 100644 --- a/addons/gamification/models/badge.py +++ b/addons/gamification/models/badge.py @@ -95,7 +95,7 @@ class gamification_badge(osv.Model): the total number of time this badge was granted 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(""" SELECT badge_id, count(user_id) as stat_count, diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index f299639265e..9ac9d0e193e 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -68,7 +68,7 @@ class hr_holidays_status(osv.osv): if employee_id: res = self.get_days(cr, uid, ids, employee_id, context=context) 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 _columns = { diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 3a4088b677c..38777eb7907 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -153,7 +153,7 @@ class hr_applicant(osv.Model): return result, fold 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): values = { 'day_open': 0.0, diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 439b2bed876..455dae7dac7 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -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 # 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,)) 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} diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index cef0ac10e6b..bc5988cf735 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -1388,7 +1388,7 @@ class mail_thread(osv.AbstractModel): def message_get_suggested_recipients(self, cr, uid, ids, context=None): """ Returns suggested recipients for ids. Those are a list of 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'): 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: diff --git a/addons/mail/res_users.py b/addons/mail/res_users.py index a4feaab2dde..c6b78b7532c 100644 --- a/addons/mail/res_users.py +++ b/addons/mail/res_users.py @@ -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) 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): """Update display_groups_suggestions value to False""" diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index cadb4291276..338eebf099d 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -133,7 +133,7 @@ class project_issue(osv.Model): """ 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): values = { 'day_open': 0.0, 'day_close': 0.0, diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index d89b33007a5..35a46ecbcab 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -32,7 +32,7 @@ class purchase_requisition(osv.osv): _inherit = ['mail.thread', 'ir.needaction_mixin'] 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 po in element.purchase_ids: result[element.id] += [po_line.id for po_line in po.order_line] diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 26038673474..9e3c8cf69ea 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -3623,7 +3623,7 @@ class stock_package(osv.osv): 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 - 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): if pack.quant_ids: 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): picking_obj = self.pool.get('stock.picking') - res = dict.fromkeys(ids, []) + res = {} for picking_type_id in ids: #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) diff --git a/addons/website_event_track/models/event.py b/addons/website_event_track/models/event.py index 1130023cd2c..fd10b912e5e 100644 --- a/addons/website_event_track/models/event.py +++ b/addons/website_event_track/models/event.py @@ -132,7 +132,7 @@ class event_event(osv.osv): } 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 track in event.track_ids: res[event.id] += [tag.id for tag in track.tag_ids] diff --git a/addons/website_mail_group/controllers/main.py b/addons/website_mail_group/controllers/main.py index 59478b37fa3..0e45a1663cf 100644 --- a/addons/website_mail_group/controllers/main.py +++ b/addons/website_mail_group/controllers/main.py @@ -34,12 +34,13 @@ class MailGroup(http.Controller): groups = group_obj.browse(cr, uid, group_ids, context) # compute statistics month_date = datetime.datetime.today() - relativedelta.relativedelta(months=1) - group_data = dict.fromkeys(group_ids, dict()) + group_data = dict() for group in groups: - group_data[group.id]['monthly_message_nbr'] = mail_message_obj.search( - cr, SUPERUSER_ID, - [('model', '=', 'mail.group'), ('res_id', '=', group.id), ('date', '>=', month_date.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT))], - count=True, context=context) + group_data[group.id] = { + 'monthly_message_nbr': mail_message_obj.search( + cr, SUPERUSER_ID, + [('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} return request.website.render('website_mail_group.mail_groups', values) diff --git a/openerp/modules/graph.py b/openerp/modules/graph.py index b0f6141e78f..48666d9d9f3 100644 --- a/openerp/modules/graph.py +++ b/openerp/modules/graph.py @@ -70,7 +70,7 @@ class Graph(dict): return # update the graph with values from the database (if exist) ## 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 cr.execute('SELECT name, id, state, demo AS dbdemo, latest_version AS installed_version' ' FROM ir_module_module'