Añadir filtro en un campo one2many

2,606 views
Skip to first unread message

Alberto García

unread,
Sep 30, 2013, 5:47:34 AM9/30/13
to openerp-s...@googlegroups.com
Buenos días,

Me he quedado atascado en el siguiente punto: tengo un campo one2many relacionado con otra tabla a través de la id del registro, al que quiero añadir que se cumpla otra condición para que me aparezca en el campo con el widget one2many_list...

El problema que tengo es que, aunque defina en el modelo esta condición (o sólo en la vista, o en ambas), me lo está ignorando.

Código Python

class padre(osv.osv):
  _name = 'test.padre'
  _columns = {
    'name':fields.char('Nombre',size=80,required=True),
    'dependencias_jueves':fields.one2many('test.hijo','padre_id','Dependencias',context="{'dia_id':['jueves']}"),
  }
padre()

class hijo(osv.osv):
  _name = 'test.hijo'
  _columns = {
    'padre_id':fields.many2one('test.padre','Padre',required=True,ondelete='cascade'),
    'dia_id':fields.selection((('jueves','Jueves'),('viernes','Viernes'),('sabado','Sábado'),('domingo','Domingo')),'Día'),
    'responsables':fields.integer('Responsables'),
    'oficiales':fields.integer('Oficiales'),    
  }
  _defaults = {
    'padre_id' : lambda self, cr, uid, context : context['padre_id'] if context and 'padre_id' in context else None,
    'dia_id' : lambda self, cr, uid, context : context['dia_id'] if context and 'dia_id' in context else None 
  }
hijo()

Código XML
<record model="ir.ui.view" id="padre_view">
        <field name="name">test.padre.view</field>
        <field name="model">test.padre</field>
        <field name="type">form</field>
        <field name="arch" type="xml">
          <form col="8">
            <field name="name" colspan="4" />            
            <notebook colspan="8">
              <page string="Dependencias">
                <field name="dependencias_jueves" nolabel="1" widget="one2many_list"
                       domain="[('plantilla_id','=',active_id),('dia_id','in',['jueves'])]"  context="{'plantilla_id':active_id,'dia_id':'jueves'}">
                  <tree editable="bottom">
                    <field name="dia_id" />                                         
                    <field name="area_id"/>
                    <field name="responsables"/>
                    <field name="oficiales" />
                  </tree>
                </field>
              </page>              
            </notebook>             
          </form>
        </field>
      </record>  



El problema en concreto es que aunque cuando vaya a añadir un nuevo registro en la relación de hijos, me coge correctamente que el día nuevo a añadir es el jueves, pero a la hora de mostrar el widget del one2many, me está sacando todos los valores (como si no cogiera el filtro de dia_id = 'jueves')

¿Estoy haciendo alguna cosa mal? ¿Es posible añadir una condición al dominio de un one2many? 

En el Developer Book de la 6.1 viene lo siguiente

context:

Define a variable's value visible in the view's context or an on-change function. Used when searching child table of one2many relationship?

, por lo que entiendo que este caso se puede resolver, ¿pero cómo?


Un saludo y gracias por su tiempo,

Pedro Manuel Baeza Romero

unread,
Sep 30, 2013, 6:18:48 AM9/30/13
to openerp-s...@googlegroups.com
Buenas, Alberto, lo que tienes que hacer es utilizar domain en lugar de context para ese filtrado.

Un saludo.


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

Alberto García

unread,
Sep 30, 2013, 6:34:33 AM9/30/13
to openerp-s...@googlegroups.com
Buenas,

He probado a añadir el domain, quedándose la definición del campo así:

    'dependencias_jueves':fields.one2many('test.hijo','padre_id','Dependencias',domain="[('dia_id','=','jueves')]"),

Ahora obtengo el siguiente error:
TypeError: cannot concatenate 'str' and 'list' objects

También he probado variantes en en domain como [('dia_id','in',['jueves'])], o [('dia_id','=',['jueves'])], con el mismo resultado.

Ignacio Ibeas

unread,
Sep 30, 2013, 6:44:43 AM9/30/13
to openerp-s...@googlegroups.com

Hola,


Estas comparando id (dia_id) que es número con un String, debes compararlo con el id al que corresponda 'jueves'.

 

Saludos

 

On Lunes, 30 de septiembre de 2013 03:34:33 Alberto García escribió:

