跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. 关于系统的 _constraints 如何删除,或者继承?

关于系统的 _constraints 如何删除,或者继承?

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
14 帖子 5 发布者 9.5k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • JoshuaJ 离线
    JoshuaJ 离线
    Joshua 管理员
    写于 最后由 编辑
    #1

    例如 product/pricelist.py的

    <br />_constraints = [<br />&nbsp; &nbsp; &nbsp; &nbsp; (_check_date, &#039;You cannot have 2 pricelist versions that overlap!&#039;,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#91;&#039;date_start&#039;, &#039;date_end&#039;])<br />&nbsp; &nbsp; ]<br />
    


    如何继承或者删除呢。
    方案:
    1)直接改源码
    ...
    期待大家有更好的方案

    【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

    1 条回复 最后回复
    0
    • Z 离线
      Z 离线
      zjxplq
      写于 最后由 编辑
      #2

      可能在自己的osv类中重载createInstance(cls, pool, module, cr)可能可以实现,从源码上看是在此处真正动态创建类的,且实例化的.我试了一下_sql_contraints,处理了父类继承过来的约束后,违反约束时出现的提示与父类不一样了。不过_constraints没有真正试过

      1 条回复 最后回复
      0
      • Z 离线
        Z 离线
        zjxplq
        写于 最后由 编辑
        #3

        从createInstance(cls, pool, module, cr)源码看,为了删除现有的系统的_constraints,可以定义一个与要删除的_constrains同名的约束,且这个约束会一定满足就行。

        1 条回复 最后回复
        0
        • mrshellyM 离线
          mrshellyM 离线
          mrshelly
          写于 最后由 编辑
          #4

          [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 未果...

          1 条回复 最后回复
          0
          • wjfonhandW 离线
            wjfonhandW 离线
            wjfonhand
            写于 最后由 编辑
            #5

            [quote author=zjxplq link=topic=2587.msg8653#msg8653 date=1315705028]
            从createInstance(cls, pool, module, cr)源码看,为了删除现有的系统的_constraints,可以定义一个与要删除的_constrains同名的约束,且这个约束会一定满足就行。
            [/quote]

            顶这个!

            GoodERP -- Odoo China fork

            1 条回复 最后回复
            0
            • Z 离线
              Z 离线
              zjxplq
              写于 最后由 编辑
              #6

              重载createInstance(cls, pool, module, cr)时,我测试了一下改变_sql_contraints,但改变不了natrr['_sql_contraints']的值,就为了这个搞了好长时间,后来不知怎样出现了提示信息与本来不一样了.太迟了就没有再试,就把设想发在网上了

              1 条回复 最后回复
              0
              • wjfonhandW 离线
                wjfonhandW 离线
                wjfonhand
                写于 最后由 编辑
                #7

                删除 _sql_contraints 我做过的
                <br / [检测到链接无效,已移除] br />
                Joshua现在碰到的问题是如何删除_contraints

                GoodERP -- Odoo China fork

                1 条回复 最后回复
                0
                • digitalsatoriD 离线
                  digitalsatoriD 离线
                  digitalsatori 管理员
                  写于 最后由 编辑
                  #8

                  这样怎么样:

                  import ModuleName.ClassName<br />ModuleName.ClassName._constraints=&#91;]<br />
                  


                  Monkey Patch rocks, : )

                  如果不想要这样的猴子戏法,在继承类中的_constraints里使用与父类的_constraints里的函数的名字相同即可覆写父类中的相应constraint.如果想删除对应的父类的constraint,只要在继承类中将对应的函数总是返回True即可。

                  【上海先安科技】(tony AT openerp.cn)

                  1 条回复 最后回复
                  0
                  • JoshuaJ 离线
                    JoshuaJ 离线
                    Joshua 管理员
                    写于 最后由 编辑
                    #9

                    经过查看5.x 和 6.x的代码我发现
                    _constraints
                    在5.x是有bug的不能继承的

                    <br />if s==&#039;_constraints&#039;:<br />&nbsp; &nbsp; for c in cls.__dict__.get(s, &#91;]):<br />&nbsp; &nbsp; &nbsp; &nbsp; exist = False<br />&nbsp; &nbsp; &nbsp; &nbsp; for c2 in range(len(new)):<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #For _constraints, we should check field and methods as well<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if new[c2][2]==c[2] and new[c2][0]==c[0]:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new[c2] = c<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exist = True<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break<br />&nbsp; &nbsp; &nbsp; &nbsp; if not exist:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 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==&#039;_constraints&#039;:<br />&nbsp; &nbsp; for c in cls.__dict__.get(s, &#91;]):<br />&nbsp; &nbsp; &nbsp; &nbsp; exist = False<br />&nbsp; &nbsp; &nbsp; &nbsp; for c2 in range(len(new)):<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  #For _constraints, we should check field and methods as well<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  if new[c2][2]==c[2] and (new[c2][0] == c[0] \<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; or getattr(new[c2][0],&#039;__name__&#039;, True) == \<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getattr(c[0],&#039;__name__&#039;, False)):<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # If new class defines a constraint with<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # same function name, we let it override<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # the old one.<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new[c2] = c<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exist = True<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break<br />&nbsp; &nbsp; &nbsp; &nbsp; if not exist:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new.append(c)<br />
                    


                    1.而校长说的写一个相同名字的函数名,但是这里直接调用类里的_check_date继承不了。
                    2.猴子戏法可以实现把_constraints替换 ;D
                    有趣

                    【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

                    1 条回复 最后回复
                    0
                    • mrshellyM 离线
                      mrshellyM 离线
                      mrshelly
                      写于 最后由 编辑
                      #10

                      我在一个 模块中

                      <br />...<br /><br />from openerp.addons import stock<br /><br />...<br />....<br /><br /><br />class stock_move(osv.osv):<br />....<br />&nbsp; &nbsp; _constraints = &#91;]<br /><br />&nbsp; &nbsp; for constraints in stock.stock_move._constraints:<br />&nbsp; &nbsp; &nbsp; &nbsp; if constraints[0].__name__ == &#039;_check_tracking&#039;:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue<br />&nbsp; &nbsp; &nbsp; &nbsp; _constraints.append(constraints)<br />&nbsp; &nbsp; stock.stock_move._constraints = _constraints<br /><br />...<br />
                      




                      然后 在某个业务操作后, 发现 还是调用了 openerp.addons.stock.stock_move._check_tracking 方法.
                      是我没有理解猴子戏法?

                      1 条回复 最后回复
                      0
                      • JoshuaJ 离线
                        JoshuaJ 离线
                        Joshua 管理员
                        写于 最后由 编辑
                        #11

                        试试不要放在 class stock_move(osv.osv)里面

                        【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

                        1 条回复 最后回复
                        0
                        • mrshellyM 离线
                          mrshellyM 离线
                          mrshelly
                          写于 最后由 编辑
                          #12

                          [quote author=Joshua link=topic=2587.msg14383#msg14383 date=1362543836]
                          试试不要放在 class stock_move(osv.osv)里面
                          [/quote]

                          <br /><br />...<br /><br />_constraints = &#91;]<br />for constraints in stock.stock_move._constraints:<br />&nbsp; &nbsp; if constraints[0].__name__ == &#039;_check_tracking&#039;:<br />&nbsp; &nbsp; &nbsp; &nbsp; continue<br />&nbsp; &nbsp; _constraints.append(constraints)<br />stock.stock_move._constraints = _constraints<br /><br />class stock_move(osv.osv):<br /><br />&nbsp; &nbsp; _inherit = &#039;stock.move&#039;<br />&nbsp; &nbsp; _name = &#039;stock.move&#039;<br /><br />...<br />
                          



                          重启OE server 打断点的结果, 仍然 还是调用了 addons\stock\stock.py 里面的 _check_picking 方法.

                          1 条回复 最后回复
                          0
                          • mrshellyM 离线
                            mrshellyM 离线
                            mrshelly
                            写于 最后由 编辑
                            #13

                            最新 消息 在 Joshua 和 buke 的耐心指导下 下面的代码测试在 6.1 下测试通过:

                            <br /><br />...<br />class stock_move(osv.osv):<br /><br />&nbsp; &nbsp; _inherit = &#039;stock.move&#039;<br />&nbsp; &nbsp; _name = &#039;stock.move&#039;<br /><br />&nbsp; &nbsp; def __init__(self, pool, cr):<br />&nbsp; &nbsp; &nbsp; &nbsp; super(stock_move, self).__init__(pool, cr)<br />&nbsp; &nbsp; &nbsp; &nbsp; pool.models&#91;&#039;stock.move&#039;]._constraints = [x for x in pool.models&#91;&#039;stock.move&#039;]._constraints if x[0].__name__ != &#039;_check_tracking&#039;]<br /><br />...<br />
                            



                            代码作用: 移除 stock.move 对象 关于 _check_tracking 的约束...

                            1 条回复 最后回复
                            0

                            • 登录

                            • 没有帐号? 注册

                            • 登录或注册以进行搜索。
                            • 第一个帖子
                              最后一个帖子
                            0
                            • 版块
                            • 标签
                            • 热门
                            • 用户
                            • 群组