def show_questionnaire(request, runinfo, errors={}): """ Return the QuestionSet template Also add the javascript dependency code. """ request.runinfo = runinfo if request.GET.get('show_all') == '1': # for debugging purposes. questions = runinfo.questionset.questionnaire.questions() else: questions = runinfo.questionset.questions() show_all = request.GET.get('show_all') == '1' # for debugging purposes in some cases we may want to show all questions on one screen. questionset = runinfo.questionset questions = questionset.questionnaire.questions() if show_all else questionset.questions() qlist = [] jsinclude = [] # js files to include cssinclude = [] # css files to include jstriggers = [] qvalues = {} # initialize qvalues cookiedict = runinfo.get_cookiedict() for k, v in cookiedict.items(): qvalues[k] = v substitute_answer(qvalues, runinfo.questionset) #we make it clear to the user that we're going to sort by sort id then number, so why wasn't it doing that? questions = sorted(questions, key=lambda question: (question.sort_id, question.number)) previous_column=False first_question=True for question in questions: # if we got here the questionset will at least contain one question # which passes, so this is all we need to check for question_visible = question_satisfies_checks(question, runinfo) or show_all Type = question.get_type() _qnum, _qalpha = split_numal(question.number) qdict = { 'css_style': '' if question_visible else 'display:none;', 'template': 'questionnaire/%s.html' % (Type), 'qnum': _qnum, 'qalpha': _qalpha, 'qtype': Type, 'qnum_class': (_qnum % 2 == 0) and " qeven" or " qodd", 'qalpha_class': _qalpha and (ord(_qalpha[-1]) % 2 \ and ' alodd' or ' aleven') or '', 'column': question.column, 'new_column': question.column != previous_column, 'first_question': first_question, } previous_column=question.column first_question=False # substitute answer texts substitute_answer(qvalues, question) # add javascript dependency checks cd = question.getcheckdict() # Note: dep_check() is showing up on pages where questions rely on previous pages' questions - # this causes disappearance of questions, since there are no qvalues for questions on previous # pages. BUT depon will be false if the question is a SAMEAS of another question with no off-page # checks. This will make no bad dep_check()s appear for these SAMEAS questions, circumventing the # problem. Eventually need to fix either getcheckdict() (to screen out questions on previous pages) # or prevent JavaScript from hiding questions when check_dep() cannot find a key in qvalues. depon = cd.get('requiredif', None) or cd.get('dependent', None) or cd.get('shownif', None) if depon: willberequiredif = bool(cd.get("requiredif", None) ) willbedependent = bool(cd.get("dependent", None) ) willbe_shownif = (not willberequiredif) and (not willbedependent) and bool(cd.get("shownif", None)) # jamie and mark funkyness to be only done if depon is shownif, some similar thought is due to requiredif # for shownon, we have to deal with the fact that only the answers from this page are available to the JS # so we do a partial parse to form the checks="" attribute if willbe_shownif: qdict['checkstring'] = ' checks="%s"' % make_partially_evaluated_javascript_expression_for_shownif_check( depon, runinfo, question ) else: # extra args to BooleanParser are not required for toString parser = BooleanParser(dep_check) qdict['checkstring'] = ' checks="%s"' % parser.toString(depon) jstriggers.append('qc_%s' % question.number) footerdep = cd.get('footerif', None) if footerdep: parser = BooleanParser(dep_check) qdict['footerchecks'] = ' checks="%s"' % parser.toString(footerdep) jstriggers.append('qc_%s_footer' % question.number) if 'default' in cd and not question.number in cookiedict: qvalues[question.number] = cd['default'] if Type in QuestionProcessors: qdict.update(QuestionProcessors[Type](request, question)) if 'jsinclude' in qdict: if qdict['jsinclude'] not in jsinclude: jsinclude.extend(qdict['jsinclude']) if 'cssinclude' in qdict: if qdict['cssinclude'] not in cssinclude: cssinclude.extend(qdict['jsinclude']) if 'jstriggers' in qdict: jstriggers.extend(qdict['jstriggers']) if 'qvalue' in qdict and not question.number in cookiedict: qvalues[question.number] = qdict['qvalue'] if 'qvalues' in qdict: # for multiple selection for choice in qdict['qvalues']: qvalues[choice] = 'true' qlist.append((question, qdict)) try: has_progress = settings.QUESTIONNAIRE_PROGRESS in ('async', 'default') async_progress = settings.QUESTIONNAIRE_PROGRESS == 'async' except AttributeError: has_progress = True async_progress = False 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(): if k.startswith("question_"): s = k.split("_") if s[-1] == "value": # multiple checkboxes with value boxes qvalues["_".join(s[1:])] = v elif len(s) == 4: qvalues[s[1] + '_' + v] = '1' # evaluates true in JS elif len(s) == 3 and s[2] == 'comment': qvalues[s[1] + '_' + s[2]] = v else: qvalues[s[1]] = v if use_session: prev_url = reverse('redirect_to_prev_questionnaire') else: prev_url = reverse('redirect_to_prev_questionnaire', args=[runinfo.random, runinfo.questionset.sortid]) current_answers = [] if debug_questionnaire: current_answers = Answer.objects.filter(subject=runinfo.subject, runid=runinfo.runid).order_by('id') r = r2r("questionnaire/questionset.html", request, questionset=runinfo.questionset, runinfo=runinfo, errors=errors, qlist=qlist, progress=progress, triggers=jstriggers, qvalues=qvalues, jsinclude=jsinclude, cssinclude=cssinclude, async_progress=async_progress, async_url=reverse('progress', args=[runinfo.random]), prev_url=prev_url, current_answers=current_answers, ) r['Cache-Control'] = 'no-cache' r['Expires'] = "Thu, 24 Jan 1980 00:00:00 GMT" r.set_cookie('questionset_id', str(questionset.id)) return r
def show_questionnaire(request, runinfo, errors={}): """ Return the QuestionSet template Also add the javascript dependency code. """ request.runinfo = runinfo if request.GET.get('show_all') == '1': # for debugging purposes. questions = runinfo.questionset.questionnaire.questions() else: questions = runinfo.questionset.questions() show_all = request.GET.get( 'show_all' ) == '1' # for debugging purposes in some cases we may want to show all questions on one screen. questionset = runinfo.questionset questions = questionset.questionnaire.questions( ) if show_all else questionset.questions() qlist = [] jsinclude = [] # js files to include cssinclude = [] # css files to include jstriggers = [] qvalues = {} # initialize qvalues cookiedict = runinfo.get_cookiedict() for k, v in cookiedict.items(): qvalues[k] = v substitute_answer(qvalues, runinfo.questionset) #we make it clear to the user that we're going to sort by sort id then number, so why wasn't it doing that? questions = sorted(questions, key=lambda question: (question.sort_id, question.number)) previous_column = False first_question = True for question in questions: # if we got here the questionset will at least contain one question # which passes, so this is all we need to check for question_visible = question_satisfies_checks(question, runinfo) or show_all Type = question.get_type() _qnum, _qalpha = split_numal(question.number) qdict = { 'css_style': '' if question_visible else 'display:none;', 'template': 'questionnaire/%s.html' % (Type), 'qnum': _qnum, 'qalpha': _qalpha, 'qtype': Type, 'qnum_class': (_qnum % 2 == 0) and " qeven" or " qodd", 'qalpha_class': _qalpha and (ord(_qalpha[-1]) % 2 \ and ' alodd' or ' aleven') or '', 'column': question.column, 'new_column': question.column != previous_column, 'first_question': first_question, } previous_column = question.column first_question = False # substitute answer texts substitute_answer(qvalues, question) # add javascript dependency checks cd = question.getcheckdict() # Note: dep_check() is showing up on pages where questions rely on previous pages' questions - # this causes disappearance of questions, since there are no qvalues for questions on previous # pages. BUT depon will be false if the question is a SAMEAS of another question with no off-page # checks. This will make no bad dep_check()s appear for these SAMEAS questions, circumventing the # problem. Eventually need to fix either getcheckdict() (to screen out questions on previous pages) # or prevent JavaScript from hiding questions when check_dep() cannot find a key in qvalues. depon = cd.get('requiredif', None) or cd.get( 'dependent', None) or cd.get('shownif', None) if depon: willberequiredif = bool(cd.get("requiredif", None)) willbedependent = bool(cd.get("dependent", None)) willbe_shownif = (not willberequiredif) and ( not willbedependent) and bool(cd.get("shownif", None)) # jamie and mark funkyness to be only done if depon is shownif, some similar thought is due to requiredif # for shownon, we have to deal with the fact that only the answers from this page are available to the JS # so we do a partial parse to form the checks="" attribute if willbe_shownif: qdict[ 'checkstring'] = ' checks="%s"' % make_partially_evaluated_javascript_expression_for_shownif_check( depon, runinfo, question) else: # extra args to BooleanParser are not required for toString parser = BooleanParser(dep_check) qdict['checkstring'] = ' checks="%s"' % parser.toString(depon) jstriggers.append('qc_%s' % question.number) footerdep = cd.get('footerif', None) if footerdep: parser = BooleanParser(dep_check) qdict['footerchecks'] = ' checks="%s"' % parser.toString(footerdep) jstriggers.append('qc_%s_footer' % question.number) if 'default' in cd and not question.number in cookiedict: qvalues[question.number] = cd['default'] if Type in QuestionProcessors: qdict.update(QuestionProcessors[Type](request, question)) if 'jsinclude' in qdict: if qdict['jsinclude'] not in jsinclude: jsinclude.extend(qdict['jsinclude']) if 'cssinclude' in qdict: if qdict['cssinclude'] not in cssinclude: cssinclude.extend(qdict['jsinclude']) if 'jstriggers' in qdict: jstriggers.extend(qdict['jstriggers']) if 'qvalue' in qdict and not question.number in cookiedict: qvalues[question.number] = qdict['qvalue'] if 'qvalues' in qdict: # for multiple selection for choice in qdict['qvalues']: qvalues[choice] = 'true' qlist.append((question, qdict)) try: has_progress = settings.QUESTIONNAIRE_PROGRESS in ('async', 'default') async_progress = settings.QUESTIONNAIRE_PROGRESS == 'async' except AttributeError: has_progress = True async_progress = False 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(): if k.startswith("question_"): s = k.split("_") if s[-1] == "value": # multiple checkboxes with value boxes qvalues["_".join(s[1:])] = v elif len(s) == 4: qvalues[s[1] + '_' + v] = '1' # evaluates true in JS elif len(s) == 3 and s[2] == 'comment': qvalues[s[1] + '_' + s[2]] = v else: qvalues[s[1]] = v if use_session: prev_url = reverse('redirect_to_prev_questionnaire') else: prev_url = reverse('redirect_to_prev_questionnaire', args=[runinfo.random, runinfo.questionset.sortid]) current_answers = [] if debug_questionnaire: current_answers = Answer.objects.filter( subject=runinfo.subject, runid=runinfo.runid).order_by('id') r = r2r( "questionnaire/questionset.html", request, questionset=runinfo.questionset, runinfo=runinfo, errors=errors, qlist=qlist, progress=progress, triggers=jstriggers, qvalues=qvalues, jsinclude=jsinclude, cssinclude=cssinclude, async_progress=async_progress, async_url=reverse('progress', args=[runinfo.random]), prev_url=prev_url, current_answers=current_answers, ) r['Cache-Control'] = 'no-cache' r['Expires'] = "Thu, 24 Jan 1980 00:00:00 GMT" r.set_cookie('questionset_id', str(questionset.id)) return r
def show_questionnaire(request, runinfo, errors={}): """ Return the QuestionSet template Also add the javascript dependency code. """ request.runinfo = runinfo if request.GET.get('show_all') == '1': # for debugging purposes. questions = runinfo.questionset.questionnaire.questions() else: questions = runinfo.questionset.questions() show_all = request.GET.get('show_all') == '1' # for debugging purposes in some cases we may want to show all questions on one screen. questionset = runinfo.questionset questions = questionset.questionnaire.questions() if show_all else questionset.questions() qlist = [] jsinclude = [] # js files to include cssinclude = [] # css files to include jstriggers = [] qvalues = {} # initialize qvalues cookiedict = runinfo.get_cookiedict() for k, v in cookiedict.items(): qvalues[k] = v substitute_answer(qvalues, runinfo.questionset) for question in questions: # if we got here the questionset will at least contain one question # which passes, so this is all we need to check for question_visible = question_satisfies_checks(question, runinfo) or show_all Type = question.get_type() _qnum, _qalpha = split_numal(question.number) qdict = { 'css_style': '' if question_visible else 'display:none;', 'template': 'questionnaire/%s.html' % (Type), 'qnum': _qnum, 'qalpha': _qalpha, 'qtype': Type, 'qnum_class': (_qnum % 2 == 0) and " qeven" or " qodd", 'qalpha_class': _qalpha and (ord(_qalpha[-1]) % 2 \ and ' alodd' or ' aleven') or '', } # substitute answer texts substitute_answer(qvalues, question) # add javascript dependency checks cd = question.getcheckdict() depon = cd.get('requiredif', None) or cd.get('dependent', None) if depon: # extra args to BooleanParser are not required for toString parser = BooleanParser(dep_check) qdict['checkstring'] = ' checks="%s"' % parser.toString(depon) jstriggers.append('qc_%s' % question.number) if 'default' in cd and not question.number in cookiedict: qvalues[question.number] = cd['default'] if Type in QuestionProcessors: qdict.update(QuestionProcessors[Type](request, question)) if 'jsinclude' in qdict: if qdict['jsinclude'] not in jsinclude: jsinclude.extend(qdict['jsinclude']) if 'cssinclude' in qdict: if qdict['cssinclude'] not in cssinclude: cssinclude.extend(qdict['jsinclude']) if 'jstriggers' in qdict: jstriggers.extend(qdict['jstriggers']) if 'qvalue' in qdict and not question.number in cookiedict: qvalues[question.number] = qdict['qvalue'] qlist.append((question, qdict)) try: has_progress = settings.QUESTIONNAIRE_PROGRESS in ('async', 'default') async_progress = settings.QUESTIONNAIRE_PROGRESS == 'async' except AttributeError: has_progress = True async_progress = False 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(): if k.startswith("question_"): s = k.split("_") if len(s) == 4: qvalues[s[1] + '_' + v] = '1' # evaluates true in JS elif len(s) == 3 and s[2] == 'comment': qvalues[s[1] + '_' + s[2]] = v else: qvalues[s[1]] = v if use_session: prev_url = reverse('redirect_to_prev_questionnaire') else: prev_url = 'javascript:history.back();' current_answers = [] if debug_questionnaire: current_answers = Answer.objects.filter(subject=runinfo.subject, runid=runinfo.runid).order_by('id') r = r2r("questionnaire/questionset.html", request, questionset=runinfo.questionset, runinfo=runinfo, errors=errors, qlist=qlist, progress=progress, triggers=jstriggers, qvalues=qvalues, jsinclude=jsinclude, cssinclude=cssinclude, async_progress=async_progress, async_url=reverse('progress', args=[runinfo.random]), prev_url=prev_url, current_answers=current_answers, ) r['Cache-Control'] = 'no-cache' r['Expires'] = "Thu, 24 Jan 1980 00:00:00 GMT" return r
def show_questionnaire(request, runinfo, errors={}): """ Return the QuestionSet template Also add the javascript dependency code. """ request.runinfo = runinfo if request.GET.get('show_all') == '1': # for debugging purposes. questions = runinfo.questionset.questionnaire.questions() else: questions = runinfo.questionset.questions() show_all = request.GET.get( 'show_all' ) == '1' # for debugging purposes in some cases we may want to show all questions on one screen. questionset = runinfo.questionset questions = questionset.questionnaire.questions( ) if show_all else questionset.questions() qlist = [] jsinclude = [] # js files to include cssinclude = [] # css files to include jstriggers = [] qvalues = {} # initialize qvalues cookiedict = runinfo.get_cookiedict() for k, v in cookiedict.items(): qvalues[k] = v substitute_answer(qvalues, runinfo.questionset) for question in questions: # if we got here the questionset will at least contain one question # which passes, so this is all we need to check for question_visible = question_satisfies_checks(question, runinfo) or show_all Type = question.get_type() _qnum, _qalpha = split_numal(question.number) qdict = { 'css_style': '' if question_visible else 'display:none;', 'template': 'questionnaire/%s.html' % (Type), 'qnum': _qnum, 'qalpha': _qalpha, 'qtype': Type, 'qnum_class': (_qnum % 2 == 0) and " qeven" or " qodd", 'qalpha_class': _qalpha and (ord(_qalpha[-1]) % 2 \ and ' alodd' or ' aleven') or '', } # substitute answer texts substitute_answer(qvalues, question) # add javascript dependency checks cd = question.getcheckdict() depon = cd.get('requiredif', None) or cd.get('dependent', None) if depon: # extra args to BooleanParser are not required for toString parser = BooleanParser(dep_check) qdict['checkstring'] = ' checks="%s"' % parser.toString(depon) jstriggers.append('qc_%s' % question.number) if 'default' in cd and not question.number in cookiedict: qvalues[question.number] = cd['default'] if Type in QuestionProcessors: qdict.update(QuestionProcessors[Type](request, question)) if 'jsinclude' in qdict: if qdict['jsinclude'] not in jsinclude: jsinclude.extend(qdict['jsinclude']) if 'cssinclude' in qdict: if qdict['cssinclude'] not in cssinclude: cssinclude.extend(qdict['jsinclude']) if 'jstriggers' in qdict: jstriggers.extend(qdict['jstriggers']) if 'qvalue' in qdict and not question.number in cookiedict: qvalues[question.number] = qdict['qvalue'] qlist.append((question, qdict)) try: has_progress = settings.QUESTIONNAIRE_PROGRESS in ('async', 'default') async_progress = settings.QUESTIONNAIRE_PROGRESS == 'async' except AttributeError: has_progress = True async_progress = False 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(): if k.startswith("question_"): s = k.split("_") if len(s) == 4: qvalues[s[1] + '_' + v] = '1' # evaluates true in JS elif len(s) == 3 and s[2] == 'comment': qvalues[s[1] + '_' + s[2]] = v else: qvalues[s[1]] = v if use_session: prev_url = reverse('redirect_to_prev_questionnaire') else: prev_url = 'javascript:history.back();' current_answers = [] if debug_questionnaire: current_answers = Answer.objects.filter( subject=runinfo.subject, runid=runinfo.runid).order_by('id') r = r2r( "questionnaire/questionset.html", request, questionset=runinfo.questionset, runinfo=runinfo, errors=errors, qlist=qlist, progress=progress, triggers=jstriggers, qvalues=qvalues, jsinclude=jsinclude, cssinclude=cssinclude, async_progress=async_progress, async_url=reverse('progress', args=[runinfo.random]), prev_url=prev_url, current_answers=current_answers, ) r['Cache-Control'] = 'no-cache' r['Expires'] = "Thu, 24 Jan 1980 00:00:00 GMT" return r
def show_questionnaire(request, runinfo, errors={}): """ Return the QuestionSet template Also add the javascript dependency code. """ questions = runinfo.questionset.questions() total = len(runinfo.questionset.questionnaire.questionsets()) qlist = [] jsinclude = [] # js files to include cssinclude = [] # css files to include jstriggers = [] qvalues = {} alignment=4 for question in questions: Type = question.get_type() _qnum, _qalpha = split_numal(question.number) if _qalpha: _qalpha_class = ord(_qalpha[-1]) % 2 and 'odd' or 'even' qdict = { 'template' : 'questionnaire/%s.html' % (Type), 'qnum' : _qnum, 'qalpha' : _qalpha, 'qtype' : Type, 'qnum_class' : (_qnum % 2 == 0) and " qeven" or " qodd", 'qalpha_class' : _qalpha and (ord(_qalpha[-1]) % 2 \ and ' alodd' or ' aleven') or '', } if not question.newline(): alignment = max(alignment, calc_alignment(question.text)) # add javascript dependency checks cd = question.getcheckdict() depon = cd.get('requiredif',None) or cd.get('dependent',None) if depon: # extra args to BooleanParser are not required for toString parser = BooleanParser(dep_check) qdict['checkstring'] = ' checks="%s"' % parser.toString(depon) jstriggers.append('qc_%s' % question.number) if 'default' in cd: qvalues[question.number] = cd['default'] if Type in QuestionProcessors: qdict.update(QuestionProcessors[Type](request, question)) if 'alignment' in qdict: alignment = max(alignment, qdict['alignment']) if 'jsinclude' in qdict: if qdict['jsinclude'] not in jsinclude: jsinclude.extend(qdict['jsinclude']) if 'cssinclude' in qdict: if qdict['cssinclude'] not in cssinclude: cssinclude.extend(qdict['jsinclude']) if 'jstriggers' in qdict: jstriggers.extend(qdict['jstriggers']) if 'qvalue' in qdict: qvalues[question.number] = qdict['qvalue'] qlist.append( (question, qdict) ) progress = None if runinfo.questionset.sortid != 0: progress = get_progress(runinfo.questionset.sortid / float(total)) # initialize qvalues for k,v in runinfo.get_cookiedict().items(): qvalues[k] = v if request.POST: for k,v in request.POST.items(): if k.startswith("question_"): s = k.split("_") if len(s) == 2: qvalues[s[1]] = v r = r2r("questionnaire/questionset.html", request, questionset=runinfo.questionset, runinfo=runinfo, errors=errors, qlist=qlist, progress=progress, triggers=jstriggers, qvalues=qvalues, alignment=alignment, jsinclude=jsinclude, cssinclude=cssinclude) r['Cache-Control'] = 'no-cache' r['Expires'] = "Thu, 24 Jan 1980 00:00:00 GMT" return r
def show_questionnaire(request, runinfo, errors={}): """ Return the QuestionSet template Also add the javascript dependency code. """ questions = runinfo.questionset.questions() total = len(runinfo.questionset.questionnaire.questionsets()) qlist = [] jsinclude = [] # js files to include cssinclude = [] # css files to include jstriggers = [] qvalues = {} alignment = 4 for question in questions: Type = question.get_type() _qnum, _qalpha = split_numal(question.number) if _qalpha: _qalpha_class = ord(_qalpha[-1]) % 2 and 'odd' or 'even' qdict = { 'template' : 'questionnaire/%s.html' % (Type), 'qnum' : _qnum, 'qalpha' : _qalpha, 'qtype' : Type, 'qnum_class' : (_qnum % 2 == 0) and " qeven" or " qodd", 'qalpha_class' : _qalpha and (ord(_qalpha[-1]) % 2 \ and ' alodd' or ' aleven') or '', } if not question.newline(): alignment = max(alignment, calc_alignment(question.text)) # add javascript dependency checks cd = question.getcheckdict() depon = cd.get('requiredif', None) or cd.get('dependent', None) if depon: # extra args to BooleanParser are not required for toString parser = BooleanParser(dep_check) qdict['checkstring'] = ' checks="%s"' % parser.toString(depon) jstriggers.append('qc_%s' % question.number) if 'default' in cd: qvalues[question.number] = cd['default'] if Type in QuestionProcessors: qdict.update(QuestionProcessors[Type](request, question)) if 'alignment' in qdict: alignment = max(alignment, qdict['alignment']) if 'jsinclude' in qdict: if qdict['jsinclude'] not in jsinclude: jsinclude.extend(qdict['jsinclude']) if 'cssinclude' in qdict: if qdict['cssinclude'] not in cssinclude: cssinclude.extend(qdict['jsinclude']) if 'jstriggers' in qdict: jstriggers.extend(qdict['jstriggers']) if 'qvalue' in qdict: qvalues[question.number] = qdict['qvalue'] qlist.append((question, qdict)) progress = None if runinfo.questionset.sortid != 0: progress = get_progress(runinfo.questionset.sortid / float(total)) # initialize qvalues for k, v in runinfo.get_cookiedict().items(): qvalues[k] = v if request.POST: for k, v in request.POST.items(): if k.startswith("question_"): s = k.split("_") if len(s) == 2: qvalues[s[1]] = v r = r2r("questionnaire/questionset.html", request, questionset=runinfo.questionset, runinfo=runinfo, errors=errors, qlist=qlist, progress=progress, triggers=jstriggers, qvalues=qvalues, alignment=alignment, jsinclude=jsinclude, cssinclude=cssinclude) r['Cache-Control'] = 'no-cache' r['Expires'] = "Thu, 24 Jan 1980 00:00:00 GMT" return r
def show_questionnaire(request, runinfo, errors={}): """ Return the QuestionSet template Also add the javascript dependency code. """ questions = runinfo.questionset.questions() total = len(runinfo.questionset.questionnaire.questionsets()) qlist = [] jsinclude = [] # js files to include cssinclude = [] # css files to include jstriggers = [] qvalues = {} alignment = 4 # initialize qvalues for k, v in runinfo.get_cookiedict().items(): qvalues[k] = v for question in questions: Type = question.get_type() _qnum, _qalpha = split_numal(question.number) if _qalpha: _qalpha_class = ord(_qalpha[-1]) % 2 and "odd" or "even" qdict = { "template": "questionnaire/%s.html" % (Type), "qnum": _qnum, "qalpha": _qalpha, "qtype": Type, "qnum_class": (_qnum % 2 == 0) and " qeven" or " qodd", "qalpha_class": _qalpha and (ord(_qalpha[-1]) % 2 and " alodd" or " aleven") or "", } # If the question has a magic string surrounded by spaces that refers to an answer to a previous question, fetch the answer and replace the magic string # To be able to fetch the cookie with the answer it has to be stored using additional checks # At the moment it only works for english. replacementtext = settings.REPLACEMENTSTRING questionnumberpos = question.text.find(replacementtext) if questionnumberpos <> -1: questionnumber = question.text_en[questionnumberpos:].split(" ")[0].replace(replacementtext, "") if questionnumber in qvalues.keys(): question.text_en = question.text_en.replace(replacementtext + questionnumber, qvalues[questionnumber]) if not question.newline(): alignment = max(alignment, calc_alignment(question.text)) # add javascript dependency checks cd = question.getcheckdict() depon = cd.get("requiredif", None) or cd.get("dependent", None) if depon: # extra args to BooleanParser are not required for toString parser = BooleanParser(dep_check) qdict["checkstring"] = ' checks="%s"' % parser.toString(depon) jstriggers.append("qc_%s" % question.number) if "default" in cd: qvalues[question.number] = cd["default"] if Type in QuestionProcessors: qdict.update(QuestionProcessors[Type](request, question)) if "alignment" in qdict: alignment = max(alignment, qdict["alignment"]) if "jsinclude" in qdict: if qdict["jsinclude"] not in jsinclude: jsinclude.extend(qdict["jsinclude"]) if "cssinclude" in qdict: if qdict["cssinclude"] not in cssinclude: cssinclude.extend(qdict["jsinclude"]) if "jstriggers" in qdict: jstriggers.extend(qdict["jstriggers"]) if "qvalue" in qdict: qvalues[question.number] = qdict["qvalue"] qlist.append((question, qdict)) progress = None if runinfo.questionset.sortid != 0: progress = get_progress(runinfo.questionset.sortid / float(total)) if request.POST: for k, v in request.POST.items(): if k.startswith("question_"): s = k.split("_") if len(s) == 4: qvalues[s[1] + "_" + v] = "1" # evaluates true in JS elif len(s) == 3 and s[2] == "comment": qvalues[s[1] + "_" + s[2]] = v else: qvalues[s[1]] = v r = r2r( "questionnaire/questionset.html", request, questionset=runinfo.questionset, runinfo=runinfo, errors=errors, qlist=qlist, progress=progress, triggers=jstriggers, qvalues=qvalues, alignment=alignment, jsinclude=jsinclude, cssinclude=cssinclude, ) r["Cache-Control"] = "no-cache" r["Expires"] = "Thu, 24 Jan 1980 00:00:00 GMT" return r
def show_questionnaire(request, runinfo, errors={}): """ Return the QuestionSet template Also add the javascript dependency code. """ questions = runinfo.questionset.questions() qlist = [] jsinclude = [] # js files to include cssinclude = [] # css files to include jstriggers = [] qvalues = {} # initialize qvalues cookiedict = runinfo.get_cookiedict() for k,v in cookiedict.items(): qvalues[k] = v substitute_answer(qvalues, runinfo.questionset) for question in questions: # if we got here the questionset will at least contain one question # which passes, so this is all we need to check for if not question_satisfies_checks(question, runinfo): continue Type = question.get_type() _qnum, _qalpha = split_numal(question.number) qdict = { 'template' : 'questionnaire/%s.html' % (Type), 'qnum' : _qnum, 'qalpha' : _qalpha, 'qtype' : Type, 'qnum_class' : (_qnum % 2 == 0) and " qeven" or " qodd", 'qalpha_class' : _qalpha and (ord(_qalpha[-1]) % 2 \ and ' alodd' or ' aleven') or '', } # substitute answer texts substitute_answer(qvalues, question) # add javascript dependency checks cd = question.getcheckdict() depon = cd.get('requiredif',None) or cd.get('dependent',None) if depon: # extra args to BooleanParser are not required for toString parser = BooleanParser(dep_check) qdict['checkstring'] = ' checks="%s"' % parser.toString(depon) jstriggers.append('qc_%s' % question.number) if 'default' in cd and not question.number in cookiedict: qvalues[question.number] = cd['default'] if Type in QuestionProcessors: qdict.update(QuestionProcessors[Type](request, question)) if 'jsinclude' in qdict: if qdict['jsinclude'] not in jsinclude: jsinclude.extend(qdict['jsinclude']) if 'cssinclude' in qdict: if qdict['cssinclude'] not in cssinclude: cssinclude.extend(qdict['jsinclude']) if 'jstriggers' in qdict: jstriggers.extend(qdict['jstriggers']) if 'qvalue' in qdict and not question.number in cookiedict: qvalues[question.number] = qdict['qvalue'] qlist.append( (question, qdict) ) try: has_progress = settings.QUESTIONNAIRE_PROGRESS in ('async', 'default') async_progress = settings.QUESTIONNAIRE_PROGRESS == 'async' except AttributeError: has_progress = True async_progress = False 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(): if k.startswith("question_"): s = k.split("_") if len(s) == 4: qvalues[s[1]+'_'+v] = '1' # evaluates true in JS elif len(s) == 3 and s[2] == 'comment': qvalues[s[1]+'_'+s[2]] = v else: qvalues[s[1]] = v # Include the project description if this is the first # questionset. if runinfo.questionset.heading == 'General questions': proj_desc = runinfo.project.description if not proj_desc: proj_desc = None upload_logo = True else: proj_desc = None upload_logo = False r = r2r("questionnaire/questionset.html", request, questionset=runinfo.questionset, runinfo=runinfo, errors=errors, qlist=qlist, progress=progress, triggers=jstriggers, qvalues=qvalues, jsinclude=jsinclude, cssinclude=cssinclude, proj_desc=proj_desc, upload_logo=upload_logo, 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