I am looking at the source code. Is this really one single file
(pollyreports.py)? I cannot find a single import in there and I cannot find
the word "pdf" in there either. Is that really the files that generates the
PDF?
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
>
--