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)
Beispiel #2
0
    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