attakatara

El sitio del código de todos python, sql, xml …

Archivo para la etiqueta “odoo”

Estructura de Reportes en Odoo

Construir una estructura básica para la generación de reportes en Odoo puede ser una tarea cuesta arriba, toda vez que la documentación oficial existente al respecto no es muy clara. Es por ello que desde esté blog haremos el esfuerzo en simplificar una receta tan válida como sencilla, un Hola Mundo!!! Reportes Odoo.

Una dependencia necesaria en esté módulo será el Motor de informes Webkit o report_webkit, el mismo se vale de wkhtmltopdf que es una libreria que ofrece capacidades de diseño basadas en html + css y a partir de el convertir a pdf. En Odoo podemos instalar el webkit tanto desde la interfaz gráfica módulos locales y seleccionar la opción instalar o como dependencia de nuestro módulo, lo cual recomendamos.

Entonces es necesario instalar la librería wkhtmltopdf en su versión 0.12.0 para lo cual dejamos enlace oficial para su descarga e instrucciones de instalación en tu sistema pulsa AQUí.

webkit

Módulko WebKit desde la interfaz gráfica de Odoo

Para agregarlo como dependencia vamos al descriptor del módulo __openerp__.py, y agregamos: “depends” : [‘report_webkit’].

Receta para el Hola Mundo Reportes:

Estructura:

  1. Carpeta reportes
  2. Carpeta views

en 1 tres archivos:

  1. __init__.py
  2. report.py
  3. report.xml

en 2 el template del reporte:  template_report.xml   Nuestra estructura debe quedar algo como esto:

estructurareport

para construir el modelo del reporte primero exportamos las librerias necesarias:

from openerp.report import report_sxw
from openerp.osv import osv

Luego declaramos la clase mandatoria (debe ir en todas las construcciones de módulos de reportes que diseñemos):

class report_nombre(report_sxw.rml_parse):
    def __init__(self,cr,uid,name,context):
        super(report_nombre,self).__init__(cr,uid,name,context)

Ahora si definimos la clase del reporte como tal:

class report_nombre_des(osv.AbstractModel):
    _name = "report.carpetamodulo.nomrep"
    _inherit = "report.abstract_report"
    _template = "carpetamodulo.nombre_des"
    _wrapped_report_class = report_nombre

Definición del reporte:

Los reportes son escritos en Html/Qweb como una vista regular en Odoo, ya recordaras que las vistas son definidas por archivos del tipo XML. En este punto es importante decir que necesitamos definir el reporte y el template del mismo.

Los reportes son definidos por una acción reporte que en XML se representa mediante la etiqueta <report  />, lo q corresponde en la estructura arriba expuesta al archivo reportes_cp.py, catun ejemplo de definición de reportes:

<?xml version="1.0"?>
    <openerp>
        <data>
            <report 
                id = "cpinv_report" 
                string = "Reporte de Inventarios" 
                model = "cp.inventario" 
                report_type = "qweb-pdf" 
                file = "cpinv_rep.cp_inv" 
                name = "cpinv_rep.cp_inv" 
                menu = "True" 
            />  
       </data>
</openerp>

Luego debemos llamar al mismo desde el archivo __init__.py : import reportes_cp, es importante recordar llamar a la carpeta reportes luego desde el __init__.py del módulo con: import reportes.

Hasta aquí tenemos los tres archivos escenciales que necesitamos en la carpeta reportes ahora debemos definir el template, que define la estructura visual de nuestro reporte, en: /modulo/views/template_report.xml:

<?xml version="1.0"?>
    <openerp>
        <data>
            <template id="cpinv_rep.cp_inv" name="Reporte de Inventarios">
                <t t-call="report.html_container">
                    <t t-foreach="docs" t-as="o">
                        <t t-call="report.external_layout">
                            <div class="page">
                                <h1>Hola Mundo Reportes </h1>
                            </div>
                        </t>
                    </t>
                 </t>
            </template>
       </data>
</openerp>

las etiquetas <t t-call>, <t t-foreach>, son propias de Qweb, en posteriores entregas profundizaremos su sintaxis y uso.

Una vez hecho esto tenemos todo para correr nuestro módulo y ver en funcionamiento el motor de generación de reportes Odoo, en posteriores publicaciones profundizaremos en el diseño, por ahora esperamos que te quede claro y de practica este “Hola Mundo!!! Reportes Odoo”, para conseguir el código usado puedes acceder:

 https://github.com/jorgescalona/cpinv_rep   

También te queremos dejar este vídeo tutorial de la gente de juventud productiva:

nota: Los reportes son generados de forma dinámica por su respectivo módulo de reportes y pueden ser accesados vía URL, por ejemplo se puede acceder un reporte Sale Order en su versión Html visitando: http://<server-address>/report/html/sale.report_saleorder/38

