def main(argv): # TODO: test for new_limesurvey_id existence questionnaire_id, new_limesurvey_id = parse_options(argv) questionnaire = Questionnaire.objects.get(id=questionnaire_id) survey = questionnaire.survey old_limesurvey_id = survey.lime_survey_id survey.lime_survey_id = new_limesurvey_id # TODO: # if old_limesurvey_id == new_limesurvey_id do nothing, exit with message survey.save() limesurvey_surveys = Questionnaires() print('Getting old tokens ...') old_tokens = \ limesurvey_surveys.find_tokens_by_questionnaire(old_limesurvey_id) print('Getting new tokens ...') new_tokens = \ limesurvey_surveys.find_tokens_by_questionnaire(survey.lime_survey_id) print('Updating experiment questionnaire responses ...') for q_experiment_response in EQuestionnaireResponse.objects.filter( data_configuration_tree__component_configuration__component= questionnaire.id): update_questionnaire_response(old_tokens, new_tokens, q_experiment_response) print('Updating patients questionnaire responses ...') for q_patient_response in PQuestionnaireResponse.objects.filter( survey=survey): update_questionnaire_response(old_tokens, new_tokens, q_patient_response)
def _remove_limesurvey_participants(self): """Must be called after updating Limesurvey surveys references""" result = 0, '' indexes = self._get_indexes('experiment', 'questionnaire') ls_interface = Questionnaires() # As there can be same survey in more than one questionnaire component, # create a dictionaire to nao questionnaire compontents by limesurvey # surveys. token_ids_survey = dict() for index in indexes: questionnaire = Questionnaire.objects.get(id=self.data[index]['pk']) limesurvey_id = questionnaire.survey.lime_survey_id # Initialize dict if first time of limesurvey_id if limesurvey_id not in token_ids_survey: token_ids_survey[limesurvey_id] = [] token_ids = list(QuestionnaireResponse.objects.filter( data_configuration_tree__component_configuration__component= questionnaire.id).values_list('token_id', flat=True)) token_ids_survey[limesurvey_id] += token_ids for limesurvey_id, token_ids in token_ids_survey.items(): all_participants = ls_interface.find_tokens_by_questionnaire(limesurvey_id) if all_participants is None: result = self.LIMESURVEY_ERROR, _('Could not clear all extra survey participants data.') continue # TODO (NES-956): don't remove participants of other experiment of this NES. for participant in all_participants: if participant['tid'] not in token_ids: status_delete = ls_interface.delete_participants(limesurvey_id, [participant['tid']]) if status_delete is None: result = self.LIMESURVEY_ERROR, _('Could not clear all extra survey participants data.') continue responses = ls_interface.get_responses_by_token(sid=limesurvey_id, token=participant['token']) if responses is None: result = self.LIMESURVEY_ERROR, _('Could not clear all extra survey participants data.') continue responses = QuestionnaireUtils.responses_to_csv(responses) del(responses[0]) # First line is the header line response_ids = [] for response in responses: response_ids.append(int(response[0])) ls_interface = Questionnaires( settings.LIMESURVEY['URL_API'] + '/index.php/plugins/unsecure?plugin=extendRemoteControl&function=action') status = ls_interface.delete_responses(limesurvey_id, response_ids) if status is None: result = self.LIMESURVEY_ERROR, _('Could not clear all extra survey participants data.') ls_interface = Questionnaires() # Return to access core RPC ls_interface.release_session_key() return result