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

viernes, 14 de octubre de 2016

Forzar la Escritura de Base de Datos en Procesos Odoo

Forzar un Commit a la Base de Datos


    Muchos de nosotros en el ambiente de programación Odoo hemos notado una funcionalidad bastante interesante, poderosa y buena para evitar concurrencia de información basura en el Sistema y es la escritura a la Base de Datos mediante Odoo, durante la ejecución de una función (proceso) Odoo no realiza cambios en la Base de Datos hasta no terminar la ejecución correcta de la misma, si ocurre un error durante la ejecución Odoo hace un reverse a lo que se habĆ­a realizado anteriormente, asĆ­ evita que se guarde información basura o se llegaran a duplicar registros.
    Esto es muy Ćŗtil, pero en ocasiones llegamos a tener la necesidad de forzar la escritura a la Base de Datos ya sea por el tamaƱo de recursos del Servidor (Memoria RAM), por bloqueos generados por el Servidor PostgreSQL (max_locks_per_transaction) o simplemente queremos que cierta información recabada no se pierda, por ejemplo en la lectura de archivos binarios de una ruta x, que al ser procesados son eliminados del servidor, en este proceso no podemos perder la información ya generada, asĆ­ que podrĆ­amos forzar la escritura a la Base de Datos, otro ejemplo podria ser al generar reportes contables en donde la cantidad de información es en volĆŗmenes considerablemente grandes y la memoria podria saturarse.

Para forzar la escritura de la Base de Datos basta con insertar este pequeño fragmente de codigo en la parte de nuestro código donde queremos forzar la escritura:

self.env.cr.commit()

lunes, 10 de octubre de 2016

Instalación de Odoo 10 en CentOS 7




Instalación de Odoo 10 en 
CentOS 7

Instalación de Odoo 10 en un servidor CentOS 7 con GitHub

Instalación y Configuración de PostgreSQL 9.3

Primero que nada debemos instalar y descargar PostgreSQL del repositorio Oficial:
rpm -Uvh http://yum.postgresql.org/9.3/redhat/rhel-7-x86_64/pgdg-centos93-9.3-1.noarch.rpm  
yum -y install postgresql93 postgresql93-server postgresql93-devel --disablerepo=* --enablerepo=pgdg93  
El segundo paso es habilitar el Servidor PostgreSQL como un servicio del Sistema:
/usr/pgsql-9.3/bin/postgresql93-setup initdb
systemctl enable postgresql-9.3.service  
systemctl start postgresql-9.3  
Creamos un usuario postgres para nuestro servidor Odoo:
su - postgres -c "createuser -s odoo" 2> /dev/null || true  

Instalación de dependencias para Odoo

Necesitaremos instalar las herramientas necesarias:
yum -y groupinstall "Development tools"  
Para la instalación de las dependencias ejecutaremos en una terminal:
yum -y install subversion git bzr bzrtools postgresql python-all-dev python-dev python-setuptools libxml2-dev libxslt1-dev libevent-dev libsasl2-dev libldap2-dev pkg-config libtiff5-dev libjpeg8-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev liblcms2-utils libwebp-dev tcl8.6-dev tk8.6-dev python-tk libyaml-dev fontconfig node-less python-pip gdebi-core python-dateutil python-feedparser python-ldap python-libxslt1 python-lxml python-mako python-openid python-psycopg2 python-pybabel python-pychart python-pydot python-pyparsing python-reportlab python-simplejson python-tz python-vatnumber python-vobject python-webdav python-werkzeug python-xlwt python-yaml python-zsi python-docutils python-psutil python-mock python-unittest2 python-jinja2 python-pypdf python-decorator python-requests python-passlib python-pil
Habilitaremos repositorios como EPEL:
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm  
rpm -ivh epel-release-7-5.noarch.rpm  
Instalación de Wkhtmltopdf:
yum --enablerepo=epel install wkhtmltopdf  
Instalación de la aplicación Python Pip, para el manejo de las librerías en Python:
yum --enablerepo=epel install python-pip  

Descarga de Odoo desde Repositorios Oficiales via GitHub

Clonamos el repositorio oficial en la ruta /opt/ :
git clone --branch 10.0 https://www.github.com/odoo/odoo /opt/odoo

Creación de una Virtual Env para Odoo

Un virtual env es un emulador de librerĆ­as Python, que nos permitirĆ” manejar librerĆ­as Python de forma independiente en una ruta especifica.

