Odoo Help


How to run a wizard from Python code?

Juan Formoso
on 1/14/15, 5:52 AM 6,674 views

I've created the next wizard form in XML:

<?xml version="1.0" encoding="utf-8"?>
        <record model="ir.ui.view" id="confirm_unlink_res_partner_bank_wizard_form">
            <field name="name">confirm.unlink.res.partner.bank.wizard.form</field>
            <field name="model">confirm.unlink.res.partner.bank.wizard</field>
            <field name="arch" type="xml">
                <form string="Confirm removing bank account" version="7.0">
                    <group colspan="8">
                        <group colspan="8">
                            <label string="Do you want to continue?"/>
                            <button string="Confirm" name="unlink_res_partner_bank" type="object" class="oe_highlight"/>
                            <button string="Cancel" class="oe_link" special="cancel" />

Here is its Python code (from the moment, the button does nothing):

class confirm_unlink_res_partner_bank_wizard(osv.TransientModel):
    _name = 'confirm.unlink.res.partner.bank.wizard'

    def unlink_res_partner_bank(self, cr, uid, ids, context=None):


What I want to manage: If the user tries to remove a res.partner.bank record, show them a pop-up (my wizard). So for that, I did the next:

class res_partner_bank(orm.Model):
    _inherit = 'res.partner.bank'

    def unlink(self, cr, uid, id, context=None):
            data_obj = self.pool.get('ir.model.data')
            form_data_id = data_obj._get_id(cr, uid, 'res_partner_extended', 'confirm_unlink_res_partner_bank_wizard_form')
            form_view_id = False
            if form_data_id:
                form_view_id = data_obj.browse(cr, uid, form_data_id, context=context).res_id
            return {
                'name': 'Confirm removing bank account',
                'view_type': 'form',
                'view_mode': 'form',
                'view_id': False,
                'views': [(form_view_id, 'form'),],
                'res_model': 'confirm.unlink.res.partner.bank.wizard',
                'type': 'ir.actions.act_window',
                'target': 'new',
                'flags': {'form': {'action_buttons': True},}

But the wizard form is not showing up. However, I've checked the value of the variable form_view_id and it's right.

There must be anything else I'm missing. Can anyone help me, please?

I've just copied the code of other function I have which calls a simple form (not wizard) from Python (the function works perfectly) and pasted it into the unlink function. Nothing happens, so I'm starting to guess that there's any problem about calling a form from an unlink function, but I don't know.

Juan Formoso
on 1/14/15, 6:31 AM

You forgot that you need to pool.get('model_to_unlink') and call unlink action on thatmodel.. not on current(self) because current working model is in fact wizard model.. so confirm button should return self.pool.get('some_model').unlink(cr, uid, some_id)

on 1/14/15, 6:53 AM

Thank you @Bole! I'll do that but first I only wanted to see my wizard, in spite of this having no functionality for the moment.

Juan Formoso
on 1/14/15, 7:11 AM

try to check your function been called from the unlink, try to print "hello" ... and check the server...

Ahmed M.Elmubarak
on 1/14/15, 7:30 AM

Thank you @Ahmed M.Elmubarak, I've checked and the code inside unlink function is being executed. But for some reason the return isn't working as expected.

Juan Formoso
on 1/14/15, 7:33 AM

Is it possible to call a wizard from the unlink function of a model? Because I'm starting to think that it's not.

Juan Formoso
on 1/14/15, 7:54 AM

it is possible, but the unlink action is't called at all because you are actualy writing in different model.. see my comen below... you should call the wizard form res_partner write action,

on 1/14/15, 9:14 AM

Ok, I've just tried to execute the code I write in unlink from other function, one made by me. When I click on the button, the wizard is showing up, so it's work well!! The problem is when I try to call it from unlink, I don't know why...

Juan Formoso
on 1/14/15, 10:54 AM
Juan Formoso
On 1/15/15, 3:36 AM

It's not possible to return a dictionary from an ORM method. That's the reason for which I'm not able to return my wizard from the unlink function.

Kazim Mirza
On 1/14/15, 6:20 AM

Hello Juan

Every wizard have form view and id.

view_ref = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'Modal Folder Name', 'Form view id(confirm_unlink_res_partner_bank_wizard_form)')
        view_id = view_ref and view_ref[1] or False,
        return {
            'type': 'ir.actions.act_window',
            'name': _('Sales Order'),
            'res_model': 'sale.order',
            'res_id': ids[0], #If you want to go on perticuler record then you can use res_id 

            'view_type': 'form',
            'view_mode': 'form',
            'view_id': view_id,
            'target': 'current',
            'nodestroy': True,

Please change code as per your need.

Hope that this answer will help you.

Please don't hesitate to ask any question regarding this.

Thank You

one thing:res_id in this case will have id of current record... you should create a wizard model record , and pass that id in order to open correct wizard page... my guess is this will thorow error because ids[0] passed to wizzard might not exist

on 1/14/15, 6:28 AM

Hey Bole, Thnkz I forgot to mention that in answer.

Kazim Mirza
on 1/14/15, 6:35 AM

Thank you @Kazim! I've tried your code and still same result. I didn't use res_id neither view_id earlier and it worked for other forms, so I guess that shouldn't be the reason, should it?

Juan Formoso
on 1/14/15, 6:46 AM
On 1/14/15, 6:21 AM

Wery simmilar to account.account_fiscalyear_close_state wizard ( check out code and behaivor)...


put a boolen filed in your wizard and ask for confimation ( check field) before deletion...
when calling wizard, don't browse ir.model.data object.. rather call get_object_reference, or get_object methods..
nad retrive view_id in that way.. 

Hello @Bole! Thanks for helping me. I did what @Kazim and you said and stop using browse to using get_object_reference instead. I was looking that wizard you've told me, I'm so sorry but I can't find the similarity. I only want to show my wizard when I try to remove a res.partner.bank record. Note that I'm removing it from res.partner form (where res.partner.bank is a one2many), and I guess the pop-up isn't going to appear until I press the save button (to save the res.partner record). But my wizard never appears. By the way, what I have to specify res_id and view_id? I didn't do it earlier and the forms I called from Python always worked.

Juan Formoso
on 1/14/15, 7:08 AM

then you are trying to override wrong method.. instead of unlink on res.partner.bank.. you should do it in write of res.partner... and check res_partner_bank_ids ... it will contain list of tuples for each bank... if first element of tuple =4 ok, if it is 2 it means delete record.. then you should call wizard view... and returning from wizard will then be write on res.partner... that part was oveseen before :)

on 1/14/15, 7:39 AM

That's right @Bole, thank you! But to do it easier, I started to check the unlink from the res.partner.bank form and remove the records directly. If I raise a exception just before the return with the wizard data, when I click on remove record I see the message (so I'm overriding the method well), but if I do this without stopping the execution, the return doesn't take me to my wizard (or any other form).

Juan Formoso
on 1/14/15, 9:17 AM

About This Community

This platform is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


Odoo Training Center

Access to our E-learning platform and experience all Odoo Apps through learning videos, exercises and Quizz.

Test it now

Question tools

1 follower(s)


Asked: 1/14/15, 5:52 AM
Seen: 6674 times
Last updated: 3/16/15, 8:10 AM