> Buenas,

>

> He probado a añadir el domain, quedándose la definición del campo así:

>

> '*dependencias_jueves*

> ':fields.one2many('test.hijo','padre_id','Dependencias',*

> domain="[('dia_id','=','jueves')]"*),

>

> Ahora obtengo el siguiente error:

>

> TypeError: cannot concatenate 'str' and 'list' objects

>

>

> También he probado variantes en en domain como [('dia_id','in',['jueves'])],

> o [('dia_id','=',['jueves'])], con el mismo resultado.

--

Ignacio Ibeas

Acysos S.L. (www.acysos.com)

LinkedIn: http://lnkd.in/Mi37Fk

Launchpad: http://launchpad.net/acysos

Github: http://github.com/acysos

C/ Miguel Astrain 18, 1º Oficina A

31006 Pamplona, Navarra.

ign...@acysos.com

Tel. 948238905

Móvil 639452423

---------------------- // -------------------

La información contenida en este mensaje de correo electrónico es

confidencial, para ser leída por la(s) persona(s) a quién se dirige. El

acceso a este mensaje por otras personas no está autorizado. Si Ud. no es la

persona a la que va dirigido, cualquier divulgación, copia o distribución de

la información queda prohibida y puede ser ilegal. Asimismo, cualquier acción

tomada o dejada de tomar basada en la información contenida en este mensaje

queda prohibida y puede ser ilegal.

The information in this e-mail is confidential and may be legally privileged.

It is intended solely for the addressee. Access to this e-mail by anyone is

unauthorised. If you are not the intended recipient, any disclousure,

copying, distribuition or any action taken or omited to be taken in reliance

on it, is prohibited and may be unlawful.

Alberto García

unread,
Sep 30, 2013, 7:04:41 AM9/30/13
to openerp-s...@googlegroups.com, ign...@acysos.com
Buenas,

Según la definición del campo dia_id, es un campo selection (lo empecé como un entero, pero al final lo cambié a selection), por lo que la forma de comparar sería con el valor de cadena, ¿no?

No sé por dónde pueden ir los tiros, cuando parece que algo tiene sentido, no da error pero se salta el domain, mostrándome todos los registros.

Gracias por todo,

Ignacio Ibeas

unread,
Sep 30, 2013, 7:11:32 AM9/30/13
to Alberto García, openerp-s...@googlegroups.com

Vale, me ha confundido el ID, tendrias que comparar con el identificador de la selección. Copia aquí el código del campo dia_id.

 

Saludos

 

On Lunes, 30 de septiembre de 2013 04:04:41 Alberto García escribió:

> Buenas,

>

> Según la definición del campo *dia_id*, es un campo selection (lo empecé

> como un entero, pero al final lo cambié a selection), por lo que la forma

> de comparar sería con el valor de cadena, ¿no?

>

> No sé por dónde pueden ir los tiros, cuando parece que algo tiene sentido,

> no da error pero se salta el domain, mostrándome todos los registros.

>

> Gracias por todo,

--

Alberto García

unread,
Sep 30, 2013, 7:22:46 AM9/30/13
to openerp-s...@googlegroups.com, Alberto García, ign...@acysos.com
Buenas,

Adjunto el código tal y como lo tengo, ya que lo había puesto de forma que no tuviese que explicar las relaciones. He quitado el id al campo de dia_id para evitar confusiones.

class circuito_plantilla(osv.osv):
  _name = 'circuito.plantilla'
  _columns = {
    'name':fields.char('Nombre',size=80,required=True),
    'jueves':fields.boolean('Jueves'),
    'viernes':fields.boolean('Viernes'),
    'sabado':fields.boolean('Sábado'),
    'domingo':fields.boolean('Domingo'),
    'dependencias_1':fields.one2many('circuito.dependencia','plantilla_id','Dependencias'),
    'dependencias_2':fields.one2many('circuito.dependencia','plantilla_id','Dependencias'),
    'dependencias_3':fields.one2many('circuito.dependencia','plantilla_id','Dependencias'),
    'dependencias_4':fields.one2many('circuito.dependencia','plantilla_id','Dependencias'),              
  }    
circuito_plantilla()

