关于系统的 _constraints 如何删除,或者继承?
-
[quote author=zjxplq link=topic=2587.msg8652#msg8652 date=1315671569]
可能在自己的osv类中重载createInstance(cls, pool, module, cr)可能可以实现,从源码上看是在此处真正动态创建类的,且实例化的.我试了一下_sql_contraints,处理了父类继承过来的约束后,违反约束时出现的提示与父类不一样了。不过_constraints没有真正试过
[/quote]
也就是说 _sql_contraints 的继承实现可以覆盖基类的 _sql_contraints ? 测试过吗?
Joshua 说测试 _contraints 未果... -
这样怎么样:
import ModuleName.ClassName<br />ModuleName.ClassName._constraints=[]<br />
Monkey Patch rocks, : )
如果不想要这样的猴子戏法,在继承类中的_constraints里使用与父类的_constraints里的函数的名字相同即可覆写父类中的相应constraint.如果想删除对应的父类的constraint,只要在继承类中将对应的函数总是返回True即可。 -
经过查看5.x 和 6.x的代码我发现
_constraints
在5.x是有bug的不能继承的<br />if s=='_constraints':<br /> for c in cls.__dict__.get(s, []):<br /> exist = False<br /> for c2 in range(len(new)):<br /> #For _constraints, we should check field and methods as well<br /> if new[c2][2]==c[2] and new[c2][0]==c[0]:<br /> new[c2] = c<br /> exist = True<br /> break<br /> if not exist:<br /> new.append(c)<br />
重点就在于<br />if new[c2][2]==c[2] and new[c2][0]==c[0]:<br />
以上面的为例_constraints,这里分别是比较的是['date_start', 'date_end']和_check_date,但是它比较_check_date的时候不是比较名字,而是比较整个function的object,通过继承两个function是不可以相同的,所以应该这里应该是比较function name
大家可以看看6.0就变成这样了<br />if s=='_constraints':<br /> for c in cls.__dict__.get(s, []):<br /> exist = False<br /> for c2 in range(len(new)):<br /> #For _constraints, we should check field and methods as well<br /> if new[c2][2]==c[2] and (new[c2][0] == c[0] \<br /> or getattr(new[c2][0],'__name__', True) == \<br /> getattr(c[0],'__name__', False)):<br /> # If new class defines a constraint with<br /> # same function name, we let it override<br /> # the old one.<br /> new[c2] = c<br /> exist = True<br /> break<br /> if not exist:<br /> new.append(c)<br />
1.而校长说的写一个相同名字的函数名,但是这里直接调用类里的_check_date继承不了。
2.猴子戏法可以实现把_constraints替换 ;D
有趣 -
我在一个 模块中
<br />...<br /><br />from openerp.addons import stock<br /><br />...<br />....<br /><br /><br />class stock_move(osv.osv):<br />....<br /> _constraints = []<br /><br /> for constraints in stock.stock_move._constraints:<br /> if constraints[0].__name__ == '_check_tracking':<br /> continue<br /> _constraints.append(constraints)<br /> stock.stock_move._constraints = _constraints<br /><br />...<br />
然后 在某个业务操作后, 发现 还是调用了 openerp.addons.stock.stock_move._check_tracking 方法.
是我没有理解猴子戏法? -
[quote author=Joshua link=topic=2587.msg14383#msg14383 date=1362543836]
试试不要放在 class stock_move(osv.osv)里面
[/quote]<br /><br />...<br /><br />_constraints = []<br />for constraints in stock.stock_move._constraints:<br /> if constraints[0].__name__ == '_check_tracking':<br /> continue<br /> _constraints.append(constraints)<br />stock.stock_move._constraints = _constraints<br /><br />class stock_move(osv.osv):<br /><br /> _inherit = 'stock.move'<br /> _name = 'stock.move'<br /><br />...<br />
重启OE server 打断点的结果, 仍然 还是调用了 addons\stock\stock.py 里面的 _check_picking 方法. -
最新 消息 在 Joshua 和 buke 的耐心指导下 下面的代码测试在 6.1 下测试通过:
<br /><br />...<br />class stock_move(osv.osv):<br /><br /> _inherit = 'stock.move'<br /> _name = 'stock.move'<br /><br /> def __init__(self, pool, cr):<br /> super(stock_move, self).__init__(pool, cr)<br /> pool.models['stock.move']._constraints = [x for x in pool.models['stock.move']._constraints if x[0].__name__ != '_check_tracking']<br /><br />...<br />
代码作用: 移除 stock.move 对象 关于 _check_tracking 的约束...