From ac855ee9bb465d88db5bd9369aea354eb2505f4e Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 26 Jan 2015 14:55:28 +0100 Subject: [PATCH] Factorize blurp rendering and in the same movement implement ajax rendering when using template tags --- src/cmsplugin_blurp/cms_plugins.py | 35 +++++++-------- .../templates/cmsplugin_blurp/ajax.html | 6 +-- .../templatetags/blurp_tags.py | 45 +++++++++---------- src/cmsplugin_blurp/urls.py | 2 +- src/cmsplugin_blurp/utils.py | 26 +++++++++++ src/cmsplugin_blurp/views.py | 29 +++++++----- 6 files changed, 85 insertions(+), 58 deletions(-) diff --git a/src/cmsplugin_blurp/cms_plugins.py b/src/cmsplugin_blurp/cms_plugins.py index 9accdef..01ed44c 100644 --- a/src/cmsplugin_blurp/cms_plugins.py +++ b/src/cmsplugin_blurp/cms_plugins.py @@ -1,9 +1,12 @@ +import logging + +from django.conf import settings from django.utils.translation import ugettext_lazy as _ from cms.plugin_pool import plugin_pool from cms.plugin_base import CMSPluginBase -from . import models +from . import models, utils class BlurpPlugin(CMSPluginBase): name = _('Blurp Plugin') @@ -12,26 +15,18 @@ class BlurpPlugin(CMSPluginBase): render_template = '' def render(self, context, instance, placeholder): - renderer = instance.get_renderer() - request = context.get('request') - ajax = context.get('ajaxy', True) and renderer.config.get('ajax', False) - if not ajax: - self.render_template = renderer.render_template() - return renderer.render(context) - else: - request = context.get('request') - context['plugin_id'] = instance.id - context['ajax_refresh'] = renderer.config.get('ajax_refresh', 0) - if request.GET: - context['plugin_args'] = '?{0}'.format(request.GET.urlencode()) - # hack alert !! - self.render_template = 'cmsplugin_blurp/ajax.html' + logger = logging.getLogger(__name__) + try: + slug = instance.name + template, context = utils.render_blurp(context, slug) + self.render_template = template return context - - - - - + except Exception, e: + logger.exception('error while rendering blurp %s', slug) + if settings.TEMPLATE_DEBUG: + msg = 'error while rendering blurp %s: %s' % (slug, e) + self.render_template = 'cmsplugin_blurp/error.html' + return {'content': msg} plugin_pool.register_plugin(BlurpPlugin) diff --git a/src/cmsplugin_blurp/templates/cmsplugin_blurp/ajax.html b/src/cmsplugin_blurp/templates/cmsplugin_blurp/ajax.html index c9db681..4b94b29 100644 --- a/src/cmsplugin_blurp/templates/cmsplugin_blurp/ajax.html +++ b/src/cmsplugin_blurp/templates/cmsplugin_blurp/ajax.html @@ -7,13 +7,13 @@ if ($ == undefined) { alert('jQuery is missing'); } else { - var $container = $("#block-plugin-ajax-{{ plugin_id }}"); + var $container = $("#block-plugin-ajax-{{ slug }}"); var ajax_refresh = {{ ajax_refresh }}; var exponential_refresh = ajax_refresh; var reload = function () { $container.removeClass('block-plugin-ajax-failed'); $container.addClass('block-plugin-ajax-loading'); - $.getJSON('{% url 'ajax_render' plugin_id=plugin_id %}{{ plugin_args|safe }}', function (result) { + $.getJSON('{% url 'ajax_render' slug=slug %}{{ plugin_args|safe }}', function (result) { $container.html(result.content); $container.removeClass('block-plugin-ajax-loading'); if (ajax_refresh > 0) { @@ -38,7 +38,7 @@ {% endaddtoblock %} -
+
{% trans "loading..." %}
diff --git a/src/cmsplugin_blurp/templatetags/blurp_tags.py b/src/cmsplugin_blurp/templatetags/blurp_tags.py index 78789b6..59a290b 100644 --- a/src/cmsplugin_blurp/templatetags/blurp_tags.py +++ b/src/cmsplugin_blurp/templatetags/blurp_tags.py @@ -32,25 +32,22 @@ class RenderBlurp(Tag): ) - def render_tag(self, context, name): - renderer = utils.resolve_renderer(name) - if not renderer: - return '' - template = renderer.render_template() - context = renderer.render(context) + def render_tag(self, context, slug): + context.push() try: - if not hasattr(template, 'render'): - template = template.Template(template) - return template.render(context) - except Exception, e: - logging.getLogger(__name__).exception('error while rendering %s', - renderer) - msg = '' - if settings.TEMPLATE_DEBUG: - msg += 'error while rendering %s: %s' % (renderer, e) - msg = '
%s
' % escape(msg) - return msg - + logger = logging.getLogger(__name__) + try: + template, context = utils.render_blurp(context, slug) + return template.render(context) + except Exception, e: + logger.exception('error while rendering blurp %s', slug) + msg = '' + if settings.TEMPLATE_DEBUG: + msg += 'error while rendering blurp %s: %s' % (slug, e) + msg = '
%s
' % escape(msg) + return msg + finally: + context.pop() @register.tag class BlurpNode(Tag): @@ -60,9 +57,11 @@ class BlurpNode(Tag): Argument('name'), blocks=[('endblurp', 'nodelist')]) - def render_tag(self, context, name, nodelist): + def render_tag(self, context, slug, nodelist): context.push() - utils.insert_blurp_in_context(name, context) - output = self.nodelist.render(context) - context.pop() - return output + try: + utils.insert_blurp_in_context(slug, context) + output = self.nodelist.render(context) + return output + finally: + context.pop() diff --git a/src/cmsplugin_blurp/urls.py b/src/cmsplugin_blurp/urls.py index 4cb18f3..7fe5bd0 100644 --- a/src/cmsplugin_blurp/urls.py +++ b/src/cmsplugin_blurp/urls.py @@ -3,7 +3,7 @@ from django.conf.urls import patterns, url from . import views urlpatterns = patterns('', - url(r'^block-plugin-async/(?P\d+)/$', + url(r'^block-plugin-async/(?P\w+)/$', views.ajax_render, name='ajax_render') ) diff --git a/src/cmsplugin_blurp/utils.py b/src/cmsplugin_blurp/utils.py index d7ebe4e..d6337fd 100644 --- a/src/cmsplugin_blurp/utils.py +++ b/src/cmsplugin_blurp/utils.py @@ -1,5 +1,8 @@ +import logging + from django.utils.importlib import import_module from django.utils.translation import ugettext_lazy as _ +from django.template.loader import get_template from . import app_settings @@ -34,3 +37,26 @@ def insert_blurp_in_context(name, context): if not renderer: return '' return renderer.render(context) + +def render_blurp(context, slug, ajax=True): + logger = logging.getLogger(__name__) + renderer = resolve_renderer(slug) + if not renderer: + logger.warning('renderer %s does not exist', slug) + return None, None + # Ajax rendering is canceled in the ajax view + ajax = ajax and renderer.config.get('ajax', False) + if ajax: + request = context.get('request') + context['slug'] = renderer.slug + context['ajax_refresh'] = renderer.config.get('ajax_refresh', 0) + if request.GET: + context['plugin_args'] = '?{0}'.format(request.GET.urlencode()) + # hack alert !! + template = get_template('cmsplugin_blurp/ajax.html', context) + else: + template = renderer.render_template() + if not hasattr(template, 'render'): + template = template.Template(template) + context = renderer.render(context) + return template, context diff --git a/src/cmsplugin_blurp/views.py b/src/cmsplugin_blurp/views.py index 0b32f6d..682ef49 100644 --- a/src/cmsplugin_blurp/views.py +++ b/src/cmsplugin_blurp/views.py @@ -2,20 +2,27 @@ import json import logging from django.http import HttpResponse -from django.template import RequestContext, loader -from django.shortcuts import get_object_or_404 +from django.template import RequestContext +from django.utils.html import escape +from django.conf import settings -from cms.models import CMSPlugin +from . import utils logger = logging.getLogger(__name__) -def ajax_render(request, plugin_id): +def ajax_render(request, slug): context = RequestContext(request) - context['ajaxy'] = False - plugin = get_object_or_404(CMSPlugin, pk=plugin_id) - rendered = plugin.render_plugin(context) - # use another template to render accumulated js and css declarations from sekizai - content = loader.render_to_string('cmsplugin_blurp/sekizai_render.html', - {'content': rendered}, context) - return HttpResponse(json.dumps({'content': content})) + template, context = utils.render_blurp(context, slug, ajax=False) + result = {} + try: + template, context = utils.render_blurp(context, slug) + result['content'] = template.render(context) + except Exception, e: + logger.exception('error while rendering blurp %s', slug) + msg = '' + result['error'] = msg + if settings.TEMPLATE_DEBUG: + msg += 'error while rendering blurp %s: %s' % (slug, e) + result['content'] = '
%s
' % escape(msg) + return HttpResponse(json.dumps(result))