class circuito_dependencia(osv.osv):
  _name = 'circuito.dependencia'
  _columns = {
    'plantilla_id':fields.many2one('circuito.plantilla','Plantilla',required=True,ondelete='cascade'),
    'area_id':fields.many2one('circuito.area','Área',required=True,ondelete='cascade'),
    'dia':fields.selection((('jueves','Jueves'),('viernes','Viernes'),('sabado','Sábado'),('domingo','Domingo')),'Día'),
    'responsables':fields.integer('Responsables'),
    'oficiales':fields.integer('Oficiales'),    
  }
  _defaults = {
    'plantilla_id' : lambda self, cr, uid, context : context['plantilla_id'] if context and 'plantilla_id' in context else None,
    'dia' : lambda self, cr, uid, context : context['dia'] if context and 'dia' in context else None 
  }
circuito_dependencia()


<record model="ir.ui.view" id="circuito_plantilla_view">
        <field name="name">circuito.plantilla.view</field>
        <field name="model">circuito.plantilla</field>
        <field name="type">form</field>
        <field name="arch" type="xml">
          <form col="8">
            <field name="name" colspan="4" />                 
            <group col="8" colspan="4">
              <field name="jueves"/>
              <field name="viernes" />
              <field name="sabado" />
              <field name="domingo" />
            </group>  
            <notebook colspan="8">
              <page string="Dependencias">
                <field name="dependencias_1" nolabel="1" widget="one2many_list" 
                       domain="[('plantilla_id','=',active_id),('dia','=',['jueves'])]" context="{'plantilla_id':active_id,'dia':'jueves'}">
                  <tree editable="bottom">
                    <field name="dia" />                                         
                    <field name="area_id"/>
                    <field name="responsables"/>
                    <field name="oficiales" />
                  </tree>
                </field>
              </page>              
            </notebook>             
          </form>
        </field>
      </record>  


Inicialmente, a una plantilla le correspondían una serie de dependencias, pero ahora a cada plantilla le podrán corresponder hasta 4 grupos de dependencias (uno para cada uno de los días posibles). 
Mi idea inicial era tener un sólo campo (many2one) de dependencias, y en el formulario, añadir tantos tree como me fuesen necesarios, añadiendo al dominio del campo la condición para que mostrase únicamente los correspondientes a cada uno de los días, pero si defino el domain directamente en la vista, tampoco me funciona.

Ignacio Ibeas

unread,
Sep 30, 2013, 10:59:19 AM9/30/13
to openerp-s...@googlegroups.com

Es campo booleano entonces tiene que ser:

 

<field name="dependencias_1" nolabel="1" widget="one2many_list" domain="[('plantilla_id','=',active_id),('jueves','=',1)]" />

 

Saludos

--

Alberto García

unread,
Sep 30, 2013, 12:30:32 PM9/30/13
to openerp-s...@googlegroups.com, ign...@acysos.com
Buenas,

Pero el campo booleano (jueves) que me indicas, es un campo del objeto padre, yo necesito hacer el filtro sobre los campos del objeto de dependencias.

Por lo que he estado viendo, el domain no funciona en los campos one2many, ¿es cierto? Lo que me hace falta ahora mismo, es establecer la relación por el filtro entre distintos campos, y actualmente sólo me funciona con el id de la plantilla.

Tengo otras opciones, como, por ejemplo, crear 4 modelos distintos, uno para cada uno de los días, pero no me parece la opción correcta.

Gracias de antemano. Un saludo,

Ignacio Ibeas

unread,
Oct 1, 2013, 4:15:21 AM10/1/13
to Alberto García, openerp-s...@googlegroups.com

Ok, me he mirado mal la clase.

 

Entonces tienes bien el dominio, y te sigue dando ese error??

 

Saludos

> > Ignacio Ibeas

> >

> > Acysos S.L. (www.acysos.com)

> >

> > LinkedIn: http://lnkd.in/Mi37Fk

> >

> > Launchpad: http://launchpad.net/acysos

> >

> > Github: http://github.com/acysos

> >

> > C/ Miguel Astrain 18, 1º Oficina A

> >

> > 31006 Pamplona, Navarra.

> >

> > ign...@acysos.com <javascript:>

Alberto García

unread,
Oct 1, 2013, 4:56:36 AM10/1/13
to openerp-s...@googlegroups.com, Alberto García, ign...@acysos.com
Sí, estoy empezando a pensar que con los campos one2many no se puede modificar el dominio.

