From 2e4f798a39a64c631d69ad768423ccf86c31234a Mon Sep 17 00:00:00 2001 From: "olt@tinyerp.com" <> Date: Mon, 20 Sep 2010 15:59:21 +0200 Subject: [PATCH 1/6] [IMP] project: no need to use operator.itemgetter when a simple lambda can do the same operation bzr revid: olt@tinyerp.com-20100920135921-fhqshcnqlepcflly --- addons/project/project.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 6aa3eaef151..5483d7072c0 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -27,7 +27,6 @@ from tools.translate import _ from osv import fields, osv from tools import email_send as email -from operator import itemgetter class project_task_type(osv.osv): _name = 'project.task.type' @@ -466,7 +465,7 @@ class task(osv.osv): cr.execute('SELECT DISTINCT task_id '\ 'FROM project_task_parent_rel '\ 'WHERE parent_id IN %s', (tuple(ids),)) - child_ids = map(itemgetter(0), cr.fetchall()) + child_ids = map(lambda x: x[0], cr.fetchall()) c_ids = child_ids if (list(set(parent_ids).intersection(set(c_ids)))) or (obj_task.id in c_ids): return False From 5c94f9e27f68e0b7a154088278b1a7dd12520749 Mon Sep 17 00:00:00 2001 From: "olt@tinyerp.com" <> Date: Mon, 20 Sep 2010 17:11:56 +0200 Subject: [PATCH 2/6] [IMP] mrp: only import the methods actually used instead of whole module bzr revid: olt@tinyerp.com-20100920151156-cz77f9le62a3xo8n --- addons/mrp/mrp.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index a7c44e5f7c0..5ad90bf25d6 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -19,8 +19,8 @@ # ############################################################################## -import itertools -import operator +from itertools import groupby +from operator import itemgetter from datetime import datetime from osv import osv, fields from tools.translate import _ @@ -358,12 +358,11 @@ class many2many_domain(fields.many2many): move_obj = obj.pool.get('stock.move') res = {}.fromkeys(ids, []) - key = operator.itemgetter(0) valid_move_ids = move_obj.search(cr, user, self._domain) # move ids relative to domain argument cr.execute("SELECT production_id, move_id from mrp_production_move_ids where production_id in %s and move_id in %s", [tuple(ids), tuple(valid_move_ids)]) related_move_map = cr.fetchall() - related_move_dict = dict((k, list(set([v[1] for v in itr]))) for k, itr in itertools.groupby(related_move_map, key)) + related_move_dict = dict((k, list(set([v[1] for v in itr]))) for k, itr in groupby(related_move_map, itemgetter(0))) res.update(related_move_dict) return res From 0c1f4b268c6cd663e0077707cd6951106b2f9db5 Mon Sep 17 00:00:00 2001 From: "olt@tinyerp.com" <> Date: Mon, 20 Sep 2010 17:12:41 +0200 Subject: [PATCH 3/6] [IMP] project: performance improvement: moved sql query outside loop bzr revid: olt@tinyerp.com-20100920151241-owecugwym2ft09gy --- addons/project/project.py | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 5483d7072c0..6959a19fd03 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -22,7 +22,10 @@ from lxml import etree import time from datetime import datetime, date +from operator import itemgetter +from itertools import groupby +from tools.misc import flatten from tools.translate import _ from osv import fields, osv from tools import email_send as email @@ -76,20 +79,6 @@ class project(osv.osv): pricelist_id = pricelist.get('property_product_pricelist', False) and pricelist.get('property_product_pricelist')[0] or False return {'value':{'contact_id': addr['contact'], 'pricelist_id': pricelist_id}} - def get_all_child_projects(self, cr, uid, ids, context=None): - # Calculate child project for Given project id => For progress rate + planned time + Time spent - cr.execute('''SELECT prpc.id AS id from account_analytic_account AS p - JOIN account_analytic_account AS c ON p.id = c.parent_id - JOIN project_project AS prp ON prp.analytic_account_id = p.id - JOIN project_project AS prpc ON prpc.analytic_account_id = c.id - WHERE prp.id IN %s''',(tuple(ids),)) - - child_ids = cr.fetchall() - if child_ids: - child_ids = [x[0] for x in child_ids] - child_ids = self.get_all_child_projects(cr, uid, child_ids) - return ids + child_ids - def _get_user_and_default_uom_ids(self, cr, uid): users_obj = self.pool.get('res.users') model_data_obj = self.pool.get('ir.model.data') @@ -101,17 +90,33 @@ class project(osv.osv): return user_uom, default_uom def _progress_rate(self, cr, uid, ids, names, arg, context=None): + def _get_all_child_projects(ids): + """Recursively get child project ids""" + child_ids = flatten([project_hierarchy.get(idn, []) for idn in ids]) + if child_ids: + child_ids = _get_all_child_projects(child_ids) + return ids + child_ids + # END _get_all_child_projects + res = {}.fromkeys(ids, 0.0) progress = {} if not ids: return res - par_child_projects={} + par_child_projects = {} all_projects = list(ids) + # get project hierarchy: + cr.execute('''SELECT prp.id AS pr_parent_id, prpc.id AS pr_child_id + FROM account_analytic_account AS p + JOIN account_analytic_account AS c ON p.id = c.parent_id + JOIN project_project AS prp ON prp.analytic_account_id = p.id + JOIN project_project AS prpc ON prpc.analytic_account_id = c.id''') + + project_hierarchy = dict((k, list(set([v[1] for v in itr]))) for k, itr in groupby(cr.fetchall(), itemgetter(0))) + for id in ids: - child_projects = self.get_all_child_projects(cr, uid, [id], context) - child_projects = [x for x in child_projects] + child_projects = _get_all_child_projects([id]) par_child_projects[id] = child_projects all_projects.extend(child_projects) From 9ab0d55dbc7656a3b19275d0a972b9bcbefba69d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 21 Sep 2010 11:48:28 +0530 Subject: [PATCH 4/6] [FIX] colspan on crm.meeting.allday bzr revid: xmo@openerp.com-20100921061828-j0ihg7z7bf0rtvxi --- addons/crm/crm_meeting_view.xml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml index 5dbadcd26e1..a3556653516 100644 --- a/addons/crm/crm_meeting_view.xml +++ b/addons/crm/crm_meeting_view.xml @@ -26,19 +26,17 @@
+ required="1" /> - + - Date: Tue, 21 Sep 2010 08:33:50 +0200 Subject: [PATCH 5/6] [FIX] fixed an error in 'copy' method bzr revid: olt@tinyerp.com-20100921063350-r6i51lvorh5qudqe --- addons/project_scrum/project_scrum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project_scrum/project_scrum.py b/addons/project_scrum/project_scrum.py index a80a31ff257..d4be8ebe450 100644 --- a/addons/project_scrum/project_scrum.py +++ b/addons/project_scrum/project_scrum.py @@ -140,7 +140,7 @@ class project_scrum_sprint(osv.osv): if default is None: default = {} default.update({'backlog_ids': [], 'meeting_ids': []}) - return super(scrum_sprint, self).copy(cr, uid, id, default=default, context=context) + return super(project_scrum_sprint, self).copy(cr, uid, id, default=default, context=context) def onchange_project_id(self, cr, uid, ids, project_id=False): v = {} From d31b61e8a2ff4ac36da7d3de5705007c78e058e4 Mon Sep 17 00:00:00 2001 From: Ferchu <> Date: Tue, 21 Sep 2010 13:02:53 +0530 Subject: [PATCH 6/6] [FIX] Fetchmail : Correction for pop server mail processing lp bug: https://launchpad.net/bugs/643994 fixed bzr revid: jvo@tinyerp.com-20100921073253-hmf0yps77j8s8o9n --- addons/fetchmail/fetchmail.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py index cd25a5f1883..7d527442391 100644 --- a/addons/fetchmail/fetchmail.py +++ b/addons/fetchmail/fetchmail.py @@ -154,7 +154,7 @@ class email_server(osv.osv): for num in range(1, numMsgs + 1): (header, msges, octets) = pop_server.retr(num) msg = '\n'.join(msges) - res_id = email_tool.process_email(cr, uid, server.object_id.model, data[0][1], attach=server.attach, context=context) + res_id = email_tool.process_email(cr, uid, server.object_id.model, msg, attach=server.attach, context=context) if res_id and server.action_id: action_pool = self.pool.get('ir.actions.server') action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})