Programacion Interactiva

Descubre una Nueva y Poderosa Herramienta.

FrameWork de Nueva Generacion

Acceso a tu Informacion desde cualquier Dispositivo con Navegador.

Enfoque en el Backend

Frontend de forma facil con Odoo y XML.

Creacion de Verticales

Creacion de nuevas Verticales Conquistando nuevos Mercados.

Tu marca aqui mismo

Llega a miles de personas.

Publicidad

Mostrando las entradas con la etiqueta odoo. Mostrar todas las entradas
Mostrando las entradas con la etiqueta odoo. Mostrar todas las entradas

martes, 11 de mayo de 2021

Aplicar Descuentos en Cascada, Descuentos en Python - Odoo

Descuentos en Cascada




Con el siguiente fragmento de código, podemos aplicar descuentos en cascada por ejemplo:

  • 10 + 20

Primero aplicamos el 10% después se aplicaría un 20% al resultado de la primer operación, con el sig. fragmento obtenemos el resultado real del porcentaje equivalente a 10+20% y este seria aplicado a tu subtotal:


descuentos = '10+20'

def get_discount_eq(perc, amount):
    new_amount = (perc * amount)/100
    return (amount - new_amount)
amount = 100
splited_discounts = [10, 20]
for discount in splited_discounts:
    amount = get_discount_eq(float(discount),amount)
final_discount = 100 - amount
print(":::::::: final_discount >>>>>>>> ", final_discount)

martes, 14 de julio de 2020

Obtener registros Hijos de un registro Padre en Odoo

Como utilizar child of para buscar registros hijos en Odoo



Algo muy frecuente y que estoy seguro que te as preguntado es como poder obtener las categorĆ­as hijas de un registro, por ejemplo en los modelos:

  • Ubicaciones
  • Categorias
  • Partners

Existen columnas dentro de los lineamientos de Odoo que nos permiten tener un control en un esquema de arbol:
  • Parent Left
  • Parent Right
  • Parent ID

Con estos campos podemos saber de donde la estructura de la que se compone nuestro registro y por medio de ellas buscar sus hijos:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
## Iniciamos nuestra lista final ###
all_record_ids = []
#### La variable que usare como ejemplo es record, que es una instancia de un registro de X tabla que usa el esquema de hijos ###
#### Iniciamos nuestro dominio, en este ejemplo usare una variable para no tener todo en una sola linea ####
child_dom = [('parent_left', '>', record.parent_left), ('parent_left', '<', record.parent_right)] 
#### Buscamos los registros que cumplen mi condicion ####
child_records = self.search(child_dom)
#### Agregamos a mi lista final, el registro principal (record) y agregamos los hijos ####
all_record_ids.append(record.id)
all_record_ids=all_record_ids+child_records.ids


Yo por ejemplo, necesitaba saber las categorĆ­as hijas de un registro en donde mi variable era category:

1
2
3
product_category = self.env['product.category']
child_dom = [('parent_left', '>', category.parent_left), ('parent_left', '<', category.parent_right)] 
child_categs = product_category.search(child_dom)

jueves, 4 de junio de 2020

Desabilitar Fines de Semana en campos Fecha Odoo

No permitir la selección de fines de semana en campos de tipo fecha



Existe un atributo dentro de Odoo que nos permite restringir la selección de fines de semana en campos de tipo fecha, lo cual nos deja lo que conocemos como días hÔbiles L-V pero que puede ser configurado de acuerdo a lo requerido.

El ejemplo seria:

options='{"datepicker": {"daysOfWeekDisabled": [0, 6]}}'

Dentro del campo de fecha de expiación en las cotizaciones, al seleccionar un día L - V no tendríamos problemas:


Pero al seleccionar por ejemplo el dĆ­a sabado:

Como vemos el icono de bloqueo no dejarĆ­a seleccionar el dĆ­a que no esta permitido.


Como observamos en la imagen el parametro tiene por nombre daysOfWeekDisabled


miƩrcoles, 3 de junio de 2020

Nginx SSL - ERR_SSL_PROTOCOL_ERROR - No se puede conectar por SSL (Solución)

