es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo ocultar el botón de creación o edición basado en una condición utilizando python o xml? Odoo 14

En el modelo stock.picking, quiero ocultar los botones de edición y creación basados en la condición (si mi campo booleano: ‘is_active’ = False). He intentado con:

   <xpath expr="/form" position="attributes">
                <attribute name="create">{'false':[('is_active', '=', False)]} 
                 </attribute>
                <attribute name="edit">{'false':[('is_active', '=', False)]} 
                </attribute>
       </xpath>

También he intentado con código Python utilizando la función fields_view_get:

@api.model
def fields_view_get(self, view_id=None, view_type='form',
                    toolbar=False, submenu=False):

    res = super(StockPicking, self).fields_view_get(
        view_id=view_id, view_type=view_type,
        toolbar=toolbar, submenu=submenu)

    doc = etree.XML(res['arch'])
    if view_type == 'form':
        for node_form in doc.xpath("//form"):
            node_form.set("create", 'false')
            node_form.set("edit", 'false')
    res['arch'] = etree.tostring(doc)
    return res

Este código funciona, pero al agregar mi condición usando:

   for rec in self:
         if view_type == 'form' and rec.is_active == True:
             .....

Ese código no entra en la condición.

¿Alguna ayuda por favor?
¿Cómo puedo hacerlo con XML o Python?

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para ocultar los botones de editar y crear en el modelo stock.picking basado en la condición de que el campo is_active sea False, puedes usar el siguiente código en XML:

    <xpath expr="//form" position="attributes">
        <attribute name="create">{'invisible': [('is_active', '=', False)]}</attribute>
        <attribute name="edit">{'invisible': [('is_active', '=', False)]}</attribute>
    </xpath>
    

    Esto hará que los botones de crear y editar sean invisibles si el campo is_active es False.

    Alternativamente, puedes usar código Python en la función fields_view_get:

    @api.model
    def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
        res = super(StockPicking, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
    
        if view_type == 'form' and self.is_active == False: 
            doc = etree.XML(res['arch']) 
            for node_form in doc.xpath("//form"): 
                node_form.set("create", "false") 
                node_form.set("edit", "false") 
            res['arch'] = etree.tostring(doc)
        return res
    

    Este código también ocultará los botones de crear y editar si el campo is_active es False. Sin embargo, es importante tener en cuenta que si quieres comprobar el valor del campo is_active para cada registro, necesitarás usar un bucle para iterar sobre los registros:

    @api.model
    def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
        res = super(StockPicking, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
    
        doc = etree.XML(res['arch'])
        if view_type == 'form':
            for node_form in doc.xpath("//form"):
                for rec in self:
                    if rec.is_active == False:
                        node_form.set("create", "false")
                        node_form.set("edit", "false")
                        break
        res['arch'] = etree.tostring(doc)
        return res
    

    Este código recorrerá cada registro y comprobará el valor del campo is_active. Si es False para algún registro, ocultará los botones de crear y editar en la vista.

Comments are closed.