def render_ajax_form(context, request, name): """Render ajax form on context by view name. By default contents of div with id ``content`` gets replaced. If fiddle mode or selector needs to get customized, ``bda.plone.ajax.form.mode`` and ``bda.plone.ajax.form.selector`` must be given as request parameters. """ try: result = context.restrictedTraverse(name)() selector = request.get('bda.plone.ajax.form.selector', '#content') mode = request.get('bda.plone.ajax.form.mode', 'inner') continuation = request.get('bda.plone.ajax.continuation') form_continue = AjaxFormContinue(continuation) response = ajax_form_template % { 'form': result, 'selector': selector, 'mode': mode, 'next': form_continue.next, } return response except Exception: result = '<div>Form rendering error</div>' selector = request.get('bda.plone.ajax.form.selector', '#content') mode = request.get('bda.plone.ajax.form.mode', 'inner') tb = format_traceback() continuation = AjaxMessage(tb, 'error', None) form_continue = AjaxFormContinue([continuation]) response = ajax_form_template % { 'form': result, 'selector': selector, 'mode': mode, 'next': form_continue.next, } return response
def ajaxaction(self): """Ajaxaction view, expected by bdajax contract. This view tries to lookup action by restricted traverse first, if not found, it tries to lookup contentprovider by action name. If this fails an error is raised. """ self.request.response.setHeader('X-Theme-Disabled', 'True') self.request.response.setHeader( 'Content-Type', 'application/json; charset=utf-8' ) try: mode = self.request.get('bdajax.mode') selector = self.request.get('bdajax.selector') action = self.request.get('bdajax.action') ret = { 'mode': mode, 'selector': selector, } try: view = self.context.restrictedTraverse(action) except (KeyError, AttributeError): view = None if view: ret['payload'] = view() self.continuation(ret) return json.dumps(ret) toadapt = (self.context, self.request, self) renderer = getMultiAdapter(toadapt, IContentProvider, name=action) renderer.update() ret['payload'] = renderer.render() self.continuation(ret) return json.dumps(ret) except Exception, e: logger.exception(e) tb = format_traceback() continuation = AjaxContinue( [AjaxMessage(tb, 'error', None)]).definitions return json.dumps({ 'mode': 'NONE', 'selector': 'NONE', 'payload': '', 'continuation': continuation, })