Si lo pongo en la definición del campo -> fields.one2many('circuito.dependencia','plantilla_id','Dependencias',domain="[('dia','=','jueves')]") me da el siguiente error:

File "/opt/openerp61/server/openerp/osv/fields.py", line 551, in get
    ids2 = obj.pool.get(self._obj).search(cr, user, self._domain + [(self._fields_id, 'in', ids)], limit=self._limit, context=context)
TypeError: cannot concatenate 'str' and 'list' objects

Buscando por internet posibles soluciones, encontré un foro donde decían que el dominio habría que definirlo como el contexto en el campo field2many, quedándose el campo así definido, y obteniendo otro error distinto: -> fields.one2many('circuito.dependencia','plantilla_id','Dependencias',context="{'dia':'jueves'}"),

File "/opt/openerp61/server/openerp/osv/fields.py", line 543, in get
    context.update(self._context)
ValueError: dictionary update sequence element #0 has length 1; 2 is required

Finalmente, si no modifico la definición del campo y lo defino en el xml de la vista, me ignora las condiciones... El campo queda así -> fields.one2many('circuito.dependencia','plantilla_id','Dependencias'),
La definición del XML queda así:
<notebook colspan="8">
  <page string="Dependencias">
    <field name="dependencias_1" nolabel="1" widget="one2many_list"
                       domain = "[('plantilla_id','=',active_id),('dia','=','jueves')]" 
                       context="{'plantilla_id':active_id,'dia':'jueves'}">             
      <tree editable="bottom">
        <field name="dia"/>
        <field name="area_id"/>
        <field name="responsables"/>
        <field name="oficiales" />
      </tree>
    </field>
  </page>
</notebook>

De esta forma, aunque se establezca el dominio, parece ser que lo ignora. Adjunto una imagen en la que viene el supuesto dominio aplicado, pero mostrándome datos que no deberían entrar.

En la imagen se ve que en el dominio vienen las condiciones aplicadas, pero está mostrando ya un registro con dia = 'viernes'. Si modifico el XML y elimino el dominio que tengo puesto ahí, el formulario se ve exactamente igual.

No se más formas de modificar el dominio para un campo, pero no consigo que funcione para ninguna. Creo que aunque sea un engorro, voy a tener que hacer un modelo distinto para cada uno de los días para los que quiera asignar dependencias...

Un saludo y gracias por su tiempo
 

Pablo Cayuela Martínez - ASERTI

unread,
Oct 1, 2013, 6:18:13 AM10/1/13
to openerp-s...@googlegroups.com, Alberto García, ign...@acysos.com
 Hola Alberto.

Hasta donde he podido averiguar, los dominios funcionan si los defines en el modelo pero en las vistas no. Lo del dominio por contexto no suena bien, el contexto es solamente eso, un diccionario con valores a los que puedes acceder en las funciones a las que se lo pases.
El error que te está dando de concatenación de str y list es porque los dominios en el modelo van sin comillas, tienes que poner

fields.one2many('circuito.dependencia','plantilla_id','Dependencias',domain=[('dia','=','jueves')])
o de lo contrario cuando hace
 self._domain + [(self._fields_id, 'in', ids)]
cascará tal como dice el error.


Un saludo

Alberto García

unread,
Oct 1, 2013, 7:10:35 AM10/1/13
to openerp-s...@googlegroups.com, Alberto García, ign...@acysos.com
OLE OLE Y OLE,

Lamentablemente había comenzado ya con la barbaridad de sacar distintos modelos ya que no sabía si esto iba a marchar algún día, pero lo he probado y funciona correctamente. Era el tema de las comillas en el modelo.

Os dejo el código final en el que ha quedado:

class circuito_plantilla(osv.osv):
  _name = 'circuito.plantilla'
  _columns = {
    'name':fields.char('Nombre',size=80,required=True),
    'jueves':fields.boolean('Jueves'),
    'viernes':fields.boolean('Viernes'),
    'sabado':fields.boolean('Sábado'),
    'domingo':fields.boolean('Domingo'),    
    #Sin comillas en el domain y comparando con el valor del campo selección
    'dependencias_1':fields.one2many('circuito.plantilla.dependencia','plantilla_id','Dependencias',domain=[('dia','=','j')]), 
    'dependencias_2':fields.one2many('circuito.plantilla.dependencia','plantilla_id','Dependencias',domain=[('dia','=','v')]),
    'dependencias_3':fields.one2many('circuito.plantilla.dependencia','plantilla_id','Dependencias',domain=[('dia','=','s')]),
    'dependencias_4':fields.one2many('circuito.plantilla.dependencia','plantilla_id','Dependencias',domain=[('dia','=','d')]),
  }      
