[pyar] Duda y problemas con web2py + fpdf. fpdf encuentra el tag TD pero despues dice que es NoneType

Mariano Reingart reingart en gmail.com
Lun Ene 28 12:32:06 ART 2013


2013/1/28 Leonardo M. Rocha <leo.m.rocha en gmail.com>:
> Hola Mariano,
>
> Perdon por lo desordenado del e-mail, voy escribiendo  a medida que
> voy probando cosas y mi cerebro es bastante desastroso.
>
> Tengo algunos remarks, espero que te sirvan.
>
> La documentacion sobre Templates es bastante confusa (al menos para
> mi, que habia tocado mas bien poco  y nada de web, hace casi 3 semanas
> estoy con web2py y es la primera vez que hago reportes).
> Aca http://pastebin.com/ee23cvpM hice un pequenio texto con algunas
> cosas que creo ayudarian al tutorial que espero sea util para mejorar
> la wiki

Puede ser que la documentación este confusa, en el libro de Packt
puede estar un poco más clara, pero es verdad, habría que mejorarla y
traducirla.

Te dí acceso como colaborador en la página del proyecto, por si querés
hacer los cambios directamente ;-)

> Un ejemplo copipasteable estaria bueno, el que esta le falta definir
> en la DB los campos del template (o es porque soy nuevo en esto y no
> lo encuentro).



> Respecto a eso; al archivo "invoice.csv" que se nombra en el test de :
> gluon/contrib/fpdf/template.py
> no lo encontre ( yo estaba esperando encontrar un template csv para
> retocar y ver como se comporta), pero supongo porque el archivo esta
> desactualizado y el nuevo archivo seria el que esta en el repo
> web2conf. Igual, lo encontre en la red y lo retoque.

Ups, perdón.
Suele pasar que quede algo desactualizado, avisame o directamente
podes hacer los cambios en el sitio de googlecode ;-)

> Con respecto a la validacion de los campos, hay un bug si se considera
> que la db debe validar contra todas los db engines disponibles
> keys = ('name','type','x1','y1','x2','y2','font','size',
>             'bold','italic','underline','foreground','background',
>             'align','text','priority', 'multiline')
>
> Los campos que fallan, porque estan reservados no se para cual db
> engine (no me puse a probarlos a todos) son:
> type, size y text (hice el submit the un issue en el tracker)
> Se que funciona bien para sqlite, mysql y postgres

Si, vi el issue.
Son nombres muy genéricos, una lástima que no se puedan usar en general.
Como es una plantilla, modificarlo sería facil, si tenes alguna
sugerencia de que nombres se podrían usar lo vemos.

> Con respecto a los ejemplos, hay varios desactualizados, llaman a
> "import pyfpdf", pero el modulo se llama fpdf
>
> http://code.google.com/p/pyfpdf/wiki/Templates

Si, esto es porque se cambió el esquema de directorio para hacerlo más
compatible con las herramientas de instalación de Python.
En web2py tendrían que funcionar ambas, y se podría hacer un
pseudomodulo de compatibilidad, pero no creo que haga falta.

Si querés corregirlo en la wiki, adelante, yo en estos días estoy con
otros temas, sino me lo agendo.

> los recipes: https://github.com/mdipierro/web2py-recipes-source/blob/master/apps/10_Reporting_Recipes/web2py.app.pdf.w2p
> dan error al instalar  en la ultima version del repo de web2py (no me
> puse a ver mucho porque, directamente baje las fuentes y me puse a
> verlas)

Si, hubo una mejora en web2py que rompió el tema de plantillas.

https://code.google.com/p/web2py/issues/detail?id=1255&can=1&q=fpdf

Ya estaría solucionado para la próxima versión, pero básicamente debes
cambiar la siguiente linea en template.py:

    element = element.copy()

por:

    element = dict(element)

En la próxima versión ya estaría solucionado.

> El ejemplo del badge, mas o menos sigo la idea del codigo, pero no
> encontre los templates en la base de datos, ademas que:
> ....manage/badge/auth_user da como error: "Not implemented"
> al igual que badge/sample y otros cuantos paths que probe a mano

