Un Robot que mueve Archivos en Python + Bash

De verdad que es muy importante aprender mas cada día de nuestro trabajo pero en especial de Dios, recordemos que todo el conocimiento proviene de Dios la Sabiduría es el temor a Jehova o al Señor, y el Discernimiento es conocer Al Señor… por esto yo día a día busco a Dios y dice la palabra todas las cosas se te darán por añadidura, es decir el conocimiento y las fuerzas para hacer cada Día tu trabajo serán añadidos y se te harán mucho mas fácil y podrás hacer cosas que ni pensabas 😀

Les cuento que Tenia que probar en tiempo real que el ODOO v8 leía los documentos PNR de Sabre, en Openerp v7 solo implemente una clase que al ser creada leía los PNRs, luego se me pidió que colocara dicha función que leía los PNR en el planificador de tareas de ODOO v7, y bueno me encontré con algunos detalles que poco  a poco fui sorteando :D, al final todo funciono y tocaba hacer lo mismo en ODOO v8 y así lo hice, pero también debía agregar cada cierto tiempo algunos PNRs para estar seguros que ODOO estaba leyendo los PNRs apenas llegaban y ademas estar seguros que los PNRs una vez leídos eran pasados a otra carpeta para no perder tiempo en leerlos o si quiera contarlos nuevamente, aunque fueran segundos son importantes 😀

Por lo que se me ocurrió la idea de crear un programita que hiciera esa ardua tarea de mover archivos cada cierto tiempo de una carpeta a otra, al final pensé en como hacerlo y quedo así:

# -*- coding: utf-8 -*-
import os

import random

import subprocess

os.system("ls /home/usuario/emular_server_sabre/resspl >/home/usuario/emular_server_sabre/lista_archivos_resspl")

archi=open('/home/usuario/emular_server_sabre/lista_archivos_resspl','r')
    
lineas=archi.read().splitlines()
lista_definitiva = []
for linea in lineas:
      
    lista_definitiva.append(linea)
    

print lista_definitiva
    
archi.close()

while len(lista_definitiva) >= 20:
    numero_aleatorio= random.randrange(20)
    print len(lista_definitiva)
    
    for archivos in range(numero_aleatorio):
      
          numero_aleatorio_sacar= random.randrange(len(lista_definitiva))
          
          archivo_pnr = lista_definitiva[numero_aleatorio_sacar]
          archivo_a_mover = '/home/usuario/emular_server_sabre/resspl/'+ archivo_pnr
          subprocess.call(['mv', archivo_a_mover, '/home/usuario/emular_server_sabre/resspl_new'])
          
          lista_definitiva.pop(numero_aleatorio_sacar)
          
          print archivo_a_mover
          
    os.system("sleep 10")

          

Les comento algunas lineas, importamos os y subprocess, por que es mas cómodo trabajar la shell desde os algunas veces y otras desde subprocess, random para darle un poco de realismo entre comillas :D, lo primero que hacemos es leer la carpeta donde llegaran los PNRs y la pasamos a un archivo, dicho archivo lo leemos linea a linea y lo agregamos 1 a 1 con for a una lista, cerramos el archivo, luego creamos un bucle que mientras queden mas de 20 archivos se ejecute siempre, luego creamos un numero_aleatorio que sera la cantidad de archivos que pasaremos entre 0 y 20, luego creamos en el for un numero aleatorio esta ves para sacar los números de la lista, así vamos moviendo dicho archivo  otro directorio, y hacemos eso para el numero de veces definidas aleatoria-mente, luego esperamos 10 segundos y repetimos el proceso:

Esta podría ser la salida:


