2016-12-21 5 views
0

Предположим, что я настроил действие сервера A на модели stock.inventory. Это действие просто регистрирует значение, а затем вызывает Sever Action B (с идентификатором базы данных 366). Код питона в действии просто:Одуо автоматическое действие сервера для запуска другого действия сервера

log('running server action a') 
value = { 
    "type": "ir.actions.server", 
    "id": 366, 
} 

Затем в сервер действий B, который находится на product.product модели, код питон просто:

log('running server aciton b') 

Теперь, когда я добавляю Действие сервера A в меню «Дополнительно» и вручную запустить его из браузера на объекте stock.inventory, оба действия успешно выполняются. Другими словами, в журналах я вижу как «выполняемое действие сервера a», так и «запуск действия сервера b».

Теперь я создаю автоматическое действие для запуска действия сервера A при обновлении или создании объекта stock.inventory. После этого и обновления или создания объекта stock.inventory через пользовательский интерфейс я вижу только «выполнение действия сервера a» в журналах. Другими словами, действие Server B никогда не запускается, как это было, когда я запускал один и тот же эксперимент вручную из меню «Дополнительно».

Итак, мой вопрос в том, можно ли инициировать действие второго сервера с первого действия сервера, если действие первого сервера инициируется автоматическим действием.

+0

Как вы называете действие? Я думаю, что из контекста автоматизированного действия вам нужно вызвать метод, который не возвращает действие. Семантика этих проблем может показаться странной. Я вызывал действие сервера, которое возвращало действие окна, и ничего не работало, пока я не присвоил действию значение возвращаемого действия окна. Однако при нормальных обстоятельствах я бы просто вернул действие окна и ожидал, что он загрузит представление. –

+0

Я не уверен, но мне интересно, если действия, возвращаемые из функций, обрабатываются по-разному при вызове из браузера, а не из кода. Возможно, вам придется вызвать другой метод напрямую, а не возвращать действие, которое действительно просто вызывает метод в любом случае. –

+0

@PhillipStack Я думаю, что вы правы. Похоже, когда вы «возвращаете действие», это то, что понимает браузер. Он знает, что нужно вызвать сервер и выполнить возвращенное действие. Я хотел бы просто вызвать метод, как вы предлагаете, но, к сожалению, я делаю все это в версии Odoo Online, то есть у меня нет доступа к исходному коду. Я добавляю эти действия через пользовательский интерфейс и не могу определить способ запуска действия с другой серверной стороны. – flyingL123

ответ

1

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

Вот пример.

Сервер Действие

a = env['ir.actions.server'].browse(409) 
ctx = dict(env.context or {}) 
ctx.update({'active_id': 169, 'active_model': 'purchase.order'}) 
a.with_context(ctx).run() 

Сервер Действие B (ID = 409)

raise Warning(record) 

Когда вы вызываете первое действие, вы получите строку purchase.order(169,) в качестве вывода.

Даже охладитель, если второй сервер присваивает значение action, он возвращается к первому действию. Например:

Сервер действий A

a = env['ir.actions.server'].browse(409) 
ctx = dict(env.context or {}) 
ctx.update({'active_id': 169, 'active_model': 'purchase.order'}) 
resp = a.with_context(ctx).run() 
raise Warning(resp) 

Сервер Действие B (ID = 409)

action = record.id 

Когда вы вызываете первое действие сервера, вы увидите, как 169 ответ.

0

Если у вас есть доступ к разделу администрирования. Вы должны иметь возможность вызвать функцию напрямую. В odoo8 это выглядит так.

enter image description here

Выберите ваше действие сервер

enter image description here

Обратите внимание на раздел питон код. Вы должны иметь возможность найти нужную модель и выполнить функцию напрямую.

action = self.env['addon.model'].the_fun() 

Чтобы выполнить другое действие, попробуйте следующее.

action = self.env['ir.actions.server'].ref('xml_id_of_action') 
action.run_action_code_multi() 

Вот описание

run_action_code_multi(self, *args, **kwargs) Override to allow returning response the same way action is already returned by the basic server action behavior. Note that response has priority over action, avoid using both.

+0

Да, я знаю поле кода питона, именно так я создал действия в первую очередь и включил код для регистрации значений, как показано в исходном вопросе. Проблема, что я хочу вызвать другое действие из этого поля кода, и я не знаю, как это сделать. Имеет ли это смысл? – flyingL123

+0

Ну, я не совсем уверен, в каком контексте вы ограничены в отношении вызова функции odoo в поле кода python. Я уточню свой ответ. Попробуйте просто вызвать функцию в другом действии. Я не знаю, как вызвать действие. Но вы, вероятно, можете вызвать функцию. –

+0

Я не могу просто вызвать метод напрямую, потому что метод не существует, так как я использую odoo online. Нет способа, это другое действие сервера. Если действие сервера каким-то образом автоматически дает имя, позволяющее ему вызываться как метод на модели? Это было бы неплохо, но звучит так, будто это неправда. – flyingL123

 Смежные вопросы

  • Нет связанных вопросов^_^