Hola,
he encontrado una solución usando la función fields_view_get(). Os desarrollo un poco los pasos y la lógica que he seguido hasta llegar a ella.
Consideraciones previas:
1º- Cuando en nuestro form usamos un field de un campo One2many y usamos el widget="one2many_list", parece que si dentro del field anidamos la estructura <tree> que queremos que muestre, usa esta estructura. Si no ponemos ninguna estructura, entonces usa la vista tree que tenga configurada el sistema o que hayamos definido nosotros de forma explicita en un archivo xml.
2º- Usando la función fields_view_get(), cuando interceptamos la vista form y vemos el contenido, no sé por qué, pero si el field One2many, en el xml tiene definido su vista tree de forma anidada, esta no aparece, por lo tanto, no se puede modificar.
3º- La vista form, con su field One2many, con tree anidado, no lanza la funcion fields_view_get() del modelo con el que se relaciona el campo One2many.
4º- La vista form, con su field One2many, pero sin ningún tree anidado, si el sistema dispone de una vista tree registrada de ese modelo con el que se relaciona el campop One2many, entonces si lanza la
funcion fields_view_get(). Además, esta función, si gestiona la información que se renderiza cuando el field One2many, hace uso del widget "one2many_list".
Después de este rollo, que no sé si es del todo cierto, porque está basado en prueba y error, al final lo que he hecho respecto a mi supuesto inicial, es lo siguiente, partiendo de que tenemos dos modelos, peliculas y escenas, y que su relación es de One2many.
Vistas generadas
Vista de tipo form para el modelo pelicula...
<record...
<field name="arch" type="xml">
<form>
<field name="name"/>
<field name="tipo" />
<field name="director"/>
<field name="pais"/>
<field name="escenas"widget="one2many_list" context="{'default_tipo': tipo}" />
</form>
Vista tree de escenas
<record...>
<field name="arch" type="xml">
<tree editable="bottom" >
<field name="minuto"/>
<field name="fecha"/>
<field name="name"/>
<field name="num_actores" invisible="1" />
<field name="contiene_efectos" invisible="1" />
</tree>
</field>
Dentro de la clase del modelo de escenas:
class Escenas(models.Model):
....
class Escena(models.Model):
_inherit ='escenas'
[Campos del modelo...]
@api.model
def fields_view_get(self, view_id=None, view_type=False, toolbar=False, submenu=False):
context = self._context
tipo_pelicula = context.get('default_tipo')
res = super(Escena, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
if view_type == 'tree':
doc = etree.XML(res['arch'])
if tipo_escena in ('terror'):
for node in doc.xpath("//field[@name='num_actores']"):
node.set('invisible', '0')
node.set('modifiers', '{"tree_invisible": false}')
for node in doc.xpath("//field[@name='contiene_efectos']"):
node.set('invisible', '0')
node.set('modifiers', '{"tree_invisible": false}')
res['arch'] = etree.tostring(doc)
return res
La clave un poco está en modificar el nodo buscandolo por su propiedad name y añadir los atributos que queramos... La propiedad que realmente hace que se vea o no una columna es la de modifiers... Con solo invisible, seguía haciendo que se modificase.
Perdón por el lío, pero creo que puede ser de utilidad.
Espero que se entienda algo.
Saludos.