Beispiel #1
0
    def test_get_question_properties(self, mockServer):
        lime_survey = Questionnaires()
        lime_survey.get_question_properties(1, 'en')

        question_properties = {
            'gid', 'question', 'question_order', 'subquestions',
            'answeroptions', 'title', 'type', 'attributes_lang', 'attributes',
            'other'
        }
        (session_key, question_id, properties, language), kwargs = \
            mockServer.return_value.get_question_properties.call_args
        self.assertTrue(
            set(question_properties).issubset(properties),
            str(set(question_properties)) + ' is not a subset of ' +
            str(set(properties)))
Beispiel #2
0
    def test_get_question_properties(self, mockServerClass):
        lime_survey = Questionnaires()
        lime_survey.get_question_properties(1, 'en')

        question_properties = {
            'gid', 'question', 'question_order', 'subquestions',
            'answeroptions', 'title', 'type', 'attributes_lang',
            'attributes', 'other'
        }
        (session_key, question_id, properties, language), kwargs = \
            mockServerClass.return_value.get_question_properties.call_args
        self.assertTrue(
            set(question_properties).issubset(properties),
            str(set(question_properties)) + ' is not a subset of ' +
            str(set(properties))
        )
Beispiel #3
0
    def test_acquisitiondate_field_is_not_hidden(self):
        ls = Questionnaires()
        groups = ls.list_groups(LS_ID)
        identification_group = next(item for item in groups
                                    if item['group_name'] == 'Identification')
        questions = ls.list_questions(LS_ID, identification_group['gid'])
        acquisitiondate_question = next(item for item in questions
                                        if item['title'] == 'acquisitiondate')
        question_properties = ls.get_question_properties(
            acquisitiondate_question['qid'], 'en')

        self.assertEqual(question_properties['attributes']['hidden'], '0')
