automation中的webhook - xiaohao0576/odoo-doc GitHub Wiki
特点: csrf=False, 并且能自动提取json数据
from odoo.http import request, route, Controller
from odoo.addons.base_automation.models.base_automation import get_webhook_request_payload
class BaseAutomationController(Controller):
@route(['/web/hook/<string:rule_uuid>'], type='http', auth='public', methods=['GET', 'POST'], csrf=False, save_session=False)
def call_webhook_http(self, rule_uuid, **kwargs):
""" Execute an automation webhook """
rule = request.env['base.automation'].sudo().search([('webhook_uuid', '=', rule_uuid)])
if not rule:
return request.make_json_response({'status': 'error'}, status=404)
data = get_webhook_request_payload()
try:
rule._execute_webhook(data)
except Exception: # noqa: BLE001
return request.make_json_response({'status': 'error'}, status=500)
return request.make_json_response({'status': 'ok'}, status=200)
def get_webhook_request_payload():
if not request:
return None
try:
payload = request.get_json_data()
except ValueError:
payload = {**request.httprequest.args}
return payload
record_getter = fields.Char(default="model.env[payload.get('_model')].browse(int(payload.get('_id')))",
help="This code will be run to find on which record the automation rule should be run.")
def _get_eval_context(self, payload=None):
""" Prepare the context used when evaluating python code
:returns: dict -- evaluation context given to safe_eval
"""
self.ensure_one()
model = self.env[self.model_name]
eval_context = {
'datetime': safe_eval.datetime,
'dateutil': safe_eval.dateutil,
'time': safe_eval.time,
'uid': self.env.uid,
'user': self.env.user,
'model': model,
}
if payload is not None:
eval_context['payload'] = payload
return eval_context