Solución al error con Nginx ERR_SSL_PROTOCOL_ERROR




139857146823744:error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error:../ssl/record/rec_layer_s3.c:1528:SSL alert number 80


El error esta en la configuración de nuestro sitio nginx, para ser exactos en el apartado de configuración ssl debemos modificar y de ser necesario cambiar o reemplazar los sig. parÔmetros:


    ssl_prefer_server_ciphers on;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;


TEST de CONEXION SSL



openssl s_client -connect jlbelleza.es:443 -servername midominio.mx


El parƔmetro midominio.mx es el sitio al cual se estƔn conectando e implementando el certificado SSL.

domingo, 29 de marzo de 2020

Presicion Decimal en Odoo 13

Creación de Campos con Decimales Dinamicos




Como habíamos mencionado en post anteriores podemos definir una presicion dinÔmica que nos permita gestionar de forma modificable el no. de decimales para la definición de los campos en una clase.

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
   <data>
  <!--  Mi presicion decimal-->

  <record model="decimal.precision" id="precision_discounts">
    <field name="name">Discount</field>
    <field name="digits">6</field>
  </record>  

   </data>
</odoo>

Al instalar nuestro modulo o actualizarlo, nos creara el registro correspondiente al XML:


El valor digits es el numero de decimales que tendra el campo que lo utilice como su presición decimal.

El paso final es asignar esta presición en la creación del campo en una clase Odoo.

# -*- coding: utf-8 -*-
from openerp.exceptions import UserError
from openerp import api, fields, models, _, tools

class Accountinvoice(models.Model):
    _inherit = 'account.invoice'
    _name = 'account.invoice'
    
    invoice_discount_amount = fields.Float(digits='Discount', 
                                string='Descuento Total en Monto')


En el ejemplo anterior herede facturas y cree mi campo llamado Descuento Total con 6 Decimales en su parte flotante, el campo se visualiza de la siguiente manera en el Sistema:

Si modificamos la presición decimal a 4.


Veriamos el campo actualizado y los registros anteriores redondeados al nuevo numero de decimales.

Una presición puede ser reutilzada muchas veces no es necesario crear una por cada campo a menos que el proceso lo requiera.

Espero que les ayude esta información y no se olviden dejar sus comentarios.




miƩrcoles, 19 de febrero de 2020

Odoo Qweb manejo de Ciclos

Loops o Ciclos con




QWeb en Odoo es muy util al momento de realizar o ejecutar funcionalidades como Reportes, Archivos XML etc. todo esto basado en plantillas, pero existen muchas funcionalidades muy utiles que nos pueden ayudar a mejorar el diseƱo de nuestros Reportes, de las cuales les vengo a hablar en este post y son:


  • as_first
  • as_last
  • as_index

t t-foreach="['A','B','C','D','E']" t-as="item">
    <p t-if="item_first">
        Inicio
    </p>
    <p>
        Indice <t t-esc="item_index"/> y resultado <t t-esc="item"/>
    </p>
    <p t-if="item_last">
        Fin
    </p>
</t>

El resultado seria:

Inicio
Indice 0 y resultado A
Indice 1 y resultado B
Indice 2 y resultado C
Indice 3 y resultado D
Indice 4 y resultado E
Fin

Podemos deducir que las palabras clave as_first indica el inicio del loop, as_index el recorrido de nuestro ciclo y as_end si es el ultimo valor de nuestra lista.


martes, 18 de febrero de 2020

Actualizar Modulo en Multiples Bases de Datos - Odoo

Actualización de Modulos en multiples Bases de Datos




El dia de hoy traigo un Query que nos permite actualizar un modulo  en multiples Bases de Datos de Odoo corriendo en una misma instancia y versión de Odoo.

Script escrito en Bash con codigo Python:


#!/usr/bin/env python

from datetime import date
import subprocess, xmlrpclib, sys, os, psycopg2, pexpect

# Database info
db_user = 'odoo'
db_passwd = ''
db_host = 'localhost'
db_port = 5432
db_name = 'postgres'
oerp_conf = '/opt/odoo/odoo.conf'
oerp_bin = "/opt/odoo/odoo-bin"
module_to_upgrade = "modulo_a_actualizar"

