Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

【求助】如何实现添加采购明细时,采购员不能修改采购单价?



  • 采购员添加采购明细时,一旦选择了产品,相应的价格、计量单位等都由系统自动完成,采购员可以改变数量、单价、单位等。
    但现在要求采购人员不能改变单价。我把 price_unit这个field设置成readonly,但price_unit的值是在用户选择产品后,触发product_id_change这个方法才获得的,如果一开始在view里设置成readonly,那price_unit就永远是0,无法获得新值。
    在purchase.py源文件里,把price_unit改为'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy'])),read=['group_purchase_user']) 重启ERP系统后,不论是系统管理员还是采购员,如果打开包括采购明细内容的采购订单就报错,如果采购订单里没有采购订单明细可以正常打开订单。错误信息如下所示:
    Traceback (most recent call last):
      File "netsvc.pyo", line 245, in dispatch
      File "netsvc.pyo", line 74, in call
      File "service\web_services.pyo", line 576, in execute
      File "osv\osv.pyo", line 58, in wrapper
      File "osv\osv.pyo", line 119, in execute
      File "osv\osv.pyo", line 111, in execute_cr
      File "osv\orm.pyo", line 2225, in read
      File "osv\orm.pyo", line 2355, in _read_flat
      File "osv\fields.pyo", line 650, in get
      File "d:\OpenERP\Server\addons\purchase\purchase.py", line 446, in _amount_line
      File "osv\orm.pyo", line 240, in getattr
      File "osv\orm.pyo", line 189, in getitem
      File "osv\orm.pyo", line 2225, in read
      File "osv\orm.pyo", line 2379, in _read_flat
    IndexError: list index out of range


    如果想实现类似price_unit这样实时计算字段值的只读,换句话说,就是禁止用户自己编辑值。在系统里如何实现?



  • 采购员添加采购明细时,一旦选择了产品,相应的价格、计量单位等都由系统自动完成,采购员可以改变数量、单价、单位等。
    但现在要求采购人员不能改变单价。我把 price_unit这个field设置成readonly,但price_unit的值是在用户选择产品后,触发product_id_change这个方法才获得的,如果一开始在view里设置成readonly,那price_unit就永远是0,无法获得新值。
    在purchase.py源文件里,把price_unit改为'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy'])),read=['group_purchase_user']) 重启ERP系统后,不论是系统管理员还是采购员,如果打开包括采购明细内容的采购订单就报错,如果采购订单里没有采购订单明细可以正常打开订单。错误信息如下所示:
    Traceback (most recent call last):
      File "netsvc.pyo", line 245, in dispatch
      File "netsvc.pyo", line 74, in call
      File "service\web_services.pyo", line 576, in execute
      File "osv\osv.pyo", line 58, in wrapper
      File "osv\osv.pyo", line 119, in execute
      File "osv\osv.pyo", line 111, in execute_cr
      File "osv\orm.pyo", line 2225, in read
      File "osv\orm.pyo", line 2355, in _read_flat
      File "osv\fields.pyo", line 650, in get
      File "d:\OpenERP\Server\addons\purchase\purchase.py", line 446, in _amount_line
      File "osv\orm.pyo", line 240, in getattr
      File "osv\orm.pyo", line 189, in getitem
      File "osv\orm.pyo", line 2225, in read
      File "osv\orm.pyo", line 2379, in _read_flat
    IndexError: list index out of range


    如果想实现类似price_unit这样实时计算字段值的只读,换句话说,就是禁止用户自己编辑值。在系统里如何实现?



  • 我在想是不是可以用addon的方式,override一下purchase_order_line的create事件, 忽略修改的, 不过貌似界面是可以设置readonly的啊, 只要你给它一个默认值



  • 楼上说的方法,我试过了,不行。
    price的默认值是0,当用户选定产品后,根据产品中的价格设置而获得产品单价值。
    因此在views上设置field为readonly后,price_unit字段就一直会是0,不能获得新值。



  • 关注此帖,销售订单也有这个问题。既然有pricelist做了那么复杂的运算,这个结果就不应该让user改。但是记得听谁说过view上设置为readonly确实就连on_change都update不了这个值了。


  • 管理员

    可不可以不设成readonly,但是你写个onchange(),让他就算修改了,一保存也是用回原来的值?


  • 管理员

    这个readonly属性的确令人很迷惑,在官方论坛也有很多类似的问题。
    很多人理解readonly是对用户只读的,其实设有readonly属性的字段的数据改变都不会保存到数据库,也就是它是阻止数据更新的。

    我们可以用两个方法来实现楼主的要求:

    1、使用字段访问权限,就是添加字段级别的访问权限,就是你尝试过的方法,但是也许用的不太正确,应该设定write的访问组,比如: [code]write=['group_purchase_manager'][/code]

    2. 使用ontown兄提到的方法,就是覆写 'reate', 'write', 方法。


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待