Dominios, Busquedas (env, browse, search), Filtros, Agrupamientos - leninsvg/Odoo GitHub Wiki

Busquedas

Env

Por medio de esta funcion se crea un objeto para su uso se tiene la siguiente sintaxis.

@api.multi
def onchange_account_id(self,account_id):       
    auxAccount=self.env['account.account']

Como se puede observar se puede utilizar del env en una funcion. En mi caso estoy creando un objeto de tipo cuenta.

Search

Por medio de esta funcion se puede buscar los registros de una manera deinamica y facil para su uso tenemos:

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

En el ejemplo un objeto en el cual gurdaremos nuestra busqueda.

Con self.env['gol.item.center.cost'] se esta definiendo que nuestro o objetos resultado seran buscados en 'gol.item.center.cost' seguido de esto definimos el filtro

 search(['idItemCenterCost', '=', auxAccount.apportionment.id](/leninsvg/Odoo/wiki/'idItemCenterCost',-'=',-auxAccount.apportionment.id)).

El filtro se define del siguiente modo: 'field','=', value....

 search(['is_company', '=', True], ['customer', '=', True](/leninsvg/Odoo/wiki/'is_company',-'=',-True],-['customer',-'=',-True))

Browse

Su fincionamento es paresido al del search solo que a diferencia de este el filtro esta definido hacia el id. Y no permite filtrar multiples campos. Para su uso se tiene:

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

Como se puede observar al igual que el serach depende del env, solo que en el browse se busca los objetos que tengan el id. El cual es enviado en el filtro.

Filtrar Valores desde el xml de un formulario

Para el filtro de valores desde una vista se debe estableser el dominio, no importa si se trata de una campo Many2one en este tipo de busqueda se podra acceder filtrar los campos del field many2one

 <field name="accountingAccount" domain="[('type','=','movement')]"/>

Como se puede apreciar aqui se esta filtrando a las cuentas de tipo movimiento para que sean desplegadas en la vista

Definir un dominio en un campo Many2One

Parra llenar poner un dominio a un elemneto many2one se tienen que utilizar una lista, la cual contendra nuestro dominio. Recordar que en un dominio es un conjunto de atributos los cuales se apuntan se definen un una búsqueda. En otras palabras con el dominio se define un filtro.

    @api.multi
    def onchange_get_organizer_account(self,auxType):
    if auxType:
        ids=self.env['gol.organizer.account'].search(['organizerType', '=', auxType](/leninsvg/Odoo/wiki/'organizerType',-'=',-auxType))
        auxIds=[]    
        for item in ids:
            auxIds.append(item.id) 
        print ids
        print auxIds
        return {'domain':{'organizerAccount':[('id','in',auxIds)]}}  
    @api.onchange('organizerAccount','code')
    def getCode(self):
    if self.organizerAccount:
        self.code=self.organizerAccount.code

Para empesar itilizare un objeto en el cual gurdamos los objetos que querramos desplegar en nuestro elemento many2one

    ids=self.env['gol.organizer.account'].search(['organizerType', '=', auxType](/leninsvg/Odoo/wiki/'organizerType',-'=',-auxType))

Como resultado de la busqeuda tendresmo una lista e objetos. en este punto yo solo nesesitos los ids pero para estableser un dominio odoo solo adminite una busqueda por listas. Por lo cual me creo una lista y la lleno con los Ids mi busqueda

        auxIds=[]    
        for item in ids:
            auxIds.append(item.id)

Una ves que ya tengo la lista de id retorno el dominio, en el cual digo los id de organizer account que esten en la lista auxIds

        return {'domain':{'organizerAccount':[('id','in',auxIds)]}}

https://github.com/idu-bogota/curso-taller-openerp/tree/odoo-v8/lecciones/05