circuito_plantilla()

class circuito_plantilla_dependencia(osv.osv):
  _name = 'circuito.plantilla.dependencia'
  _columns = {
    'plantilla_id':fields.many2one('circuito.plantilla','Plantilla',required=True,ondelete='cascade'),
    'area_id':fields.many2one('circuito.area','Área',required=True,ondelete='cascade'),
    'dia':fields.selection((('j','Jueves'),('v','Viernes'),('s','Sábado'),('d','Domingo')),'Día'),    
    'responsables':fields.integer('Responsables'),
    'oficiales':fields.integer('Oficiales'),    
  }

  # Para que coja los valores por defectos pasados por contexto en el formulario.  
  _defaults = {
    'plantilla_id' : lambda self, cr, uid, context : context['plantilla_id'] if context and 'plantilla_id' in context else None,     
    'dia' : lambda self, cr, uid, context : context['dia'] if context and 'dia' in context else None,
  }
circuito_plantilla_dependencia()


Vista en XML
<record model="ir.ui.view" id="circuito_plantilla_view">
        <field name="name">circuito.plantilla.view</field>
        <field name="model">circuito.plantilla</field>
        <field name="type">form</field>
        <field name="arch" type="xml">
          <form col="8">
            <field name="name" colspan="4" />                 
            <group col="8" colspan="4">
              <field name="jueves"/>
              <field name="viernes" />
              <field name="sabado" />
              <field name="domingo" />
            </group>
            <group col="8" colspan="8">    
              <group colspan="4">
                <separator string = "Dependencias jueves" />
                <newline/>
                <!-- Sacamos cada uno de los campos, cambiando el contexto para que coja los valores por defecto.
                      Si queremos que coja el valor por defecto en el dia, a parte de tener definido el valor en _defaults {}, hay que añadirlo en este formulario,
                      aunque sea oculto. Si no no le pasa el valor -->
                <field name="dependencias_1" nolabel="1" widget="one2many_list"                    
                       context="{'plantilla_id':active_id,'dia':'j'}" colspan="4">                                   
                  <tree editable="bottom">
                    <field name="dia" invisible="1" />                                      
                    <field name="area_id"/>                
                    <field name="responsables"/>
                    <field name="oficiales" />
                  </tree>
                </field>
              </group>
              <group colspan="4">
                <separator string = "Dependencias viernes" />
                <newline/>
                <field name="dependencias_2" nolabel="1" widget="one2many_list"                    
                      context="{'plantilla_id':active_id,'dia':'v'}" colspan="4">                                   
                  <tree editable="bottom">
                    <field name="dia" invisible="1" />                                                              
                    <field name="area_id"/>                
                    <field name="responsables"/>
                    <field name="oficiales" />
                  </tree>
                </field>
              </group>
              <group colspan="4">
                <separator string = "Dependencias sábado" />
                <newline/>
                <field name="dependencias_3" nolabel="1" widget="one2many_list"                    
                      context="{'plantilla_id':active_id,'dia':'s'}" colspan="4">                                   
                  <tree editable="bottom">
                    <field name="dia" invisible="1" />                                                              
                    <field name="area_id"/>                
                    <field name="responsables"/>
                    <field name="oficiales" />
                  </tree>
                </field>
              </group>
              <group colspan="4">
                <separator string = "Dependencias domingo" />
                <newline/>
                <field name="dependencias_4" nolabel="1" widget="one2many_list"                    
                      context="{'plantilla_id':active_id,'dia':'d'}" colspan="4">                                   
                  <tree editable="bottom">
                    <field name="dia" invisible="1" />                                                              
                    <field name="area_id"/>                
                    <field name="responsables"/>
                    <field name="oficiales" />
                  </tree>
                </field>
              </group>
            </group>                       
          </form>
        </field>
      </record>


Muchas gracias por vuestro tiempo. ¡SOLUCIONADO!  =)
Reply all
Reply to author
Forward
0 new messages