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