Está en la página 1de 8

Heredar y modificar modelos en Odoo

Hola a todos voy a tratar de ponerme al día después de mucho, así que voy a escribir una serie de artículos de

un tirón aprovechando que tengo tiempo.

Este articulo es sobre heredar modelos en Odoo, para que sirve esto? pues para modificar, añadir, quitar

campos en nuestros modelos.

Asumo que ya saben como crear un modulo e incluir archivos.

Vamos a empezar por el heredar un modelo:

En este caso voy a heredar el modelo de Partner (res.partner) para poder modificarlo a mi antojo, lo mas pro

seria hacer estas cosas sin mirar siquiera el código fuente, pero para los curiosos, esta definido en el archivo

openerp>addons>base>res>res_partner.py, sin embargo yo voy a explicar como hacerlo por las buenas.

Vamos hasta el formulario del objeto que queramos modificar, en este caso “res.partner” seria la información

de nuestros clientes, proveedores y socios, entonces vamos hasta Ventas, ponemos el cliente web en modo

desarrollador.

Ya en modo desarrollador, al hacer click, en cualquier socio, nos abrirá la vista formulario (form de ahora en

mas) del modelo partner, hacemos click en el desplegable de opciones del desarrollador, y pinchamos la

opción “Administrar vistas”, se nos abrirá un popup, y aquí tendremos la información que necesitamos, para

modificar el modelo, en la columna nos dice que el nombre del objeto es “res.partner”. Y vamos a utilizar esa

información para heredar, también una vez mas espabilados puedes obtener esa información solo mirando la

URL.
Creamos un archivo .py y lo importamos en nuestro init.py.

Para OpenERP 7 y con el estilo de la vieja API del ORM, seria así:

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

from openerp.osv import fields, osv

class res_partner(osv.osv):

_name = 'res.partner'

_inherit = 'res.partner' # Aqui colocamos el nombre del modelo que vamos a heredar

_columns = {

'dni': fields.char('DNI', size=32, translate=True), # declaro un campo char para

almacenar el DNI

# Añado una restriccion unique para que el DNI no se repita

_sql_constraints = [

('dni', 'unique(dni)', 'The DNI must be unique')

res_partner()

Es bastante simple en _inherit= (tambien puede ser _inherits=), declaro el objeto que voy a heredar. En
_columns añado un campo “dni” y en por ultimo añado una restricción en _sql_constraints, para que no se
pueda repetir.

Con Odoo V8 cambia un poco, pero la nueva API es retrocompatible, esto significa que se puede escribir de

todas formas como lo hacías antes, es importante sin embargo que sepamos que son diferentes ya que por
ejemplo si vas a sobrescribir un método de la nueva API, tendrás que hacerlo con el estilo de la nueva API.

Para declarar lo mismo en V8 seria de esta forma:

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


from openerp import models, api, fields

class res_partner(models.Model):

_name = 'res.partner'

_inherit = 'res.partner'

dni = fields.Char(string="DNI")

_sql_constraints = [

('dni', 'unique(dni)', 'The DNI must be unique')

Como podemos observar no es muy difícil.

No tengo mucho tiempo así que voy a explicar lo siguientes casos que considero lo mas común en el trabajo,

todo en uno, aplica para los casos en que queramos:

1.Modificar el orden.

2.Quitar o añadir un campo atributos (por ejemplo que sea un campo requerido).

3.Quitar o añadir el valor por defecto de un campo.

class res_partner(osv.osv):
_name = 'res.partner'
_inherit = 'res.partner'

_order = "name asc" # Ordenamiento ascendente, en caso que querramos que sea

descendente, colocamos desc

_columns = {

'name': fields.char('Name', required=False) #Redefinimos el campo name y le

quitamos el atributo requerido

'dni': fields.char('DNI', required=True), # Hago dni un campo requerido

_defaults = {

'is_company' : False, # Declaro que los socios por defecto no sean tratados como

compañias sino como personas fisicas

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 porContabilidad>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>

Hola hago este post por si alguien necesita saber como ocultar un campo vacio en una vista form
(Formulario) a traves de sus atributos en Odoo v8.Supongamos que tenemos un campo One2many llamado
line_ids, en este caso en la definición de la vista form correspondiente, debemos añadir unas lineas de la
siguiente forma:

<field name="line_ids" attrs="{'invisible':[('line_ids','=',[])]}">

De esta forma si el campo esta vacio, simplemente no sera dibujado por el navegador, ahorrando espacio en
campos de solo lectura…

También podría gustarte