def test_complete_survey(self): lime_survey = Questionnaires() sid = None try: # Cria uma nova survey no lime survey title_survey = 'Questionario de teste' sid = lime_survey.add_survey(9999, title_survey, 'en', 'G') # Obtenho o titulo da survey survey_title = lime_survey.get_survey_title(sid) self.assertEqual(survey_title, title_survey) # Verifica se esta ativa survey_active = lime_survey.get_survey_properties(sid, 'active') self.assertEqual(survey_active, 'N') # Obtem uma propriedade - Administrador da Survey survey_admin = lime_survey.get_survey_properties(sid, 'admin') self.assertEqual(survey_admin, None) # Importar grupo de questoes handle_file_import = \ open('quiz/static/quiz/tests/limesurvey_groups.lsg', 'r') questions_data = handle_file_import.read() questions_id = \ lime_survey.insert_questions(sid, questions_data, 'lsg') self.assertGreaterEqual(questions_id, 1) # Inicia tabela de tokens self.assertEqual(lime_survey.activate_tokens(sid), 'OK') # Ativar survey self.assertEqual(lime_survey.activate_survey(sid), 'OK') # Verifica se esta ativa survey_active = lime_survey.get_survey_properties(sid, 'active') self.assertEqual(survey_active, 'Y') # Adiciona participante e obtem o token result_token = lime_survey.add_participant(sid) # Verifica se o token está presente na tabela de participantes token = lime_survey.get_participant_properties( sid, result_token, "token") self.assertEqual(token, result_token['token']) finally: # Deleta a survey gerada no Lime Survey self.assertEqual(lime_survey.delete_survey(sid), 'OK')
def test_complete_survey(self): lime_survey = Questionnaires() sid = None try: # Cria uma nova survey no lime survey title_survey = 'Questionario de teste' sid = lime_survey.add_survey(9999, title_survey, 'en', 'G') # Obtenho o titulo da survey survey_title = lime_survey.get_survey_title(sid) self.assertEqual(survey_title, title_survey) # Verifica se esta ativa survey_active = lime_survey.get_survey_properties(sid, 'active') self.assertEqual(survey_active, 'N') # Obtem uma propriedade - Administrador da Survey survey_admin = lime_survey.get_survey_properties(sid, 'admin') self.assertEqual(survey_admin, None) # Importar grupo de questoes handle_file_import = \ open('quiz/static/quiz/tests/limesurvey_groups.lsg', 'r') questions_data = handle_file_import.read() questions_id = \ lime_survey.insert_questions(sid, questions_data, 'lsg') self.assertGreaterEqual(questions_id, 1) # Inicia tabela de tokens self.assertEqual(lime_survey.activate_tokens(sid), 'OK') # Ativar survey self.assertEqual(lime_survey.activate_survey(sid), 'OK') # Verifica se esta ativa survey_active = lime_survey.get_survey_properties(sid, 'active') self.assertEqual(survey_active, 'Y') # Adiciona participante e obtem o token result_token = lime_survey.add_participant(sid) # Verifica se o token está presente na tabela de participantes token = lime_survey.get_participant_properties(sid, result_token, "token") self.assertEqual(token, result_token['token']) finally: # Deleta a survey gerada no Lime Survey self.assertEqual(lime_survey.delete_survey(sid), 'OK')
def _update_limesurvey_identification_questions(self): """Must be called after updating Limesurvey surveys references """ result = 0, '' indexes = self._get_indexes('experiment', 'questionnaire') ls_interface = Questionnaires( settings.LIMESURVEY['URL_API'] + '/index.php/plugins/unsecure?plugin=extendRemoteControl&function=action') questionnaire_utils = QuestionnaireUtils() for index in indexes: questionnaire = Questionnaire.objects.get(id=self.data[index]['pk']) questionnaire_responses = QuestionnaireResponse.objects.filter( data_configuration_tree__component_configuration__component=questionnaire.id) limesurvey_id = questionnaire.survey.lime_survey_id for response in questionnaire_responses: responsible_id = response.questionnaire_responsible_id subject_id = response.subject_of_group.subject_id token_id = response.token_id token = ls_interface.get_participant_properties(limesurvey_id, token_id, 'token') if token is None: result = self.LIMESURVEY_ERROR, _('Could not update identification questions for all responses.') continue # TODO (NES-956): get the language. By now put 'en' to test ls_subject_id_column_name = \ questionnaire_utils.get_response_column_name_for_identification_group_questions( ls_interface, limesurvey_id, 'subjectid', 'en') if isinstance(ls_subject_id_column_name, tuple): # Returned error result = ls_subject_id_column_name[0], _('Could not update identification questions for all ' 'responses.') continue ls_responsible_id_column_name = \ questionnaire_utils.get_response_column_name_for_identification_group_questions( ls_interface, limesurvey_id, 'responsibleid', 'en') if isinstance(ls_responsible_id_column_name, tuple): # Returned error result = ls_responsible_id_column_name[0], _('Could not update identification questions for all ' 'responses.') continue result_update = ls_interface.update_response(limesurvey_id, { 'token': token, ls_subject_id_column_name: subject_id, ls_responsible_id_column_name: responsible_id }) if not result_update: return self.LIMESURVEY_ERROR, _('Could not update all responses.') ls_interface.release_session_key() return result
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(' ', '').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
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(' ', '').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
def get_questionnaire_fields(questionnaire_code_list, language_current="pt-BR"): """ :param questionnaire_code_list: list with questionnaire id to be formatted with json file :return: 1 list: questionnaires_included - questionnaire_id that was included in the .txt file """ questionnaires_included = [] questionnaire_lime_survey = Questionnaires() for questionnaire in questionnaire_code_list: questionnaire_id = questionnaire["sid"] language_new = get_questionnaire_language(questionnaire_lime_survey, questionnaire_id, language_current) # get a valid token (anyone) survey = Survey.objects.filter(lime_survey_id=questionnaire_id).first() token_id = QuestionnaireResponse.objects.filter(survey=survey).first().token_id token = questionnaire_lime_survey.get_participant_properties(questionnaire_id, token_id, "token") responses_string = questionnaire_lime_survey.get_header_response(questionnaire_id, language_new, token) questionnaire_title = questionnaire_lime_survey.get_survey_title(questionnaire_id, language_new) # print("id: %d " % questionnaire_id) if not isinstance(responses_string, dict): record_question = {'sid': questionnaire_id, "title": questionnaire_title, "output_list": []} questionnaire_questions = perform_csv_response(responses_string) responses_full = questionnaire_lime_survey.get_header_response(questionnaire_id, language_new, token, heading_type='full') questionnaire_questions_full = perform_csv_response(responses_full) index = 0 # line 0 - header information for question in questionnaire_questions[0]: if question not in questionnaire_evaluation_fields_excluded: # properties = questionnaire_lime_survey.get_question_properties(question, language) # record_question["output_list"].append({"field": question, # "header": question}) description = questionnaire_questions_full[0][index] # if len(description)+3+len(question) > 120: # length = 120 - (3+len(question)) # # description_part1 = description[:length-30] # description_part2 = description[-25:] # description = description_part1 + "..." + description_part2 record_question["output_list"].append({"field": question, "header": question, "description": description }) index += 1 questionnaires_included.append(record_question) questionnaire_lime_survey.release_session_key() return questionnaires_included
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( ' ', '').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
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( ' ', '').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