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:
- objeto = El modelo que tiene los campos que vamos a modificar.
- id externo = el id que identifica univocamente a esta vista
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.
<xpath expr="//field[@name='partner_id']" position="attributes"> <attribute name='required'>0</attribute> <attribute name='nolabel'>1</attribute> </xpath>
Muy bueno el manual
Yo quería saber como ocultar un campo de un formulario, cuando saco el libro mayor por PDF quería que el campo de Contrapartida no me lo mostrara, hay alguna forma de ocultar este campo al sacar el libro mayor??
Me gustaLe gusta a 1 persona
Debes sobreescribir el reporte de Libro Mayor, es muy facil con el nuevo motor QWeb
Me gustaMe gusta
Gracias por responder tan rápido, hace poco que me iniciado y necesitaría un manual » fácil » de como sobrescribir ese report… alguna referencia ya que es un programa muy complejo que poco a poco me voy haciendo con el pero a tanto no llego jejeje!
Me gustaMe gusta
La forma correcta es crear tu propio modulo, y heredar account_ledger_report o algo asi, este fin de semana voy a hacer un post sobre eso si aun te es de utilidad
Me gustaMe gusta
Si que estoy interesado si 🙂
Me gustaMe gusta
muy buen post, felicitaciones!!
Me gustaMe gusta
Gracias!! me ayudó a resolver mi tema de cómo modificar un campo propio de
OpenErp
Me gustaMe gusta
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 gustaMe 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
Me gustaLe gusta a 1 persona
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
Me gustaLe gusta a 1 persona
Oye disculpame pero te expresaste mal y no entendi lo que quieres hacer
Me gustaMe gusta