Beispiel #4
0
Datei: views.py Projekt: INCF/nes
def get_questionnaire_responses(language_code, lime_survey_id, token_id, request):

    questionnaire_responses = []
    surveys = Questionnaires()
    token = surveys.get_participant_properties(lime_survey_id, token_id, "token")
    question_properties = []
    groups = surveys.list_groups(lime_survey_id)

    survey_title = surveys.get_survey_title(lime_survey_id)

    if not isinstance(groups, dict):

        # defining language to be showed
        languages = surveys.get_survey_languages(lime_survey_id)

        # language to be showed can be the base language, or...
        language = languages['language']

        # ...can be one of the additional languages
        if language.lower() != language_code.lower() and languages['additional_languages']:

            # search for the right language in addional languages,
            # considering that the LimeSurvey uses upper case in the two-letter language code, like en-US and pt-BR.
            additional_languages_list = languages['additional_languages'].split(' ')
            additional_languages_list_lower = [item.lower() for item in additional_languages_list]
            if language_code.lower() in additional_languages_list_lower:
                index = additional_languages_list_lower.index(language_code.lower())
                language = additional_languages_list[index]

        for group in groups:
            if 'id' in group and group['id']['language'] == language:

                question_list = surveys.list_questions(lime_survey_id, group['id'])
                question_list = sorted(question_list)

                for question in question_list:

                    properties = surveys.get_question_properties(question, group['id']['language'])

                    # cleaning the question field
                    properties['question'] = re.sub('{.*?}', '', re.sub('<.*?>', '', properties['question']))
                    properties['question'] = properties['question'].replace('&nbsp;', '').strip()

                    is_purely_formula = (properties['type'] == '*') and (properties['question'] == '')

                    if not is_purely_formula and properties['question'] != '':

                        if isinstance(properties['subquestions'], dict):
                            question_properties.append({
                                'question': properties['question'],
                                'question_id': properties['title'],
                                'answer_options': 'super_question',
                                'type': properties['type'],
                                'attributes_lang': properties['attributes_lang'],
                                'hidden': 'hidden' in properties['attributes'] and
                                          properties['attributes']['hidden'] == '1'
                            })
                            for key, value in sorted(properties['subquestions'].items()):
                                question_properties.append({
                                    'question': value['question'],
                                    'question_id': properties['title'] + '[' + value['title'] + ']',
                                    'answer_options': properties['answeroptions'],
                                    'type': properties['type'],
                                    'attributes_lang': properties['attributes_lang'],
                                    'hidden': 'hidden' in properties['attributes'] and
                                              properties['attributes']['hidden'] == '1'
                                })
                        else:
                            question_properties.append({
                                'question': properties['question'],
                                'question_id': properties['title'],
                                'answer_options': properties['answeroptions'],
                                'type': properties['type'],
                                'attributes_lang': properties['attributes_lang'],
                                'hidden': 'hidden' in properties['attributes'] and
                                          properties['attributes']['hidden'] == '1'
                            })

        # Reading from Limesurvey and...
        responses_string = surveys.get_responses_by_token(lime_survey_id, token, language)

        # ... transforming to a list:
        # response_list[0] has the questions
        #   response_list[1] has the answers
        responses_list = []

        if isinstance(responses_string, bytes):
            reader = csv.reader(StringIO(responses_string.decode()), delimiter=',')

            for row in reader:
                responses_list.append(row)

            for question in question_properties:

                if not question['hidden']:

                    if isinstance(question, str) and question['answer_options'] == "super_question":

                        if question['question'] != '':
                            questionnaire_responses.append({
                                'question': question['question'],
                                'answer': '',
                                'type': question['type']
                            })
                    else:

                        answer = ''

                        if question['type'] == '1':

                            answer_list = []

                            if question['question_id'] + "[1]" in responses_list[0]:
                                index = responses_list[0].index(question['question_id'] + "[1]")
                                answer_options = question['answer_options']

                                # if 'dualscale_headerA' in question['attributes_lang']:

                                answer = question['attributes_lang']['dualscale_headerA'] + ": "
                                if responses_list[1][index] in answer_options:
                                    answer_option = answer_options[responses_list[1][index]]
                                    answer += answer_option['answer']
                                else:
                                    answer += 'Sem resposta'
                                # else:
                                #     answer += 'Sem resposta'

                            answer_list.append(answer)

                            if question['question_id'] + "[2]" in responses_list[0]:
                                index = responses_list[0].index(question['question_id'] + "[2]")
                                answer_options = question['answer_options']

                                # if 'dualscale_headerB' in question['attributes_lang']:

                                answer = question['attributes_lang']['dualscale_headerB'] + ": "
                                if responses_list[1][index] in answer_options:
                                    answer_option = answer_options[responses_list[1][index]]
                                    answer += answer_option['answer']
                                else:
                                    answer += 'Sem resposta'
                                # else:
                                #     answer += 'Sem resposta'

                            answer_list.append(answer)

                            questionnaire_responses.append({
                                'question': question['question'],
                                'answer': answer_list,
                                'type': question['type']
                            })
                        else:

                            if question['question_id'] in responses_list[0]:

                                index = responses_list[0].index(question['question_id'])

                                answer_options = question['answer_options']

                                if isinstance(answer_options, dict):

                                    if responses_list[1][index] in answer_options:
                                        answer_option = answer_options[responses_list[1][index]]
                                        answer = answer_option['answer']
                                    else:
                                        answer = 'Sem resposta'
                                else:
                                    if question['type'] == 'D':
                                        if responses_list[1][index]:
                                            answer = datetime.datetime.strptime(responses_list[1][index],
                                                                                '%Y-%m-%d %H:%M:%S')
                                        else:
                                            answer = ''
                                    else:
                                        answer = responses_list[1][index]

                            questionnaire_responses.append({
                                'question': question['question'],
                                'answer': answer,
                                'type': question['type']
                            })
        else:
            messages.error(request, _("LimeSurvey did not find fill data for this questionnaire."))

    surveys.release_session_key()

    return survey_title, questionnaire_responses
