使员工字段从配置字段(多对多字段)中变为只读。

huangapple go评论99阅读模式
英文:

Make employee field readonly from configured fields(many2many field)

问题

Here's the translated content you requested:

  1. 我正在使用Odoo版本16,之前我使用的是Odoo版本11,我想将我的代码从v11升级到v16
  2. 我卡在一个方法上,我想要将一些字段设为只读,这些字段是在设置中定义的(many2many字段),针对特定的用户组(除了管理员组)。这段代码在v11上工作正常,但在v16上不起作用。
  3. 所以,有人可以帮助我解决这个问题吗?
  4. 我的代码如下:
  5. class HrEmployeeResConfigSettings(models.TransientModel):
  6. _inherit = 'res.config.settings'
  7. editable_fields = fields.Many2many('ir.model.fields', 'editable_fields_rel', 'model_id', 'id',
  8. string='Editable Field', domain="[('model_id', '=', 'hr.employee')]")
  9. class CustomEmployee(models.Model):
  10. _inherit = 'hr.employee'
  11. def fields_view_get(self, view_id=None, view_type="form", toolbar=False, submenu=False):
  12. res = super(CustomEmployee, self).fields_view_get(view_id=view_id,
  13. view_type=view_type, toolbar=toolbar, submenu=submenu)
  14. doc = etree.XML(res['arch'])
  15. ###### 使字段对其他人不可见###########
  16. config_fields = self.env['ir.default'].get('res.config.settings', 'editable_fields')
  17. all_editable_fields = self.env['ir.model.fields'].browse(config_fields)
  18. rec_list = []
  19. for rec in all_editable_fields:
  20. rec_list.append(rec.name)
  21. ###### 使字段对其他人只读 ###########
  22. if not self.env.user.has_group('hr.group_hr_manager'):
  23. for field in res['fields']:
  24. if field not in rec_list:
  25. for node in doc.xpath("//field[@name='%s']" % field):
  26. node.set('readonly', '1')
  27. node_values = node.get('modifiers')
  28. modifiers = json.loads(node_values)
  29. modifiers["readonly"] = True
  30. node.set('modifiers', json.dumps(modifiers))
  31. res['arch'] = etree.tostring(doc)
  32. ####################
  33. return res

Please note that I've translated your code, but I haven't made any changes to its functionality. If you encounter issues with it in Odoo version 16, you may need to adapt it to the changes in the new version.

英文:

I am using odoo version 16, earlier I am using odoo version 11 and i want to upgrade my code from v11 to v16.

I am stuck at one method where I want to make some fields read-only from defined configured fields(many2many field in setting) for a specific group (except manager group). This code worked for v11 but not working on v16.

So, anyone can help me out with this problem?

My code is below:

  1. class HrEmployeeResConfigSettings(models.TransientModel):
  2. _inherit = 'res.config.settings'
  3. editable_fields = fields.Many2many('ir.model.fields', 'editable_fields_rel', 'model_id', 'id',
  4. string='Editable Field', domain="[('model_id', '=', 'hr.employee')]")
  5. class CustomEmployee(models.Model):
  6. _inherit = 'hr.employee'
  7. def fields_view_get(self, view_id=None, view_type="form", toolbar=False, submenu=False):
  8. res = super(CustomEmployee, self).fields_view_get(view_id=view_id,
  9. view_type=view_type, toolbar=toolbar, submenu=submenu)
  10. doc = etree.XML(res['arch'])
  11. ###### Make fields invisible for others###########
  12. config_fields = self.env['ir.default'].get('res.config.settings', 'editable_fields')
  13. all_editable_fields = self.env['ir.model.fields'].browse(config_fields)
  14. rec_list = []
  15. for rec in all_editable_fields:
  16. rec_list.append(rec.name)
  17. ###### Make fields Readonly for others ###########
  18. if not self.env.user.has_group('hr.group_hr_manager'):
  19. for field in res['fields']:
  20. if field not in rec_list:
  21. for node in doc.xpath("//field[@name='%s']" % field):
  22. node.set('readonly', '1')
  23. node_values = node.get('modifiers')
  24. modifiers = json.loads(node_values)
  25. modifiers["readonly"] = True
  26. node.set('modifiers', json.dumps(modifiers))
  27. res['arch'] = etree.tostring(doc)
  28. ####################
  29. return res

Thanks in advance.

答案1

得分: 1

In Odoo 16,fields_view_get 变成了 get_view

要使字段变为只读,重写 _get_view 函数,该函数返回一个 etree 节点。

示例:

  1. class CustomEmployee(models.Model):
  2. _inherit = 'hr.employee'
  3. @api.model
  4. def _get_view_cache_key(self, view_id=None, view_type='form', **options):
  5. """The override of _get_view making the fields readonly for HR managers
  6. makes the view cache dependent on the fact the user has the group HR manager or not"""
  7. key = super()._get_view_cache_key(view_id, view_type, **options)
  8. key = key + (self.env.user.has_group('hr.group_hr_manager'),)
  9. return key
  10. @api.model
  11. def _get_view(self, view_id=None, view_type='form', **options):
  12. arch, view = super()._get_view(view_id, view_type, **options)
  13. if not self.env.user.has_group('hr.group_hr_manager'):
  14. rec_list = [...]
  15. for field in arch.xpath("//field"):
  16. if field.get('name') not in rec_list:
  17. field.set('readonly', '1')
  18. return arch, view
英文:

In Odoo 16 fields_view_get becomes get_view.

To make fields read-only override the _get_view function which returns the arch as an etree node

Example:

  1. class CustomEmployee(models.Model):
  2. _inherit = 'hr.employee'
  3. @api.model
  4. def _get_view_cache_key(self, view_id=None, view_type='form', **options):
  5. """The override of _get_view making the fields readonly for HR managers
  6. makes the view cache dependent on the fact the user has the group HR manager or not"""
  7. key = super()._get_view_cache_key(view_id, view_type, **options)
  8. key = key + (self.env.user.has_group('hr.group_hr_manager'),)
  9. return key
  10. @api.model
  11. def _get_view(self, view_id=None, view_type='form', **options):
  12. arch, view = super()._get_view(view_id, view_type, **options)
  13. if not self.env.user.has_group('hr.group_hr_manager'):
  14. rec_list = [...]
  15. for field in arch.xpath("//field"):
  16. if field.get('name') not in rec_list:
  17. field.set('readonly', '1')
  18. return arch, view

huangapple
  • 本文由 发表于 2023年4月13日 18:15:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/76004268.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定