Valores por Defecto - leninsvg/Odoo GitHub Wiki

Para realizar o insertar de un valor por defecto se utiliza un create y un return por medio del cual se retorna los valores por defecto.

Decoradores

@api.multi

Create

Por medio de esta funcion se puede instanciar un objeto de manera que pueda ser guardado en BDD. En el siguiente ejemplo se visualizara con mayor claridad:

auxItem=self.env['gol.item.apportionment'].create({
                    'idItemApportionment':auxId,
                    'centerCost':auxIdCenterCost,
                    'value':auxValue})

Como se observa la funcion create depende del env ya que nesesita de un objeto al cual asignar valores por defecto

Return

Esta palabra reservada permite retornar valores a BDD. para su uso utilizare el siguiente ejemplo:

@api.multi
def insertarItems(self,auxId,auxValue,auxIdCenterCost):
    values = {}
    auxItem=self.env['gol.item.apportionment'].create({
                    'idItemApportionment':auxId,
                    'centerCost':auxIdCenterCost,
                    'value':auxValue})
    values['idItemApportionment']=auxItem.idItemApportionment
    values['centerCost']=auxItem.centerCost
    values['value']=auxItem.value       
    return {'value': values}

Como se observa el return depende del value:

value: en el value van los datos a ser registrados en la BDD

Cargar valores por defecto desde una campo a otro si tienen el mismo tipo de objeto.

@api.multi
def onchange_account_id(self,account_id):       
    #Intento 3 Funcionando --- :)
    values = {}
    domain = {}
    if account_id:
        auxAccount=self.env['account.account'].browse(account_id)
        auxApportionment=self.env['gol.apportionment'].browse(auxAccount.apportionment)           
        values['apportionment']=auxApportionment.id
    return {'value': values, 'domain':domain}

En este ejemplo insertamos valores en el campo apportionment. Para lo cual:

Cargamos los valores que queremos insertar

auxAccount=self.env['account.account'].browse(account_id)
auxApportionment=self.env['gol.apportionment'].browse(auxAccount.apportionment)

Asignamos a nuestro campo los valores cargados

values['apportionment']=auxApportionment.id

Retornamos el resultado a la BDD

return {'value': values, 'domain':domain}

Cargar valores por defecto desde una campo a otro si son de objetos diferentes.

Este caso es mas complicado ya que se tiene que crear el otro objeto. Para explciarlo de una manera mejor utilizare el siguiente ejemplo:

@api.multi
def onchange_account_id(self,account_id):       
    #Intento 3 Funcionando --- :)
    values = {}
    domain = {}
    if account_id:
        auxAccount=self.env['account.account'].browse(account_id)
        auxApportionment=self.env['gol.apportionment'].browse(auxAccount.apportionment)            
        auxItemCenterCost=self.env['gol.item.center.cost'].search(['idItemCenterCost', '=', auxAccount.apportionment.id](/leninsvg/Odoo/wiki/'idItemCenterCost',-'=',-auxAccount.apportionment.id))
    #Intento 2       
        auxAuxItemApportionment=self.env['gol.aux.item.apportionment'].create({})              
        for item in auxItemCenterCost:       
            self.insertarItems(auxAuxItemApportionment.id, item.value, item.centerCost.id)           

values['auxItemApportionment']=auxAuxItemApportionment.id
return {'value': values, 'domain':domain}

@api.multi
def insertarItems(self,auxId,auxValue,auxIdCenterCost):
    values = {}
    domain = {}
    auxItem=self.env['gol.item.apportionment'].create({
                    'idItemApportionment':auxId,
                    'centerCost':auxIdCenterCost,
                    'value':auxValue})
    values['idItemApportionment']=auxItem.idItemApportionment
    values['centerCost']=auxItem.centerCost
    values['value']=auxItem.value       
    return {'value': values, 'domain':domain}

Cargamos los valores a insertar

  auxAccount=self.env['account.account'].browse(account_id)
  auxApportionment=self.env['gol.apportionment'].browse(auxAccount.apportionment)
  auxItemCenterCost=self.env['gol.item.center.cost'].search(['idItemCenterCost', '=',auxAccount.apportionment.id](/leninsvg/Odoo/wiki/'idItemCenterCost',-'=',auxAccount.apportionment.id))

