attakatara

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

Archivar para el mes “mayo, 2016”

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

 

 

 

Crud + Sql, fácil en Python

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 didácticos elaborado por jorgescalona @jorgemustaine jorgescalona@riseup.net.

Crud + Sql, fácil en Python

Crud es un acrónimo inglés (Create, Read, Update and Delete) que al español seria: Crear, Leer, Actualizar y Borrar, y lo que describe son las operaciones básicas que se pueden hacer sobre una base de datos. Sql (Structure Query Language), es un lenguaje declarativo de acceso a bases de datos relacionales. Nuestro articulo versa sobre como realizar las operaciones crud con python. Para este caso usamos sqlite3 como sistema de gestión de base de datos relacional.

Preparación del entorno python

Lo primero que debemos hacer es importar la libreria correspondiente con:

import sqlite3

(en el caso de postgresql seria: import pg). Luego se debe crear una conexión a la base de datos sobre la que actuaremos, ejemplo:

conn=sqlite3.connet('bd.sqlite')

, esto crea una instancia conn que llama al método connect de la libreria sqlite3. Ahora necesitamos crear el cursor ejemplo:

cur=conn.cursor

, esto crea una nueva instancia cur que llama al método cursor, esto nos permite ejecutar sentencias sql desde python con la siguiente sintaxis: cur.execute(”’ sentencia sql ”’ ), una vez finalizadas las operaciones sobre la base de datos es necesario cerrar el socket abierto en la interacción con: cur.close().

Operaciones crud

Crear una tabla en la bd:

CREATE TABLE users(name VARCHAR(128), email VARCHAR(128))

Crea una tabla user con los campos name y email del tipo varchar y de longitud 128 cada uno.

Insertar registros en la bd:

INSERT INTO users(name,email) values('jorge','jorge@dominio')

Inserta en la tabla users y los campos name y email los valores en la tupla values.

Eliminar registros en la bd:

DELETE FROM users WHERE email='jorge@dominio'

Elimina de la tabla user el registro coincidente con la expresión que le sigue a WHERE.

Modificar registros de la bd:

UPDATE users SET name='pedro' WHERE email='jorge@dominio'

Actualiza la tabla user y sustituye el valor del campo name para el registro coincidente con la condición despues del WHERE.

Listar o leer registros de la bd:

SELECT * FROM users

Lee todas las columnas de la tabla users

SELECT * FROM users WHERE email='jorge@dominio'

lee las columnas que conincidan con la condición luego del WHERE.

SELECT * FROM users ORDER BY email

Lista todas las columnas de la tabla users y las ordena por el campo email.

Ejemplos de scrpits en python que interactuan con bd sqlite:

import sqlite3

conn = sqlite3.connect('music.sqlite')
cur = conn.cursor()

cur.execute('DROP TABLE IF EXISTS Tracks ')
cur.execute('CREATE TABLE Tracks (title TEXT, plays INTEGER)')

conn.close()

En el script podemos ver que importa la librería para luego crear una conexión conn la base de datos music.sqlite, luego sirviendonos del cursor eliminamos la tabla tracks de existir con la instrucción sql DROP y luego crea la tabla Tracks, finaliza el script cerrando el socket, sencillo verdad 🙂

Un ejemplo más:

import sqlite3

conn = sqlite3.connect('music.sqlite')
cur = conn.cursor()

cur.execute('INSERT INTO Tracks (title, plays) VALUES ( ?, ? )', ( 'Thunderstruck', 20 ) )
cur.execute('INSERT INTO Tracks (title, plays) VALUES ( ?, ? )', ( 'My Way', 15 ) )
conn.commit()

print 'Tracks:'
cur.execute('SELECT title, plays FROM Tracks')
for row in cur:
     print row

cur.close()

Este ultimo inserta valores en la tabla Tracks y luego los lista haciendo uso de las sentencias sql INSERT y SELECT.

Enlaces consultados:

Enlaces recomendados:

Hablemos de SL en VE

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 didácticos elaborado por jorgescalona @jorgemustaine jorgescalona@riseup.net.

Hablemos de SL en VE