Quedan este numero de archivos: 442
/home/setnorac/emular_server_sabre/resspl/TNMLIR00.PNR
/home/setnorac/emular_server_sabre/resspl/CMQSJB00.PNR
/home/setnorac/emular_server_sabre/resspl/BBILYI00.PNR
/home/setnorac/emular_server_sabre/resspl/VKTKVL00.PNR
/home/setnorac/emular_server_sabre/resspl/ASFFGA00.PNR
/home/setnorac/emular_server_sabre/resspl/NZBTGI00.PNR
/home/setnorac/emular_server_sabre/resspl/DEGYFS00.PNR
/home/setnorac/emular_server_sabre/resspl/WFBUUR00.PNR
/home/setnorac/emular_server_sabre/resspl/TEDUYP00.PNR
/home/setnorac/emular_server_sabre/resspl/AQVSGF00.PNR
/home/setnorac/emular_server_sabre/resspl/WNNESL00.PNR
/home/setnorac/emular_server_sabre/resspl/EZTZAX00.PNR
Quedan este numero de archivos: 430
/home/setnorac/emular_server_sabre/resspl/ODGGSK01.PNR
/home/setnorac/emular_server_sabre/resspl/WZUSXY02.PNR
/home/setnorac/emular_server_sabre/resspl/QCCKUP00.PNR
/home/setnorac/emular_server_sabre/resspl/QRYXQJ00.PNR
/home/setnorac/emular_server_sabre/resspl/MLLHVX00.PNR
/home/setnorac/emular_server_sabre/resspl/LKJVCP00.PNR
/home/setnorac/emular_server_sabre/resspl/GNUNXP00.PNR
/home/setnorac/emular_server_sabre/resspl/ZZXVVX00.PNR
/home/setnorac/emular_server_sabre/resspl/ZSTHCV00.PNR
/home/setnorac/emular_server_sabre/resspl/LLIBLM00.PNR
/home/setnorac/emular_server_sabre/resspl/KJNDYN00.PNR
/home/setnorac/emular_server_sabre/resspl/CDAZSI00.PNR
Quedan este numero de archivos: 418
/home/setnorac/emular_server_sabre/resspl/USYRFJ00.PNR
/home/setnorac/emular_server_sabre/resspl/HRZUTH09.PNR
/home/setnorac/emular_server_sabre/resspl/KABKQK00.PNR
/home/setnorac/emular_server_sabre/resspl/WFIIEH00.PNR
/home/setnorac/emular_server_sabre/resspl/RBHQMX00.PNR
/home/setnorac/emular_server_sabre/resspl/ZJVGZF00.PNR
/home/setnorac/emular_server_sabre/resspl/SZKRTH00.PNR
/home/setnorac/emular_server_sabre/resspl/WKEIPW00.PNR
Quedan este numero de archivos: 410
/home/setnorac/emular_server_sabre/resspl/NTJHEC00.PNR
Quedan este numero de archivos: 409
/home/setnorac/emular_server_sabre/resspl/KCMOWH03.PNR
/home/setnorac/emular_server_sabre/resspl/IWMGLY00.PNR
/home/setnorac/emular_server_sabre/resspl/UIVSYI00.PNR
/home/setnorac/emular_server_sabre/resspl/JREMOQ00.PNR
/home/setnorac/emular_server_sabre/resspl/TCPTNN00.PNR
/home/setnorac/emular_server_sabre/resspl/EQZFFS00.PNR
/home/setnorac/emular_server_sabre/resspl/FFFSRL00.PNR
/home/setnorac/emular_server_sabre/resspl/ZAKAMO01.PNR
/home/setnorac/emular_server_sabre/resspl/GWOYGO00.PNR
Quedan este numero de archivos: 400
/home/setnorac/emular_server_sabre/resspl/FTYBXG00.PNR
/home/setnorac/emular_server_sabre/resspl/GGSFVQ00.PNR
/home/setnorac/emular_server_sabre/resspl/YRYHQE00.PNR
/home/setnorac/emular_server_sabre/resspl/GVGEHA00.PNR
/home/setnorac/emular_server_sabre/resspl/EOUVSS00.PNR
/home/setnorac/emular_server_sabre/resspl/VDZGUO00.PNR
/home/setnorac/emular_server_sabre/resspl/ZKVDFB00.PNR
/home/setnorac/emular_server_sabre/resspl/WBEPNT00.PNR
/home/setnorac/emular_server_sabre/resspl/RYPPFK00.PNR
/home/setnorac/emular_server_sabre/resspl/VEWSTU00.PNR
/home/setnorac/emular_server_sabre/resspl/FFWFZB00.PNR
/home/setnorac/emular_server_sabre/resspl/BGDXGH00.PNR
/home/setnorac/emular_server_sabre/resspl/UZEDKC00.PNR
Quedan este numero de archivos: 387
Quedan este numero de archivos: 387
/home/setnorac/emular_server_sabre/resspl/EIGPDE00.PNR
/home/setnorac/emular_server_sabre/resspl/OJWCOC00.PNR
/home/setnorac/emular_server_sabre/resspl/DDCMEX00.PNR
/home/setnorac/emular_server_sabre/resspl/DKTGPP00.PNR
/home/setnorac/emular_server_sabre/resspl/AEJHFG00.PNR
/home/setnorac/emular_server_sabre/resspl/TGHKIK00.PNR
/home/setnorac/emular_server_sabre/resspl/DRKFSS00.PNR
Quedan este numero de archivos: 380
/home/setnorac/emular_server_sabre/resspl/KELLQI00.PNR
/home/setnorac/emular_server_sabre/resspl/OGGFZL00.PNR
/home/setnorac/emular_server_sabre/resspl/YUVINL00.PNR
/home/setnorac/emular_server_sabre/resspl/TAPXAA00.PNR
/home/setnorac/emular_server_sabre/resspl/EEMYZM00.PNR
/home/setnorac/emular_server_sabre/resspl/EBJWPM00.PNR
/home/setnorac/emular_server_sabre/resspl/STJHUE00.PNR
/home/setnorac/emular_server_sabre/resspl/EMSWIR00.PNR
/home/setnorac/emular_server_sabre/resspl/KPPWGH00.PNR
/home/setnorac/emular_server_sabre/resspl/FMFAYL00.PNR
/home/setnorac/emular_server_sabre/resspl/OJGBZT00.PNR
/home/setnorac/emular_server_sabre/resspl/DQKLJH00.PNR
/home/setnorac/emular_server_sabre/resspl/EHUKQF00.PNR
/home/setnorac/emular_server_sabre/resspl/CFGMKG00.PNR
/home/setnorac/emular_server_sabre/resspl/VXKOPK00.PNR
/home/setnorac/emular_server_sabre/resspl/YZHXZQ00.PNR
/home/setnorac/emular_server_sabre/resspl/QYOLSD00.PNR
/home/setnorac/emular_server_sabre/resspl/MSTWAM00.PNR
Quedan este numero de archivos: 362
/home/setnorac/emular_server_sabre/resspl/BJEIWS00.PNR
/home/setnorac/emular_server_sabre/resspl/RPXTNN00.PNR
/home/setnorac/emular_server_sabre/resspl/ETWBCA00.PNR
/home/setnorac/emular_server_sabre/resspl/UBUIYY00.PNR
/home/setnorac/emular_server_sabre/resspl/NEMIQT00.PNR