nota: Todos los ejemplos aplican y fueron hechos en un equipo 4.5.0-2-amd64 #1 SMP Debian 4.5.4-1 (2016-05-16) x86_64 GNU/Linux corriendo la versión 8 de Odoo.

Enlaces de Interés:

Documentación Oficial Odoo Sobre Reportes

Documentación Oficial Odoo sobre Qweb

Sitio de Wkhtmltopdf

Github con el código de ejemplo

Vídeo reporte .pdf parte 1

 

 

 

RML y QWeb motores básicos para la generación de reportes en Odoo

Este documento es de libre acceso y uso bajo los términos expuestos en la licencia: Atribución-CompartirIgual 3.0 Venezuela (CC BY-SA 3.0 VE), https://creativecommons.org/licenses/by-sa/3.0/ve/ se agrega una copia de la misma en este repositorio.

Documento referencial con fines didacticos elaborado por jorgescalona @jorgemustaine jorgescalona@riseup.net.

Luego de repasar la información que consegui en la web sobre reportes qweb en odoo me percate que la información localizada poco me ayudaba, así que decidi seguir indagando y escribir un articulo al respecto para mi bloghttp://www.attakatara.wordpress.com. La finalidad es exponer publicamente una guía para aquellos entusiastas de la programación y de está maravillosa herramienta llamada Odoo.

  • ¿Como hacer simples cambios a las cabeceras y pie de páginas de tus reportes RML?
  • La forma básica de como el framework de Odoo organiza los reportes y las formas.
  • Como modificar y hacer cambios a los reportes usando el nuevo framework de Odoo8 y el lenguaje de templates QWeb.

Lo primero que debemos hacer es loguearnos como administrador en Odoo y comenzar a editar las cabeceras y pie de página, nos vamos a configuración y seleccionamos compañias modificamos la información general y luego pasamos a la pestaña Configuración de informes, allí podremos ver el XML que se usa para crear las plantillas para los reportes. Allí Odoo nos permitirá seleccionar el formato del papel y la fuente. Para quienes esten familiarizados con RML o XML este código será muy familiar.

RML (Report Markup Language)

En versiones previas todos los documentos se construian mediante RML. Pero Odoo a evolucionado al nuevo lenguaje de plantillas QWeb, el cual es más común para plataformas moviles, websites y reportes sin embargo existen áreas para las cuales aún se utiliza RML tales como las cabeceras y pie de página. RML es un lenguaje de marcas flexible creado por ReportLab Europe Ltd. Una de sus principales caracteristicas es que produce archivos del formato PDF. este formato de ADOBE es altamente aceptado, aparte de ser un formato abierto es aceptado en muchos paises. Odoo utiliza este formato como el principal método para el intercambio de información en documentos para usuario final. RML provee la plantilla que Odoo necesita para producir los documentos. Modificando el RML podemos adaptar los reportes como más nos guste, para mayor información sobre RML consultar: http://www.reportlab.com/docs/rml2pdf-userguide.pdf

Modificando cabeceras RML

En Odoo es posible hacer cambios sin modificar los documentos en si mismo, por ejemplo podemos cambiar las cabeceras y los pies de página de nuestros reportes. Odoo expone la plantilla del reporte en configuración ya que es uno de los más frecuentes cambios requeridos. en el mismo existen tres segmentos que podemos modificar:

  1. La plantilla para documentos que tipicamente es la que se verá externamente. Encabezado RML.
  2. La plantilla para documentos y reportes que por lo general es la que se distribuye internamente. Encabezado interno RML.
  3. La plantilla para documentos horizontales. Encabezado interno RML para informes apaisado.

Realizar los cambios sobre el RML es tan fácil como identificar la etiqueta correspondiente en nuestro caso

<!--page header -->

indica el encabezado,luego editarla ejemplo localizar

<drawString x="1.3cm" y="22.9cm>;Mail</drawString>

, en la siguiente línea

<drawRightString x="7cm" y="22.9cm">[[ company.partner_id.email or '' ]]</drawRightString>

modificar [[ company.partner_id.email or '' ]] por el correo de tu compañia ya cambiaria esa referencia. hay que ser muy cuidadoso con los cambios alterar partes complejas del RML como por ejemplo company.partner_id.email pueden romper el renderizadfo de los reportes. Lo mismo aplica para el pie de página solo que esta vez identificamos la etiqueta

<!--page bottom -->

, realizamos con cuidado los cambios y guardamos.

Entendiendo los campos dinámicos en los reportes