today = date.today()
log_date = today.strftime('%Y%m%d')
log_name = "update-{}.log".format(log_date)
base_dir = os.getcwd()

with open(log_name, 'a+') as log_file:

  # Get list of databases
  db = psycopg2.connect(user=       db_user, 
                        password=   db_passwd,
                        host=       db_host,
                        port=       db_port,
                        database=   db_name)
  cr = db.cursor()
  cr.execute("select datname from pg_database where datdba=(select usesysid from pg_user where usename='{}') order by datname".format(db_user))
  dblist = [str(name) for (name,) in cr.fetchall()]

  for database in dblist:
    # Wait for server to upgrade database, then kill it
    print "Actualizando Base de Datos {}...".format(database)
    
    dbupdate_cmd = "{} shell -c {} --database={} --update={}".format(oerp_bin, oerp_conf, database, module_to_upgrade) 
    output = pexpect.spawn(dbupdate_cmd)
    try:
      # to catch this string loading.py was altered (line 461)
      output.expect('.*Modulos Cargados.', timeout=600)

    except pexpect.ExceptionPexpect as e:
      print "Se Agoto el tiempo de espera en la actualización {}. Intente actualizar Manualmente la Base de Datos con el comando '{}'.".format(database, dbupdate_cmd)
    output.kill(0)
    status = "Base de Datos Actualizada {}.".format(database)
    print status
    log_file.write(status + "\n")

Los Parametros principales a modificar son:

  • oerp_conf
    • Es la ruta del archivo de configuración de Odoo, normalmente se encuentra dentro de /etc/odoo/odoo-server.conf
  • oerp_bin
    • Ruta del programa de administración de Odoo, se encuentra dentro de la ruta de instalación del ERP.



Fuente: http://soft29.info/blog/entry/odoo-module-upgrade-on-multiple

domingo, 4 de noviembre de 2018

Integración de Buzón Tributario con Odoo y OpenERP

Integración de Cancelaciones


De acuerdo a los nuevos lineamientos por parte del SAT para este aƱo 2018 sera obligatorio para los
Emisores de CFDI, la integración del Buzón Tributario para la generación de Solicitudes de Cancelación de Facturas, de acuerdo a los criterios establecidos por esta entidad.

Dentro de los criterios establecidos podemos encontrar lo siguiente:

Restricciones

  • Solo se permite generar 3 solicitudes como mĆ”ximo, si al tercer intento de cancelación no es
  • aceptada, esta se convierte en no Cancelable.
  • Solo se puede generar una nueva solicitud pasadas 24 horas de la ultima.
  • Si el CFDI tiene un documento relacionado vigente en el SAT la Factura no puede ser
  • Cancelable.

No requiere autorización

  • CFDI que ampare ingresos hasta 5,000 pesos con impuestos y retenciones.
  • CFDI de Nomina.
  • CFDI de Egresos como Notas de CrĆ©dito.
  • CFDI de Traslado, Carta Porte.
  • CFDI de Ingresos para Clientes con el RĆ©gimen de Incorporación Fiscal (RIF)
  • Que amparen CFDI de Retenciones.
  • CFDI Emitidos a Residentes en el Extranjero con el RFC: XEXX010101000.
Actualmente tenemos soportada esta modificaciones para las siguientes versiones del Sistema:
  • OpenERP 6.1
  • OpenERP 7.0
  • Odoo12
  • Odoo 11
  • Odoo 10
  • Odoo 09
  • Odoo 08
El siguiente video ejemplifica la forma de trabajar con esta nueva regla:



Cualquier información pueden encontrarme en los correos:
  • german.ponce@outlook.com 
  • info@argil.mx.

jueves, 4 de octubre de 2018

Instsalación Odoo 12 en Linux

Instalación Odoo 12 en Linux, Ubuntu Server y Desktop 16.x , Ubuntu 17.x y Ubuntu 18.x


PASOS PARA LA INSTALACIƓN: 