Beispiel #5
0
def get_questionnaire_responses(language_code, lime_survey_id, token_id,
                                request):

    groups_of_questions = []

    surveys = Questionnaires()
    token = surveys.get_participant_properties(
        lime_survey_id, token_id, "token"
    )
    question_properties = []
    groups = surveys.list_groups(lime_survey_id)

    # defining language to be showed
    languages = surveys.get_survey_languages(lime_survey_id)

    # language to be showed can be the base language, or...
    language = languages['language']

    # ...can be one of the additional languages
    if language.lower() != language_code.lower() and \
            languages['additional_languages']:

        # search for the right language in addional languages,
        # considering that the LimeSurvey uses upper case in the two-letter
        # language code, like en-US and pt-BR.
        additional_languages_list = languages['additional_languages'].split(' ')
        additional_languages_list_lower = [item.lower() for item in additional_languages_list]
        if language_code.lower() in additional_languages_list_lower:
            index = additional_languages_list_lower.index(language_code.lower())
            language = additional_languages_list[index]

    survey_title = surveys.get_survey_title(lime_survey_id, language)

    if not isinstance(groups, dict):
        for group in groups:
            if 'id' in group and group['id']['language'] == language:

                question_list = surveys.list_questions(
                    lime_survey_id, group['id']['gid']
                )
                question_list = sorted(question_list)

                for question in question_list:

                    properties = surveys.get_question_properties(
                        question, group['id']['language']
                    )

                    # cleaning the question field
                    properties['question'] = re.sub(
                        '{.*?}', '',
                        re.sub('<.*?>', '', properties['question'])
                    )
                    properties['question'] = \
                        properties['question'].replace('&nbsp;', '').strip()

                    is_purely_formula = (properties['type'] == '*') and \
                                        (properties['question'] == '')

                    if not is_purely_formula and properties['question'] != '':
                        if isinstance(properties['subquestions'], dict):
                            question_properties.append({
                                'gid': group['id']['gid'],
                                'group_name': group['group_name'],
                                'qid': question,
                                'question': properties['question'],
                                'question_id': properties['title'],
                                'answer_options': 'super_question',
                                'type': 'X',
                                'other': False,
                                'attributes_lang': properties['attributes_lang'],
                                'hidden': 'hidden' in properties['attributes'] and
                                          properties['attributes']['hidden'] == '1'
                            })
                            for key, value in sorted(
                                    properties['subquestions'].items()
                            ):
                                question_properties.append({
                                    'gid': group['id']['gid'],
                                    'group_name': group['group_name'],
                                    'qid': question,
                                    'question': value['question'],
                                    'question_id':
                                        properties['title'] +
                                        '[' + value['title'] + ']',
                                    'answer_options':
                                        properties['answeroptions'],
                                    'type': properties['type'],
                                    'other': False,
                                    'attributes_lang':
                                        properties['attributes_lang'],
                                    'hidden': 'hidden' in
                                              properties['attributes'] and
                                              properties['attributes']['hidden'] == '1'
                                })
                            if properties['other'] == 'Y':
                                question_properties.append({
                                    'gid': group['id']['gid'],
                                    'group_name': group['group_name'],
                                    'qid': question,
                                    'question': _('Other'),
                                    'question_id':
                                        properties['title'] + '[other]',
                                    'answer_options':
                                        properties['answeroptions'],
                                    'type': properties['type'],
                                    'other': True,
                                    'attributes_lang':
                                        properties['attributes_lang'],
                                    'hidden': 'hidden' in
                                              properties['attributes'] and
                                              properties['attributes']['hidden'] == '1'
                                })

                        else:
                            question_properties.append({
                                'gid': group['id']['gid'],
                                'group_name': group['group_name'],
                                'qid': question,
                                'question': properties['question'],
                                'question_id': properties['title'],
                                'answer_options': properties['answeroptions'],
                                'type': properties['type'],
                                'other': False,
                                'attributes_lang': properties['attributes_lang'],
                                'hidden': 'hidden' in
                                          properties['attributes'] and
                                          properties['attributes']['hidden'] == '1'
                            })
                    else:
                        question_properties.append({
                            'gid': group['id']['gid'],
                            'group_name': group['group_name'],
                            'qid': question,
                            'question':
                                _("Formula") +
                                " (" + properties['title'] + ")",
                            'question_id': properties['title'],
                            'answer_options': properties['answeroptions'],
                            'type': properties['type'],
                            'other': False,
                            'attributes_lang': properties['attributes_lang'],
                            'hidden': False
                        })

        # Reading from Limesurvey and...
        responses_string = surveys.get_responses_by_token(
            lime_survey_id, token, language
        )

        # ... transforming to a list:
        responses_list = []

        if isinstance(responses_string, bytes):
            reader_ = csv.reader(
                StringIO(responses_string.decode()), delimiter=','
            )

            for row in reader_:
                responses_list.append(row)

            previous_question = ''
            last_super_question = ''
            last_super_question_index = []

            # for question in question_properties:
            for response in responses_list[0]:
                questions = []
                for question_prop in question_properties:
                    question_id = question_prop['question_id']
                    if question_id in response:
                        if response.split('[')[0] in question_id:
                            questions.append(question_prop)
                for question in questions:
                    if question and \
                            (question['question_id'] != previous_question):
                        if not question['hidden']:
                            if isinstance(question['answer_options'], str) \
                                    and question['answer_options'] == \
                                    "super_question":
                                if question['question'] != '' and \
                                        question['question_id'] != \
                                        last_super_question:
                                    groups_of_questions = \
                                        add_questionnaire_response_to_group(
                                            groups_of_questions, question, '',
                                            None, no_response_flag=True
                                        )
                                    last_super_question = \
                                        question['question_id']
                                    last_super_question_index = [
                                        len(groups_of_questions) - 1,
                                        len(groups_of_questions[-1]
                                            ['questionnaire_responses']) - 1]

                            else:
                                previous_question = question['question_id']

                                answer = ''
                                no_response_flag = False

                                # type 'X' means "Text display"
                                if not question['type'] == 'X':
                                    # type "1" means "Array dual scale"
                                    if question['type'] == '1':
                                        answer_list = []
                                        if question['question_id'] + "[1]" in \
                                                responses_list[0]:
                                            index = \
                                                responses_list[0].index(
                                                    question['question_id'] + "[1]"
                                                )
                                            answer_options = \
                                                question['answer_options']
                                            answer = \
                                                question['question_id'] + "[1]: "
                                            if responses_list[1][index] in \
                                                    answer_options:
                                                answer_option = \
                                                    answer_options[responses_list[1][index]]
                                                answer += \
                                                    answer_option['answer']
                                            else:
                                                # Sem resposta
                                                answer += _('No answer')
                                                no_response_flag = True

                                        answer_list.append(answer)

                                        if question['question_id'] + "[2]" in \
                                                responses_list[0]:
                                            index = \
                                                responses_list[0].index(
                                                    question['question_id'] + "[2]"
                                                )
                                            answer_options = \
                                                question['answer_options']
                                            answer = \
                                                question['question_id'] + "[2]: "
                                            if responses_list[1][index] in \
                                                    answer_options:
                                                answer_option = \
                                                    answer_options[responses_list[1][index]]
                                                answer += \
                                                    answer_option['answer']
                                            else:
                                                # sem resposta
                                                answer += _('No answer')
                                                no_response_flag = True

                                        answer_list.append(answer)

                                        groups_of_questions =\
                                            add_questionnaire_response_to_group(
                                                groups_of_questions, question,
                                                answer_list, None,
                                                no_response_flag
                                            )
                                    else:
                                        link = ''
                                        if question['question_id'] in \
                                                responses_list[0]:
                                            index = \
                                                responses_list[0].index(question['question_id'])
                                            answer_options = question['answer_options']
                                            if isinstance(answer_options, dict):
                                                # type "M" means "Multiple
                                                # choice"
                                                if question['type'] == 'M':
                                                    answer = responses_list[1][index]
                                                    if question['other']:
                                                        if answer == '':
                                                            no_response_flag = True
                                                    else:
                                                        if answer != 'Y':
                                                            no_response_flag = True
                                                else:
                                                    if responses_list[1][index] in \
                                                            answer_options:
                                                        answer_option = \
                                                            answer_options[responses_list[1][index]]
                                                        answer = \
                                                            answer_option['answer']
                                                    else:
                                                        # sem resposta
                                                        answer = _('No answer')
                                                        no_response_flag = True
                                            else:
                                                # type "D" means "Date/Time"
                                                if question['type'] == 'D':
                                                    if responses_list[1][index]:
                                                        answer = \
                                                            datetime.datetime.strptime(
                                                                responses_list[1][index],
                                                                '%Y-%m-%d %H:%M:%S'
                                                            )
                                                    else:
                                                        answer = ''
                                                        no_response_flag = True
                                                else:

                                                    answer = responses_list[1][index]

                                                    # type "M" means "Multiple choice"
                                                    if question['type'] == 'M':
                                                        if question['other']:
                                                            if answer == '':
                                                                no_response_flag = True
                                                        else:
                                                            if answer != 'Y':
                                                                no_response_flag = True

                                        # not show fileupload questions
                                        if question['type'] != '|':
                                            groups_of_questions = \
                                                add_questionnaire_response_to_group(
                                                    groups_of_questions, question,
                                                    answer, link, no_response_flag
                                                )

                                        # checking if the super-question
                                        # should be unmarked
                                        if last_super_question and not \
                                                no_response_flag and \
                                                question['question_id'].split('[')[0] \
                                                == last_super_question:
                                            mark_off_super_question(
                                                groups_of_questions,
                                                last_super_question_index
                                            )
        else:
            messages.error(
                request,
                _("LimeSurvey did not find fill data for this questionnaire.")
            )

    surveys.release_session_key()

    return survey_title, groups_of_questions
