按钮上的关闭向导单击OpenERP 7

时间:2013-01-22 16:24:49

标签: python openerp odoo

我从OpenERP 7中的按钮打开向导。但是当点击向导的按钮计算时,我的向导关闭但我不想在按钮上单击计算<关闭向导/ strong>而不是我的向导关闭时单击向导的按钮关闭。 我正在使用OpenERP 7。

class test_pass_student(osv.osv_memory):
    _name = 'test.pass.student'
    _column ={  
        'pass_id': fields.many2one('pass.student', 'Passed'),
        'student_id':fields.many2one('student.student', 'Student'),
    }

test_pass_student()

def _reopen(self, res_id, model):
    return {'type': 'ir.actions.act_window',
            'view_mode': 'form',
            'view_type': 'form',
            'res_id': res_id,
            'res_model': self._name,
            'target': 'new',
            'context': {
                'default_model': model,
            },
    }

class pass_student(osv.osv_memory):
    _name = 'pass.student'

    _columns = {    
        'student_id':fields.many2one('student.student', 'Student'),
        'lines': fields.one2many('test.pass.student','pass_id', 'Passed students'),
    }

    def add_student(self, cr, uid, ids,context=None):
        lines_obj = self.pool.get('test.pass.student')
        for record in self.browse(cr,uid,ids,context):
            for line in record.student_id.scores:
                    if line.pass_score > 50:
                        lines_obj.create(cr,uid,{'pass_id': record.id,'student_id':line.student_id.id})

            return _reopen(self, record.id, record._model)

pass_student()

沉S选择第一个学生支票,如果他/她的分数大于50,然后加入one2many,然后再检查另一个学生,同样的事情再次重复。

4 个答案:

答案 0 :(得分:1)

从OpenERP 6.1开始,向导按钮(带type="object)的默认行为(因此也在7.0中)是立即关闭向导弹出窗口。按钮调用的方法可以返回将要执行的动作定义字典。 当您不希望向导关闭时,通常是因为您有几个步骤。由于多步向导通常具有不同的表单视图,因此它们的按钮方法仅使用下一步的视图返回操作以打开相同的向导记录(如果需要再次显示,它也可以是相同的视图)。

您可以在官方插件源代码中找到示例,例如在mail.compose.message向导modified by the email_template module中,它使用类似的技巧重新打开自己。

question和此other one也可能包含有用的示例。

答案 1 :(得分:1)

要关闭向导按钮,请单击在视图窗体xml上添加此代码:

<button string="Cancel" class="oe_link" special="cancel"/>

答案 2 :(得分:0)

无需再编写单独的方法来打开向导。您可以只使用对象引用并使用视图ID返回它。例如。

def add_student(self, cr, uid, ids,context=None):
    model_data_obj = self.pool.get('ir.model.data')
    lines_obj = self.pool.get('test.pass.student')
    for record in self.browse(cr,uid,ids,context):
        for line in record.student_id.scores:
                if line.pass_score > 50:
                    lines_obj.create(cr,uid,{'pass_id': record.id,'student_id':line.student_id.id})
    view_rec = model_data_obj.get_object_reference(cr, uid, 'pass_student', 'add_student_form_view_id')
    view_id = view_rec and view_rec[1] or False
    return {
       'view_type': 'form',
       'view_id' : [view_id],
       'view_mode': 'form',
       'res_model': 'pass.student',
       'type': 'ir.actions.act_window',
       'target': 'new',
       'context': context
    }

希望它会对你有所帮助!

答案 3 :(得分:0)

我回复自己,在向导中,如果,而不是按钮类型的工作流程,我把按钮类型对象和触发器wf工作(没有关闭),但这是正确的路径?

如果有人需要这个是我的对象按钮事件代码(对于我的picking.import.wizard向导):

def signal_import_load_2(self, cr, uid, ids, context=None):
    import netsvc

    wf_service = netsvc.LocalService("workflow")
    wf_service.trg_validate(uid, 'picking.import.wizard', ids[0], 'signal_import_load', cr)

    view_id = self.pool.get('ir.ui.view').search(cr,uid,[('model','=','picking.import.wizard'), ('name','=','Wizard import picking from CSV')])

    return {
         'type': 'ir.actions.act_window',
         'name': "Import",
         'res_model': 'picking.import.wizard',
         'res_id': ids[0],
         'view_type': 'form',
         'view_mode': 'form',
         'view_id': view_id,
         'target': 'new',
         'nodestroy': True,
           }