Ir al contenido
Menú
Se marcó esta pregunta
1 Responder
2676 Vistas

Hello Community,

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:

class HrEmployeeResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'

editable_fields = fields.Many2many('ir.model.fields', 'editable_fields_rel', 'model_id', 'id',
string='Editable Field', domain="[('model_id', '=', 'hr.employee')]")

class CustomEmployee(models.Model):
_inherit = 'hr.employee'

def fields_view_get(self, view_id=None, view_type="form", toolbar=False, submenu=False):
res = super(CustomEmployee, self).fields_view_get(view_id=view_id,
view_type=view_type, toolbar=toolbar, submenu=submenu)
doc = etree.XML(res['arch'])
 
###### Make fields invisible for others###########
config_fields = self.env['ir.default'].get('res.config.settings', 'editable_fields')
all_editable_fields = self.env['ir.model.fields'].browse(config_fields)
rec_list = []
for rec in all_editable_fields:
rec_list.append(rec.name)
 
###### Make fields Readonly for others ###########
if not self.env.user.has_group('hr.group_hr_manager'):
for field in res['fields']:
if field not in rec_list:
for node in doc.xpath("//field[@name='%s']" % field):
node.set('readonly', '1')
node_values = node.get('modifiers')
modifiers = json.loads(node_values)
modifiers["readonly"] = True
node.set('modifiers', json.dumps(modifiers))
res['arch'] = etree.tostring(doc)
####################
return res

Thanks in advance.

Avatar
Descartar
Mejor respuesta

Hello Pawan Sharma,

In odoo 16,"fields_view_get method" renamed to "get_view" in Odoo 16

As per your requirement, to make fields read-only override the "_get_view" method it returns the arch as an etree node of model and view

​Please find code in comments. 

Hope it will be helpful to you.

Thanks & Regards,
Email:  odoo@aktivsoftware.com

Skype: kalpeshmaheshwari 


Avatar
Descartar

Please find code here :-

Here, I shared the code:

class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'

editable_fields = fields.Many2many('ir.model.fields', 'editable_fields_rel', 'model_id', 'id',
string='Editable Field', domain="[('model_id', '=', 'hr.employee')]")

def set_values(self):
res = super(ResConfigSettings, self).set_values()
ICPSudo = self.env['ir.config_parameter'].sudo()
ICPSudo.set_param("custom_module_name.editable_fields", self.editable_fields.ids)
return res

@api.model
def get_values(self):
res = super(ResConfigSettings, self).get_values()
ICPSudo = self.env['ir.config_parameter'].sudo()
editable_fields = ICPSudo.get_param('custom_module_name.editable_fields')
if editable_fields:
res.update(editable_fields=[(6, 0, literal_eval(editable_fields))])
return res

from ast import literal_eval

class CustomEmployee(models.Model):
_inherit = 'hr.employee'

@api.model
def _get_view(self, view_id=None, view_type='form', **options):
"Get the model view architecture"
arch, view = super()._get_view(view_id, view_type, **options)
rec_list = []
if view_type=='form' and not self.env.user.has_group('hr.group_hr_manager'):
ICPSudo = self.env['ir.config_parameter'].sudo()
editable_fields = ICPSudo.get_param('custom_module_name.editable_fields')
all_editable_fields = self.env['ir.model.fields'].browse(literal_eval(editable_fields))
for rec in all_editable_fields:
rec_list.append(rec.name)
for field in arch.xpath("//field"):
if field.get('name') not in rec_list:
field.set('readonly', '1')
return arch, view

Publicaciones relacionadas Respuestas Vistas Actividad
1
abr 25
1223
Odoo App Resuelto
1
nov 23
1792
0
may 24
1470
0
sept 23
2426
0
sept 23
2100