Domain para un field Many2one

2,163 views
Skip to first unread message

Eduardo BP

unread,
May 26, 2015, 11:23:46 PM5/26/15
to openerp-s...@googlegroups.com
Hola a tod@s.

La duda que tengo está relacionada con el establecimiento de un domain para un field many2one de un modelo.

Tengo un modelo que representa a una compañía o empresa. En este modelo hay un field que representa el sector al que ésta pertenece, y un subsector cuyo padre es el sector elegido.

class Company(models.Model):
_name = 'crm.company'

    sector = fields.Many2one('crm.company.sector')
subsector = fields.Many2one('crm.company.sector')

Por otra parte, tengo el modelo 'crm.company.sector':

class CompanySector(models.Model):
_name = 'crm.company.sector'
_parent_store = True
_parent_name = 'parent_id'

name = fields.Char(string='Nombre sector', required=True)
parent_id = fields.Many2one(
'crm.company.sector', 'Sector Padre', ondelete='restrict')
parent_left = fields.Integer('Padre izquierdo', index=True)
parent_right = fields.Integer('Padre derecho', index=True)
child_ids = fields.One2many('crm.company.sector', 'parent_id', 'Sectores hijos')

Como veis, el modelo CompanySector tiene una relación de jerarquía padre/hijo, ya que un sector puede tener sectores hijos o no.

El caso, en que en la vista de formulario de creación de una compañía tengo dos combobox, uno para elegir el sector y otro para el subsector:
Lo que yo quiero es que al seleccionar un sector, sólo pueda seleccionar los subsector que son hijos del sector elegido.
Por ejemplo, si el sector Agricultura tiene dos subsectores hijos: Vino y Patatas, yo quiero que en la lista deplegable del campo Subsector me aparezcan sólo las opciones Vino y Patatas.

He intentando fabricar un método en el model Company, que se active cuando cambia el valor del combobox Sector, y que devuelva un dominio para conseguir lo que he comentado antes, pero no me funciona.

@api.one
@api.onchange('sector')
def _onchange_sector(self):
if self.sector:
Sector = self.env['crm.company.sector']
subsectors = Sector.search([('parent_id', "=", self.sector.id)])
domain = {'domain': {'subsector': [('subsector', 'in', subsectors.ids)]}}
return domain
return True

Si alguien me puede ayudar se lo agradecería, llevo horas sin dar con la solución.

Pedro Manuel Baeza Romero

unread,
May 27, 2015, 4:04:55 AM5/27/15
to openerp-s...@googlegroups.com
Ponle @api.multi en su lugar, ya que @api.one encapsula el resultado en una lista y no es legible.

Un saludo.

--
Has recibido este mensaje porque estás suscrito al grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Eduardo BP

unread,
May 27, 2015, 12:02:11 PM5/27/15
to openerp-s...@googlegroups.com
Gracias por tu respuesta Pedro.
Finalmente el método _onchange_sector ha quedado de la siguiente manera:
@api.multi
@api.onchange('sector')
def _onchange_sector(self):
    if self.sector.id:
return {'domain': {'subsector': [('parent_id', '=', self.sector.id)]}}
He descubierto que este dominio también puede escribirse en la vista (fichero .xml) correspondiente al formulario de creación de empresa, en vez de con el método anterior:
<field name="subsector" attrs="{'invisible': [('sector', '=', False)]}" domain="[('parent_id', '=', sector)]"/>

Guido Muchiutti

unread,
Sep 9, 2016, 3:33:32 PM9/9/16
to Usuarios Odoo / OpenERP en España, eduar...@gmail.com
Hola a todos. Yo tengo una situación similar, se las explico a ver si a alguien se le ocurre que puedo hacer.

Expandí el modulo "purchase" y agregué una nueva entidad llamada "Solicitud de compras". Cada orden de compra tiene asociada una solicitud de compra. Lo que quiero lograr es que cuando el usuario selecciona una solicitud de compra, se dispare un "@api.onchange" que devuelve un domain que restringe los productos que pueden seleccionarse en las "order.line".

La siguiente es el tree que esta en la vista de "purchase.order.form":
<field name="order_line">
<tree string="Purchase Order Lines" editable="bottom">
<field name="product_id"
on_change="onchange_product_id(parent.pricelist_id,product_id,0,False,parent.partner_id, parent.date_order,parent.fiscal_position,date_planned,False,False,parent.state,context)"/>
<field name="name"/>
<field name="date_planned" invisible="1"/>
..........
Una de las tantas cosas que intente hacer ( sin resultados positivos) es lo siguiente: expandí 'purchase.order' y aguregue el siguiente código:
@api.multi
@api.onchange('solicitudcompra_id')
def set_domain(self):
print "entra"

