From bb7c7a0e8ae5be7c3202c7ee5e80cc198f159a46 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 28 Aug 2014 11:21:47 +0200 Subject: [PATCH] In AJAX view return 404 on absent plugin (fixes #5092) When the view fails, stop polling if status is 404, otherwise continue polling but use an exponential backoff between retries. --- .../templates/cmsplugin_blurp/ajax.html | 19 ++++++++++++------- src/cmsplugin_blurp/views.py | 9 ++++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/cmsplugin_blurp/templates/cmsplugin_blurp/ajax.html b/src/cmsplugin_blurp/templates/cmsplugin_blurp/ajax.html index c7eeca4..c9db681 100644 --- a/src/cmsplugin_blurp/templates/cmsplugin_blurp/ajax.html +++ b/src/cmsplugin_blurp/templates/cmsplugin_blurp/ajax.html @@ -9,21 +9,26 @@ } else { var $container = $("#block-plugin-ajax-{{ plugin_id }}"); 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) { $container.html(result.content); $container.removeClass('block-plugin-ajax-loading'); - }) - .fail(function () { - $container.addClass('block-plugin-ajax-failed'); - }) - .always(function () { if (ajax_refresh > 0) { setTimeout(reload, ajax_refresh*1000); - } - }); + } + exponential_refresh = ajax_refresh; + }) + .fail(function (jqXHR) { + $container.addClass('block-plugin-ajax-failed'); + if (ajax_refresh > 0 && jqXHR.status != 404) { + /* continue polling but use exponential backoff */ + exponential_refresh = exponential_refresh * 2; + setTimeout(reload, exponential_refresh*1000); + } + }) }; $(document).ready(function(){ reload(); diff --git a/src/cmsplugin_blurp/views.py b/src/cmsplugin_blurp/views.py index 30a5057..0b32f6d 100644 --- a/src/cmsplugin_blurp/views.py +++ b/src/cmsplugin_blurp/views.py @@ -1,18 +1,21 @@ import json +import logging from django.http import HttpResponse from django.template import RequestContext, loader +from django.shortcuts import get_object_or_404 from cms.models import CMSPlugin +logger = logging.getLogger(__name__) + def ajax_render(request, plugin_id): - plugin = CMSPlugin.objects.get(pk=plugin_id) 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) + {'content': rendered}, context) return HttpResponse(json.dumps({'content': content}))