lunes, 17 de octubre de 2016

Devolver nombre en odoo

Es muy común que tengamos un objeto persona, trabajador, etc, relacionado a un ser humano, el cual tiene (normalmente) dos nombres y dos apellidos. En alguno casos, definimos solo un campo nombres y otro apellidos, nunca se recomienda un solo campo para almacenar todo eso.
En odoo, al recuperar el un registro de un objeto, por ejemplo, al crear un proyecto asignarle un(os) activista(s), el campo Many2one nos traería por defecto el valor del campo 'name', y en caso de no tener ese campo usamos el atributo _rec_name para definir otro campo, por ejemplo: 'nombres'.
Pero esto trae un inconveniente, que al mostrar en la lista desplegable, no nos basta con los nombres solamente; necesitamos los nombres y los apellidos. Para solucionar eso, definimos el método name_get
Ej:
class Activista(models.Model):
    """Registro de Activista de Bachaco-ve"""
    _name = 'activista'
    _rec_name = 'nombres'
    nombres = fields.Char(size=30,required=True, help='Nombre del Activista')
    apellidos = fields.Char(size=30,required=True, help='Apellidos del Activista')
    cedula = fields.Char('Cédula',size=8,required=True, help='Cédula del Activista')
    #...

def name_get(self, cr, uid, ids, context=None):
    res = []
    activistas = self.browse(cr, uid, ids, context)
    for activista in activistas:
        res.append((activista.id, activista.nombres + ' ' + activista.apellidos))
    return res
En este ejemplo observamos cómo definimos el método name_get con los argumentos necesarios. Luego declaramos una lista vacía, el cual retornará un par de valores (id, valor). Seguidamente instanciamos un objeto 'activistas' el cual contiene todos los registros. Luego iteramos sobre este objeto en un nuevo elemento llamado 'activista'. La acción a ejecutar será añadir a las lista 'res' dos elementos: el id del activista y la concatenación del campo nombres con apellidos incorporando un espacio en blanco entre ambos valores. Finalmente se retorna la lista res.
Entonces veremos que al usar este objeto en una relación Many2one obtendremos el nombre completo. Lo que hemos hecho es montarnos sobre el atributo _rec_name. Todas las propiedas aplicables a ese atributo, ahora son reemplazadas por nuestra función. Nota: fíjense cómo al revisar un elemento en la vista formulario, nos muestra el nombre completo.
Ejemplo de código AQUI
Nota: es importante destacar que el campo definido en en el atributo _rec_name seguirá siendo utilizado para las búsquedas tanto en el search de la vista tree como con los campos Many2one dentro de una vista form

Fuente:
https://gist.github.com/vijoin/b370e68a06d89af5b354

No hay comentarios:

Publicar un comentario