attakatara

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

Expresiones Regulares

 Son patrones de texto mediantes los cuales se pueden optimizar actividades de busqueda y reconocimiento de segmentos de cadenas de caracteres en un archivo especifico o en un conjunto de ellos. Algunos ejemplos de lo que puede hacerse con re son cosas como:

  • Comprobar o validar que una entrada en un formulario HTML sea una dirección de correo electrónico válida.
  • Inspeccionar si un patrón de texto aparece en un archivo. esto puede ser l busqued de una palabra o un porción de la misma en un documento.
  • Extraer porciones de texto de un documento. Ej: extraer el código postal de una dirección.
  • Reemplazar partes de un texto. Ej: Cambiar «Azúl» por «Rojo» en un documento.

Como podemos apreciar la aplicabilidad es extensa pero la agilidad obtenida en l manipulación de grandes porciones de archivos es una compensación hasta adictiva para todos aquellos que pretendan automatizar tareas rutinarias, que de otra mnera serian tediosamente largas y en la práctica una sincera perdida de tiempo. Las re son independientes del lenguaje que se este usando.

Antecedentes:

  • Warren McCulloch and Walter Pitts NeuroFísicos publicaron «A logical calculus of the ideas immanent in nervous activity.» (1943). Este paper no solo representa el inicio de las re sino que también propone el primer modelo matemático para redes neuronales.
  • Stephen Kleene, escribió el paper «Representation of events in nerve nets and finite automata» (1956), donde acuñó los terminos regular sets y regular expressions.
  • Doce años después un ingeniero publica: «Regular Expression Search Algorithm» Ken Thompson (1968), Ken es conocido por ser diseñador e implementador en UNIX del lenguaje B, el UTF-8, entre otros trabajos.
  • El próximo hito importante fue la introducción de una biblioteca no propietaria de regex por Henry Spence y más tarde la creación del lenguaje de guiones PERL por Larry Wall. PERL agregó muchas modificaciones a la sintaxis de regex creando lo que se conoce como «Perl Flavor» o los sabores de perl. Muchas de las implementaciones posteriores en el resto de los lenguajes se basan en el perl flavor.
  • la IEEE a través del estandar POSIX intentó un mejor soporte Unicode para regex esto se conoce como el «POSIX flavor».
  • Ahora mismo python posee un módulo para regex que soporta el estilo perl Documentación python regex module. Además del ya archi conocido modulo estandar para python2 y python3.

Definiciones:

Una Regex es un patrón de texto que consiste en caracteres ordinarios precedidos por «/» y metcarateres precedidos por «\».

Metacaracteres:
Caracteres con un significado especial para las búsquedas. Tienen un significado especial cuando se utilizan en una expresión de búsqueda.

Comienzo y final de una línea: El «^» (acento circunflejo) hace referencia al comienzo de la línea en una búsqueda y el «$» (signo dólar) tiene referencia con el final de la línea.

 

/^www/
/$com/

 

