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

Como crear smart button en mi modulo

Avatar
dronix

Hola estimados, soy nuevo en esto de odoo y veo el gran potencial que tiene y he estado desarrollando un modulo al cual quiero colocar un botón inteligente, lo pude hacer pero no logro hacer que me lleve a donde quiero.

me explico quiero que el botón realice la misma acción que hace el botón que aparece en el modulo de contacto el cual lo direccione al modulo de venta o pedido. he buscado por internet pero solo salen ejemplos para agregar un botón a otro modulo.


comparto el codigo py y xml

<record id="open_patient_appointments" model="ir.actions.act_window">
<field name="name">Venta</field>
<field name="res_model">sale.order</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('partner_id', '=', self.id)]</field>
<field name="context">('default_partner_id': self.id)</field>
</record>


<record id="view_cert_matricula_form" model="ir.ui.view">
<field name="name">view.cert.matricula.form</field>
<field name="model">cert.matricula</field>
<field name="arch" type="xml">
<form string="Matricula">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="%(open_patient_appointments)d" type="action"
class="oe_stat_button" icon="fa-usd" >
<field name="appointment_count" string="Venta" widget="statinfo"/>
</button>
</div>



este es .py

appointment_count = fields.Integer(compute='_compute_appointment_count')

def _compute_appointment_count(self):
for rec in self:
appointment_count = self.env['sale.order'].search_count([('partner_id', '=', rec.id)])
rec.appointment_count = appointment_count
Avatar
Descartar
2 Respuestas
1
Avatar
Raúl Fernández
Mejor respuesta

Hola dronix que tal,

Los errores son los siguientes:

1- En la accion "open_patient_appointments" en el domain estas filtrando no por el id del partner. Si no por el id del pedido y eso es no correcto ya que los ids son completamente distintos.
2 -  En la accion "open_patient_appointments" en el context has puesto en " default_partner_id" el id del pedido error similar al anterior.
3 -  En la funcion compute "_compute_appointment_count" que supongo estara en el modelo "cert.matricula" a la hora de buscar los pedidos filtras por el campo partner_id y has puesto que sea igual al campo id del modelo "cert.matricula" esto es incorrecto. Aqui tendrias que meter un campo many2one que llamara al modelo res.partner y filtrar por este en ese dominio.

Solucion completa a los 3 errores:

En el fichero py tener esto:

    partner_id = fields.Many2one(
string='partner_id',
comodel_name='res.partner',
)
appointment_count = fields.Integer(compute='_compute_appointment_count')
def _compute_appointment_count(self):
for rec in self:
appointment_count = 0
if rec.partner_id:
appointment_count = self.env['sale.order'].search_count([('partner_id', '=', rec.partner_id.id)])
rec.appointment_count = appointment_count
def action_view_open_patient_appointments(self):
return {
'name': 'Venta',
'view_type': 'form',
'view_mode': 'tree,form',
'view_id': False,
'res_model': 'sale.order',
'domain': [('partner_id', '=', self.partner_id.id)],
'type': 'ir.actions.act_window',
}


En el fichero xml de las vistas:

<record id="view_cert_matricula_form" model="ir.ui.view">
<field name="name">view.cert.matricula.form</field>
<field name="model">cert.matricula</field>
<field name="arch" type="xml">
<form create="true" delete="true" edit="true">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_open_patient_appointments" type="object"
class="oe_stat_button" icon="fa-usd" >
<field name="appointment_count" string="Venta" widget="statinfo"/>
</button>
</div>
<field name="partner_id" />
</sheet>
</form>
</field>
</record>



Para que el smart button funcione como lo tienes puesto. Tienes que crear una funcion que llame a un action window personalizado esto es parecido si lo has visto alguna vez como los wizard/asistentes. En la misma funcion hay ya puedes filtrar correctamente los pedidos por el partner que hayas seleccionado en el record actual.


Cualquier duda me dices

Saludos!.

Avatar
Descartar
0
Avatar
dronix
Mejor respuesta

Se agradece la ayuda estimado voy a ver si me funciona y le comento, de todas manera muchas gracias

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