一. 问题的描述
在做审批流的过程中,涉及到这样一个问题,用户申请的行总额需要根据当前行的数量和单价相乘计算得出,这本来是一个很简单的功能需求,利用odoo的计算方法就可以轻松实现,但是在在view页面给amount设置了readonly=“1”属性之后,再次修改申请单单价或数量的时候,amount字段的值却无法跟新到数据库中。
在view层的代码如下:
<record id="workflow_ebilling_request_form_view" model="ir.ui.view"> <field name="name">Workflow e-Billing</field> <field name="type">form</field> <field name="model">ebilling.request.header</field> <field name="arch" type="xml"> <form string="Workflow单"> <header> <button name="workflow_submit" states="draft" string="Submit" type="workflow" class="oe_highlight"/> <button name="workflow_approving" states="submit" string="Approving" type="workflow" class="oe_highlight"/> <button name="workflow_completed" states="approving" string="completed" type="workflow" class="oe_highlight"/> <field name="state" widget="statusbar" statusbar_visible="submit,approving,completed"/> </header> <sheet> <group> <group> <field name="project"/> <field name="bp_code"/> </group> <group> <field name="po_no"/> <field name="company_billing"/> </group> </group> <group> <group> <field name="company"/> <field name="nature_of_billing"/> </group> <group> <field name="currency"/> <field name="remark"/> </group> </group> <field name='detail_ids'> <tree string='List' editable='bottom'> <field name='part_number'/> <field name='qty' /> <field name='unit_price'/> <field name='amount' readonly="1"/> </tree> </field> <group class='oe_subtotal_footer oe_right'> <field name='total_amount' widget='monetary' /> </group> </sheet> </form> </field> </record>
二 解决问题的方案:
经过查询相关资料,了解到如果前端的field字段一旦设置了readonly=”1“字段,在后台create/write的时候,其参数values里面就不会包含此字段,对应的解决方案也就是重写这两个方法。
@api.model def write(self, values): if "unit_price" in values and "qty" not in values: values['amount'] = self.qty * values['unit_price'] if "unit_price" not in values and "qty" in values: values['amount'] = self.unit_price * values['qty'] if "unit_price" in values and "qty" in values: values['amount'] = values['unit_price'] * values['qty'] return super(BillingRequestDetail, self).write(values) @api.model def create(self, values): if "unit_price" in values and "qty" in values: values['amount'] = values['unit_price'] * values['qty'] return super(BillingRequestDetail, self).create(values)
三 对比sale模块订单行的总价处理情况
在解决以上问题的时候,发现销售订单模块也完全涉及到类似的情况,那么官方模块是如何处理这种情况的呢?
发现其并没有在view端设置readonly=“1”这个属性,而是设置了groups属性,也就是说只有有权限的才可以修改这个行总价,和我们的完全只读属性还是不太一样的。