# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # ############################################################################## import StringIO from report.render import render from report.interface import report_int from mx 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={}): io = StringIO.StringIO() if 'date_start' not in datas: cr.execute('select min(date_start) from project_task where id IN %s',(tuple(ids),)) dt = cr.fetchone()[0] if dt: datas['date_start'] = dt[:10] else: datas['date_start'] = time.strftime('%Y-%m-%d') if 'date_stop' not in datas: cr.execute('select max(date_start),max(date_end) from project_task where id IN %s',(tuple(ids),)) res = cr.fetchone() datas['date_stop'] = (res[0] and res[0][:10]) or time.strftime('%Y-%m-%d') if res[1] and datas['date_stop']