Показать / скрыть поля, если их нет в списке

Моя концепция заключается в том, что у меня есть 5 разных уровней доступа к Odoo.

Я хочу проверить, есть ли входящий в систему пользователь в списке (список создается автоматическим действием), если да, показать поля, иначе скрыть их.

Мой код:

list_of_users= []
if record.user_id.partner_id.id: #level 1 user add on list
  list_of_users.append(record.user_id.partner_id.id)

if record.user_id.sale_team_id.user_id.partner_id.id: #level 2 user add on list
  list_of_users.append(record.user_id.sale_team_id.user_id.partner_id.id)

if record.user_id.sale_team_id.regional_manager_id.partner_id.id: #level 3 user add on list
  list_of_users.append(record.user_id.sale_team_id.regional_manager_id.partner_id.id)

user_ids = record.env['res.users'].search([])
flag = record.env['res.users'].search([('groups_id','ilike','L4')])

for user_ids in flag: #level 4 and 5 users add on list
  user_record = record.env['res.users'].browse(user_ids)
  list_of_users.append(user_ids.partner_id.id)

record.update({'x_partner_follower_custom': [(6, 0, list_of_users)]})

При просмотре я использую attrs="{'invisible': [('x_partner_follower_custom', '=', False)]}" внутри полей, которые хочу показать / скрыть

x_partner_follower_custom: many2many поле res.partner

Пример вывода:  введите описание изображения здесь

Как видите, я возвращаю пользователей к просмотру, но кажется, что attrs установлен неправильно. Есть идеи, как это исправить?


person Fotic    schedule 28.12.2019    source источник
comment
Вы можете создать вычисляемое логическое поле, которое будет True, если пользователь принадлежит к списку False, если нет. и используйте это поле в attrs. Потому что я не думаю, что у вас есть доступ к текущему пользователю в оценке attrs, но я еще не уверен в этом.   -  person Charif DZ    schedule 29.12.2019
comment
Здравствуйте, вы можете привести мне пример, потому что я новичок в программировании на odoo?   -  person Fotic    schedule 29.12.2019
comment
Я создал дополнительное логическое поле в модели res.partner, какой код следует применять к полю вычисления? Изображение   -  person Fotic    schedule 29.12.2019


Ответы (1)


Прежде всего, поле не должно быть stored, и оно должно вычисляться каждый раз, потому что оно depends на значении текущего зарегистрированного user, удалить store:

   @api.depends('x_partner_follower_custom')
   def user_exist(self):
        for rec in self:
             if rec.x_partner_follower_custom and self.env.user.partner_id.id in rec.x_partner_follower_custom.ids:
                 rec.your_boolean_field_name = True
             else:
                 rec.your_boolean_field_name = False 

Таким образом, поле зависит от x_partner_follower_custom и текущего зарегистрированного пользователя не должно быть stored.

РЕДАКТИРОВАТЬ

Все объясняется в представлении формы и как заставить код работать так, как он был создан в коде:

Как создать вычислительное поле с помощью пользовательского интерфейса

Пару дней назад мне удалось найти решение: @Fotic

for record in self:
  if record['x_partner_follower_custom'] and self.env.user.partner_id.id in record['x_partner_follower_custom'].ids:
    record['x_partner_is_follower_custom'] = True
  else:
    record['x_partner_is_follower_custom'] = False
person Charif DZ    schedule 30.12.2019
comment
Прежде всего, большое спасибо за помощь, если я использую вышеуказанные настройки, я получаю пустой список внутри контакта (см. Изображения) x_partner_is_follower_custom, x_partner_follower_custom, результат. Также я тестирую с stored ON, но, похоже, не работает, при просмотре я использую attrs="{'invisible': [('x_partner_is_follower_custom', '=', False)]}". Любое решение? - person Fotic; 30.12.2019
comment
Извините за использование «в первую очередь», и код, который я написал, не предназначен для настраиваемых полей пользовательского интерфейса, но для кода на стороне сервера, кода Python. Чтобы сделать то же самое в пользовательском интерфейсе, скопируйте тело метода в поле «Код». И скопируйте зависимость в поле dependencies. Отметьте это, чтобы понять, что я говорю, и kepp store = False, как я уже говорил, это поле должно вычисляться каждый раз: odoo.com/fr_FR/forum/aide-1/question/ - person Charif DZ; 30.12.2019
comment
Как это предполагать? поле many2many x_partner_follower_custom (список пользователей создается при создании или обновлении записи), логическое поле x_partner_is_follower_custom, но я получаю ошибку: ValueError: forbidden opcode(s) in 'for rec in self:\r\n if rec.x_partner_follower_custom and self.env.user.partner_id.id ... - person Fotic; 31.12.2019
comment
Идея кода такая же, как и я, но я думаю, что вы не можете написать такой код в пользовательском интерфейсе. Если у меня будет время, я постараюсь вам в этом помочь. - person Charif DZ; 31.12.2019
comment
Я пытаюсь это сделать, потому что клиент не дает мне доступа к ftp-серверу. Так что, если у вас будет время помочь мне, я буду рад. Спасибо - person Fotic; 31.12.2019
comment
@Fotic, извините, что так долго, проверьте мои правки, надеюсь, это вам поможет - person Charif DZ; 05.01.2020
comment
Поверьте, я знал, что у вас получится сделать это самостоятельно, потому что вы поняли идею - person Charif DZ; 05.01.2020