A veces es necesario volver sobre lo fundamental. Tal aseveración se la hice a un compañero en un grupo de discusión ya que ultimamente me he topado dentro de las comunidades de tecnologías libres (tanto de software como de hardware), con personas, proyectos y tecnologías que toman el epíteto de ser libres. Es apreciable también el halago casi automático por la cantidad más no por el fondo de los proyectos, de allí me surge una gran inquietud y comienzo a preguntar:

  • ¿Es tu proyecto libre?
  • ¿Bajo que licencia lo distribuyes?
  • ¿Dónde consigo el repo de tus aportes?
  • ¿Cómo se licencia el software, el hardware o los documentos?
  • ¿Estás trabajando en algo? ¿En qué?

Para mi sorpresa las respuestas han sido variopintas y diversas dentro de una comunidad que se supone cohesionada en pensamiento, en criterios y en saber. Incluso posturas defensivas como si de un ataque personal se tratase.

¿Cómo se supone que defendamos las tecnologías libres si desconocemos los procesos implícitos en ella?, ¿Cómo se supone que no pueda identificar lo que es libre y lo que no?, interrogantes que inexorablemente me devuelven al comentario inicial: debemos volver sobre lo fundamental y luego predicar con el ejemplo. Es fuerte ver como te piden haz RT de tal hecho para apoyar el SL, pero cuando vas a revisar no consigues documentación o código alguno en ninguna parte, déjenme decirle eso no es libre.

Richard-Stallman-640

En el libro “Software Libre para una sociedad libre” de Richard Stallman el mismo asevera:

“Un programa es Software Libre siempre que, como usuario particular, tengas:

  • La libertad de ejecutar el programa sea cual sea el propósito.
  • La libertad de modificar el programa para ajustarlo a tus necesidades. (Para que se trate de una libertad efectiva en la práctica, deberás tener el acceso al código fuente, dado que sin él la tarea de incorporar cambios en un programa es extremadamente dificil).
  • La libertad de redistribuir copias, ya sea de forma gratuita, ya sea a cambio del pago de un precio.
  • La libertad de distribuir versiones modificadas del programa, de tal forma que la comunidad pueda aprovechar las mejoras introducidas.”

Entonces entendemos que mientras no libere no es tecnología libre, ir a un blog y ejemplificar como es la sintaxis o explicar el workflow de mi programa no es liberar su código, no señor. En el caso de Hardware también existen licencias, debo liberar los esquemáticos, etc. Existen normas al respecto y no se tratá de mera burocracia tecnológica como también me argumentaron por allí, es que deben existir unos requisitos mínimos para poder liberar mi trabajo, es tan sencillo como eso, los cumplo fino, no los cumplo entonces digo: “hice tecnología basada en software o hardware libre, pero que no es libre por arte de magía o por que no es mi pretensión que lo sea”, esto es más honesto, a pretender disfrazarlo con el remoquete: tecnología libre— compa tu y yo sabemos: ¡No lo es!.

No todo es así para cada regla están las excepciones y de allí podemos destacar el ejemplo de la gente de canaima (tienen repo aunque hace un rato no hacen commits sobre el, lo importante es que liberaron), Industrias DIANA y el SISB (Sistema ERP Libre y también con repos a disposición)

En la “catedral y el bazar” (1997), es un ensayo a favor del software de código abierto de Eric S. Raymond ya nos explicaba que existen dos formas básicas de desarrollo. Uno convencional o estilo de desarrollo cerrado el cual denominó como “Catedral”, y luego compará lo que pasó con el desarrollo de Gnu/Linux a nivel global y lo denominó “Bazar”, en el vislumbro técnicas de igual a igual con períodos de publicación muy cortos y constantes solicitud de retroalimentación de personas que están fuera del proyecto, luego de un proceso de observación de este fenómeno Eric concluye: “… cambiar las ventajas del desarrollo convencionalmente cerrado, por esa única ventaja de la crítica masiva independiente del igual, realmente parecía ganar, parecía obtener buenos resultados…”.

Siguiendo el enunciado de raymond veo con tristeza como los cargos convierten a nuestros entusiastas en avataras de Catedrales Institucionales, cerrando proyectos, no liberando ni una coma de nada, pero si montando más de una foto en los rincones de su Catedral en mesas de trabajo que no llegan a nada o por lo menos no lo comparten que es lo mismo. Y es que ser bazar entonces es superar el simple hecho comunicacional 2.0 del “Estamos reunidos con fulano en su Catedral”, por el hemos liberado estos documentos por que queremos el aporte popular sobre los mismos, o mejor hemos puesto a disposición de todos la infraestructura y los repositorios de las tecnologías que estamos desarrollando.

