Как вернуть существующее ir.actions.act_window из Python в Odoo 10? - PullRequest
0 голосов
/ 24 мая 2018

Что мне нужно

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

Что я сделал

Я объявил кнопку типа object для вызова метода Python.Внутри я проверяю поле.Если его значение равно A , я перенаправлю его на модель X , а если его значение равно B, я перенаправлю его на модель Y .

код

@api.multi
def my_button_method(self):
    self.ensure_one()
    if self.my_field == 'A':
        action_id = self.env.ref(
            'my_module.my_ir_actions_act_window_A')
        return action_id.__dict__
    elif self.my_field == 'B':
        action_id = self.env.ref(
            'my_module.my_ir_actions_act_window_B')
    else:
        action_id = False
    if action_id:
        return action_id.__dict__

Если я напишу это после определения action_id:

_logger.info(action_id.name)
_logger.info(action_id.type)
_logger.info(action_id.res_model)
_logger.info(action_id.view_type)
_logger.info(action_id.view_mode)
_logger.info(action_id.search_view_id)
_logger.info(action_id.help)

, я получу правильные значения.Итак, после поиска в Google я увидел, что __dict__ дает вам словарь, ключи которого являются атрибутами объекта, а значения которого значения этих атрибутов.

Но код выдает ошибку, потому что action_id.__dict__ не делаетt вернуть словарь с ожидаемыми атрибутами действия и его значениями, но вместо этого:

{
    '_prefetch': defaultdict(
        <type 'set'>,
        {
            'ir.actions.act_window': set([449])
        }
    ),
    'env': <odoo.api.Environment object at 0x7f0aa7ed7cd0>,
    '_ids': (449,)
}

Может кто-нибудь сказать мне, почему?Я пытаюсь избежать этого кода:

@api.multi
def my_button_method(self):
    self.ensure_one()
    if self.my_field == 'A':
        action_id = self.env.ref(
            'my_module.my_ir_actions_act_window_A')
    elif self.my_field == 'B':
        action_id = self.env.ref(
            'my_module.my_ir_actions_act_window_B')
    else:
        action_id
    if action_id:
        return {
            'name': action_id.name,
            'type': action_id.type,
            'res_model': action_id.res_model,
            'view_type': action_id.view_type,
            'view_mode': action_id.view_mode,
            'search_view_id': action_id.search_view_id,
            'help': action_id.help,
        }

Может быть, есть гораздо лучшее решение с использованием действия сервера, если так, кто-нибудь знает, как?

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете сделать действительно короткий "стиль":

action = self.env.ref('my_module.my_ir_actions_act_window_A').read()[0]
return action

Вы найдете множество примеров этого "стиля" в коде Odoo.

...