跳至内容
菜单
此问题已终结
5 回复
10075 查看

I have a few fields in a form that I want to keep readonly unless user is admin for my module...

in the xml:

<field name="name" attrs="{'readonly':[('user_is_admin', '=', False)]}"/>

in my .py:

user_is_admin = fields.Boolean(compute="_compute_user_is_admin", store=False)

def _compute_user_is_admin(self):
        self.user_is_admin = self.env.user.has_group('towers.group_mymodule_admin')

Works just fine, until I try to create a new record, then even if I'm admin those fields are read only. I tried displaying the field user_is_admin it is false when creating a new record (I'm guessing that makes sense since no data for that record has been created yet) if I save the record and edit it then I can edit those fields...

Any way around this? ...BTW only admin user can create a new record if that helps...

形象
丢弃

user = self.env['res.users'].browse(self._uid)

user.has_group('base.group_erp_manager')

I don't think this is a problem with self.env.user.has_group - the problem is that user_is_admin isn't computed until the record is saved.  

编写者 最佳答案

Since non admin users are not able to create new records, I resolved it by checking id to see if it's creating a new record:

<field name="name" attrs="{'readonly':[('user_is_admin','=',False),('id','>',0)]}"/>

形象
丢弃
最佳答案

Hi 
you can Start by converting your field to compute field and pass the method to it
and after that pass you depends to the method like this:
api.depends_context('uid')


after this the method will work just fine


形象
丢弃
最佳答案

Hi you can add default like this

user_is_admin = fields.Boolean(compute="_compute_user_is_admin", store=False, default= lambda self: "_compute_user_is_admin")

形象
丢弃
最佳答案

I don't think this is a problem with self.env.user.has_group - the problem is that user_is_admin isn't computed until the record is saved.  

Possible workaround: set a user-defined default (for the Administrator only): 

user_is_admin = true
形象
丢弃
最佳答案

Have you tried with sudo().

      self.user_is_admin = self.env.user.sudo().has_group('towers.group_mymodule_admin')

形象
丢弃
编写者

Would that cause it to compute before there is a record saved?