Beispiel #6
0
def get_questionnaire_responses(language_code, lime_survey_id, token_id,
                                request):

    groups_of_questions = []

    surveys = Questionnaires()
    token = surveys.get_participant_properties(lime_survey_id, token_id,
                                               "token")
    question_properties = []
    groups = surveys.list_groups(lime_survey_id)

    # defining language to be showed
    languages = surveys.get_survey_languages(lime_survey_id)

    # language to be showed can be the base language, or...
    language = languages['language']

    # ...can be one of the additional languages
    if language.lower() != language_code.lower(
    ) and languages['additional_languages']:

        # search for the right language in addional languages,
        # considering that the LimeSurvey uses upper case in the two-letter language code, like en-US and pt-BR.
        additional_languages_list = languages['additional_languages'].split(
            ' ')
        additional_languages_list_lower = [
            item.lower() for item in additional_languages_list
        ]
        if language_code.lower() in additional_languages_list_lower:
            index = additional_languages_list_lower.index(
                language_code.lower())
            language = additional_languages_list[index]

    survey_title = surveys.get_survey_title(lime_survey_id, language)

    if not isinstance(groups, dict):

        for group in groups:
            if 'id' in group and group['id']['language'] == language:

                question_list = surveys.list_questions(lime_survey_id,
                                                       group['id'])
                question_list = sorted(question_list)

                for question in question_list:

                    properties = surveys.get_question_properties(
                        question, group['id']['language'])

                    # cleaning the question field
                    properties['question'] = re.sub(
                        '{.*?}', '', re.sub('<.*?>', '',
                                            properties['question']))
                    properties['question'] = properties['question'].replace(
                        '&nbsp;', '').strip()

                    is_purely_formula = (properties['type']
                                         == '*') and (properties['question']
                                                      == '')

                    if not is_purely_formula and properties['question'] != '':

                        if isinstance(properties['subquestions'], dict):
                            question_properties.append({
                                'gid':
                                group['id']['gid'],
                                'group_name':
                                group['group_name'],
                                'qid':
                                question,
                                'question':
                                properties['question'],
                                'question_id':
                                properties['title'],
                                'answer_options':
                                'super_question',
                                'type':
                                'X',  # properties['type'],
                                'other':
                                False,
                                'attributes_lang':
                                properties['attributes_lang'],
                                'hidden':
                                'hidden' in properties['attributes']
                                and properties['attributes']['hidden'] == '1'
                            })
                            for key, value in sorted(
                                    properties['subquestions'].items()):
                                question_properties.append({
                                    'gid':
                                    group['id']['gid'],
                                    'group_name':
                                    group['group_name'],
                                    'qid':
                                    question,
                                    'question':
                                    value['question'],
                                    'question_id':
                                    properties['title'] + '[' +
                                    value['title'] + ']',
                                    'answer_options':
                                    properties['answeroptions'],
                                    'type':
                                    properties['type'],
                                    'other':
                                    False,
                                    'attributes_lang':
                                    properties['attributes_lang'],
                                    'hidden':
                                    'hidden' in properties['attributes'] and
                                    properties['attributes']['hidden'] == '1'
                                })
                            if properties['other'] == 'Y':
                                question_properties.append({
                                    'gid':
                                    group['id']['gid'],
                                    'group_name':
                                    group['group_name'],
                                    'qid':
                                    question,
                                    'question':
                                    _('Other'),
                                    'question_id':
                                    properties['title'] + '[other]',
                                    'answer_options':
                                    properties['answeroptions'],
                                    'type':
                                    properties['type'],
                                    'other':
                                    True,
                                    'attributes_lang':
                                    properties['attributes_lang'],
                                    'hidden':
                                    'hidden' in properties['attributes'] and
                                    properties['attributes']['hidden'] == '1'
                                })

                        else:
                            question_properties.append({
                                'gid':
                                group['id']['gid'],
                                'group_name':
                                group['group_name'],
                                'qid':
                                question,
                                'question':
                                properties['question'],
                                'question_id':
                                properties['title'],
                                'answer_options':
                                properties['answeroptions'],
                                'type':
                                properties['type'],
                                'other':
                                False,
                                'attributes_lang':
                                properties['attributes_lang'],
                                'hidden':
                                'hidden' in properties['attributes']
                                and properties['attributes']['hidden'] == '1'
                            })
                    else:
                        question_properties.append({
                            'gid':
                            group['id']['gid'],
                            'group_name':
                            group['group_name'],
                            'qid':
                            question,
                            'question':
                            _("Formula") + " (" + properties['title'] + ")",
                            'question_id':
                            properties['title'],
                            'answer_options':
                            properties['answeroptions'],
                            'type':
                            properties['type'],
                            'other':
                            False,
                            'attributes_lang':
                            properties['attributes_lang'],
                            'hidden':
                            False
                        })

        # Reading from Limesurvey and...
        responses_string = surveys.get_responses_by_token(
            lime_survey_id, token, language)

        # ... transforming to a list:
        # response_list[0] has the questions
        #   response_list[1] has the answers
        responses_list = []

        if isinstance(responses_string, bytes):
            reader = csv.reader(StringIO(responses_string.decode()),
                                delimiter=',')

            for row in reader:
                responses_list.append(row)

            previous_question = ''
            last_super_question = ''
            last_super_question_index = []

            # for question in question_properties:
            for response in responses_list[0]:

                questions = []
                for question_prop in question_properties:
                    question_id = question_prop['question_id']
                    if question_id in response:
                        if response.split('[')[0] in question_id:
                            questions.append(question_prop)

                for question in questions:
                    if question and (question['question_id'] !=
                                     previous_question):

                        if not question['hidden']:

                            if isinstance(question['answer_options'], str) and \
                                            question['answer_options'] == "super_question":

                                if question['question'] != '' and question[
                                        'question_id'] != last_super_question:
                                    groups_of_questions = add_questionnaire_response_to_group(
                                        groups_of_questions,
                                        question,
                                        '',
                                        None,
                                        no_response_flag=True)
                                    last_super_question = question[
                                        'question_id']
                                    last_super_question_index = [
                                        len(groups_of_questions) - 1,
                                        len(groups_of_questions[-1]
                                            ['questionnaire_responses']) - 1
                                    ]

                            else:
                                previous_question = question['question_id']

                                answer = ''
                                no_response_flag = False

                                # type 'X' means "Text display"
                                if not question['type'] == 'X':

                                    # type "1" means "Array dual scale"
                                    if question['type'] == '1':

                                        answer_list = []

                                        if question[
                                                'question_id'] + "[1]" in responses_list[
                                                    0]:
                                            index = responses_list[0].index(
                                                question['question_id'] +
                                                "[1]")
                                            answer_options = question[
                                                'answer_options']

                                            answer = question[
                                                'attributes_lang'][
                                                    'dualscale_headerA'] + ": "
                                            if responses_list[1][
                                                    index] in answer_options:
                                                answer_option = answer_options[
                                                    responses_list[1][index]]
                                                answer += answer_option[
                                                    'answer']
                                            else:
                                                # Sem resposta
                                                answer += _('No answer')
                                                no_response_flag = True

                                        answer_list.append(answer)

                                        if question[
                                                'question_id'] + "[2]" in responses_list[
                                                    0]:
                                            index = responses_list[0].index(
                                                question['question_id'] +
                                                "[2]")
                                            answer_options = question[
                                                'answer_options']

                                            answer = question[
                                                'attributes_lang'][
                                                    'dualscale_headerB'] + ": "
                                            if responses_list[1][
                                                    index] in answer_options:
                                                answer_option = answer_options[
                                                    responses_list[1][index]]
                                                answer += answer_option[
                                                    'answer']
                                            else:
                                                # Sem resposta
                                                answer += _('No answer')
                                                no_response_flag = True

                                        answer_list.append(answer)

                                        groups_of_questions = add_questionnaire_response_to_group(
                                            groups_of_questions, question,
                                            answer_list, None,
                                            no_response_flag)
                                    else:

                                        link = ''
                                        if question[
                                                'question_id'] in responses_list[
                                                    0]:

                                            index = responses_list[0].index(
                                                question['question_id'])

                                            answer_options = question[
                                                'answer_options']

                                            if isinstance(
                                                    answer_options, dict):

                                                # type "M" means "Multiple choice"
                                                if question['type'] == 'M':
                                                    answer = responses_list[1][
                                                        index]
                                                    if question['other']:
                                                        if answer == '':
                                                            no_response_flag = True
                                                    else:
                                                        if answer != 'Y':
                                                            no_response_flag = True
                                                else:
                                                    if responses_list[1][
                                                            index] in answer_options:
                                                        answer_option = answer_options[
                                                            responses_list[1]
                                                            [index]]
                                                        answer = answer_option[
                                                            'answer']
                                                    else:
                                                        # Sem resposta
                                                        answer = _('No answer')
                                                        no_response_flag = True
                                            else:
                                                # type "D" means "Date/Time"
                                                if question['type'] == 'D':
                                                    if responses_list[1][
                                                            index]:
                                                        answer = datetime.datetime.strptime(
                                                            responses_list[1]
                                                            [index],
                                                            '%Y-%m-%d %H:%M:%S'
                                                        )
                                                    else:
                                                        answer = ''
                                                        no_response_flag = True
                                                else:

                                                    answer = responses_list[1][
                                                        index]

                                                    # type "M" means "Multiple choice"
                                                    if question['type'] == 'M':
                                                        if question['other']:
                                                            if answer == '':
                                                                no_response_flag = True
                                                        else:
                                                            if answer != 'Y':
                                                                no_response_flag = True

                                                    if question[
                                                            'type'] == '|' and answer:
                                                        link = settings.LIMESURVEY['URL_WEB'] + \
                                                               '/index.php/admin/responses/sa/browse/fieldname/' + \
                                                               str(lime_survey_id) + 'X' + \
                                                               str(question['gid']) + 'X' + \
                                                               str(question['qid']) + \
                                                               '/id/' + responses_list[1][0] + \
                                                               '/surveyid/' + str(lime_survey_id) + \
                                                               '/downloadindividualfile/' + \
                                                               json.loads(answer[1:-1])['name']

                                        groups_of_questions = add_questionnaire_response_to_group(
                                            groups_of_questions, question,
                                            answer, link, no_response_flag)

                                        # checking if the super-question should be unmarked
                                        if last_super_question and not no_response_flag \
                                                and question['question_id'].split('[')[0] == last_super_question:
                                            mark_off_super_question(
                                                groups_of_questions,
                                                last_super_question_index)
        else:
            messages.error(
                request,
                _("LimeSurvey did not find fill data for this questionnaire."))

    surveys.release_session_key()

    return survey_title, groups_of_questions
