Factorize blurp rendering and in the same movement implement ajax rendering when using template tags

This commit is contained in:
Benjamin Dauvergne 2015-01-26 14:55:28 +01:00
parent 3245869817
commit ac855ee9bb
6 changed files with 85 additions and 58 deletions

View File

@ -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)

View File

@ -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 @@
</script>
{% endaddtoblock %}
<div id="block-plugin-ajax-{{ plugin_id }}" class='block-plugin-ajax block-plugin-ajax-loading'>
<div id="block-plugin-ajax-{{ slug }}" class='block-plugin-ajax block-plugin-ajax-loading'>
<div class="block-plugin-ajax-placeholder">{% trans "loading..." %}</div>
</div>

View File

@ -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 = '<pre>%s</pre>' % 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 = '<pre>%s</pre>' % 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()

View File

@ -3,7 +3,7 @@ from django.conf.urls import patterns, url
from . import views
urlpatterns = patterns('',
url(r'^block-plugin-async/(?P<plugin_id>\d+)/$',
url(r'^block-plugin-async/(?P<slug>\w+)/$',
views.ajax_render,
name='ajax_render')
)

View File

@ -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

View File

@ -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'] = '<pre>%s</pre>' % escape(msg)
return HttpResponse(json.dumps(result))