Adds progressbar configurations default, async and none. The configuration values are explained in the example/settings.py file

EmailTemplateFixes
Denis Krienbühl 2012-01-24 11:51:11 +01:00
parent a574ebc2f5
commit 9d34dcf55f
5 changed files with 74 additions and 3 deletions

View File

@ -124,7 +124,26 @@ LANGUAGES = (
('de', 'Deutsch'),
)
REPLACEMENTSTRING = u'subst_with_ans_'
# Defines the progressbar behavior in the questionnaire
# the possible options are 'default', 'async' and 'none'
#
# 'default'
# The progressbar will be rendered in each questionset together with the
# questions. This is a good choice for smaller questionnaires as the
# progressbar will always be up to date.
#
# 'async'
# The progressbar value is updated using ajax once the questions have been
# rendered. This approach is the right choice for bigger questionnaires which
# result in a long time spent on updating the progressbar with each request.
# (The progress calculation is by far the most time consuming method in
# bigger questionnaires as all questionsets and questions need to be
# parsed to decide if they play a role in the current run or not)
#
# 'none'
# Completely omits the progressbar. Good if you don't want one or if the
# questionnaire is so huge that even the ajax request takes too long.
QUESTIONNAIRE_PROGRESS = 'async'
try: from local_settings import *
except: pass

View File

@ -0,0 +1,21 @@
(function($){
$(document).ready(function() {
var request = {
type: 'GET',
url: progress_url,
dataType: 'json',
success: function(data) {
var progress = data.progress;
console.log(progress);
var bar = $('#progress_bar').find('.ui-progress');
bar.animate({'width': progress.toString() + '%'});
},
error: function(e) {
console.log(e);
}
};
$.ajax(request);
});
})(jQuery);

View File

@ -13,6 +13,13 @@
{% for x in cssinclude %}
<link rel="stylesheet" href="{{ x }}" type="text/css" />
{% endfor %}
{% if async_progress %}
<script type="text/javascript">
var progress_url = "{{ async_url }}";
</script>
<script type="text/javascript" src="{{ STATIC_URL }}progress.js"></script>
{% endif %}
{% endblock %}
{% block language %}

View File

@ -8,6 +8,8 @@ urlpatterns = patterns('',
questionnaire, name='questionnaire_noargs'),
url(r'^csv/(?P<qid>\d+)/',
export_csv, name='export_csv'),
url(r'^(?P<runcode>[^/]+)/progress',
get_async_progress, name='progress'),
url(r'^(?P<runcode>[^/]+)/(?P<qs>[-]{0,1}\d+)/$',
questionnaire, name='questionset'),
url(r'^(?P<runcode>[^/]+)/',

View File

@ -3,6 +3,7 @@
from django.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext
from django.core.urlresolvers import reverse
from django.core.cache import cache
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render_to_response, get_object_or_404
from django.db import transaction
@ -182,6 +183,15 @@ def get_progress(runinfo):
return int(progress)
def get_async_progress(request, runcode):
""" Returns the progress as json for use with ajax """
runinfo = get_runinfo(runcode)
response = dict(progress=get_progress(runinfo))
cache.set('progress' + runinfo.random, response['progress'])
return HttpResponse(json.dumps(response), mimetype='application/javascript')
def fetch_checks(questionsets):
ids = [qs.pk for qs in questionsets]
@ -487,7 +497,16 @@ def show_questionnaire(request, runinfo, errors={}):
qlist.append( (question, qdict) )
has_progress = settings.QUESTIONNAIRE_PROGRESS in ('async', 'default')
async_progress = settings.QUESTIONNAIRE_PROGRESS == 'async'
if has_progress:
if async_progress:
progress = cache.get('progress' + runinfo.random, 1)
else:
progress = get_progress(runinfo)
else:
progress = 0
if request.POST:
for k,v in request.POST.items():
@ -509,7 +528,10 @@ def show_questionnaire(request, runinfo, errors={}):
triggers=jstriggers,
qvalues=qvalues,
jsinclude=jsinclude,
cssinclude=cssinclude)
cssinclude=cssinclude,
async_progress=async_progress,
async_url=reverse('progress', args=[runinfo.random])
)
r['Cache-Control'] = 'no-cache'
r['Expires'] = "Thu, 24 Jan 1980 00:00:00 GMT"
return r