Antes que nada necesitamos instalar las dependencias que utiliza Odoo (una dependencia es una aplicación o una biblioteca requerida por otro programa para poder funcionar correctamente. Por ello se dice que dicho programa depende de tal aplicación o biblioteca).
Antes de instalar las dependencias, necesitamos una actualizacion de los repositorios:
sudo apt-get update && sudo apt-get upgrade
Creamos un directorio en la ruta /opt llamada Odoo:
cd /opt
Despues:
sudo mkdir odoo
Cambiamos los permisos de la carpeta odoo al usuario que usara esta ruta (german es el usuario del sistema):
sudo chown german.german * -R odoo
Descargamos Odoo desde el Repositorio Oficial:
sudo git clone https://www.github.com/odoo/odoo --depth 1 --branch 12.0 --single-branch .
Instalamos las dependencias de la aplicación:
sudo pip install -r /opt/odoo/doc/requirements.txt
sudo pip install -r /opt/odoo/requirements.txt

Creamos nuestro Usuario Postgres


Entramos al prompt de postgres:
sudo su postgres
Creamos el Usuario:
createuser -s -P -e odoo
Tecleamos la contraseña (odoo) 2 veces. Ahora para evitar algún error modificamos el template principal de postgres (template1)
psql template1
Y una vez dentro del template:
alter role odoo with password 'odoo';
Para salir del prompt de postgres solo ejecutamos:

psql \q

Instalación Dependencias Externas


sudo apt-get install nodejs -y
sudo apt-get install npm -y
apt-get install node-less
sudo npm install -g less
sudo npm install -g less-plugin-clean-css
sudo ln -s /usr/local/bin/lessc /usr/bin/lessc
sudo ln -s /usr/bin/nodejs /usr/bin/node
sudo apt-get install sassc

Iniciamos nuestro Servidor de Odoo 12


Creamos nuestro archivo de configuracion de Odoo, para ello vamos al directorio de instalación (/opt/odoo/) y ejecutamos:
python odoo-bin -c odoo.conf -s
Lo que estamos haciendo es crear un archivo de configuración para Odoo.
Ahora debemos pausar la ejecución del servidor con la combinación de teclas ctr+c.
Listo, ahora editamos el archivo de configuración llamado odoo.conf, con el editor vi, vim, nano o gedit si estÔn en modo grÔfico y modificamos los valores:
db_host = localhost
db_maxconn = 64
db_name = False
db_password = odoo
db_port = 5432
db_template = template1
db_user = odoo
Guardamos y ahora para ejecutar el servidor odoo, usamos el comando:
python /opt/odoo/odoo-bin -c /opt/odoo/odoo.conf
Una Captura de Odoo 12:

Desde mi perspectiva Odoo 12 es 3 veces mas rapido y mejor optimizado en cuestion del manejo de Datos, podemos optimizar aĆŗn mas el rendimiento montando un Servidor Web (Nginx) con un certificado de Serguridad HTTPS.
Y ahora con el manejo de Multi Sitios Web.

jueves, 9 de agosto de 2018

Definición y lectura de campos multi Compañia en Odoo

Lectura de campos de tipo propiedad con Odoo



Los campos multi-compañia o propiedad permiten al usuario tener un control interno por compañia dentro de la base de datos, esto permite la segmentación de la información para que una Base de Datos conserve sus propias particularidades, configuración, valores, etc.
Los datos de tipo propiedad podemos encontrarlos dentro de Clientes o Productos, principalmente para la parte Contable.

Como podemos definir un campo de tipo propiedad, antes de la Api  se definia un campo llamandolo fields.property pero con la migración a la nueva api, el valor property es cambiado por el parametro company_dependent, por ejemplo, voy a definir una tarifa secundaria dentro de Clientes, pero quiero que esta tarifa sea unica por CompaƱia:

class ResPartner(models.Model):
    _inherit = 'res.partner'

    second_product_pricelist = fields.Many2one('product.pricelist', 
         'Tarifa Secundaria', company_dependent=True)

Ahora, como podemos dar lectura al campo de tipo propiedad para obtener el valor, aqui entra en función el Contexto (context), utilizamos un parametro llamado force_company  dentro del código, por ejemplo si tengo 2 compaƱias, una con el ID 1 la otra con el ID 2, la lectura seria:

