如何在不执行超级写入的情况下覆盖写入方法?
How can override write method without executing the super write?
在membership.py文件中,class account_invoice_line继承了'account.invoice.line'并覆盖了write方法,该方法将在新的发票行创建时创建一个新的成员行在现有发票中创建。对我来说,当在现有发票中创建新的发票行时,它是不正确的,它必须与现有的成员行相关,而不是创建新的成员行
所以我必须覆盖write方法,但是member.py文件中的write方法总是被执行的问题。
那么有人能告诉我如何在不通过 membership.py 文件中的写入方法的情况下覆盖写入方法吗?
这是文件 membership.py 中的代码:
class account_invoice_line(osv.osv):
_inherit='account.invoice.line'
def write(self, cr, uid, ids, vals, context=None):
"""Overrides orm write method
"""
member_line_obj = self.pool.get('membership.membership_line')
res = super(account_invoice_line, self).write(cr, uid, ids, vals, context=context)
for line in self.browse(cr, uid, ids, context=context):
if line.invoice_id.type == 'out_invoice':
ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', line.id)], context=context)
if line.product_id and line.product_id.membership and not ml_ids:
# Product line has changed to a membership product
date_from = line.product_id.membership_date_from
date_to = line.product_id.membership_date_to
if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to:
date_from = line.invoice_id.date_invoice
member_line_obj.create(cr, uid, {
'partner': line.invoice_id.partner_id.id,
'membership_id': line.product_id.id,
'member_price': line.price_unit,
'date': time.strftime('%Y-%m-%d'),
'date_from': date_from,
'date_to': date_to,
'account_invoice_line': line.id,
}, context=context)
if line.product_id and not line.product_id.membership and ml_ids:
# Product line has changed to a non membership product
member_line_obj.unlink(cr, uid, ml_ids, context=context)
return res
def unlink(self, cr, uid, ids, context=None):
"""Remove Membership Line Record for Account Invoice Line
"""
member_line_obj = self.pool.get('membership.membership_line')
for id in ids:
ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', id)], context=context)
member_line_obj.unlink(cr, uid, ml_ids, context=context)
return super(account_invoice_line, self).unlink(cr, uid, ids, context=context)
def create(self, cr, uid, vals, context=None):
"""Overrides orm create method
"""
member_line_obj = self.pool.get('membership.membership_line')
result = super(account_invoice_line, self).create(cr, uid, vals, context=context)
line = self.browse(cr, uid, result, context=context)
if line.invoice_id.type == 'out_invoice':
ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', line.id)], context=context)
if line.product_id and line.product_id.membership and not ml_ids:
# Product line is a membership product
date_from = line.product_id.membership_date_from
date_to = line.product_id.membership_date_to
if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to:
date_from = line.invoice_id.date_invoice
member_line_obj.create(cr, uid, {
'partner': line.invoice_id.partner_id and line.invoice_id.partner_id.id or False,
'membership_id': line.product_id.id,
'member_price': line.price_unit,
'date': time.strftime('%Y-%m-%d'),
'date_from': date_from,
'date_to': date_to,
'account_invoice_line': line.id,
}, context=context)
return result
account_invoice_line()
你可以像下面这样绕过超级方法的调用。
您需要传递 osv.osv class 而不是您的 class 名称来调用直接基本写入方法。
res = super(osv.osv, self).write(cr, uid, ids, vals, context=context)
会绕过osv.osvclass.
的all super write方法直接调用
注意:您也可以调用任何其他 class 而不是 osv.osv。为此,您必须按照以下方式进行操作。
例如
from openerp.addons.account.account_invoice import account_invoice
class account_invoice_inherit(osv.osv):
def write( . .. . )
res = super(account_invoice,self).write(. .. .)
. .. .
return res
这里从这个class系统会直接调用account_invoiceclass的write方法。
希望对您有所帮助。
在membership.py文件中,class account_invoice_line继承了'account.invoice.line'并覆盖了write方法,该方法将在新的发票行创建时创建一个新的成员行在现有发票中创建。对我来说,当在现有发票中创建新的发票行时,它是不正确的,它必须与现有的成员行相关,而不是创建新的成员行 所以我必须覆盖write方法,但是member.py文件中的write方法总是被执行的问题。
那么有人能告诉我如何在不通过 membership.py 文件中的写入方法的情况下覆盖写入方法吗?
这是文件 membership.py 中的代码:
class account_invoice_line(osv.osv):
_inherit='account.invoice.line'
def write(self, cr, uid, ids, vals, context=None):
"""Overrides orm write method
"""
member_line_obj = self.pool.get('membership.membership_line')
res = super(account_invoice_line, self).write(cr, uid, ids, vals, context=context)
for line in self.browse(cr, uid, ids, context=context):
if line.invoice_id.type == 'out_invoice':
ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', line.id)], context=context)
if line.product_id and line.product_id.membership and not ml_ids:
# Product line has changed to a membership product
date_from = line.product_id.membership_date_from
date_to = line.product_id.membership_date_to
if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to:
date_from = line.invoice_id.date_invoice
member_line_obj.create(cr, uid, {
'partner': line.invoice_id.partner_id.id,
'membership_id': line.product_id.id,
'member_price': line.price_unit,
'date': time.strftime('%Y-%m-%d'),
'date_from': date_from,
'date_to': date_to,
'account_invoice_line': line.id,
}, context=context)
if line.product_id and not line.product_id.membership and ml_ids:
# Product line has changed to a non membership product
member_line_obj.unlink(cr, uid, ml_ids, context=context)
return res
def unlink(self, cr, uid, ids, context=None):
"""Remove Membership Line Record for Account Invoice Line
"""
member_line_obj = self.pool.get('membership.membership_line')
for id in ids:
ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', id)], context=context)
member_line_obj.unlink(cr, uid, ml_ids, context=context)
return super(account_invoice_line, self).unlink(cr, uid, ids, context=context)
def create(self, cr, uid, vals, context=None):
"""Overrides orm create method
"""
member_line_obj = self.pool.get('membership.membership_line')
result = super(account_invoice_line, self).create(cr, uid, vals, context=context)
line = self.browse(cr, uid, result, context=context)
if line.invoice_id.type == 'out_invoice':
ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', line.id)], context=context)
if line.product_id and line.product_id.membership and not ml_ids:
# Product line is a membership product
date_from = line.product_id.membership_date_from
date_to = line.product_id.membership_date_to
if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to:
date_from = line.invoice_id.date_invoice
member_line_obj.create(cr, uid, {
'partner': line.invoice_id.partner_id and line.invoice_id.partner_id.id or False,
'membership_id': line.product_id.id,
'member_price': line.price_unit,
'date': time.strftime('%Y-%m-%d'),
'date_from': date_from,
'date_to': date_to,
'account_invoice_line': line.id,
}, context=context)
return result
account_invoice_line()
你可以像下面这样绕过超级方法的调用。
您需要传递 osv.osv class 而不是您的 class 名称来调用直接基本写入方法。
res = super(osv.osv, self).write(cr, uid, ids, vals, context=context)
会绕过osv.osvclass.
的all super write方法直接调用注意:您也可以调用任何其他 class 而不是 osv.osv。为此,您必须按照以下方式进行操作。
例如
from openerp.addons.account.account_invoice import account_invoice
class account_invoice_inherit(osv.osv):
def write( . .. . )
res = super(account_invoice,self).write(. .. .)
. .. .
return res
这里从这个class系统会直接调用account_invoiceclass的write方法。
希望对您有所帮助。