Odoo 10中继承hr.contract模型并创建Python类更新wage字段
在Odoo 10中继承hr.contract并通过grillesalaire更新wage字段
没问题,我来帮你搞定这个需求!下面是具体的实现步骤和代码,完全适配Odoo 10的环境:
1. 创建自定义模块并继承hr.contract模型
首先你需要一个自定义模块(比如命名为custom_contract_wage),在模块的models目录下新建hr_contract.py文件,代码如下:
from odoo import models, fields, api class HrContract(models.Model): _inherit = 'hr.contract' # 继承原生的合同模型 # 先给合同模型添加关联grillesalaire的字段(如果还没有的话) grille_salaire_id = fields.Many2one('grillesalaire', string='Grille de Salaire') # 手动触发更新wage的方法 @api.multi def update_wage_from_grille(self): for contract in self: # 替换`salaire_base`为你grillesalaire模型里实际存薪资的字段名 if contract.grille_salaire_id: contract.wage = contract.grille_salaire_id.salaire_base return True # 可选:选择薪资格时自动实时更新wage @api.onchange('grille_salaire_id') def _onchange_grille_salaire(self): if self.grille_salaire_id: self.wage = self.grille_salaire_id.salaire_base # 可选:创建合同时自动同步wage @api.model def create(self, vals): contract = super(HrContract, self).create(vals) if contract.grille_salaire_id: contract.wage = contract.grille_salaire_id.salaire_base return contract # 可选:修改合同(比如切换薪资格)时自动更新wage @api.multi def write(self, vals): res = super(HrContract, self).write(vals) # 如果修改了薪资格字段,或者当前合同已有关联的薪资格,就更新wage if 'grille_salaire_id' in vals or self.grille_salaire_id: self.update_wage_from_grille() return res
2. 关键逻辑说明
- 模型继承:通过
_inherit = 'hr.contract'实现对原生合同模型的扩展,不需要重写整个模型,只添加需要的字段和逻辑即可。 - 关联字段:
grille_salaire_id用来关联你的grillesalaire模型,这样才能获取对应的薪资数据。 - 自动更新:
_onchange_grille_salaire方法会在用户选择不同薪资格时,立刻更新wage字段,提升操作体验。- 重写
create和write方法,确保合同创建或修改时,自动同步薪资数据到wage字段。
- 手动更新:
update_wage_from_grille方法可以用来批量更新合同的wage,后续可以添加按钮让用户手动触发。
3. 添加手动更新按钮(可选)
如果想让用户能手动触发更新,可以在合同表单视图里加个按钮。在模块的views目录下新建hr_contract_views.xml:
<odoo> <record id="view_contract_form_inherit" model="ir.ui.view"> <field name="name">hr.contract.form.inherit</field> <field name="model">hr.contract</field> <field name="inherit_id" ref="hr_contract.hr_contract_form"/> <field name="arch" type="xml"> <!-- 在表单的header区域添加按钮 --> <xpath expr="//header" position="inside"> <button name="update_wage_from_grille" string="Mettre à jour le salaire depuis la grille" type="object" class="oe_highlight"/> </xpath> </field> </record> </odoo>
4. 注意事项
- 记得把代码里的
salaire_base换成你grillesalaire模型中实际存储薪资的字段名。 - 如果你的
grillesalaire和合同的关联不是通过Many2one,而是通过职位、级别等条件匹配,那可以调整搜索逻辑,比如:# 示例:根据合同的职位匹配对应的薪资格 grille = self.env['grillesalaire'].search([('job_id', '=', self.job_id.id)], limit=1) if grille: self.wage = grille.salaire_base - 确保你的模块在
__manifest__.py中依赖hr_contract:'depends': ['hr_contract'],
这样就能完美实现你想要的功能啦!
内容的提问来源于stack exchange,提问作者EL Cholo
相关产品推荐
相关产品推荐