return {'domain': {'order_line.product_id': [('id', '=', self.solicitudcompra_id.get_products_list() )]}}


¿Se les ocurre algo?

Gracias desde ya.

Saludos.:

Pedro Manuel Baeza Romero

unread,
Sep 11, 2016, 7:30:43 AM9/11/16
to Usuarios Odoo / OpenERP en España
Buenas Guido,

El problema es que estás declarando un onchange en nueva API, lo que es incompatible con cómo está declarado en el módulo purchase de Odoo, que es API vieja. Tendrás que sobreescribir el método onchange actual, llamando a super y añadiendo tu dominio al resultado obtenido.

Un saludo.

--
Has recibido este mensaje porque estás suscrito al grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-users+unsub...@googlegroups.com.

Guido Muchiutti

unread,
Sep 12, 2016, 7:25:19 AM9/12/16
to openerp-s...@googlegroups.com
Ha!!! Bueno muchas gracias . No lo hubiera imaginado. 

Gracias. 

Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-users+unsubscribe...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/openerp-spain-users/aIWaxd5XgWU/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a openerp-spain-users+unsub...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Guido

Gabriel Davini

unread,
Sep 12, 2016, 5:16:15 PM9/12/16
to openerp-s...@googlegroups.com

2016-09-09 16:33 GMT-03:00 Guido Muchiutti <guidoom...@gmail.com>:
return {'domain': {'order_line.product_id': [('id', '=', self.solicitudcompra_id.get_products_list() )]}}

Sumo a la respuesta de Pedro que el operador en este caso debería ser 'in', no '='.


--
Gabriel.

Guido Muchiutti

unread,
Sep 13, 2016, 8:56:22 AM9/13/16
to openerp-s...@googlegroups.com
Gracias, puse en practica la recomendación y funciono. Lo que si quite el remplazo que estaba haciendo de la VIEW, porque me traía problemas. Sencillamente el método devolvía bien el contenido pero la vista no surgía ningún cambio. 

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/openerp-spain-users/aIWaxd5XgWU/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a openerp-spain-users+unsub...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Guido

Jordi Francesc

unread,
Sep 13, 2016, 9:41:35 AM9/13/16
to openerp-s...@googlegroups.com
Ah, o sea, ¿se puede aplicar un dominio sobre un campo hijo desde el onchange del padre?

Creo que lo intenté alguna vez y no me funcionó.

¿Está bien definido esto?
return {'domain': {'order_line.product_id': [(...)]}}

2016-09-13 14:55 GMT+02:00 Guido Muchiutti <guidoom...@gmail.com>:
Gracias, puse en practica la recomendación y funciono. Lo que si quite el remplazo que estaba haciendo de la VIEW, porque me traía problemas. Sencillamente el método devolvía bien el contenido pero la vista no surgía ningún cambio. 
El 12 de septiembre de 2016, 18:15, Gabriel Davini <gabrielfranciscodavini@gmail.com> escribió:

2016-09-09 16:33 GMT-03:00 Guido Muchiutti <guidoom...@gmail.com>:
return {'domain': {'order_line.product_id': [('id', '=', self.solicitudcompra_id.get_products_list() )]}}

Sumo a la respuesta de Pedro que el operador en este caso debería ser 'in', no '='.


--
Gabriel.

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/openerp-spain-users/aIWaxd5XgWU/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a openerp-spain-users+unsubscribe...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Guido

--
Has recibido este mensaje porque estás suscrito al grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-users+unsub...@googlegroups.com.

Guido Muchiutti

unread,
Sep 13, 2016, 10:29:58 AM9/13/16
to openerp-s...@googlegroups.com
No, después de la recomendación de Pedro, lo hice fue realmente lo que quería hacer desde un principio. Que el onchange auto complete la lista de items de la orden de compra. Eso es lo que quedó andando, y lo logre haciendo la herencia con la vieja api, como esta desarrollado el modulo de purchase en odoo 8.

Saludos.


Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a openerp-spain-users+unsubscribe...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Usuarios Odoo / OpenERP en España" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/openerp-spain-users/aIWaxd5XgWU/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a openerp-spain-users+unsub...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Guido

Reply all
Reply to author
Forward
0 new messages