From 4ff5ed7c7e8f18d98d1b3c22bf91b110763423ac Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 15 Oct 2010 14:59:55 +0530 Subject: [PATCH] [IMP] project_scrum: improve burndown chart bzr revid: hmo@tinyerp.com-20101015092955-0ewjltoo3agtjfh1 --- addons/project_scrum/report/_burndown.py | 66 ++++++++++++------- .../project_scrum/report/sprint_burndown.py | 36 ++++------ addons/project_scrum/report/task_burndown.py | 54 ++------------- 3 files changed, 57 insertions(+), 99 deletions(-) diff --git a/addons/project_scrum/report/_burndown.py b/addons/project_scrum/report/_burndown.py index 6f0db24bcb6..b2cedd85881 100644 --- a/addons/project_scrum/report/_burndown.py +++ b/addons/project_scrum/report/_burndown.py @@ -19,44 +19,60 @@ # ############################################################################## - -from mx import DateTime +from datetime import datetime +from dateutil.relativedelta import relativedelta import time +import pooler +from report.render import render +class external_pdf(render): + def __init__(self, pdf): + render.__init__(self) + self.pdf = pdf + self.output_type='pdf' + def _render(self): + return self.pdf -def compute_burndown(cr, uid, tasks_id, date_start, date_stop): +def compute_burndown(cr, uid, tasks_ids, date_start, date_stop): latest = False - if len(tasks_id): - cr.execute('select id,create_date,state,planned_hours from project_task where id IN %s order by create_date',(tuple(tasks_id),)) - tasks = cr.fetchall() - - cr.execute('select w.date,w.hours from project_task_work w left join project_task t on (t.id=w.task_id) where t.id IN %s and t.state in (%s,%s) order by date',(tuple(tasks_id),'open','progress',)) - tasks2 = cr.fetchall() - - cr.execute('select date_end,planned_hours from project_task where id IN %s and state in (%s,%s) order by date_end' ,(tuple(tasks_id),'cancelled','done',)) - tasks2 += cr.fetchall() - tasks2.sort() + pool = pooler.get_pool(cr.dbname) + project_task_pool = pool.get('project.task') + task_work_pool = pool.get('project.task.work') + if len(tasks_ids): + tasks_ids = project_task_pool.search(cr, uid, [('id','in',tasks_ids)], order='create_date') + tasks = project_task_pool.read(cr, uid, tasks_ids, ['create_date','planned_hours','state']) + tasks_ids = project_task_pool.search(cr, uid, [('id','in',tasks_ids),('state', 'in', ['open','progress'])], order='create_date') + work_ids = task_work_pool.search(cr, uid, [('task_id','in',tasks_ids)], order='date') + close_tasks = task_work_pool.read(cr, uid, work_ids, ['date','hours','state']) + tasks_ids = project_task_pool.search(cr, uid, [('id','in',tasks_ids),('state', 'in', ['cancelled','done'])], order='date_end') + close_tasks += project_task_pool.read(cr, uid, tasks_ids, ['date_end','planned_hours']) + else: tasks = [] - tasks2 = [] + close_tasks = [] current_date = date_start total = 0 done = 0 result = [] - while current_date<=date_stop: - while len(tasks) and tasks[0][1] and tasks[0][1][:10]<=current_date: + while datetime.strptime(current_date, '%Y-%m-%d') <= datetime.strptime(date_stop, '%Y-%m-%d'): + while len(tasks) and tasks[0]['create_date'] and datetime.strptime(tasks[0]['create_date'][:10], '%Y-%m-%d')<=datetime.strptime(current_date, '%Y-%m-%d'): latest = tasks.pop(0) - total += latest[3] + total += float(latest.get('planned_hours',0.0)) i = 0 - while ires: result.append(res) return result @@ -92,7 +78,7 @@ class report_tasks(report_int): ar.draw(canv) canv.close() - self.obj = external_pdf(io.getvalue()) + self.obj = _burndown.external_pdf(io.getvalue()) self.obj.render() return (self.obj.pdf, 'pdf') report_tasks('report.scrum.sprint.burndown') diff --git a/addons/project_scrum/report/task_burndown.py b/addons/project_scrum/report/task_burndown.py index 50a02792ced..14807126503 100644 --- a/addons/project_scrum/report/task_burndown.py +++ b/addons/project_scrum/report/task_burndown.py @@ -20,53 +20,14 @@ ############################################################################## import StringIO - from report.render import render from report.interface import report_int - -from mx import DateTime +from datetime import datetime import time - from pychart import * import pychart.legend - import _burndown -class external_pdf(render): - def __init__(self, pdf): - render.__init__(self) - self.pdf = pdf - self.output_type='pdf' - def _render(self): - return self.pdf - -def burndown_chart(cr, uid, tasks_id, date_start, date_stop): - latest = False - - cr.execute('select id,date_start,state,planned_hours from project_task where id IN %s order by date_start'(tuple(tasks_id),)) - tasks = cr.fetchall() - cr.execute('select id,date_end,state,planned_hours*progress/100 from project_task where id IN %s and state in (%s,%s) order by date_end', (tuple(tasks_id),'progress','done',)) - tasks2 = cr.fetchall() - current_date = date_start - total = 0 - done = 0 - result = [] - while current_date<=date_stop: - while len(tasks) and tasks[0][1] and tasks[0][1][:10]<=current_date: - total += tasks.pop(0)[3] - while len(tasks2) and tasks2[0][1] and tasks2[0][1][:10]<=current_date: - t2 = tasks2.pop(0) - if t2[2]<>'cancel': - done += t2[3] - else: - total -= t2[3] - result.append( (int(time.mktime(time.strptime(current_date,'%Y-%m-%d'))), total-done) ) - current_date = (DateTime.strptime(current_date, '%Y-%m-%d') + DateTime.RelativeDateTime(days=1)).strftime('%Y-%m-%d') - if not len(tasks) and not len(tasks2): - break - result.append( (int(time.mktime(time.strptime(date_stop,'%Y-%m-%d'))), 0) ) - return result - class report_tasks(report_int): def create(self, cr, uid, ids, datas, context=None): if context is None: @@ -87,24 +48,19 @@ class report_tasks(report_int): if res[1] and datas['date_stop']