Ok, puede que te hayas perdido en el código porque recién ayer lo
actualicé e hice unos "merge's" unificando las versiones y eso
(manage/badge es viejo, badge/ es lo mas nuevo y debería funcionar)

Un ejemplo simple y completo para crear la plantilla de una etiqueta
sería la función create_badge en aux:

https://code.google.com/p/web2conf/source/browse/controllers/aux.py#135

Más abajo podes ver create_cert y copy_labels (para general la plancha
con varias columnas y filas).

Para crear la etiqueta, directamente podes ver la función sample en badge.py:

https://code.google.com/p/web2conf/source/browse/controllers/badge.py#68

Eso debería funcionar, si no te funciona avisame y veo de armarte algo
más en concreto.


>
> El encabezado de designer de la version development lo hice funcionar,
> esta andando asi:
> #######################################################################
> import os, sys
> import wx
> import wx.lib
> import wx.lib.ogl as ogl
> try:
>     from wx.lib.wordwrap import wordwrap
> except ImportError:
>     wordwrap = lambda text, width, dc: text
>
> try:
>     from template import Template
> except ImportError:
>     # we are frozen?
>     #from pyfpdf_hg.template import Template #pyfpdf_hg is not found
>     from fpdf.template import Template

Buenisimo!
Viendo mi codigo quedo un poco viejo y con path a mi repo de
desarrollo (pyfpdf_hg ...)
Me queda como tarea limpiar eso, si querés te doy acceso de commit
para que puedas modificarlo directamente.

> #######################################################################
>
> Por si te interesa sobre mi sistema, aca te van algunos datos:
>
> Linux xxx 3.2.0-36-generic #57-Ubuntu SMP Tue Jan 8 21:44:52 UTC 2013
> x86_64 x86_64 x86_64 GNU/Linux
> Ubuntu 12.04.1 LTS \n \l
> Python 2.7.3
> wxPython instalado recientemente con easy_install

wxPython lo instalaste con easy_install y te compiló bien?
Yo estoy armando unos paquetes para wx2.9, en cuanto pueda los subo,
para Ubuntu 12.04 en adelante funcionarían.

> Bueno, por el momento espero que eso te sirva de retroalimentacion y
> haber entendido mas o menos las cosas. Ya estoy haciendo PDFs pero
> todavia no los dejo como yo quiero. Tengo un problema parseando el csv
> con el request al controller. Incluso usando el path absoluto con URL
> no logro levantarlo (puedo bajar el archivo desde el browser, pero no
> puedo  levantarlo desde codigo con:
>  f.parse_csv(URL('static/pdf_templates','basic_card.csv', scheme=True,
> host=True))
> Igual, escribi un pequenio script que modifica el csv para poder
> levantarlo derecho a la base de datos.

El ayudante URL lo debes usar solo para url en la vista.
Internamente, para ubicar archivos, tenes que usar los módulos de
python tradicionales: os.path y usar request.folder que es donde
web2py indica la ruta de la app local.
Por cierto, te conviene ubicar tus archivos internos en "private"
porque en static quedan publicados (en general)

Te paso el ejemplo que uso yo, adaptado con lo que me comentas:


def import_csv():
    import os, csv
    from gluon.contrib.pyfpdf import Template

    if request.args:
        template_id = request.args[0]
    else:
        template_id = -1   # cambiar!!!!!

    infile = os.path.join(request.folder, 'static', 'pdf_templates',
'basic_card.csv')

    f = Template()
    db(db.pdf_element.pdf_template_id==template_id).delete()
    f.parse_csv(infile=infile, delimiter=";", decimal_sep=",")
    for k,v in f.elements.items():
        v['align'] = {'I':'L','D':'R','C':'C','':''}.get(v['align'], 'L')
        v['text'] =v['text'] and
v['text'].decode("latin1").encode("utf8", 'replace')
        v['pdf_template_id'] = template_id
        db.pdf_element.insert(**v)


Puede que tengas que adaptar algo, en cuanto pueda le agrego un form de upload.

> Saludos,
>
> Leo
>

Gracias por la colaboración y sirve mucho el feedback!

Cualquier cosa avisame,

Sds

Mariano Reingart
http://www.sistemasagiles.com.ar
http://reingart.blogspot.com



More information about the pyar mailing list