151 lines
5.4 KiB
Python
151 lines
5.4 KiB
Python
##############################################################################
|
|
#
|
|
# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
|
|
# Fabien Pinckaers <fp@tiny.Be>
|
|
#
|
|
# WARNING: This program as such is intended to be used by professional
|
|
# programmers who take the whole responsability of assessing all potential
|
|
# consequences resulting from its eventual inadequacies and bugs
|
|
# End users who are looking for a ready-to-use solution with commercial
|
|
# garantees and support are strongly adviced to contract a Free Software
|
|
# Service Company
|
|
#
|
|
# This program is Free Software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# 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 General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
#
|
|
##############################################################################
|
|
|
|
from report.render import render
|
|
from report.interface import report_int
|
|
from pychart import *
|
|
from mx.DateTime import *
|
|
from report.misc import choice_colors
|
|
import time, mx
|
|
import random
|
|
import StringIO
|
|
|
|
|
|
theme.use_color = 1
|
|
#theme.scale = 2
|
|
random.seed(0)
|
|
|
|
class external_pdf(render):
|
|
def __init__(self, pdf):
|
|
render.__init__(self)
|
|
self.pdf = pdf
|
|
self.output_type='pdf'
|
|
|
|
def _render(self):
|
|
return self.pdf
|
|
|
|
class report_custom(report_int):
|
|
def _compute_dates(self, time_unit, start, stop=False):
|
|
if not stop:
|
|
stop = start
|
|
dates = {}
|
|
if time_unit == 'month':
|
|
a = Date(*map(int, start.split("-"))).year*12+Date(*map(int, start.split("-"))).month
|
|
z = Date(*map(int, stop.split("-"))).year*12+Date(*map(int, stop.split("-"))).month+1
|
|
for i in range(a,z):
|
|
year = i/12
|
|
month = i%12
|
|
if month == 0:
|
|
year -= 1
|
|
month = 12
|
|
months = { 1:"January",2:"February",3:"March",4:"April",5:"May",6:"June",7:"July",8:"August",9:"September",10:"October",11:"November",12:"December" }
|
|
dates[i] = {
|
|
'name' :months[month],
|
|
'start':(Date(year, month, 2) + RelativeDateTime(day=1)).strftime('%Y-%m-%d'),
|
|
'stop' :(Date(year, month, 2) + RelativeDateTime(day=-1)).strftime('%Y-%m-%d'),
|
|
}
|
|
return dates
|
|
elif time_unit == 'week':
|
|
a = Date(*map(int, start.split("-"))).iso_week[0]*52+Date(*map(int, start.split("-"))).iso_week[1]
|
|
z = Date(*map(int, stop.split("-"))).iso_week[0]*52+Date(*map(int, stop.split("-"))).iso_week[1]
|
|
for i in range(a,z+1):
|
|
year = i/52
|
|
week = i%52
|
|
dates[i] = {
|
|
'name' :"Week #%d" % week,
|
|
'start':ISO.WeekTime(year, week, 1).strftime('%Y-%m-%d'),
|
|
'stop' :ISO.WeekTime(year, week, 7).strftime('%Y-%m-%d'),
|
|
}
|
|
return dates
|
|
else: # time_unit = day
|
|
a = Date(*map(int, start.split("-")))
|
|
z = Date(*map(int, stop.split("-")))
|
|
i = a
|
|
while i <= z:
|
|
dates[map(int,i.strftime('%Y%m%d').split())[0]] = {
|
|
'name' :i.strftime('%Y-%m-%d'),
|
|
'start':i.strftime('%Y-%m-%d'),
|
|
'stop' :i.strftime('%Y-%m-%d'),
|
|
}
|
|
i = i + RelativeDateTime(days=+1)
|
|
return dates
|
|
return {}
|
|
|
|
def create(self, cr, uid, ids, datas, context={}):
|
|
datas = datas['form']
|
|
if datas['users_id']:
|
|
datas['users_id'] = datas['users_id'][0][2]
|
|
else:
|
|
cr.execute('select id from res_users limit 10')
|
|
datas['users_id'] = [x[0] for x in cr.fetchall()]
|
|
cr.execute('select id,name from res_users where id in ('+','.join(map(str,datas['users_id']))+')')
|
|
users_name = dict(cr.fetchall())
|
|
colors = choice_colors(len(datas['users_id']))
|
|
dates = self._compute_dates(datas['type'], datas['date1'], datas['date2'])
|
|
dates_list = dates.keys()
|
|
dates_list.sort()
|
|
x_index = map(lambda x: (dates[x]['name'],x), dates_list)
|
|
pdf_string = StringIO.StringIO()
|
|
can = canvas.init(fname=pdf_string, format='pdf')
|
|
chart_object.set_defaults(line_plot.T, line_style=None)
|
|
y_label = 'Number of Objects'
|
|
|
|
ar = area.T(legend = legend.T(),
|
|
x_grid_style= line_style.gray70_dash1,
|
|
x_axis = axis.X(label=None, format="/a90/hC%s"),
|
|
x_coord = category_coord.T(x_index, 0),
|
|
y_axis = axis.Y(label=y_label),
|
|
y_range = (0, None), size = (680,450))
|
|
bar_plot.fill_styles.reset();
|
|
|
|
data = []
|
|
for date in dates_list:
|
|
cr.execute(("SELECT create_uid,count(*) FROM %s WHERE (substring(create_date,0,11) BETWEEN '%s' AND '%s') and id in ("+','.join(map(str,datas['users_id']))+") GROUP BY create_uid") % (datas['model'].replace('.','_'), dates[date]['start'], dates[date]['stop']))
|
|
res = dict(cr.fetchall())
|
|
|
|
vals = [dates[date]['name']]
|
|
for user in datas['users_id']:
|
|
vals.append(res.get(user, 0.0))
|
|
data.append(vals)
|
|
|
|
for user_id in range(len(datas['users_id'])):
|
|
user = datas['users_id'][user_id]
|
|
|
|
f = fill_style.Plain()
|
|
f.bgcolor = colors[user_id]
|
|
ar.add_plot(bar_plot.T(label=users_name.get(user,'Unknown').replace('/', '//'), data=data, hcol=user_id+1, cluster=(user_id, len(datas['users_id'])), fill_style=f ))
|
|
|
|
ar.draw(can)
|
|
can.close()
|
|
self.obj = external_pdf(pdf_string.getvalue())
|
|
self.obj.render()
|
|
pdf_string.close()
|
|
return (self.obj.pdf, 'pdf')
|
|
report_custom('report.productivity_analysis.report')
|
|
|