Y bueno en realidad no hace mucho pero nos puede dar muchas ideas de uso 😀

Ya subi el video a Youtube mañana lo subo al blog 😀

Feliz Día que Dios les Bendiga y les Llene de Gozo….

Error al ejecutar pip install -r requirements.txt

#include “libxml/xmlversion.h”

^

compilation terminated.

error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1

—————————————-
Can’t roll back lxml; was not uninstalled
Cleaning up…
Command /usr/bin/python -c “import setuptools, tokenize;__file__=’/tmp/pip-build-GJ8XUc/lxml/setup.py’;exec(compile(getattr(tokenize, ‘open’, open)(__file__).read().replace(‘\r\n’, ‘\n’), __file__, ‘exec’))” install –record /tmp/pip-nbzGg4-record/install-record.txt –single-version-externally-managed –compile failed with error code 1 in /tmp/pip-build-GJ8XUc/lxml
Storing debug log for failure in /root/.pip/pip.log

Este es el Error que me salta en la pantalla, y es que cada vez que instalo el sistema en diferentes Gnu/linux me sale el mismo error y no me voy a extender mucho esta es la solucion:


apt-get install libxml2-dev libxslt1-dev python-dev

Saludos y comentar no cuenta nada, estamos para servir

Al final sale esto:


Cleaning up...

 

 

Openerp Imprimir Imagen de Formulario ODOO a Reporte Webkit Mako

Hoy vamos a aprender a agregar una imagen a nuestros reportes Mako en Openerp/ODOO, parece tonto pero hay que saber donde dar el martillazo, De verdad no sabia que nombre colocarle a la entrada es que busque esto con diferentes nombre durante cerca de 20 minutos iba probando y nada :D, jejeje es que siempre me tocaba imprimir el logo de la empresa nunca me toco imprimir el de otra empresa en los reportes y mucho menos una foto de un usuario, pero como a mi siempre me gusta aprender cosas nuevas decidí buscar la solución 😀

Ademas este proyecto es propio es decir es algo que yo estoy haciendo por mi cuenta así que se me pueden ocurrir cosas descabelladas, no se asusten 😀

Podría colocarle como nombre a esta entrada uno de los siguientes(lo coloco para que el buscador me tome en cuenta :D);

Odoo Insertar foto en Reportes Webkit

Insertar Imagen en Reportes Mako Openerp o ODOO

Openerp Insertar imagen, logo o foto en Reportes

ODOO imprimir imagen en Reportes Mako Webkit