# Company 1
partner_br = self.env['res.partner'].with_context(force_company=1).browse(256)
second_product_pricelist_company_1 = partner_br.second_product_pricelist.id

#Company 2

partner_br = self.env['res.partner'].with_context(force_company=2).browse(256)
second_product_pricelist_company_2 = partner_br.second_product_pricelist.id

El parametro force_company recibe el ID de la compaƱia de la cual se obtendran los valores y el browse del ejemplo es el ID de un Cliente.

No se olviden comentar ...

miƩrcoles, 18 de julio de 2018

Mejorar DesempeƱo de Odoo 8, 9 ,10 y 11 con PostgreSQL 10

Odoo Consultants

Mejorar el DesempeƱo de Odoo y Optimizar Consultas a la Base


Con la llegada de PostgreSQL 10, el rendimiento de Odoo puede aumentar beneficiandose de las nuevas funcionalidades como las funciones de consultas paralelas. Desde el lado de PostgreSQL, esta es una excelente noticia porque esto significa que muchas consultas SELECT operadas del lado del ORM de Odoo se pueden ejecutar mas rapido de lo que solian ser. Dentro de las ventajas encontramos:

  • Resultados mas rapidos en las consultas ( PostgreSQL mejora el desempeƱo hasta 32 veces mas rapida la respues que en versiones como 9.5)
  • Mejora los modos de Indexacion GIN, BRIN y B-tree.
  • Mejora la compresión de filas y tablas.
Sin embargo, cuando miramos el desempeƱo de Odoo, debemos entender que Odoo no tiene la capacidad para  utilizar estas funcionalidades de forma eficiente, ya que lo anterior implica 2 factores principales que estan ausentes en Odoo:

  • Una estrategia de indexación evolucionada orientada de acuerdo a los contenidos (Odoo solo maneja el tipo B-tree como estandar)
  • Capacidad para optimizar el Analisis de Indexación ( debe hacerse del lado de PostgreSQL y no es accesible del lado de Odoo)
En general, el cambiar las versiones de anteriores de PostgreSQL para migrar a las nuevas versiones sin realizar ajustes adecuados en su motor de base de datos y sus modelos de datos no proporcionarƔ ninguna mejora visible en tƩrminos de rendimiento y tiempos de consulta / respuesta.

Puedes verificar la relevancia y efiniencia del Indice desde el lado de PostgreSQL ejecutando el siguiente escript:


SELECT
schemaname,
relname,
idx_scan,
seq_scan,
cast(idx_scan AS numeric) / (idx_scan + seq_scan) AS idx_scan_pct
FROM pg_stat_user_tables WHERE (idx_scan + seq_scan)>0 ORDER BY idx_scan_pct;
Esto ayudara a mejorar la eficiencia de la indexación  en comparación con la lectura secuencial. Por supuesto, la idea es reducir los escaneos secuenciales tanto como sean posible, ya que consumen mas recursos y generan mas bloqueos de tablas / memoria / consumo de Procesamiento (CPU).

Fuente de Consulta:

lunes, 11 de junio de 2018

Agregar Formato a Campos Fecha Reportes Qweb Odoo

Formatear la salida de los Campos Fecha en Reportes Qweb Odoo



     Dentro de Odoo todo es manejado de forma central, la zona horaria, el formato de campos de tipo fecha, etc., esto normalmente ocasiona que se tengan que editar o modificar ciertos reportes para que utilicen nuestras particularidades, tal es el caso de los campos de tipo Fecha/Fecha Hora, en mexico la nomenclatura es dia-mes-aƱo de forma estandar odoo la envia aƱo-mes-dia, para corregir esto en los reportes basta con enviar las opciones para formatear la fecha.

Por ejemplo, yo tengo un reporte con el campo fecha de envio (send_date) la salida estandar de este campo en un reporte Qweb seria:

<span t-field="o.send_date" ></span>

Si agregamos el formato dd/mm/yyyy

