From 8df6b16784b64d4ebb375290f96a7c8e2fd4f949 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 5 Feb 2014 10:04:47 +0100 Subject: [PATCH] [ADD] website: added support for invoking a server action through controller website: added website/action/ route, that runs the server action designed by its id or xml_id. Only code server action returning a template give a result. The template is displayed. Other or not existing server actions redirect to the homepage. website: added an override of ir_actions_server: evaluation context gets request for evaluation, to enable request.render(template_name); also returns template the same way action is returned for code server action; bzr revid: tde@openerp.com-20140205090447-2hppg7818nx1wfzh --- addons/website/controllers/main.py | 31 ++++++++++++++++++++++++++-- addons/website/data/website_data.xml | 18 ++++++++++++++++ addons/website/models/__init__.py | 1 + addons/website/models/ir_actions.py | 26 +++++++++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 addons/website/models/ir_actions.py diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index b9fc68bb667..9cd22a76e6e 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -9,7 +9,6 @@ import datetime from sys import maxint -import psycopg2 import werkzeug import werkzeug.exceptions import werkzeug.utils @@ -27,6 +26,7 @@ logger = logging.getLogger(__name__) # Completely arbitrary limits MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT = IMAGE_LIMITS = (1024, 768) + class Website(openerp.addons.web.controllers.main.Home): #------------------------------------------------------ # View @@ -366,5 +366,32 @@ class Website(openerp.addons.web.controllers.main.Home): return response + #------------------------------------------------------ + # Server actions + #------------------------------------------------------ + @http.route(['/website/action/'], type='http', auth="public", website=True) + def actions_server(self, id_or_xml_id, **post): + cr, uid, context = request.cr, request.uid, request.context + res, action_id, action = None, None, None + ServerActions = request.registry['ir.actions.server'] -# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: + # find the action_id, either an int, an int into a basestring, or an xml_id + if isinstance(id_or_xml_id, basestring) and '.' in id_or_xml_id: + action_id = request.registry['ir.model.data'].xmlid_to_res_id(request.cr, request.uid, id_or_xml_id, raise_if_not_found=False) + else: + try: + action_id = int(id_or_xml_id) + except ValueError: + pass + # check it effectively exists + if action_id: + action_ids = ServerActions.exists(cr, uid, [action_id], context=context) + action_id = action_ids and action_ids[0] or None + # run it, return only LazyResponse that are templates to be rendered + if action_id: + action_res = ServerActions.run(cr, uid, [action_id], context=context) + if isinstance(action_res, LazyResponse): + res = action_res + if res: + return res + return request.redirect('/') diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml index 50f2d8e381e..dc50a494a49 100644 --- a/addons/website/data/website_data.xml +++ b/addons/website/data/website_data.xml @@ -1,5 +1,23 @@ + + + + + Website Test + True + + +values = {} +template = request.website.render("website.test0", values) + + code + ir.actions.server + + + www.openerp.com diff --git a/addons/website/models/__init__.py b/addons/website/models/__init__.py index e17fba63e39..da3c232a24e 100644 --- a/addons/website/models/__init__.py +++ b/addons/website/models/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +import ir_actions import ir_ui_view import website import ir_qweb diff --git a/addons/website/models/ir_actions.py b/addons/website/models/ir_actions.py new file mode 100644 index 00000000000..c6b71e51e1e --- /dev/null +++ b/addons/website/models/ir_actions.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +from openerp.addons.web.http import request +from openerp.osv import fields, osv + + +class actions_server(osv.Model): + """ Add website option in server actions. """ + _name = 'ir.actions.server' + _inherit = ['ir.actions.server'] + + # _columns = { + # 'website': fields.boolean('Website Stuff'), + # } + + def _get_eval_context(self, cr, uid, action, context=None): + eval_context = super(actions_server, self)._get_eval_context(cr, uid, action, context=context) + if action.state == 'code': + eval_context['request'] = request + return eval_context + + def run_action_code_multi(self, cr, uid, action, eval_context=None, context=None): + res = super(actions_server, self).run_action_code_multi(cr, uid, action, eval_context, context) + if 'template' in eval_context: + return eval_context['template'] + return res