Comodines: Regex tiene muchos aspectos heredados de [ed](https://es.wikipedia.org/wiki/Ed_(Unix) recordar cada uno de ellos se torna dificil, porque el significado de un simbolo depende de dónde se utilice en una expresión. Por ejemplo, en modo de entrada un punto «.» (punto) es simplemente un carácter ordinario de texto, salvo que se encuentre sólo en una línea, en cuyo caso significa «vuelve al modo orden». En modo orden, el «.» significa «cualquier carácter». Así, la orden:

/a..b/

significa «encuentra una a y una b separadas por tres caracteres cualesquiera». La orden:

/./

significa «encuentra cualquier carácter» (excepto un carácter de nueva-línea). Cuando el «.» punto aparece en el lado derecho de una expresión de sustitución, significa «un punto». Esto puede combinarse en una única orden:

.s/././

Esta orden muestra todos los significados de un «.» en una expresión. El primer «.» significa «en la línea actual sustituya (para cualquier carácter) un punto (.)» por Ejemplo:

p
Buenos días
s/././
.uenos días

El * (asterisco). «Tantas ocurrencias como ocurran incluyendo ninguna». Así la orden:

> s/xx*/y/

da instrucciones que en ed sustituyen dos o más ocurrencias de «x» por una única «y». La orden:

> s/x.*y/Y

significa «sustituye el carácter Y por cualquier cadena que comience por una «x» y finalice con una «y» separadas por cualquier número de caracteres». Las cadenas «xqwertyy», «xasdy» y «xy» serían sustituidas por «Y».

Recomendación: Todos estos ejemplos se pueden ejecutar desde el shell con la instrucción [«sed»](https://es.wikipedia.org/wiki/Sed_(inform%C3%A1tica) texto simple por ejemplo:

> sed -i 's/x.*y/Y/' ejemplo.txt

El & (ampersand). el & es una abreviación que ahorra mucha escritura. Supongamos que se quiere cambiar:

> Este proyecto ha sido un éxito.

por

> (Este proyecto ha sido un éxito.)

Podría utilizar la orden

s/Este proyecto ha sido un éxito./(Este proyecto ha sido un éxito.)/

Pero utilizando «&» se simplifica a:

> s/Este proyecto ha sido un éxito./(&)/

Clases de caracteres en la búsqueda:[]

Se pueden especificar clases de cosas a buscar, para lo cual se usa «[]» por ejemplo:

> [xy]

representa a la clase de letras minúsculas que son «x» o «z» de está forma:

> /[xz]/

buscará la siguiente «x» o la siguiente «z» de la expresión.

> [fF]

«f» en minúsculas o mayúsculas, en consecuencia la orden de búsqueda:

> /[fF]reddy/

encontrará a «freddy» y «Freddy». La expresión:

> [0123456789]

buscará cualquier dígito, pero se puede simplicar con:

> [0-9]

que representá toodos los caracteres en el rango «0» al «9». La orden quedará:

> /[0-9]/

ahora:

> [A-Z]

representa todos los caracteres del rango de la «A» a la «Z». para definir un caracter que no se encuentr en está clase utilizar el «^» circunflejo entre los corchetes «[^]» lo cual representa cualquier carácter no incluido en los corchetes. la expresión siguiente:

> [^0-9]

representa cualquier carácter que no este entre «0» y «9»; en otras palabras, cualquier carácter que no sea un dígito.

caracteres especiales en Regex Tabla 1

Carácter Significado
«.» Cualquier carácter distinto de nueva línea.
«*» Cero o más ocurreencias del caracter anterior.
«.*» Cero o más ocurrencias de cualquier carácter.
«^» Comienzo de línea.
«$» Final de línea.
«[–]» Identifica a la clase de caracteres definida entre corchetes.
«[^–]» Identifica a cualquier carácter no incluido en la clase definida entre corchetes.
«\» Caraćter de escape; trata al siguiente carácter, «X» como una X literal

Desactivación de caracteres especiales:

Los caracteres $ [] * son parte de la sintaxis de las Regex, todos tienen un significado especial en las búsquedas. Vea la Tabla 1. Ahora bien ¿qué pasa si queremos buscar uno de esos caracteres en un archivo? ¿qué ocurre si se necesita encontrar el «$» en una memoria? El carácter «\» Backslash se utiliza par desactivar ese significado especial de los metacaracteres. Un metacarácter precedido de un \ significá el carácter literal. Si usted teclea:

> / . /

el interprete buscaría cualquier carácter, la siguiente orden, sin embargo:

> / \ . /

busca un punto «.» literalmente y no cualquier carácter. La siguiente orden:

> / \ * /

busca un * literalmente. Y por supuesto:

> / \ \ /

busca un «\» Backslash literal. y

> / \ $ /

busca un «$»

Estos patrones de busqueda pueden ser usados de distintas formas uno de los usos que particularmente le doy es con grep (dato curioso el nombre de este comando viene de la forma que tiene el editor ed para las busquedas g/re/p o global/regular expression/print), que es una utilidad de UNIX para desde la shell ubicar una línea en un archivo específico que coincida con un patrón un ejemplo sería:

> grep -InRi '^[mM]*ay' mbox.txt
> 54165:May have missed an end tag

en el anterior obtengo una lista númerada de las líneas dentro del archivo mbox.txt que coinciden con la expresión regular entre comillas simples. Espero que ya te estes percatando del poder de las Regex. Otra buena idea es usar guiones (scripts) para sed o ed, con lo cual podemos realizar tareas super rápidas de modificación sobre archivos si quieres profundizar sobre el tema recomiendo el siguiente enlace.

 

 

¿Cómo se come Xpath?

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.

verlo en GitHub

Xpath

Xpath es un estandar para el lenguaje de path en XML. Existe desde hace más de 15 años y se conocen 3 versiones:

  • Xpath 1.0, como una recomendación de W3C el 16 de Noviembre de 1999. Es muy básica con respecto a sus sucesoras, solo soportaba 4 tipos de datos: node, booleam, number, string y un compendio reducido de funciones pre construida para ser exactos solo 27.
  • Xpath 2.0, como una recomendación de W3C el 23 de Enero de 2007. Se considera un gran avance se introdujo en está versión un sistema de tipado general que soportaba cerca de 50 tipos, nuevos operadores y una biblioteca de funciones integrada con más de 100 funciones. Se introduce el concepto de secuencias, todos los valores de uns expresión Xpath 2.0 es una secuencia. Conjuntos de nodos en la ver 1.0 fueron reemplazados con Secuencias de nodos en la ver 3.0.
  • Xpath 3.0, como una recomendación de W3C el 8 de Abril de 2014. Introduce nuevos tipos, operadores y más de 200 funciones nuevas. El más significativo aporte de la versiuón es la recursividad de funciones pudiendo ahora una función ser pasada a otra como argumento o retornar una función. Y permite escribir funciones propias del desarrollador inline functions, o crear su propias librerias de funciones.

con Xpath es posible identificar partes del documento XML y también ejecutar computos sobre esa data.

Expresiones (expresions)

es el principal bloque de construcción en Xpath, una expresión es un simple string de caracteres unicode hecho de palabras claves, simbolos y operadores.

Secuencias (sequences)

Son muy importantes en Xpath ya que cada expresión retorna una secuencia. Así una secuencia es una simple colección de items que pueden ir desde cero o más de ellos. Una secuencia sin items o vacía se conoce como: secuencia vacía (empty sequence). Una secuencia con un item simple es conocida como secuencia simple (singleton sequence). a partir de Xpath 3.0 un item en una secuencia puede ser un nodo, un valor atómico (atomic value), o una función. De esta manera Xpath 3.0 define 7 tipos de nodos:

  1. documento (document).
  2. element.
  3. attribute.
  4. namespace.
  5. procesing instruction.
  6. comment.
  7. text.

Un valor atómico es un valor permitido de un conjunto de valores para un tipo atómico en particular. Los tipos atómicos son todos los tipos que se derivan de forma directa o indirecta de xs:anyAtomicType.Como se especifica en el diagrama de herencia de tipos de datos para XML Schema 1.1:

La función es un nuevo tipo de item. En Xpath 2.0 un item en una secuencia solo podía ser un nodo o un valor atómico. En Xpath 3.0 puede ser un nodo, un valor atómico o una función.

Ubicación de la ruta (path)

Ubicar rutas es Xpath es muy similar a usar la notación de path para archivos en el sistema de archivos que usemos y al igual que este ultimo tenemos rutas relativas y absolutas, donde una ruta absoluta siempre es evaluada desde la raiz del arbol «/» y una ruta relativa se referencia a un nodo en especifico. la raiz del documento «/» es el nivel más alto del XML y es el contenedor de todos los nodos que lo componen inclusive el mismo. Una ruta absoluta también puede empezar con: «//» (lo que se refiere a todos los subnodos de la raiz) lo que es distinto a «/» (se refiere a la raiz, todo el documento, incluyendo nodos, expresiones y/o funciones). Una ruta relativa es siempre evaluada desde el contexto de un nodo. Ejemplo:

office/employee/first_name[.=’John’]

El nodo contextual en el que esta evaluada está expresión es ‘company’ que es la raiz del archivo company_1.xml, el elemento padre es ‘office’. El elemento contextual puede cambiar durante la evaluación de la expresión como lo indica el caracter punto ‘.’ en este caso es usado para indicar el nodo contextual ‘first_name’ de esta forma se compara el valor de este nodo con el string ‘John’.

Steps

Una ruta de path contiene uno o más steps. Un step está compuesto de:

  1. una axis. Es la primera parte de una ubicación step la que determina la dirección a navegar con respecto de un nodo particular. Existen 13 diferentes axisas pertenecientes a dos grupos: forward axis (estás retornan en el mismo orden que se encuentran en el documento XML) o *reverse axis (retornan de forma inversa al documento XML). Se usa «::» para separar la axisa especifica del node test. *
  2. un node test. Aparece inmediatamente despues de la axis y pueden ser de tres tipos: por nombre, por kind o por tipo.
  3. Cero o más predicates.

axis::node_test[predicate]

child::office[@location='Viena']

Está ultima expresión selecciona desde el nodo contextual todos los elementos hijos de ‘office’ que tengan un atributo llamado ‘location’ que a su vez sea igual a ‘Vienna’.

Algunas Forward Axis:

  • child
  • descendant
  • attribute
  • self
  • desendant-or-self
  • following-sibling
  • following
  • namespace

Algunas Reverse Axis:

  • parent
  • ancestor
  • preceding-sibling
  • preceding
  • ancestor-or-self

Ejemplo:

child::office

Está expresión Xpath es una ruta relativa la cual selecciona todos los elementos hijos del nodo contextual ‘office’.

node test

  • by name:officeEstá expresión Xpath contiene un nombre de nodo ‘office’ el cual selecciona todos los elementos hijos (de ese nodo contextual en especifico). Por eso no se especifica axisa alguna. La axisa child es asumida por defecto y es por ello que el principal tipo de nodo es la axisa child.@locationEsta expresión Xpath selecciona el atributo llamado ‘location’ del nodo contextual. la forma abreviada de la axisa ‘attribute’ es ‘@’.
  • by kind:los kind que se pueden aplicar a un nodo son:
    • document-node()
    • element()
    • attribute()
    • schema-element()
    • schema-attribute()
    • processing-instruction()
    • comment()
    • text()
    • namespace-node()
    • node()

    Ejemplos:

    //attribute()

    Esta expresión Xpath selecciona todos los atributos nodales en el documento XML (independientemente del nombre o el tipo). El doble slash al principio de la expresión es la forma corta de la axisa ‘descendant-or-self’.

    //element()

    Esta expresión Xpath selecciona todos los elementos del documento XML (independientemente del nombre o el tipo).

    //*

    Esta Expresión Xpath es el equivalente del ejemplo anterior. En esta forma abreviada el comodín ‘*’ es usado para denotar los elementos nodales.

  • by type:Los tipos de nodos que pueden ser evaluados son cualquiera de los presentados en la tabla de built-in Schema datatypes (arriba expuesta), como también cualquier tipo definido por el usuario o tipos complejos. Ejemplo://element(*,xs:date)El primer argumento de la función en esta expresión Xpath es el nombre del nodo y el segundo argumento es el tipo. El asterisco es usado en el primer argumento y denota ‘cualquier nombre’. La expresión selecciona todos los elementos del documento XML (insistintamente del nombre de elemento) los cuales tengan como tipo ‘xs:date’.

Predicates

Los predicados son usados para encontrar un nodo especifico o un nodo que contiene valores especificos. Estos siempre estan embebidos entre corchetes. Ejemplos:

Path Expression Result
/bookstore/book[1] selecciona el primer elemento ‘book’ que es hijo de ‘bookstore’
/bookstore/book[last()] selecciona el ultimo elemento ‘book’ que es hijo de ‘bookstore’
/bookstore/book[last()-1] seleciona el penultimo elemento ‘book’ que es hijo de ‘bookstore’
/bookstore/book[position()<3] selecciona los dos primeros elementos ‘book’ que son hijos de ‘bookstore’
//title[@lang] selecciona todos los elementos title que poseen un atributo llamado ‘lang’
//title[@lang=’en’] selecciona todos los elementos title cuyo atributo ‘lang’ es igual a ‘en’
/bookstore/book[price>35.00] selecciona todos los elementos ‘book’ hijos de ‘bookstore’ que tengan un precio por encima de 35.00
/bookstore/book[price>35.00]/title selecciona todos los elementos title hijos de ‘book’ y nietos de ‘bookstore’ que tengan un precio por encima de 35.00

Seleccionando nodos desconocidos.

Los comodines en Xpath pueden ser usados para seleccionar nodos XML desconocidos.

comodín Descripción
* cualquier elemento nodal
@* cualquier atributo nodal
node() cualquier nodo de cualquier tipo

En la siguiente tabla se listan algunas expresiones Xpath y su respectivo resultado:

Path Expression Descripción
/bookstore/* selecciona todos los elementos hijos de ‘bookstore’
//* selecciona todos los elementos en el documento
//title[@*] selecciona todos los elementos ‘title’ que tengan un atributo de cualquier indole

Selecionando varios Paths

Usando el operador ‘|’ se puede seleccionar varios paths en una expresión. Ejemplo:

//book/title | //price

selecciona todos los ‘title’ AND ‘price’ elementos hijos de ‘book’

//title | //price

selecciona todos los elementos ‘title’ AND ‘price’ en el documento

/bookstore/book/title | //price

selecciona todos los elementos ‘title’ AND ‘price’ hijos de ‘book’ y nietos de ‘bookstore’ en el documento

Enlaces de intéres y relacionados:

 

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

 

 

 

 

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’))]

BPMN (modelado de procesos de negocios)

Es una notación gráfica estandarizada que permite describir procesos que se traducen de un flujo de trabajo (Workflow) [1],  y apartir de los mismos planificar estratégias que van desde la planificación hasta la programación de códigos informáticos.

Bpmn fue en principio desarrollado por la organización Business Process Management Initiative (BPMI), y es actualmente mantenida por el Object Management Group (OMG) [2], después de la fusión de las dos organizaciones en el año 2005.

Su proposito es propocionar una notación estandar para que todos los involucrados en el proyecto, haciendo un simil podriamos decir que se asemeja a UML en forma y finalidad. En su forma se maneja a través de diagramas simples con un conjunto muy reducido de elementos gráficos y cuatro categorías básicas de elementos (lo que en UML manejamos como librerías):

  1. Objetos de Flujo: Eventos, Actividades, Rombos de control de flujo (gateways)
  2. Objetos de Conexión: Flujo de Secuencia, Flujo de Mensaje, Asociación
  3. Carriles de nado (swimlanes): Piscina, Carril
  4. Artefactos: Objetos de Datos, Grupo, Anotación.
ObjetosBpmn

Objetos de flujo

 

Carriles de nado

Carriles de nado

 

En el sitio de Bpmn [3], podemos acceder a una guia de ejemplos en formatos libres que nos puede dar una idea de que va el estandar.

Para quienes hemos trabajado con UML sin duda algunas el editor de diagramas DIA [4], es una solución de software libre que nos permite acceder a una librería con todos los componentes del estandar, pues sera grato saber que BPMN no le es extraño a nuestro editor favorito (y en python 😀 [5]):

BPMN en el editor de diagramas DIA

BPMN en el editor de diagramas DIA

Blokdiag [6], es otra herramienta que esta basada en python y nos puede ayudara a realizar diagramas BPMN de manera sencilla y eficaz.

Un diagrama BPMN completo tendrá un aspecto aproximado al siguiente:

BPMN-DiscussionCycle

Para todos los que quieran profundizar sobre el tema les recomendamos la siguiente guía en español: BPMN 2.0 Manual de referencia y guía Práctica. 

BpmnGuia

 

 

[1] https://es.wikipedia.org/wiki/Flujo_de_trabajo

[2] http://www.bpmn.org

[3] http://www.omg.org/cgi-bin/doc?dtc/10-06-02

[4] https://wiki.gnome.org/Apps/Dia

[5] https://www.python.org

[6] https://pypi.python.org/pypi/blockdiag/

 

 

Navegador de artículos