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

-- 



Attachment: ventas.pdf
Description: Adobe PDF document

Reply via email to