Cuando RML es procesado el texto que está entre corchetes [[" and "]], es procesado de forma dinámica. Lo que quiere decir que el reporte no mostrará lo que textualmente está entre los corchetes sino que rellenará el mismo con información dsede el framework. Por ejemplo si el pie de página contiene [[ user.name ]] le dice al motor de reportes que lo sustituya por el valor de la referencia. Es bueno tomarse un tiempo en leer el RML e identificar este tipo de datos dinámicos. Adicionalmente esta sintaxis puede ser usada para llamar métodos python, por ejemplo: [[ display_address(company.partnert) ]].

Como Odoo organiza los reportes

En la interfaz de Odoo y como administradores podemos dirigirnos a configuración/Técnico/informes/informes, lo que desplegará una ventana con información sobre los existentes, allí podemos ver información como el modelo asosiado al informe, el tipo de acción que dispará el reporte, la plantilla del mismo y el tipo de reporte:

atta1

Cada actualización de Odoo a traido consigo mejoras en el motor de informes, sin embargo aún soporta las caracteristicas más antiguas, pero todo apunta en la actualidad al uso de plantillas QWeb.

QWeb framework

Adicionalmente al viejo formato RML la versión 8 trae consigo todo un nuevo framework dedicado a la materia de generación de informes lo que lo hace super más flexible hasta el punto de soportar dispositivos móviles. Un poderoso lenguaje de Templates llamado QWeb permite integrar la información desde Odoo para tus reportes.

Las plantillas QWeb es el principal constructor actual tanto para CMS, sitios web y porsupuesto reportes, cuando se usa como CMS genera el código HTML correspondiente para informes funciona similar pero genera un PDF, la parte importante de todo esto es saber como modificar QWeb para obtener la habilidad de crear páginas dinámicas que se conectan directamente al framework de Odoo para generar las salidas deseadas. La mejor forma de aprender es leer código ya hecho

Tecnologias relacionadas:

Fuentes consultadas:

 

 

un bug afecta el despliegue de Odoo sobre Chrome ver 50

Al parecer un bug a afectado momentaneamente el despliegue de los sistemas basados en Odoo sobre el web browser chrome en su más reciente versión #50, se pudo conocer que la gente de Odoo lanzo un fix pero que el mismo fue recogido ya que rompía Internet Explorer en Windows, se espera que en las proximas horas sea corregido dicho bug, por ahora se recomienda usar FireFox o cualquier alternativa libre de web Browser.

Recomendamos Leer los siguientes enlaces para complementar la información:

Issues en Github sobre el bug

Discusión en el grupo de spain OpenErp

domain filter odoo

domain

Al manejar grandes flujos de información nos veremos en la necesidad de exportar la misma desde la base de datos (postgresql), es característico en odoo sobre campos relacionales del tipo m2o que tengamos que filtrar ese flujo de información es allí cuando el filtro domain nos es de gran ayuda.

Una condición simple en programación puede ser: si campo1=10

Para poder expresar la misma en Odoo se utiliza una sintaxis entre tuplas del tipo ———>  (‘field_name’, ‘operator’, value), donde “field_name” ser[a un campo válido de la BD (base de datos), o bien el nombre de un objeto en el modelo. “operator” entre los cuales tenemos: =, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right (openerp/osv/expression.py), y por ultimo “value” que será un valor valido de comparación. Ahora bien nuestra condición inicial puede quedar de la siguiente manera: domain=[(‘field1′,’=’,10)] donde field1 debe coincidir con un campo en el modelo y 10 sera el valor. Aunque algunas veces podemos sustituir el value por otro campo lo que quedaria asi: domain=[(‘field1′,’=’,’field2′)] donde field1 y field2 son campos del modelo.

Otras condiciones de programación son aplicables a este filtro domain por ejemplo la AND, expresiones como: SI field1=5 y field2=10, la traducción de la misma para Odoo queda: domain = [(‘field1′,’=’,5),(‘field2′,’=’,10)],  otro ejemplo de este operador: domain = [(‘field1′,’=’,field3),(‘field1′,’=’,field3)] en el ultimo se sustituye el value por campos en el modelo.

para el operador OR: SI field1=5 or field2=10, con el filtro domain nos queda: domain = [‘|’, (‘field1′,’=’,5),(‘field2′,’=’,10)] y sustituyendo value por campos: domain = [‘|’, (‘field1′,’=’,field3),(‘field1′,’=’,field3)]

Por supuesto también es admisible el condicionamieto multiple una expresión como: SI field1 = 5 or (field2 ! = 10 and field3 = 12) quedara como: domain = [‘|’,(‘field1′,’=’,5),(‘&’,(‘field2′,’!=’,10),(‘field3′,’=’,’12’))]

Navegador de artículos