Creamos un nuevo usuario del Sistema, y lo asignamos como propietario de nuestro git clone Odoo /opt/directorio_odoo :
useradd odoo  
chown -R odoo: /opt/odoo  
su - odoo  
Ahora instalaremos las dependencias desde nuestro archivo requirements.txt, ubicado en la instalación de Odoo (requirements.txt):
/bin/virtualenv odoo
source odoo/bin/activate  
PATH=$PATH:/usr/pgsql-9.3/bin  
pip install -r /opt/odoo/requirements.txt  
exit  
Esperamos que finalice la descarga de los paquetes a nuestro entorno virtual.

Creación del Servicio Odoo (Systemctl)

Generamos el archivo odoo-server.conf:
cat > /etc/odoo-server.conf << EOF  
[options]
admin_passwd = admin  
db_host = False  
db_port = False  
db_user = odoo  
db_password = False  
addons_path = /opt/odoo/addons,/opt/odoo/odoo/addons
without-demo=all  
no-xmlrpc = True  
no-xmlrpcs = True  
no-netrpc = True  
log_db = False  
log_handler = ['[\'["[\\\':INFO\\\']"]\']']  
log_level = info  
logfile = False  
login_message = False  
logrotate = True  
syslog = False  
EOF  
Generamos el archivo odoo.service (systemctl):
cat > /usr/lib/systemd/system/odoo.service << EOF  
[Unit]
Description=Odoo 10.0 ERP and CRM server  
After=postgresql-9.3.service

[Service]
Type=simple  
User=odoo  
Group=odoo  
ExecStart=/home/odoo/odoo/bin/python /opt/odoo/odoo-bin --config=/etc/odoo-server.conf

[Install]
WantedBy=multi-user.target  
EOF  
Puedes usar el siguiente comando para visualizar el log de Odoo en tiempo real: journalctl -f -u odoo.

Pasos Finales

Necesitamos permitir el acceso de información del puerto 8069 en el firewall de CentOS:
firewall-cmd --zone=public --add-port=8069/tcp --permanent  
firewall-cmd --reload  
Finalmente iniciamos el Servicio de Odoo con los comandos:
systemctl enable odoo.service  
systemctl start odoo  
Listo, ahora visualizaremos en nuestro navegador: http://<ip_servidor>:8069


Instalacion Odoo 10 en Ubuntu Server

Instalación Odoo 10 en Linux, Ubuntu 15.x , Ubuntu 16.x y Ubuntu Server


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
Abrimos una Terminal de Ubuntu o una manera rƔpida es presionando las teclas Alt+Ctrl+T y escribimos lo siguiente:
sudo apt-get install subversion git bzr bzrtools python-pip postgresql python-all-dev 
python-dev python-setuptools libxml2-dev libxslt1-dev libevent-dev libsasl2-dev
libldap2-dev pkg-config libtiff5-dev libjpeg8-dev libjpeg-dev zlib1g-dev libfreetype6-dev 
liblcms2-dev liblcms2-utils libwebp-dev tcl8.6-dev tk8.6-dev python-tk libyaml-dev 
fontconfig node-less python-pip gdebi-core python-dateutil python-feedparser python-ldap
python-libxslt1 python-lxml python-mako python-openid python-psycopg2 python-pybabel 
python-pychart python-pydot python-pyparsing python-reportlab python-simplejson python-tz 
python-vatnumber python-vobject python-webdav python-werkzeug python-xlwt python-yaml 
python-zsi python-docutils python-psutil python-mock python-unittest2 python-jinja2 
python-pypdf python-decorator python-requests python-passlib python-pil -y
Nota: Debemos copiar y pegar las dependencias en un bloc de notas y quitar los saltos de linea que tiene el formato del Blog.
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 10.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
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 odoo-bin -c odoo.conf
En la ruta /opt/odoo
NOTAS: 
En ocasiones el Firewall de Linux, puede bloquear nuestro puerto en donde iniciamos Odoo, entonces debemos ejecutar los siguientes comandos:
sudo ufw allow ssh
sudo ufw allow 8069/tcp
sudo ufw enable

miƩrcoles, 28 de septiembre de 2016

Nuevos atributos para Color en Vistas Avanzadas Odoo

Decoradores para vistas de Lista Odoo 9


    En OpenERP 7 y Odoo 8.0 tenĆ­amos la posibilidad de aƱadir atributos de color (color) y fuente (font) en las vistas de lista, para poder identificarlas de una manera mas sencilla, en Odoo 9.0 encontrĆ© que cambio un poco y ahora utiliza atributos especiales para ello (decoradores), veamos un ejemplo:

Vista con Colores en versiones anteriores a Odoo 9.0

<tree string="Pedidos de Venta" colors="blue:state=='confirmed'" >
    .....
    .....
    .....
