Odoo, OpenERP, Programación

Modificar Vistas en Odoo (OpenERP)

En este articulo voy a tratar de describir lo mas extenso y posible sobre la herencia de las vistas para Odoo, aunque creo que de todas formas va ir dividido en varios artículos.Asumo que saben como declarar nuevas vistas aunque sea.
Empezar diciendo que Odoo es un sistema muy modular, esto se refleja en que la interfaz es solo un cliente mas, de hecho, en realidad es una aplicación escrita en javascript que se descarga in situ al navegador del cliente y que renderiza el contenido de acuerdo a la información que le envié el servidor. Es importante saber que existen otros clientes, como el todo poderoso script erppeek, aplicaciones no oficiales e incluso alguna vez el cliente web convivió con una interfaz de escritorio nativa en escrita en GTK+.
El cliente web esta escrito con base en la libreria QWEB, el cliente es propietario y OpenERP paga una licencia por usar esta tecnología. Ademas se usa jQuery, Underscore, Bootstrap y otras tecnologías.
Sin embargo para diseñar nuestras propias vistas ni siquiera nos tenemos que preocupar por saber JavaScript o CSS, nosotros declaramos los formularios y el cliente web se encarga de renderizarlos con sus respectivos campos, botones y diseños.
Así que manos a la obra:
Tenemos un formulario que modificar, en este caso, me decido por Contabilidad>Facturas de Proveedor, por ser bastante complejo y permitirme ilustrar una gran cantidad de casos. En el post anterior explique como añadir campos, supongamos que añadimos un campo‘invoice_condition’ (para indicar si la factura es al contado o crédito).
Vamos a intentar de hacerlo por las buenas, no hace falta mirar el código siquiera y es conveniente declarar los cambios en un modulo, ya que así los cambios perduran a las actualizaciones.
Vamos hasta facturas de Proveedor, teniendo el cliente Web en modo desarrollador.
En la pestaña de desarrollador seleccionamos administrar vistas, pincharemos la vista original, para heredar el id de esta vista. Nos interesan la siguiente información:

Pantallazo-Facturas de Proveedor - Odoo - Mozilla Firefox

  • objeto = El modelo que tiene los campos que vamos a modificar.
  • id externo = el id que identifica univocamente a esta vista

Pantallazo-Facturas de Proveedor - Odoo - Mozilla Firefox-2

En nuestro modulo, agregamos el archivo view al manifiesto openerp del modulo.

<?xml version="1.0" encoding="UTF-8"?>
<openerp>
    <data>
    <record model="ir.ui.view" id="account_invoice_suplier_form_inherited">
            <field name="name">account.invoice.supplier.form.inh</field>
            <field name="model">account.invoice</field>
            <field name="inherit_id" ref="account.invoice_supplier_form"/>
            <field name="arch" type="xml">
               <!-- MIS CAMPOS -->
            </field>
        </record>
    </data>
</openerp>

Hasta aquí la estructura básica para heredar una vista, el “id” le ponemos el que queramos, “name” también, pero conviene hacerlo entre puntos, porque esa cadena va ser incluida en los archivos de traducción, y los va confundir luego. En “model”, ponemos la información del objeto que obtuvimos en modo desarrollador, y el mas importante en este caso es “inherit_id” y “ref”, ahi ponemos el id externo de la vista, ojo no olvidar ponerla con el punto en este caso es “account.invoice_supplier_form”.

Ahora vamos a ver casos comunes, dejo caso mas complicados para un siguiente post.

  • Añadir un campo.
  • Hacer invisible un campo.
  • Hacer requerido un campo.
  • Cambiar el tamaño de un campo
  • Especificar un placeholder (marcador de posición)
  • Cambiar atributos respecto a otro campo.

Voy a añadir el campo ‘invoice_condition’:

<?xml version="1.0" encoding="UTF-8"?>
<openerp>
    <data>
    <record model="ir.ui.view" id="account_invoice_suplier_form_inherited">
            <field name="name">account.invoice.supplier.form.inh</field>
            <field name="model">account.invoice</field>
            <field name="inherit_id" ref="account.invoice_supplier_form"/>
            <field name="arch" type="xml">
                   <xpath expr="//field[@name='date_invoice']" position="after">
                    <field name="invoice_condition" required="1" placeholder="Condition"/>
                </xpath>
            </field>
        </record>
    </data>
</openerp>

Hay varios métodos para recorrer la estructura, pero el que muestro mas arriba es el mas elegante y poderoso, se trata de construir expresiones a traves de XPATH (de XML Path Language).
Creamos las etiquetas <xpath></xpath> y dentro del atributo expr=”” le decimos que busque el campo cuyo nombre sea ‘date_invoice’ (la fecha de la factura), el atributo position=, le indicamos after, para que coloque nuestro nuevo campo inmediatamente después de date_invoice.

Estas son las opciones:

  • after: inmediatamente despues
  • before: antes del elemento referencia
  • replace: reemplazar el campo con otro que debemos indicarle
  • attributes: acceder a los atributos del campo
    XPATH también puede recibir el nombre de ruta completo del elemento en cuestión, si es que lo conocemos o simplemente somos masoquistas.
    En el atributo required, le indicamos “1”(True), para que sea un campo obligatorio.
    Otros atributos comunes son
  • invisible: El campo esta ahí, pero no se ve.
  • readonly: Solo lectura
  • nolabel: No dibujar la etiqueta
  • widget: Usar otro widget para mostrar/introducir los datos
  • attrs: declarar varios atributos en uno solo
  • class: añadir clases CSS
  • placeholder: marcador guiá
    Modificaremos los atributos del campo ‘partner_id’, para mostrar como manipular los atributos.Pantallazo-Facturas de Proveedor - Odoo - Mozilla Firefox-1

<xpath expr="//field[@name='partner_id']" position="attributes">
    <attribute name='required'>0</attribute>
    <attribute name='nolabel'>1</attribute>
</xpath>
Estándar

11 comentarios en “Modificar Vistas en Odoo (OpenERP)

  1. Saludos, buen foro, muy explciado, tengo una pregunta con este método, seria posible consultar el valor de Campos que estan almacenados en base de datos ? es decir, A través de un codigo unico se genera un registro de varios datos, quiesiera mostrar dichos datos registrados asociados a este registro unico, pudiera hacerse con este metodo?

    Me gusta

    • Hola, no acabo de entender tu necesidad, pero si lo que quieres mostrar datos relacionados, deberías crear un campo many2one en el tipo de datos que quieres filtrar. Un ejemplo de eso es el caso de los clientes, si abres la ficha de un cliente, tienes un botón que dice «ventas», cuando le das click, te lleva a la vista asociada con el tipo de datos «sale.order» osea los pedidos de ventas, en esa vista por defecto esta aplicado un filtro que solo muestra los pedidos de venta que están asociados a dicho cliente

      Le gusta a 1 persona

  2. Joyza dijo:

    Hola oye yo quiero heredar la vista de account.invoice pero la parte de ventas-> factura cliente en mi inocencia crei que haciendo esto


    libro.compra.form.view
    account.account
    form

    Factura Modelo A
    account.invoice
    form
    tree,form

    Cree una nueva Factura!



    mostraria la vista de clientes y no solo muestra la vista de proveedor…ayuda no hayo que hacer. Obvio esta en odoo 10

    Le gusta a 1 persona

Replica a Alex Andreu Cases Cancelar la respuesta