Por eso coloque el titulo tan largo :D, yo busque así y no recuerdo con cual frase lo encontré…. Bueno manos a la obra

Les explico mi proyecto trata de una red social como Computrabajo, Bumerang, Freelancer entre otras pero que ademas les dejen crear su propio curriculum totalmente personalizado, con estilos y diseños predefinidos(espero este mes que viene comenzar con esto y darles entrada como Betatester)

Como les decía tenemos la foto del usuario que esta creando el Curriculum y queremos insertarla en el PDF, la siguiente es la solución, colocarnos en el archivo MAKO y agregar una linea como esta donde deseen:


<img src="data:image/jpeg;base64,${inv.foto_personal}" />

Ademas podemos definir con coordenadas donde queremos colocar dicha foto o imagen así


<img class="foto_personal" height="150.0" src="data:image/jpeg;base64,${inv.foto_personal}" />

Aqui encontraremos el tamaño definido para la foto y una clase que se llama foto_personal que debe estar contenida en el css/style mas o menos el código generado seria este:


<html>

<head>

<style>
${css}


.foto_personal {

position: absolute;
top: 1.5cm;
left:0.25cm;
}
</style>

</head>
<body>

<%
def carriage_returns(text):
return text.replace('\n', '
')

%>
%for inv in objects:

<td class="curriculum_vitae"><B>Sintesis Curricualr</B></td>


<table class="informacion_perfil">
<img class="foto_personal" height="150.0" src="data:image/jpeg;base64,${inv.foto_personal}" />

</table>


%endfor

This is my web-kit report
</body>
</html>

Tambien podemos usar esta:


<img>${helper.embed_image('png', company.logo, 145, 35)|n}
</img>

Donde especificamos que la imagen es PNG y la altura es 145 y anchura 35, ademas hay un salto de linea, fíjate que puedes colocar el campo que desees aquí usamos el logo de la empresa 😀

Bueno si necesitan ayuda en algo parecido no duden en escribirme, ademas trabajo como freelancer si necesitan programar algo para ODOO o las APIs 😀

Dios les Bendiga, Comentar es Gratis

Informacion sacada de aqui:

http://stackoverflow.com/questions/16437590/how-can-i-get-logo-of-curent-comoany-in-openerp-and-us-it-in-webkit-report

ODOO herencia de Modulos stock.pickin.out (Stock picking out )

ESto va a ser breve y simple solo para recordar y ayudar a quienes necesiten esto que en internet no esta tan explicito, agregar un campo por herencia a stock.pickin.out es igual que a partner ;D

ojo no voy a hablar de crear  modulos desde 0 a mnos que de verdad necesiten que lo haga, solo vamos a hablar del archivo .py y el archivo .xml, simple el py es donde vamos a crear toda la logica de programacion, las clases funciones y campos, y el archivo .xml es el archivo donde vamos a codificar como queremos que se vean los campos en el navegador 😀

el primer archivo quedaria asi


from openerp.osv import fields, osv

class stock_picking_out_mi(osv.osv):
    """
Modified stock
    """
    _inherit = "stock.picking.out"


    _columns = {
        

         'responsable': fields.many2one('res.partner','Responsable'),
         'despachado_por': fields.many2one('res.partner','Despachador'),
         

    }
    _defaults ={

    }

stock_picking_out_mi()



Solo me interesa agregar por quien fue despachado y quien es el responsable de la mercancía, ojo que los campos me los traigo de la clase res.partner solo por que ya esta instanciada…

	

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
<!-- Adding the fields from stock_move to the screen -->
    <record model="ir.ui.view" id="mi_modulo_stock_picking_out_mi_form">
        <field name="name">mi_modulo.stock.picking.out.form</field>
            <field name="model">stock.picking.out</field>
            <field name="type">form</field>
            <field name="inherit_id" ref="stock.view_picking_form"/>
            <field name="arch" type="xml">
                <field name='origin' position='before'>

 
                    <field name="despachado_por"/>
                    <field name="responsable"/>

                </field>
            </field>
        </record>
	
	
    </data>
</openerp>

Aqui podria colocar los campos donde se desee, pero lo colocamos despues de origin, le podemos crear un page entre otras mejoras, ojo con los nombre y sobre todo con la referencias, la linea que contiene lo siguiente es lo mas importante:


<field name="inherit_id" ref="stock.view_picking_form"/>

Openerp Software Libre de Alta Calidad

Openerp(Odoo) Software Libre de Alta Calidad

OPENERP es un potente sistema de Gestión Empresarial, Es mas que una Suits Costosa, es una potente herramienta al alcance de la pequeña y mediana empresa, es totalmente adaptable a sus necesidades y no tendrá que pagar por licencias anualmente, actualmente producido por la empresa belga Odoo S.A. El fabricante declara su producto como una alternativa de código abierto a SAP ERP y Microsoft Dynamics.

Odoo viene provisto de módulos estándar tales como:

  • Gestión de compraventa.
  • CRM.
  • Gestión de proyectos.
  • Sistema de gestión de almacenes.
  • Manufactura.
  • Contabilidad analítica y financiera.
  • Puntos de venta.
  • Gestión de activos.
  • Gestión de recursos humanos.
  • Gestión de inventario.
  • Ayuda técnica.
  • Campañas de marketing.
  • Flujos de trabajo.

Odoo o openerp esta orientado a ser una solución rápida y de crecimiento constante en su empresa, ya que los limites lo pone la empresa que contrata nuestros servicios y no el software, el cielo es el limite con Odoo…

Odoo esta programado en Python, usa como base de Datos Postgresql y XML como gestor de vistas

Ya basta de estos Software de baja calidad que pretenden ser un ERP y son solo suits poco configurables y para nada adaptables a nuestras necesidades como empresa, si no existe el modulo se lo hacemos todo y como usted siempre quiso trabajarlo, lo reportes tipo HTML5 con CSS le darán una idea de la potente herramienta que esta por contratar. Que espera busque su Soporte de Odoo mas cercano o escríbame por aquí haremos de su empresa mas productiva y con menos dolores de cabeza por que tiene que llevar todo en diferentes sistemas y la contabilidad no cuadra, con Odoo tendrá todo en un solo lugar y tendrá mas tiempo para su familia y hacer lo que realmente quiere hacer mientras su empresa prácticamente se lleva sola 😀

Ventajas no me gusta repetir mucho así que te diré lo que otros no te van a ofrecer y por un increíble precio menos de lo que te cuesta pagarle a 1 Obrero anual;

Sistema en la Nube con una VPN Segura, Adaptación de los módulos a tu empresa y creación de todos los módulos que necesites, Soporte Garantizado

Así que escríbeme ya y veamos que necesitas… la 1era asesoría es totalmente gratis así que escríbeme es totalmente gratis y te traerá grandes beneficios…

Script Python para obtener Rif y Cedula a partir del NIF Openerp7 o Odoo7

La siguiente entrada esta dedicada a Openerp aunque no sera implementada directamente, primero vamos a plantear y solucionar el problemita de los Nif al que tarde o temprano los que trabajamos con Odoo nos hemos enfrentado…

Muchas personas en Venezuela y analizando los comentarios podríamos decir en todo el mundo no están habituados a los Nif simplemente no le gustaría ver el VE o Es(para España) al principio del Rif o simplemente no les gusta el formato den Venezuela Nif se resisten al cambio pero tarde o temprano tendrán que usarlo aunque parece que por ahora la mayoría de las empresas siguen usando Rif o Cédula…

El formato puede variar aunque usare uno muy normal mas no formal para nuestro primer ejemplo… comente cualquier inquietud es gratis la asesoría por ahora :D…

VEV16547897-5 

Supongamos este Nif, podria ser

VEV165478975 

Yo preferi para nuestro ejemplo el primero por que quería usar find 😀

En nuestro ejemplo tenemos una cadena de 13 caracteres que va desde 0 a 12

Si quisiéramos sacar el Rif para este formato usaríamos este script y agregar los cambios como herencia en un modulo de openerp (pendiente de hacerlo)

 

#Programa ejemplo de como cambiar el nif  a rif 😀 y tambien cedula

nif = "VEV16547897-5"  # no necesita comenarios
 
guion_nif = nif.find("-")    # Buscamos el guion en la cadena, no hace falta solo podias colocar guion_nif = 11

cedula = nif[3:guion_nif]   # Aqui podiamos colocar 11 en lugar de guion_nif, buscamos la cadena de numero Cedula
rif_falta_J = nif[3:]   # Buscamos el rif pero nos falta la J-
rif = "J-"+ rif_falta_J  # Creamos otra cadena porque son inmutables y le agregamos J-

# Aqui tenemos el resultado
print "La Cedula es:      ", cedula
print  "El Rif es:       ", rif 

No creo que necesite muchos comentarios seguiremos con el modulo directamente en la próxima entrada…

He visto los módulos hechos en openerp para este fin pero son muy poco explícitos :S