<span t-field="o.send_date" t-options='{"format": "dd/MM/yyyy"}'></span>



Formato Fecha Hora:

       <span t-field="o.date_order" t-options='{"format":"dd-MM-yyyy hh:mm:ss"}'/>

Creacion de Codigos de Barra en Reportes Qweb Odoo

Inserción de Codigos de Barra en Reportes Qweb Odoo


En esta ocasión les vengo a brindar información acerca de los Codigos de barra en reportes Qweb y como generarlos, estos muchas veces nos son requeridos para reportes de Almacen, etc.

Dentro de los reportes Odoo encontramos todo lo necesario para generarlos, no es necesario integrar nadad "adicional" o computar nuestros campos binarios para generar estas imagenes, aunque conocer como se calculan tambiƩn es util.

Odoo nos permite generar imagenes de Codigo de barra de los siguientes tipos:
  • Codabar
  • Code11
  • Code128
  • EAN13
  • EAN8
  • Extended39
  • Extended93
  • FIM
  • I2of5
  • MSI
  • POSTNET
  • QR
  • Standard39
  • Standard93
  • UPCA
  • USPS_4State
Como una utileria adicional para los desarrolladores, Odoo aƱadio un previsualizador, el cual nos permite visualizar y generar nuestra imagen a partir de una URL, por ejemplo si visualizo en mi navegador:

http://localhost:10869/report/barcode/Code128/FURN001



Como podemos observar la URL se compone de la dirección /report/barcode/ + tipo de codigo + cadena a convertir


Automaticamente nos genera una imagen en codigo de barras.


Para insertarla en nuestro Reporte Qweb se realiza mediante la siguiente estructura:

<img t-if="o.product_id.barcode" 
    t-att-src="'/report/barcode/Code128/%s' % 'FURN001' "
                           style="width:100%;height:20%;" />

Podemos observar que utiliza la estructura mencionada anteriormente, podemos cambiar la cadena FURN001  para que sea tomada de forma dinamica colocando nuestra variable usada en el reporte por ejemplo, para tomar la referencia del Producto en mi reporte:

<img t-if="o.product_id.barcode" 
 t-att-src="'/report/barcode/Code128/%s' % o.product_id.default_code "
 style="width:100%;height:20%;" />

El resultado seria:


No se olviden dejar sus comentarios.

lunes, 21 de mayo de 2018

Creación de Campos con Precisión Decimal Dinamica en Odoo

Creación de Campos con Decimales Dinamicos




Un aspecto fundamental en la parte administrativa es la contable donde la presición decimal debe ser muy controlada, tanto en la generación de reportes como en la creación de algunos formularios.

Dentro de las muchas bondades que siempre describo en mis articulos, Odoo cuenta con una presición dinamica, esta precisón puede ser moderada por el usuario final (cliente), esto le ayudara a aumentar o disminuir el numero de decimales en Odoo de acuerdo a sus necesidades y sin tener que programar o editar el codigo fuente.

La precisión decimal la encontramos en el Menu Configuración --> Tenico --> Estructura de la Base de Datos --> Presición Decimal.

El primer paso es crear tu precisión Decimal mediante una vista XML.

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
   <data>
  <!--  Mi presicion decimal-->

  <record model="decimal.precision" id="precision_discounts">
    <field name="name">Discount</field>
    <field name="digits">6</field>
  </record>  

   </data>
</odoo>

Al instalar nuestro modulo o actualizarlo, nos creara el registro correspondiente al XML:


El valor digits es el numero de decimales que tendra el campo que lo utilice como su presición decimal.

El paso final es asignar esta presición en la creación del campo en una clase Odoo.

# -*- coding: utf-8 -*-
from openerp.exceptions import UserError
from openerp import api, fields, models, _, tools
import openerp.addons.decimal_precision as dp

class Accountinvoice(models.Model):
    _inherit = 'account.invoice'
    _name = 'account.invoice'
    
    invoice_discount_amount = fields.Float(digits=dp.get_precision('Discount'), 
                                string='Descuento Total en Monto')


En el ejemplo anterior herede facturas y cree mi campo llamado Descuento Total con 6 Decimales en su parte flotante, el campo se visualiza de la siguiente manera en el Sistema:

