Я хочу, чтобы некоторые из полей в записи не редактировались для пользователя, который выбран в поле forbridden_user
. Но не все поля. Некоторые поля должны быть доступны для редактирования. Как я мог это достичь?Права/правила доступа к файлам Odoo
ответ
Здесь есть две отдельные проблемы:
- Создание поля отображается только в форме.
- Обеспечение безопасности, чтобы оно действительно не могло быть изменено.
Это отдельные проблемы, и, обратившись только к первому пункту, вы можете получить очень неприятный сюрприз в будущем.
К сожалению, Odoo не имеет рамки разрешений для каждого поля (you can read my rant about this here).
Если вы хотите, вы можете use a module I created while working on a project, that addresses this very issue.
После загрузки модуля и добавления protected_fields
в зависимости вашего модуля вы могли бы сделать что-то вроде этого:
class YourModel(models.Model):
_name = 'your.model'
_inherit = [
'protected_fields.mixin',
]
_protected_fields = ['field_you_want_to_protect']
field_you_want_to_protect = fields.Char()
forbridden_user = fields.Many2one('res.users')
current_user_forbidden = fields.Boolean(compute="_compute_current_user_forbidden")
@api.one
@api.depends('forbridden_user')
def _compute_current_user_forbidden(self):
"""
Compute a field indicating whether the current user
shouldn't be able to edit some fields.
"""
self.current_user_forbidden = (self.forbridden_user == self.env.user)
@api.multi
def _is_permitted(self):
"""
Allow only authorised users to modify protected fields
"""
permitted = super(DetailedReport, self)._is_permitted()
return permitted or not self.current_user_forbidden
Это будет заботиться о надежно защищая поля на стороне сервера и дополнительно создать current_user_forbidden
поле. Поле будет установлено на True
, когда текущий пользователь равен forbridden_user
. Мы можем использовать это на стороне клиента, чтобы сделать защищенное поле отображаемым только для чтения.
Добавить выведенное поле в ваше представление (как невидимое поле - нам просто нужно, чтобы его значение было доступно) и добавить атрибут attrs
к полям, которые вы хотите защитить, с доменом, который будет создавать поле появляется только для чтения, когда current_user_forbidden
поля является True
:
<field name="current_user_forbidden" invisible="1"/>
<field name="field_you_want_to_protect" attrs="{'readonly': [('current_user_forbidden', '=', True)]}"/>
конечно вместо field_you_want_to_protect
вы должны использовать свое собственное поле, которое вы хотите защитить.
Большое спасибо! – hockeyman
Основная идея здесь,,
1) наследуют вид
2) указать группы, к которым вы хотите ограничить поля
3), а затем изменить атрибуты поля.
Я вставив здесь пример код, который позволит сделать Employee contirbution поля только для чтения, когда пользователи команды Данные групп вошли в системе.
<record id="view_contribution_fields_form" model="ir.ui.view">
<field name="name">member.contribution.form.editable.list</field>
<field name="model">member.contribution</field>
<field name="inherit_id" ref="contribution_view_form"/> <!-- ref = 'module_name.form_view_id'-->
<field name="groups_id" eval="[(6, 0, [ref('group_data_team')])]"/>
<field name="arch" type="xml">
<field name="contribution_employee" position="attributes">
<attribute name="readonly">1</attribute>
</field>
</field>
</record>
, как это вы можете изменить поле атрибутов, когда конкретный вход пользователя в системе.
А что, если я не хочу ограничить его по группам. Я хочу ограничить доступ к полю по значению поля. Если пользователь выбран в поле 'forbriden_user', я хочу, чтобы этот пользователь не писал некоторые поля. – hockeyman
ok, то просто наследуйте форму 2) наследуйте поле 3), затем примените attrs, как показано ниже. <Имя поля = положение "contribution_employee" = "атрибуты"> <атрибут Name = "ATTRS"> { 'только для чтения': [('forbidden_user', '=', 'some_value')]} –
вот проблему , Что должно быть в 'some_value'? Я попробовал 'uid' и' user.id'.Оба не работают. – hockeyman
может быть вам полезна. http://stackoverflow.com/questions/22368935/openerp-7-how-to-give-users-access-to-custom-module-in-openerp-7/22534350#22534350 –