</tree>

Atributos para Colores en Odoo 9.0

<tree string="Pedidos de Venta" decoration-info="state=='confirmed'">
    .....
    .....
    .....
</tree>

Otros decoradores son:
  • decoration-bf - Lineas en BOLD 
  • decoration-it - Lineas en ITALICS 
  • decoration-danger - Color LIGHT RED 
  • decoration-info - Color LIGHT BLUE 
  • decoration-muted - Color LIGHT GRAY 
  • decoration-primary - Color LIGHT PURPLE 
  • decoration-success - Color LIGHT GREEN 
  • decoration-warning - Color LIGHT BROWN

lunes, 19 de septiembre de 2016

Widget Boton Contador de Elementos en Formularios Odoo


Para añadir un botón en un formulario con un contador de los elementos que mostrarÔ (como el de la imagen superior), debemos calcular el número de resultados en un campo y, posteriormente, mostrarlo:
1
2
3
4
5
6
7
8
serials_qty = fields.Integer(
        compute="_get_serials_qty",
        readonly=True)
 
@api.one
def _get_serials_qty(self):
     cond = [('partner_id', '=', self.id)]
     self.serials_qty = len(self.env['stock.production.lot'].search(cond))
1
2
3
4
5
6
7
8
<div class="oe_right oe_button_box" name="contact_buttons">
     <button class="oe_inline oe_stat_button" type="action" icon="fa-list"
              name="%(client_serial_numbers.act_contact_serial_numbers)d">
              <field name="serials_qty"
                     string="NĆŗm. de serie"
                     widget="statinfo" />
     </button>
</div>
En el xml definimos un div como el mostrado y dentro de la etiqueta button insertamos el campo en el que hemos calculado la cantidad, con el atributo statinfo.
Fuente Tomada de Odootricks

AƱadir Fuentes TTF a Informes Qweb

Para cambiar la fuente a un informe, debemos seguir estos pasos:
Primero, descargar la fuente con formato .ttf de internet. Es muy fÔcil encontrar la fuente que queremos buscando un poco. Segundo, abrir el código de nuestro informe y definirnos una nueva font-family de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
11
<div class="header">
      <style type="text/css">
             <![CDATA[
                        @font-face {
                          font-family: 'MyFontName';
                          src: url('module_name/static/src/font/cour.ttf') format('truetype');
                        }
               ]]>
       </style>
---
</div>
Por Ćŗltimo, la utilizamos:
1
<span style="font-family:'MyFontName';" t-field="o.company_id.name" /><br />
Fuente Tomada de Odootricks

AƱadir Direccion de Partner en Reportes Qweb de forma Facil


En el sistema Qweb the Odoo existen widgets para distintos Ɣmbitos, pero en esta entrada vamos a hablar sobre el widget the contact
Este widget nos hace la vida mÔs fÔcil porque con solo una linea y pocos parametros nos muestra toda la información de un cliente.
Código ejemplo:
1
2
3
<div t-field="o.partner_id"  
         t-field-options='{"widget": "contact", "fields": ["name", "address", "city", 
         "phone", "mobile", "fax", "website", "email"],   "no_marker": true}'/>
En este ejemplo podemos ver todos los posibles parametros:
  • name
  • address
  • country_image
  • city
  • phone
  • mobile
  • fax
  • website
  • email
Pero si usted no tiene suficiente con estos parametros en este link puede encontrar información de como aƱadir uno nuevo.
Fuente Tomada de Odootricks

Filtros XML Odoo usando la libreria Time & Datetime

¿Podemos aƱadir filtros en  Odoo usando librerias para el Manejo de Fechas?



La respuesta es Si, el Core de Odoo tiene el manejo de algunas librerías y métodos para enviar información desde una vista XML y esta sea renderizada al momento de ejecutar una acción sobre ella, un filtro, una agrupación, abrir una ventana de un formulario, etc...

Mostrare dos ejemplos sobre el uso de las librerias time y  datetime en vistas XML, muy similar a lo que nosotros realizamos en Python:

<!-- Usando libreria Time -->
<filter string="Today"
   domain="[('date','<', time.strftime('%%Y-%%m-%%d 00:59:59')), 
   ('date','>=', time.strftime('%%Y-%%m-%%d 00:00:00'))]"
   help="Today objects" />
 
<!-- Usando libreria datetime -->
<filter  string="Ejemplo 2"
   domain="[('date','&#60=',(datetime.date.today()-datetime.timedelta
   (days=7)).strftime('%%Y-%%m-%%d 00:00:00'))]" />

En estos casos podemos ver los caracteres &#60 , esto es porque en xml no podemos usar estos elementos <, > ya que son reservados.

En esta web podrĆ” consultar los codigos html de los caracteres.

Pero también existe un palabra reservado muy útil current_date, esta palabra retorna la fecha actual y puede ser usada en un dominio o un tree color como en este ejemplo:
<tree colors="grey:date_end &#60 current_date;">


Fuente Tomada de Odootricks

jueves, 18 de agosto de 2016

Solución a la lectura de Registros por permisos Ocultos en Odoo

Saltarnos algunas Reglas de Lectura de Registros en Odoo



    Este pequeƱo fragmento de Código es un ejemplo sobre como poder saltarse las reglas de lectura de registros para algunas clases, les contare un poco que me orillo a esta solución un poco agresiva, esto lo he tenido que hacer para un Cliente que tiene desarrollos de Terceros, por alguna circunstancia dentro de algĆŗn modulo existe un fragmento de Código que limita al usuario a solo visualizar sus Registros Creados sin utilizar las Reglas de Odoo, buscando dentro de todos los módulos no encontrĆ© ese fragmento y me puse a pensar una solución a este detalle y se me ocurrió usar la librerĆ­a SUPERUSER_ID de Odoo y pasarla al mĆ©todo principal de bĆŗsqueda, esto ayuda a poder usar el Root de Odoo y visualizar la información sin problema, el ejemplo siguiente es para la tabla de Albaranes o Movimientos de AlmacĆ©n:


class stock_picking(osv.osv):
    _name = 'stock.picking'
    _inherit ='stock.picking'
    _columns = {
        }

    _defaults = {
        }

    ########## METODOS PARA VOLARNOS LAS REGLAS DE LECTURA DE REGISTROS #############

    def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
        from openerp import SUPERUSER_ID

        res = super(stock_picking, self).fields_view_get(cr, SUPERUSER_ID, view_id, view_type, context=context,
        toolbar=toolbar, submenu=submenu)
        
        return res

    def search(self, cr, uid, args, offset=0, limit=None, order=None,
            context=None, count=False):
        from openerp import SUPERUSER_ID

        res = super(stock_picking, self).search(cr, SUPERUSER_ID, args, offset, limit, order,
            context, count)
        return res

Podrƭamos mejorar un poco el codigo aƱadiendo algunas normas de lectura, etc...

Notas: El ejemplo esta hecho para OpenERP 7 y Odoo 8, para Odoo 9 solo sustituimos la herencia y los mƩtodos por la API.


Espero les sea de utilidad.

martes, 2 de agosto de 2016

Consultar las Tablas Relacionales Many2many en Odoo 9

Como encontrar las tablas resultantes de campos Many2many en Odoo 9



    Dentro de los muchos cambios que estamos observando en la API de odoo y para los que venimos de la programación de módulos en versiones inferiores a odoo (openerp) notamos una dificultad en los campos relacionales, en openerp 7 hacia abajo uno de los atributos que necesitabas para poder declarar un campo de tipo many2many era el nombre de la tabla relacion, por ejemplo la clase purchase.order (compras) y la relacion con account.invoice (facturas), esta relacion de tipo many2many estaba declarada de la siguiente manera:

'invoice_ids': fields.many2many('account.invoice',
               'purchase_invoice_rel', 
               'purchase_id', 'invoice_id', 
               'Invoices', help="Invoices generated for a purchase order"),

A simple vista identificamos la tabla resultante de la relación llamada purchase_invoice_rel.


En la API de odoo ya no es necesario indicar el nombre de la tabla relación, esta se creara de forma interna, aunque si nosotros la indicamos en la declaración del campo odoo respetara ese atributo. El mismo ejemplo anterior con la API de Odoo seria:

invoice_ids = fields.Many2many('account.invoice',
              compute="_compute_invoice", string='Invoices', copy=False)

A simple vista no podemos identificar la tabla resultante de la misma relación, para ello debemos consultar la tabla ir_model_relation  a nivel base de datos y buscarla de forma manual, es una tarea un poco mas compleja,pero al final nos ayudara un poco y nos evitara buscar en todo el codigo del modulo:

select * from ir_model_relation where name like '%order%'


Si queremos ver todas las relaciones creadas en nuestra Base de Datos:

select * from ir_model_relation order by name

Una alternativa es consultando los atributos del campo, en la tabla ir_model_fields:

select * from ir_model_fields where model = 'hr.employee.imss' and name='contract_ids'

Nota:
         Debemos asegurarnos que el campo que vayamos a consultar el modulo que lo contiene este instalado en la base de datos.