Beispiel #7
0
def get_questionnaire_responses(language_code, lime_survey_id, token_id,
                                request):

    questionnaire_responses = []
    surveys = Questionnaires()
    token = surveys.get_participant_properties(lime_survey_id, token_id,
                                               "token")
    question_properties = []
    groups = surveys.list_groups(lime_survey_id)

    survey_title = surveys.get_survey_title(lime_survey_id)

    if not isinstance(groups, dict):

        # defining language to be showed
        languages = surveys.get_survey_languages(lime_survey_id)

        # language to be showed can be the base language, or...
        language = languages['language']

        # ...can be one of the additional languages
        if language.lower() != language_code.lower(
        ) and languages['additional_languages']:

            # search for the right language in addional languages,
            # considering that the LimeSurvey uses upper case in the two-letter language code, like en-US and pt-BR.
            additional_languages_list = languages[
                'additional_languages'].split(' ')
            additional_languages_list_lower = [
                item.lower() for item in additional_languages_list
            ]
            if language_code.lower() in additional_languages_list_lower:
                index = additional_languages_list_lower.index(
                    language_code.lower())
                language = additional_languages_list[index]

        for group in groups:
            if 'id' in group and group['id']['language'] == language:

                question_list = surveys.list_questions(lime_survey_id,
                                                       group['id'])
                question_list = sorted(question_list)

                for question in question_list:

                    properties = surveys.get_question_properties(
                        question, group['id']['language'])

                    # cleaning the question field
                    properties['question'] = re.sub(
                        '{.*?}', '', re.sub('<.*?>', '',
                                            properties['question']))
                    properties['question'] = properties['question'].replace(
                        '&nbsp;', '').strip()

                    is_purely_formula = (properties['type']
                                         == '*') and (properties['question']
                                                      == '')

                    if not is_purely_formula and properties['question'] != '':

                        if isinstance(properties['subquestions'], dict):
                            question_properties.append({
                                'question':
                                properties['question'],
                                'question_id':
                                properties['title'],
                                'answer_options':
                                'super_question',
                                'type':
                                properties['type'],
                                'attributes_lang':
                                properties['attributes_lang'],
                                'hidden':
                                'hidden' in properties['attributes']
                                and properties['attributes']['hidden'] == '1'
                            })
                            for key, value in sorted(
                                    properties['subquestions'].items()):
                                question_properties.append({
                                    'question':
                                    value['question'],
                                    'question_id':
                                    properties['title'] + '[' +
                                    value['title'] + ']',
                                    'answer_options':
                                    properties['answeroptions'],
                                    'type':
                                    properties['type'],
                                    'attributes_lang':
                                    properties['attributes_lang'],
                                    'hidden':
                                    'hidden' in properties['attributes'] and
                                    properties['attributes']['hidden'] == '1'
                                })
                        else:
                            question_properties.append({
                                'question':
                                properties['question'],
                                'question_id':
                                properties['title'],
                                'answer_options':
                                properties['answeroptions'],
                                'type':
                                properties['type'],
                                'attributes_lang':
                                properties['attributes_lang'],
                                'hidden':
                                'hidden' in properties['attributes']
                                and properties['attributes']['hidden'] == '1'
                            })

        # Reading from Limesurvey and...
        responses_string = surveys.get_responses_by_token(
            lime_survey_id, token, language)

        # ... transforming to a list:
        # response_list[0] has the questions
        #   response_list[1] has the answers
        responses_list = []

        if isinstance(responses_string, bytes):
            reader = csv.reader(StringIO(responses_string.decode()),
                                delimiter=',')

            for row in reader:
                responses_list.append(row)

            for question in question_properties:

                if not question['hidden']:

                    if isinstance(
                            question, str
                    ) and question['answer_options'] == "super_question":

                        if question['question'] != '':
                            questionnaire_responses.append({
                                'question':
                                question['question'],
                                'answer':
                                '',
                                'type':
                                question['type']
                            })
                    else:

                        answer = ''

                        if question['type'] == '1':

                            answer_list = []

                            if question[
                                    'question_id'] + "[1]" in responses_list[
                                        0]:
                                index = responses_list[0].index(
                                    question['question_id'] + "[1]")
                                answer_options = question['answer_options']

                                # if 'dualscale_headerA' in question['attributes_lang']:

                                answer = question['attributes_lang'][
                                    'dualscale_headerA'] + ": "
                                if responses_list[1][index] in answer_options:
                                    answer_option = answer_options[
                                        responses_list[1][index]]
                                    answer += answer_option['answer']
                                else:
                                    answer += 'Sem resposta'
                                # else:
                                #     answer += 'Sem resposta'

                            answer_list.append(answer)

                            if question[
                                    'question_id'] + "[2]" in responses_list[
                                        0]:
                                index = responses_list[0].index(
                                    question['question_id'] + "[2]")
                                answer_options = question['answer_options']

                                # if 'dualscale_headerB' in question['attributes_lang']:

                                answer = question['attributes_lang'][
                                    'dualscale_headerB'] + ": "
                                if responses_list[1][index] in answer_options:
                                    answer_option = answer_options[
                                        responses_list[1][index]]
                                    answer += answer_option['answer']
                                else:
                                    answer += 'Sem resposta'
                                # else:
                                #     answer += 'Sem resposta'

                            answer_list.append(answer)

                            questionnaire_responses.append({
                                'question':
                                question['question'],
                                'answer':
                                answer_list,
                                'type':
                                question['type']
                            })
                        else:

                            if question['question_id'] in responses_list[0]:

                                index = responses_list[0].index(
                                    question['question_id'])

                                answer_options = question['answer_options']

                                if isinstance(answer_options, dict):

                                    if responses_list[1][
                                            index] in answer_options:
                                        answer_option = answer_options[
                                            responses_list[1][index]]
                                        answer = answer_option['answer']
                                    else:
                                        answer = 'Sem resposta'
                                else:
                                    if question['type'] == 'D':
                                        if responses_list[1][index]:
                                            answer = datetime.datetime.strptime(
                                                responses_list[1][index],
                                                '%Y-%m-%d %H:%M:%S')
                                        else:
                                            answer = ''
                                    else:
                                        answer = responses_list[1][index]

                            questionnaire_responses.append({
                                'question':
                                question['question'],
                                'answer':
                                answer,
                                'type':
                                question['type']
                            })
        else:
            messages.error(
                request,
                _("LimeSurvey did not find fill data for this questionnaire."))

    surveys.release_session_key()

    return survey_title, questionnaire_responses