1
# -*- encoding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
8
# This program is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU General Public License for more details.
18
# You should have received a copy of the GNU General Public License
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
21
##############################################################################
25
from report.interface import report_int
26
import reportlab.lib.pagesizes as pagesize
29
from lxml import etree
30
from report import render
40
class report_printscreen_list(report_int):
41
def __init__(self, name):
42
report_int.__init__(self, name)
46
def unicode_csv_reader(self, utf8_data, dialect=csv.excel, **kwargs):
47
csv_reader = csv.reader(utf8_data, delimiter = ',', quotechar = '"')
48
for row in csv_reader:
49
yield [unicode(cell, 'utf-8') for cell in row]
53
def comma_me(self,amount):
54
if type(amount) is float :
55
amount = str('%.2f'%amount)
61
new = re.sub("^(-?\d+)(\d{3})", "\g<1>,\g<2>", amount)
65
return self.comma_me(new)
68
def get_para_style(self, uid, field):
70
para = utilRML_std.para()
72
col_options = field.keys()
73
for option in dir(para):
74
if option in col_options:
75
para_str = 'para.%s("%s")'%(option, field[option])
76
if field.has_key('conditioning'):
77
result['conditioning'] = field['conditioning']
83
def evaluate_condition(self, uid, condition_brw, elem):
84
for condition in condition_brw:
86
res = eval("%s %s %s"%(elem, condition.name, condition.value))
88
res = eval("'%s' %s '%s'"%(elem, condition.name, condition.value))
90
field ={'setfontname':condition.fontname,
91
'setfontsize':condition.fontsize,
92
'setalignment':condition.align,
93
'settextColor':condition.textcolor,
94
'setbackColor':condition.backcolor,
96
para_style = self.get_para_style(uid, field)['para']
101
def _parse_node(self, root_node):
103
for node in root_node.getchildren():
104
if node.tag == 'field':
107
if not attrsa is None:
108
for key,val in attrsa.items():
110
result.append(attrs['name'])
112
result.extend(self._parse_node(node))
115
## def _parse_string(self, view):
117
## dom = etree.XML(view.encode('utf-8'))
119
## dom = etree.XML(view)
120
## return self._parse_node(dom)
122
def create(self, cr, uid, ids, datas, context=None):
125
pool = pooler.get_pool(cr.dbname)
126
model = pool.get(datas['model'])
127
model_id = pool.get('ir.model').search(cr, uid, [('model','=',model._name)])
128
model_brw = model.browse(cr, uid, datas['id'])
130
model = pooler.get_pool(cr.dbname).get(datas['model'])
131
lables = model_brw.label_ids
135
for label in model_brw.label_ids:
136
if not label.invisible:
138
fields_order.append(label.label_new or label.name)
139
fields[label.label_new or label.name] = {
141
'string':label.label_new or label.name,
143
'setfontname':label.fontname,
144
'setfontsize':label.fontsize,
145
'setalignment':label.align,
146
'settextColor':label.textcolor,
147
'setbackColor':label.backcolor,
151
fields[label.label_new or label.name].update({'conditioning':label.style_ids})
154
rows = datas['form']['file.csv']
155
buf = StringIO.StringIO(rows)
156
report_name = '/tmp/report_%s.csv'%(uid)
157
ss = open(report_name,'w')
158
ss.write(base64.decodestring(buf.getvalue()))
161
#rows = csv.reader(open(report_name,'rb'), delimiter = ',', quotechar = '"')
162
rows = self.unicode_csv_reader(open(report_name,'rb'))
167
if datas['form']['header']:
171
first_row_titles = rows.next()
172
self.title = header[2]
177
self.title = model_brw.name
182
if not invisible[count]:
185
rows_lst.append(new_row)
186
res = self._create_table(uid, model_brw, datas['ids'], fields, fields_order, rows_lst, context, self.title , header)
187
return (self.obj.get(), 'pdf')
190
def add_row_element(self, uid, elem, para_col_tag, count, type=0):
193
cc = self.comma_me(elem)
194
if para_col_tag[count].has_key('conditioning'):
195
new_para = self.evaluate_condition(uid, para_col_tag[count]['conditioning'], re.sub(' %','',elem))
197
return new_para + self.comma_me(elem) +'</para>' or ''
199
return para_col_tag[count]['para'] + self.comma_me(elem) +'</para>' or ''
201
return para_col_tag[count]['para'] + self.comma_me(elem) +'</para>' or ''
206
if para_col_tag[count].has_key('conditioning'):
207
new_para = self.evaluate_condition(uid, para_col_tag[count]['conditioning'], re.sub(' %','',elem))
209
return new_para + elem +'</para>' or ''
211
return para_col_tag[count]['para'] + elem +'</para>' or ''
213
return para_col_tag[count]['para'] + elem +'</para>' or ''
217
def _create_table(self, uid, model_brw, ids, fields, fields_order, results, context, title='', header = ''):
218
stylesheet = utilRML_std.stylesheet()
219
style = utilRML_std.getdefaultStyles()
220
stylesheet.addElement(style)
221
story = utilRML_std.story()
222
style_acc = utilRML_std.blockTableStyle('location_heder')
223
style_acc.setblockFont('Helvetica-Bold',{'size':'9'})
224
style_acc.setblockAlignment('LEFT')
225
style_acc.setlineStyle('LINEBELOW', 'black', {'thickness':'2','start':'0,-1', 'stop':'-1,-1'})
226
stylesheet.addElement(style_acc)
227
table_functions = {'page':model_brw.page_size,
228
'portrait' : model_brw.portrait,}
229
#table_h, style_heder = utilRML_std.getstandarReportHeader(header, table_functions)
230
#stylesheet.addElement(style_heder)
231
pageSize = 'pagesize.%s'%(table_functions['page'])
232
pageSize = eval(pageSize)
233
if table_functions['portrait']:
234
pageSize = (pageSize[1], pageSize[0])
239
strmax = (pageSize[0] - 60)
241
count = len(fields_order)
242
for i in range(0,count):
245
table = utilRML_std.blockTable()
246
table.setstyle('header')
247
table.setcolWidths('%s,%s,%s'%(strmax/3 , strmax/3, strmax/3))
248
row = utilRML_std.tr()
250
row.addElement(header[0])
251
r20 = header[1].split(',')[0]
253
row2 = utilRML_std.tr()
255
row2.addElement(header[2])
256
r21 = header[1].split(',')[1]
258
table.addElement(row)
259
table.addElement(row2)
261
row = utilRML_std.tr()
262
story.addElement(table)
263
#### adds the options
264
table = utilRML_std.blockTable()
265
table.setstyle('header-options')
266
table.setcolWidths('%s'%(strmax))
267
row = utilRML_std.tr()
268
row.addElement('<para>' + header[3] + '</para>')
269
table.addElement(row)
270
story.addElement(table)
273
row = utilRML_std.tr()
274
context = {'fontName':'Helvetica-Bold'}
275
for f in fields_order:
276
row.addElement(f, context)
279
if (fields[f]['type'] in ('float','integer')) and not (fields[f]['sum']):
281
elif (fields[f]['type'] in ('float','integer')) and (fields[f]['sum']):
283
elif (fields[f]['type'] == 'pct') and not (fields[f]['sum']):
285
elif (fields[f]['type'] == 'pct') and (fields[f]['sum']):
287
t += fields[f].get('size', 10)# / 28 + 1
289
para_col_tag.append(self.get_para_style( uid, fields[f]))
290
for pos in range(len(l)):
292
s = fields[fields_order[pos]].get('size', 10) #/ 28 + 1
293
l[pos] = strmax * s / t
295
for size in map(str,l):
299
count = len(fields_order)
300
for i in range(0,count):
302
table = utilRML_std.blockTable()
303
table.setcolWidths(nl)
304
table.setstyle('products')
305
table.setrepeatRows(1)
306
table.addElement(row)
310
row = utilRML_std.tr()
311
#node_line = etree.Element("row")
314
if elem == 'None' or elem == 'False':
317
elem = re.sub('&','', elem)
320
if temp[count] in (1,2,3,4): ####aqui van los integers y floats y pct
324
ss = float(elem or 0)
327
if temp[count] in (2 ,4):
328
tsum[count] = float(tsum[count]) + ss
329
if temp[count] in (3 , 4):
330
elem = str('%.2f'%float(elem)) + ' %'
331
row.addElement(self.add_row_element( uid, elem, para_col_tag, count, temp[count]))
333
row.addElement(self.add_row_element( uid, elem, para_col_tag, count))
334
table.addElement(row)
337
row = utilRML_std.tr()
342
for f in range(0,count+1):
345
if (tsum[f] >= 0.01) and (temp[f] == 2) :
346
prec = '%.' + str(2) + 'f'
347
total = prec%(tsum[f])
348
txt = str(total or '')
350
txt = str(tsum[f] or '')
356
prec = '%.' + str(2) + 'f'
357
total = prec%(tsum[f]/trows)
358
txt = str(total or '') + ' %'
359
row.addElement(self.add_row_element( uid, self.comma_me(txt), para_col_tag, f))
360
#row.addElement(self.comma_me(txt) or '', context)
361
table.addElement(row)
362
story.addElement(table)
364
doc = utilRML_std.document()
365
doc.setfilename(self.title)
366
template = utilRML_std.template()
367
template.settitle(self.title)
368
template.setpageSize(model_brw.page_size, model_brw.portrait)
369
template.setrotation(model_brw.rotation)
370
pageTemplate = utilRML_std.pageTemplate()
371
pageTemplate.setid('first')
372
frame = utilRML_std.frame()
373
frame.setx1(model_brw.margin_x)
374
frame.sety1(model_brw.margin_y)
375
frame.setsize(model_brw.page_size, model_brw.portrait)
376
pageGP = utilRML_std.pageGraphics()
377
if model_brw.count_pages:
378
drawString = utilRML_std.drawString()
379
drawString.sety('10')
380
drawString.setx('10')
381
drawString.addElement("Pag.: '<pageNumber/>'")
382
pageGP.addElement(drawString)
383
pageTemplate.addElement(frame)
384
pageTemplate.addElement(pageGP)
385
template.addElement(pageTemplate)
386
#template = utilRML_std.getdefaultTemplate(table_functions['page'], table_functions['portrait'])
387
doc.addElement(template)
388
doc.addElement(stylesheet)
390
rml2 = `doc` + `story` + '</document>\n'
391
self.obj = render.rml(rml2, title=self.title)
395
report_printscreen_list('report.query.print.report')
398
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: