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

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.

martes, 19 de julio de 2016

Cerrar Conexiones a una Base de Datos PostgreSQL

Matar sesiones conectadas a una base de datos (PostgreSQL)


    Para poder matar las conexiones que existan para una determinada base de datos enPostgreSQL, deberemos combinar la función pg_terminate_backend(pid) para matar la sesión con la tabla pg_stat_activity para obtener los pids de las conexiones a una determinada base de datos
     Mediante la tabla pg_stat_activity podemos filtrar por “datname” para obtener todos los pids (columna pid) de las conexiones a dicha base de datos, por lo que si lo combinamos con la función pg_terminate_backend() podremos matar todas las sesiones que usen dicha base de datos. 
Primero Debemos conectarnos al template predeterminado de nuestro Servidor PostgreSQL, por defecto template1:
sudo su postgres 
psql template1
El Query Final seria :
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'basededatos';

lunes, 18 de julio de 2016

Solución al tiempo excesivo en la generación de Reportes PDF Odoo 9

Solucion al Tiempo Excesivo de Generación de Reportes Qweb Odoo


    Este error puede surgir a causa de una mala instalación del Sistema, lo que puede generar es que la Impresión de un Reporte tarde minutos, en lugar de segundos, la causa es que Odoo no encuentra los recursos fuente (Css, JavaScript. templates, etc.), la solución es muy simple y esta basada en un parĆ”metro del Sistema:
  1. Vamos al menu Configuracion --> Parametros --> Parametros del Sistema
  2. Creamos un parĆ”metro del sistema y lo nombramos web.base.url.freeze
  3. El Valor que le agregaremos a este parƔmetro es True


Esto seria la solución a ese problema.

jueves, 16 de junio de 2016

Leer y ordenar archivos por fecha de Creación desde Python

Leer y Ordenar Archivos por su fecha de Creación (Antiguedad Descendente Antiguo --> Reciente)



Este pequeño codigo es muy util en la creación de colas de lectura ordenadas por antiguedad del archivo.

Primero haremos uso de 2 librerĆ­as:
  1. glob
  2. os
Las importamos en nuestro codigo como cualquier otra libreria:

import glob
import os

Ahora un ejemplo del Codigo:

import glob
import os

search_dir = "/mi_ruta_archivos/"
files = filter(os.path.isfile, glob.glob(search_dir + "*"))
files.sort(key=lambda x: os.path.getmtime(x))
files = [str(x) for x in files]

print "####### ARCHIVOS ORDENADOS POR ANTIGUEDAD", files

Un ejemplo de cada elemento de la lista files es "/mi_ruta_archivos/archivo1.txt"