Necesario es destacar que bajo el modelo de bazar se han implementado proyectos tan exitosos como el kernel de linux (por sólo nombrar el más emblemático), citando a Raymond, “mientras más gente sea co-participe de mis proyectos entonces éste debe ser más exitoso”, pero al parecer la consigna institucional es el celo y el velo, lo que nos hace redundar en esfuerzos y no finalizar nada en lo tangible.

El presidente hace poco anuncia la adquisición de un software para hacer más eficiente la recaudación en un convenio con Ecuador, y me pregunto: ¿quién determinará si es libre o no dicha tecnología?. Evidentemente no será la comunidad, ni los colectivos ni el poder popular; pero si nos toca alzar la voz de protesta ¿Con qué argumentos lo haremos? ¿Con qué ejemplo Lo haremos? y éticamente cabe preguntarnos ¿Qué he liberado yo? ¿Con qué ejemplo pido rectificación? ¿con qué aporte niego un segundo genexus?.

Allí se los dejo sólo pa la reflexión mis compas.

Enlaces de Interes relacionados:

Xpath (módulo python)

Xpath es un módulo que es parte de la librería xml.etree.ElementTree por lo general la misma se importa de la siguiente manera:

 import xml.etree.ElementTree as ET 

Xpath provee una serie de expresiones para localizar elementos en un árbol, su finalidad es proporcionar un conjunto de sintaxis, por lo que debido a su limitado alcance no se considera un motor en si mismo.

Ejemplos de uso de Xpath:

 
import xml.etree.ElementTree as ET

root = ET.fromstring(docxml)

# Elementos de nivel superior
root.findall(".")

# todos los hijos de neighbor o nietos de country en el nivel superior
root.findall("./country/neighbor")

# Nodos xml con name='Singapore' que sean hijos de 'year'
root.findall(".//year/..[@name='Singapore']")

# nodos 'year' que son hijos de etiquetas xml cuyo name='Singapore'
root.findall(".//*[@name='Singapore']/year")

# todos los nodos 'neighbor'que son el segundo hijo de su padre
root.findall(".//neighbor[2]") 

Como vemos nos permite extraer facilmente partes del xml haciendo referencia a su ubicación nodal representada a forma de path, lo que nos hace una sintaxis familiarmente sencilla a la hora de construir un paser xml.

Xpath Sintaxis:

SINTAXIS Descripción
tag Selecciona todos los elementos hijos contenidos en la etiqueta “tag”, Por ejemplo: spam, selecciona todos los elementos hijos de la etiqueta spam y así sucesivamente en un path de nodos spam/egg, /spam/egg/milk
* Selecciona todos los elementos hijos. Ejemplo: */egg, seleccionara todos los elementos nietos bajo la etiqueta egg
. Selecciona el nodo actual, este es muy usado en el inicio del path, para indicar que es un path relativo.
// Selecciona todos los sub elementos de todos los niveles bajo el nodo expresado. Por ejemplo: .//egg selecciona todos los elementos bajo egg a través de todo el arbol bajo la etiqueta
.. Selecciona el elemento padre
[@attrib] Selecciona todos los elementos que contienen el atributo tras el “@”
[@attrib=’value’] Seleccione todos los elementos para los cuales el atributo dado tenga un valor dado, el valor no puede contener comillas
[tag] Selecciona todos los elementos que contienen una etiqueta hijo llamada tag. Solo los hijos inmediatos son admitidos
[tag=’text’] Selecciona todos los elementos que tienen una etiqueta hijo llamada tag incluyendo descendientes que sean igual al texto dado
[position] Selecciona todos los elementos que se encuentran en la posición dada. La posición puede contener un entero siendo 1 la primera posición, la expresión last( ) para la ultima, o la posición relativa con respecto a la ultima posición last( )-1

notas: las expresiones entre corchetes deben ser precedidas por un nombre de etiquta, un astertisco u otro comodín. Las referencias a position deben ser precedidas por una etiqueta xml válida.

Ejemplo de uso de Xpath dentro de una sentencia xml:

 
<xpath expr="//field[@name]='is_done'" position="before">
    <field name="date_deadline" />
</xpath>

 

Enlaces consultados:

  1. referencia oficial de python sobre XPath 
  2. Documentación Odoo en español de Bachaco-VE, cápitulo 3

 

 

 

 

Navegador de artículos