En mi caso voya insertar varios valores asi que tengo que cargar todo esto

Creamos los objetos o armamos una estructura que nos permita la creacion del objeto:

Con esto creo un objeto

auxAuxItemApportionment=self.env['gol.aux.item.apportionment'].create({})

Con la siguiente funcion definimos la creacion e insercion de datos en un objeto, Para en la cual defino parametros que paso. Esto se da ya que el objeto a ser creado contiene otro objeto el cual tengo que llenar

@api.multi
def insertarItems(self,auxId,auxValue,auxIdCenterCost):
    values = {}
    domain = {}
    auxItem=self.env['gol.item.apportionment'].create({
                    'idItemApportionment':auxId,
                    'centerCost':auxIdCenterCost,
                    'value':auxValue})
    values['idItemApportionment']=auxItem.idItemApportionment
    values['centerCost']=auxItem.centerCost
    values['value']=auxItem.value       
    return {'value': values, 'domain':domain}

Creamos el objeto

auxAuxItemApportionment=self.env['gol.aux.item.apportionment'].create({})

Seteamos valores por defecto a los campos del objeto

for item in auxItemCenterCost:       
    self.insertarItems(auxAuxItemApportionment.id, item.value, item.centerCost.id)                       `
values['auxItemApportionment']=auxAuxItemApportionment.id

Retornamos los registros a la BDD

return {'value': values, 'domain':domain}

Valores por defecto One2Many

En el siguiente ejemplo pongo valores por defecto a un campo One2Many

'''Con esta Funcion pongo valores por defecto el las cuentas de tipo ordenador
Esto lo hago con la finalidad que esten listadas todas las cuentas tipo ordenador'''          
@api.model
def default_get(self, vals):
    auxOrganizerType= self.env['gol.organizer.type'].search([])
    listItemOrganizerAccount=[]
    for item in auxOrganizerType:
        '''Aqui lleno mi lista con un array para esto adjunte () diciendole a mi lista que lo que
        ingreso es un array'''
        listItemOrganizerAccount.append((0,0,{'auxType':item.id}))
    res = super(GolAccount, self).default_get(vals)      
    res.update({'itemOrganizerAccount': listItemOrganizerAccount})
    return res

Primeramente busco lo que quiero llenar osea los valores por defecto que pondre. Para esto utilizo:

    auxOrganizerType= self.env['gol.organizer.type'].search([])

Segido de esto me construyo una lista en la cual insertare el arreglo de objetos que pondre por defecto en mi campo One2Many. Para esto utilizare lo siguiente:

(0,0,{Values}) : con esto estamos indicando que insertaremos nuevos registros. No se preocupen los 0 son por defecto el primer 0 significa que vamos a insertar, y el segundo que se asigne un id automaticamente.

   for item in auxOrganizerType:
        '''Aqui lleno mi lista con un array para esto adjunte () diciendole a mi lista que lo que
        ingreso es un array'''
        listItemOrganizerAccount.append((0,0,{'auxType':item.id}))

Teniendo en cuenta esto armamos la lista pero ojo aqui tendran un problema ya que una lista no admite datos multiples, es decir de enteros que son los 0 y diccionarios que son {}, Por tal motivo se adjunta una convercion interna en la lista a una rreglo esto lo hago con (). Una ves que tenemos esto ya tendremos una lista con una estructura bien definida.

Una vez que tenemos todo esto es hora de llenar mi elemento, para esto utilizare:

    res = super(GolAccount, self).default_get(vals) 

En esta linea estamos diciendo que estamos trabajando con nuestra clase principal ocea en la que nos encontramos. Si saben algo de programacion sabran para que sirve super.

    res.update({'itemOrganizerAccount': listItemOrganizerAccount})

segido de esto con esta linea actulizamos el elemento que querramos inicializar o poner valores por defecto. Y finalmente retornamos un resultado.

    return res