This is really nice. I would like to see it compares with fpdf (which now
ships with web2py).
I also suggest you post this example on web2pyslices so it does not get
lost. It will be valuable to others.
Here it will get lost.
massimo
On Saturday, 22 September 2012 07:21:41 UTC-5, Jose wrote:
>
> Hi
>
> This is PollyReport [1] y [2].
>
> You can use downloading PollyReport.py and copying the file to the
> directory site-packages web2py or installed directly on the system.
>
> This is a small example based on the author's tutorial:
>
> Model
>
> tb_tiposclientes = db.define_table('tiposclientes',
> Field('tipo', length=10),
> format='%(tipo)s'
> )
>
> tb_clientes = db.define_table('clientes',
> Field('tipo', tb_tiposclientes),
> Field('nors', length=50),
> Field('domicilio'),
> format='%(nors)s'
> )
>
> tb_ventas = db.define_table('ventas',
> Field('fecha', 'date'),
> Field('cliente', tb_clientes),
> Field('total', 'double'),
> )
>
> if db(tb_clientes).isempty():
> from gluon.contrib.populate import populate
> tb_tiposclientes.insert(tipo='AAAA')
> tb_tiposclientes.insert(tipo='BBBB')
> tb_tiposclientes.insert(tipo='CCCC')
> populate(tb_clientes,12)
> populate(tb_ventas,100)
>
>
>
> class Ventas(object):
> def iva(self):
> return self.ventas.total*0.21
> tb_ventas.virtualfields.append(Ventas())
>
>
> Controlller
>
> import os
> from reportlab.pdfgen.canvas import Canvas
> from reportlab.lib.pagesizes import landscape, portrait, A4, A5
> from PollyReports import *
>
> def ventas():
> import os
> import urllib2
> #import urlparse
> from cStringIO import StringIO
> from reportlab.lib.utils import ImageReader
>
> rel_tipo = (tb_clientes.tipo==tb_tiposclientes.id)
> rel_cliente = (tb_ventas.cliente==tb_clientes.id)
>
> data = db(rel_tipo & rel_cliente).select(
> tb_tiposclientes.tipo,
> tb_clientes.nors,
> tb_ventas.fecha,
> tb_ventas.total,
> orderby=[tb_tiposclientes.tipo|tb_clientes.nors]
> ).as_list()
>
>
> rpt = Report(data)
>
> tiposclientes_tipo = lambda x: x['tiposclientes']['tipo']
> clientes_nors = lambda x: x['clientes']['nors']
> ventas_total = lambda x: x['ventas']['total']
> ventas_iva = lambda x: x['ventas']['iva']
> ventas_fecha = lambda x: x['ventas']['fecha']
>
> data = urllib2.urlopen('
> http://www.python.org/images/python-logo.gif').read()
> buffer = StringIO(data)
> image = ImageReader(buffer)
>
> #Titulo
> rpt.titleband = Band([
> Element((300, 0), ("Times-Bold", 26), text = "Informe de Ventas",
> align="center"),
> Element((300, 25), ("Times-Bold", 18), text = "Período 2010-2012",
> align="center"),
> #Image((36, 0), 120, 43, text='/home/jose/borro/freebsd.jpg'),
>
> Image((36, 0), 120, 43, text=image),
> ])
>
> #Cabecera de página
> rpt.pageheader = Band([
> Element((36, 0), ("Times-Bold", 20), text = "Ventas"),
> Element((36, 24), ("Helvetica", 12), text = "Fecha"),
> Element((100, 24), ("Helvetica", 12), text = "Nombre o Razón
> Social"),
> Element((500, 24), ("Helvetica", 12), text = "IVA", align =
> "right"),
> Element((600, 24), ("Helvetica", 12), text = "Total", align =
> "right"),
> Rule((36, 42), 7.5*75, thickness = 2),
> ])
>
> #Cabecera de grupo (se agrupará por nombre de cliente)
> rpt.groupheaders = [
> #Agrupo primero por tipo de cliente
> Band([
> Rule((36, 20), 7.5*72),
> Element((36, 4), ("Helvetica-Bold", 13), getvalue =
> tiposclientes_tipo, format = lambda x: "Clientes tipo %s" % x),
> ],
> getvalue = tiposclientes_tipo
> ),
>
> #y luego por nombre de cliente
> Band([
> Rule((36, 20), 7.5*72),
> Element((36, 4), ("Helvetica-Bold", 12), getvalue =
> clientes_nors),
> ],
> getvalue = clientes_nors
> )
> ]
>
> #Pie de grupo (se sumariza por cliente)
> rpt.groupfooters = [
> #sumarizo por nombre de cliente
> Band([
> Rule((500, 4), 100),
> Element((36, 4), ("Helvetica-Bold", 12), getvalue =
> clientes_nors, format = lambda x: "Total de %s" % x),
> SumElement((600, 4), ("Helvetica-Bold", 12), getvalue =
> ventas_total, align = "right", format=lambda x:'$%0.2f'%x),
> ],
> getvalue = clientes_nors,
> ),
>
> #sumarizo por tipo de cliente
> Band([
> Rule((500, 4), 100),
> Element((36, 4), ("Helvetica-Bold", 13), getvalue =
> tiposclientes_tipo, format = lambda x: "Total para clientes tipo %s" % x),
> SumElement((600, 4), ("Helvetica-Bold", 12), getvalue =
> ventas_total, align = "right", format=lambda x:'$%0.2f'%x),
> ],
> getvalue = tiposclientes_tipo,
> #Inserto una nueva página luego de sumarizar
> newpageafter = True,
> ),
> ]
>
> #Detalle
> rpt.detailband = Band([
> Element((36, 0), ("Helvetica", 10), getvalue = ventas_fecha),
>
> Element((500, 0), ("Helvetica", 10), getvalue = ventas_iva, align
> = "right", format=lambda x:'$%0.2f'%x),
> Element((600, 0), ("Helvetica", 10), getvalue = ventas_total,
> align = "right", format=lambda x:'$%0.2f'%x),
> ])
>
> #Total de ventas
> rpt.reportfooter = Band([
> Rule((450, 4), 72),
> Element((400, 4), ("Helvetica-Bold", 12), text = "Total General"),
> SumElement((600, 4), ("Helvetica-Bold", 12), getvalue =
> ventas_total, align = "right", format=lambda x:'$%0.2f'%x),
> ])
>
> #Pie de página
> rpt.pagefooter = Band([
> Element((72*8, 0), ("Times-Bold", 18), text = "Ejemplo de Pie de
> Página", align = "right"),
> Element((36, 16), ("Helvetica-Bold", 12), sysvar = "pagenumber",
> format = lambda x: "Página %d" % x),
> ])
>
> _buffer = StringIO()
>
> canvas = Canvas(_buffer, pagesize=landscape(A4))
> canvas.setTitle('Prueba con url imagen')
> rpt.generate(canvas)
> canvas.save()
>
> response.headers['Content-Type']='application/pdf'
> response.headers['Content-Disposition'] = 'attachment;
> filename=ventas.pdf'
>
> return _buffer.getvalue()
>
> attached the pdf output.
>
> José
>
> [1] https://github.com/Solomoriah/PollyReports
> [2] http://pypi.python.org/pypi/PollyReports
>
--