Si modificamos la presición decimal a 4.


Veriamos el campo actualizado y los registros anteriores redondeados al nuevo numero de decimales.

Una presición puede ser reutilzada muchas veces no es necesario crear una por cada campo a menos que el proceso lo requiera.

Espero que les ayude esta información y no se olviden dejar sus comentarios.




jueves, 17 de mayo de 2018

Duplicar Base de Datos en 5 Minutos Odoo y PostgreSQL

Duplicar una base de datos a nivel directorio Fisico PostgreSQL


Todas las Bases de Datos creadas en Postgres son guardadas en archivos y directorios del Sistema Operativo, utilizando un metodo sencillo podemos duplicar una Base de Datos a nivel fisico.

1. Creamos nuestra Base de Datos copia

Creamos nuestra Base de Datos Copia por medio de terminal.

sudo su postgres

createdb BASE_2 -O odoo10

2. Verificamos el Nombre del Directorio

El ID origen llamado OID en el template de postgres, es el nombre del directorio que contiene tu Base de Datos, es necesario conocerlo para poder duplicar nuestra Base de Datos.

Obtenemos el OID de la Base Origen

sudo su postgres

psql template1

select datname,oid from pg_database where datname like 'BASE_ORIGEN';

Obtenemos el OID de la Base Destino

sudo su postgres

psql template1

select datname,oid from pg_database where datname like 'BASE_2';

3. Nos colocamos en el directorio de Postgres

En este ejemplo estoy utilizando PostgreSQL 9.6 y el ejemplo que mostrare es la ubicacion de mis bases de datos.

cd /var/lib/postgresql/9.6/main/base


4. Duplicamos el Directorio de la Base Origen

Es Importante que este proceso lo hagamos con el usuario postgres del Sistema Operativo.

El primer Base es Eliminar el Directorio de nuestra Base 2

rm -r OID_BASE_2


Como paso final duplicamos el directorio de la Base Origen a la Base 2 

cp OID_ORIGEN OID_BASE_2


Listo, con estos sencillos pasos obtenemos una copia de nuestra Base de Datos de una forma rapida y sin esperar.

Nota Importante: Es importante tambien, duplicar el directorio de archivos binarios (data_dir) de tu base de datos origen con el nombre de tu base de datos destino.

miƩrcoles, 18 de abril de 2018

Lectura Archivos Python 3 y Odoo 11

Lectura de archivos y conversión a base64




La actual migración de Python 2.7 a Python 3 para Odoo 11, fue un gran cambio en el manejo de algunos tipos de datos, por ejemplo en la lectura de un archivo que puede ser una imagen, un csv o un txt nos llega a generar errores ya que nos puede devolver una instancia IO o generarnos algunos errores, para ello me di a la tarea de indagar en el manejo interno de Odoo y el mismo me dio la solución, una pequeña linea capaz de leer cualquier archivo y convertirlo a Base64 para grabarlo en un Campo Binario de nuestra Tabla.

Primero Debemos Importar la libreria base64:

# -*- coding: utf-8 -*-

import base64



Ahora debemos obtener la ruta de la Imagen o archivo que queremos grabar en nuestra tabla, por ejemplo /tmp/qr_cfdi.png

La lectura de mi archivo y conversión quedaria de la siguiente manera:

f_b64 = base64.b64encode(open('/tmp/qr_cfdi.png','rb').read())


El paso final seria grabarlo en la tabla correspondiente, en mi caso la imagen QR necesito guardarla en la tabla de Facturas (account.invoice).

invoice_br = self.env['account.invoice].browse(ID_FACT)

invoice_br.cfdi_cbb = f_b64

# Utilizando el Metodo Write:

invoice_br.write({'cfdi_cbb':f_b64})



El ejemplo anterior utiliza el metodo browse para poder obtener una instancia de Facturas del registro en el cual quiero grabar la imagen obtenida de otro proceso, el campo cfdi_cbb es un binario de la tabla donde quiero guardar la imagen y el resultado podria observarse como la siguiente imagen: