General

¡Bienvenido a los foros Aeodoo!

Somos la comunidad de Odoo internacional hispanohablante.
Estos foros son para compartir y debatir dudas técnicas, funcionales y mejores prácticas para Odoo. Recuerda que no están permitidos los insultos, descalificaciones o spam, cualquier conducta reprobable supondrá el baneo del usuario.

0

Problema con una condicion en formulario con xpath odoo 13

Avatar
Eduardo

Hola, Primero indicar que la version de odoo es la 13, estoy tratando de que se muestren ciertos botones en determinados momentos segun su fabricación, si es registro parcial o completo, para ello uso el modulo mrp.workorder de odoo, para ello se generó un formulario canvas para que se usaran en tablets. 
Con este contexto copiare el codigo de todo ese formulario para si alguien me indica donde esta el fallo, ya que la ultima condicion que le pongo no la considera. la condicion es '|', ('qty_remaining', '=', 'qty_producing'), que se encuentra casi al final, mi intencion era que la condicion fuese doble, '|', (('qty_remaining', '=', 'qty_producing'), ('qty_producing'. '!=', 0)), pero no he conseguido que funcione, da error.


Gracias de antemano al que me pueda ayudar.


<?xml version="1.0"?>

<!--

mrp.workorder.view.form.inherit.quality.tablet.new_cmp_mod

version: 0.10

se añade boton de reabrir y volver a cerrar, para los casos en las que la OT esta terminada pero en el centro de trabajo necesita acceder para modificar 

algun dato o se cierra por error y necesitan acceder a plano.

Hay que crear accion de servidor de reabrir y de Cerrar de nuevo.


reabrir:

env.cr.execute("""

  UPDATE mrp_workorder SET state = 'progress' WHERE id = %s

  """, (record.id,))



Cerrar de nuevo:

if record:

  env.cr.execute("""

  UPDATE mrp_workorder SET state = 'done' WHERE id = %s

  """, (record.id,))



Despues con su name (leer metadatos de Accion de servidor) crear los botones y definir parametros para ocultación.


version: 0.9


0.9

x_operator


0.8

Se añade x_studio_operation_flow_control


0.7

Se añade work_instructions


0.6

GESTION DE MODIFICACIONES

BOTON COLLAPSE MOSTRAR HTML

MODIFICACIONES

NOTA OF

NOTA OT 

CALIDAD FABRICA

OCULTAR BARRAS SI EL TICK NO ESTÁ HECHO

Se comenta "x_studio_cant_unitaria"



0.5

lost in translation



0.4

Se guarda en el collapse 

el boton "Producto en Desarrollo Técnico: Generar Alerta de Calidad"

el cuadro "raw_workorder_line_ids"

Se saca la nota de la operacion: <field class="o_workorder_note" name="note"/>

Estas notas son un paso de las operaciones


0.3

Para el modelo (mrp.workorder.line):

  Se crean los campos 

  x_studio_cant_unitaria

  x_studio_imagen_principal

que se muestran es esta vista

-->

<data>

  <xpath expr="//div[@name='odoo_data']" position="after">


    <div name="raw_workorder_line_ids" class="o_workorder_data">

      <field name="raw_workorder_line_ids" readonly="1" attrs="{'invisible': [('raw_workorder_line_ids', '=', [])]}">

        <tree>

          <field name="product_id"/>

<!--          <field name="x_studio_cant_unitaria"/> -->

          <field name="qty_to_consume"/>

          <field name="product_uom_id"/>

        </tree>

<form string="Linea de Material">

  <field name="product_id"/>

  <field name="x_studio_imagen_principal" string="Imagen Principal" widget="pdf_viewer"/>

</form>   

      </field>

    </div>


    <div name="quality_alert_ids" class="o_workorder_data">

      <field name="quality_alert_ids" readonly="1" attrs="{'invisible': [('quality_alert_ids', '=', [])]}">

        <tree>

          <field name="name"/>

          <field name="title"/>

          <field name="check_id"/>

        </tree>

      </field>

    </div>

  </xpath>



  <!--oculta el boton iniciar cuando la workorder no esta preparada; y habilita un nuevo botón solo para el administrador de fabricacion-->

  <xpath expr="//button[@name='button_start']" position="attributes">

    <attribute name="attrs">{'invisible': ['|', '|', '|', ('is_user_working', '=', True), ('working_state', '=', 'blocked'), ('state', '=', 'pending')]}</attribute>

  </xpath>

  <xpath expr="//button[@name='button_start']" position="after">

    <button name="button_start" type="object" class="btn-warning" attrs="{'invisible': ['|', '|', '|', ('is_user_working', '=', True), ('working_state', '=', 'blocked'), ('state', '!=', 'pending')]}" barcode_trigger="pause" string="Continue" groups="mrp.group_mrp_manager"/>

  </xpath>

  <!--oculta el boton iniciar cuando la workorder no esta preparada; y habilita un nuevo botón solo para el administrador de fabricacion-->

  

  <!--cuando es la última OT; Muestra solo el botón "marcar como hecho y cerrar OF; (oculta el boton marcar como hecho "simple"), se añade necesidad del operador-->

  <!-- se añade comprobacion de cantidad restante en la v0.10 para que no aparezca en casos de que se use reabrir-->

  


 

<xpath expr="//button[@name='do_finish']" position="attributes">

  <attribute name="attrs">

  {'invisible': 

      ['|', ('is_user_working', '=', False), 

      '|', ('is_last_step', '!=', True), 

      '|', ('skipped_check_ids', '!=', []), 

      '|', ('is_last_lot', '=', False), 

      '|', ('is_last_unfinished_wo', '=', True),

      '|', ('qty_remaining', '=', 0),

       ]}

</attribute>

<attribute name="string">

      REGISTRAR PRODUCCION

  </attribute>

  </xpath>

<!--

  <xpath expr="//button[@name='do_finish']" position="attributes">             

    <attribute name="invisible"> 1 

    </attribute>         

  </xpath>  

-->

  <xpath expr="//button[@name='action_open_manufacturing_order']" position="attributes">             

    <attribute name="invisible"> 1 

    </attribute>         

  </xpath> 

 

 

 

 

 <!--Se saca la nota de la operacion: <field class="o_workorder_note" name="note"/>-->

<xpath expr="//field[@name='note']" position="replace">

</xpath>   


<xpath expr="//div[@name='collapse_menu']" position="after">

<div class="o_workorder_data" name="odoo_data">

<field class="o_workorder_note btn btn-warning btn-sm text-center" name="note"/>

</div>

  

  <div name="x_studio_desarrollo_tecnico_wo" class="o_workorder_data">

    <button name="button_quality_alert" type="object" class="btn btn-danger btn-block" string="Producto en Desarrollo Técnico: Generar Alerta de Calidad" attrs="{'invisible': [('x_studio_desarrollo_tecnico_wo', '!=', True)]}"/>

  </div>

</xpath>

<!--Se saca la nota de la operacion: <field class="o_workorder_note" name="note"/>-->



<!--0.6 gestion mod. motrar nota OT y OF-->

<xpath expr="//field[@name='company_id']" position="before">

    <field name="x_studio_mo_flow_control" invisible="1"/>

<field name="x_studio_wo_flow_control" invisible="1"/>

    <field name="x_studio_operation_flow_control" invisible="1"/>

    <field name="x_mrp_workorder_note" invisible="1"/>

    <field name="x_mrp_operation_note" invisible="1"/>

    <field name="x_mrp_production_note" invisible="1"/>

<field name="x_ot_nota_inspeccion" invisible="1"/>

<field name="x_ot_nota_modificacion" invisible="1"/>

</xpath>


<xpath expr="//div[@name='collapse_menu']" position="after">

<!--Boton Collapse-->

    <div attrs="{'invisible':

        ['|','|',

        ('x_mrp_operation_note','=',False),

        ('x_mrp_workorder_note','=',False),

        ('x_mrp_production_note','=',False),

        ]}">


  <a class="btn btn-danger btn-sm" data-toggle="collapse" href="#collapseNote" role="button" aria-expanded="true" aria-controls="collapseExample">

Mostrar/Ocultar Nota

  </a>

<!--Boton Collapse-->

<!--Contenido-->


<div class="collapse show container border border-danger" id="collapseNote" name="collapse_note">  

<div class="row">

<div class="column">

<field name="x_mrp_workorder_note" attrs="{'readonly':True}"/>

</div>

<div class="column">

<field name="x_mrp_production_note" attrs="{'readonly':True}"/>

</div>

<div class="column">

<field name="x_mrp_operation_note" attrs="{'readonly':True}"/>

</div>                

</div>

</div>

<!--Contenido-->

</div>

</xpath>

<!--0.6 gestion mod. motrar nota OT y OF-->


<!-- 0.7 instrucciones de Trabajo -->

<xpath expr="//div[@name='collapse_menu']" position="after">

<!--Boton Collapse-->

<div attrs="{'invisible':[('x_studio_work_instructions','=',[])]}">


  <a class="btn btn-info btn-sm" data-toggle="collapse" href="#collapse_work_instruction" role="button" aria-expanded="true" aria-controls="collapseExample">

Mostrar/Ocultar Instrucciones de trabajo

  </a>

<!--Boton Collapse-->

<!--Contenido-->


<div class="collapse show container" id="collapse_work_instruction" name="collapse_note">  

<div class="row">

<div class="column">

                    <field name="x_studio_work_instructions" widget="many2many_tags" options="{'no_create_edit': True}"/>

<field name="x_studio_work_instructions_descr" attrs="{'readonly':True}" />

</div>

</div>

</div>

<!--Contenido-->

</div>

</xpath>


<!-- 0.7 instrucciones de Trabajo -->


<!--0.8 Control de flujo-->


<xpath expr="//div[@class='o_actions']" position="attributes" name="pausa">

<attribute name="attrs">

{'invisible': 

[

'|','|','|','|','|','|','|','|','|',

('working_state', '=', 'blocked'), 

('state', '=', 'pending'),


#pausa

('x_studio_mo_flow_control','in',[1]),

('x_studio_wo_flow_control','in',[1]),

        ('x_studio_operation_flow_control','in',[1]),


#operador

'&amp;',

('x_operator','=',False),

        ('x_studio_operator_required','=',True),


#nota operador

'&amp;',

('x_studio_operator_note','=',False),

        ('x_studio_operator_note_required','=',True),



#fai

'&amp;','|','|',

('x_studio_mo_flow_control','in',[3]),

('x_studio_wo_flow_control','in',[3]),

        ('x_studio_operation_flow_control','in',[3]),

'|',

('x_studio_wo_flow_control','not in',[5]),

('x_ot_nota_inspeccion','=',False),


#prev NC

'&amp;','|','|',

('x_studio_mo_flow_control','in',[4]),

('x_studio_wo_flow_control','in',[4]),

        ('x_studio_operation_flow_control','in',[4]),

'|',

('x_studio_wo_flow_control','not in',[5]),

('x_ot_nota_inspeccion','=',False),


#mod

'&amp;','|','|',

('x_studio_mo_flow_control','in',[6]),

('x_studio_wo_flow_control','in',[6]),

        ('x_studio_operation_flow_control','in',[6]),

'|',

('x_studio_wo_flow_control','not in',[7]),

('x_ot_nota_modificacion','=',False),

]

}

</attribute>

</xpath>


<!--0.8 Control de flujo-->


<!-- Operador -->

<xpath expr="//div[@class='workorder_actions']" position="before">

    <div class="workorder_bar">

        <field name="x_studio_operator_department" invisible="1"/>

        <field name="x_studio_operator_required" invisible="1"/>

        <field name="x_studio_operator_note_required" invisible="1"/>

        <span class="o_workorder_field" attrs="{'invisible': [('x_studio_operator_required','=',False)]}">

            <span class="o_form_label">Operador</span>

                <field name="x_operator" class="mr-5" domain="[('department_id.id', '=', x_studio_operator_department)]" options="{&quot;no_create&quot;:true,&quot;no_open&quot;:true}"/> 

        </span>

        <span class="o_workorder_field">

            <span class="o_form_label">Nota Operador</span>

                <field name="x_studio_operator_note" class="mr-5"/> 

<button string="Guardar" type="object" name="button_start" class="btn btn-success"/>

        </span>

    </div>

</xpath>


<!-- Operador -->


<!-- v0.10 VOLVERE -->

<xpath expr="//div[@class='o_workorder_bar_content o_workorder_bar_content_right']" position="inside">

