2015-08-13 1 views
0

Я хочу, чтобы некоторые из полей в записи не редактировались для пользователя, который выбран в поле forbridden_user. Но не все поля. Некоторые поля должны быть доступны для редактирования. Как я мог это достичь?Права/правила доступа к файлам Odoo

+0

может быть вам полезна. http://stackoverflow.com/questions/22368935/openerp-7-how-to-give-users-access-to-custom-module-in-openerp-7/22534350#22534350 –

ответ

3

Здесь есть две отдельные проблемы:

  1. Создание поля отображается только в форме.
  2. Обеспечение безопасности, чтобы оно действительно не могло быть изменено.

Это отдельные проблемы, и, обратившись только к первому пункту, вы можете получить очень неприятный сюрприз в будущем.

К сожалению, 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 вы должны использовать свое собственное поле, которое вы хотите защитить.

+0

Большое спасибо! – hockeyman

0

Основная идея здесь,,
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> 

, как это вы можете изменить поле атрибутов, когда конкретный вход пользователя в системе.

+0

А что, если я не хочу ограничить его по группам. Я хочу ограничить доступ к полю по значению поля. Если пользователь выбран в поле 'forbriden_user', я хочу, чтобы этот пользователь не писал некоторые поля. – hockeyman

+0

ok, то просто наследуйте форму 2) наследуйте поле 3), затем примените attrs, как показано ниже. <Имя поля = положение "contribution_employee" = "атрибуты"> <атрибут Name = "ATTRS"> { 'только для чтения': [('forbidden_user', '=', 'some_value')]} –

+0

вот проблему , Что должно быть в 'some_value'? Я попробовал 'uid' и' user.id'.Оба не работают. – hockeyman