<button name="995" type="action" string="Reabrir OT" icon="fa-check" attrs="{'invisible': ['|','|',('working_state', '=', 'blocked'),('state', '!=', 'done'),('qty_remaining', '!=', 0)]}" class="btn-warning"/>

<button name="996" type="action" string="Cerrar de nuevo" icon="fa-check" attrs="{'invisible': ['|','|',('working_state', '=', 'blocked'),('state', '!=', 'progress'),('qty_remaining', '!=', 0)]}" class="btn-warning"/>

</xpath>


<xpath expr="//button[@name='record_production']" position="attributes">

  <attribute name="context">{'qty_remaining': 'qty_remaining', 'qty_producing': 'qty_producing'}</attribute>

<attribute name="attrs">

  {'invisible': [

'|', ('is_user_working', '=', False), 

'|', ('is_last_step', '!=', True),

'|', ('qty_remaining', '=', 0),

'|', ('state', '!=', 'progress'),

'|', ('skipped_check_ids', '!=', []),

'|', ('qty_remaining', '=', 'qty_producing')

]}

</attribute>

<attribute name="string">

      REGISTRO PARCIAL o TOTAL

  </attribute>

  </xpath> 


<!-- -->


</data>

Avatar
Descartar
3 Respuestas
0
Mejor respuesta

Buenas, 

Independientemente del campo que comenta Pedro, creo que los operadores no están bien puestos, si no me equivoco creo que debería ser así:

{'invisible': [

'|', ('is_user_working', '=', False), 

 ('is_last_step', '!=', True),

'|', ('qty_remaining', '=', 0),

 ('state', '!=', 'progress'),

'|', ('skipped_check_ids', '!=', []),

('qty_remaining', '=', qty_producing)

]}


Saludos

Avatar
Descartar
0
Avatar
Eduardo
Mejor respuesta

Hola, el error es que no hace caso a la condición (lo que esta en negrita y subrayado), no lanza ventana de error ni nada, y quise poner todo ya que no era mucho y por poner en contexto, pero en realidad el problema está en esta parte y así hare para otras veces:

<xpath expr="//button[@name='record_production']" position="attributes">

  <attribute name="context">{'qty_remaining': 'qty_remaining', 'qty_producing': 'qty_producing'}</attribute>

<attribute name="attrs">

  {'invisible': [

'|', ('is_user_working', '=', False), 

'|', ('is_last_step', '!=', True),

'|', ('qty_remaining', '=', 0),

'|', ('state', '!=', 'progress'),

'|', ('skipped_check_ids', '!=', []),

'|', ('qty_remaining', '=', qty_producing)

]}

</attribute>

<attribute name="string">

      REGISTRO PARCIAL o TOTAL

  </attribute>

  </xpath> 


Si le quito las comillas (pensaba que con context podría resolver, pero veo que no) me lanza este error al querer guardar:

Error while validating view <class 'NameError'>: "name 'qty_producing' is not defined" while evaluating "\n \t\t{'invisible': [\n\t\t'|', ('is_user_working', '=', False), \n\t\t'|', ('is_last_step', '!=', True),\n\t\t'|', ('qty_remaining', '=', 0),\n\t\t'|', ('state', '!=', 'progress'),\n\t\t'|', ('skipped_check_ids', '!=', []),\n\t\t'|', ('qty_remaining', '=', qty_producing)\n\t\t]}\n\t"

Los campos están en la vista y por separado los leo y comparo sin problema, pero para que cumpla esa condición doble me da problemas y no sé como abordarlo sin tocar el modulo, ya que quiero evitar tocarlo. Que se pueda hacer desde el xml de la vista. Es posible?

Avatar
Descartar
0
Avatar
Pedro M. Baeza
Mejor respuesta

Intenta la próxima vez indicar cuál es el error que te aparece y resumir quitando el código superfluo.

Por lo que veo, en la parte derecha del dominio debes poner qty_producing sin comillas para indicar que es un valor de un campo. Dicho campo debe estar también incluido en la vista.

Avatar
Descartar

Su respuesta

Intente dar una respuesta sustancial. Si desea hacer un comentario sobre la pregunta o la respuesta, utilice la herramienta de comentarios. Recuerde que siempre puede revisar sus respuestas , no es necesario responder dos veces a la misma pregunta. No olvide votar , ayuda a seleccionar las mejores preguntas y respuestas