Exemplo n.º 1
0
def get_questions_list(assets):
    global kobo
    if kobo is None:
        printMsgAndQuit(
            "Error in get_merged_questions: KoboExtractor not initialised.")

    questions_list = []
    for asset in assets:
        asset_questions = kobo.get_questions(asset=asset,
                                             unpack_multiples=True)
        if asset['uid'] == 'aAYAW5qZHEcroKwvEq8pRb':
            # Special treatment for interview version
            # Move S40/residence, S40/residence_99 to S10/residence, S10/residence_99
            # Move S10/email to S70/email
            asset_questions['groups']['S10']['questions'][
                'residence'] = asset_questions['groups']['S40']['questions'][
                    'residence']
            asset_questions['groups']['S10']['questions'][
                'residence_99'] = asset_questions['groups']['S40'][
                    'questions']['residence_99']
            asset_questions['groups']['S70']['questions'][
                'email'] = asset_questions['groups']['S10']['questions'][
                    'email']
            del asset_questions['groups']['S40']['questions']['residence']
            del asset_questions['groups']['S40']['questions']['residence_99']
            del asset_questions['groups']['S10']['questions']['email']
        questions_list.append(asset_questions)
    return questions_list
Exemplo n.º 2
0
def get_choice_lists(assets):
    global kobo
    if kobo is None:
        printMsgAndQuit(
            "Error in get_choice_lists: KoboExtractor not initialised.")

    def merge_dicts(d1, d2):
        """
        Modifies d1 in-place to contain values from d2.  If any value
        in d1 is a dictionary (or dict-like), *and* the corresponding
        value in d2 is also a dictionary, then merge them in-place.
        """
        for k, v2 in d2.items():
            v1 = d1.get(k)  # returns None if v1 has no value for this key
            if (isinstance(v1, dict) and isinstance(v2, dict)):
                merge_dicts(v1, v2)
            else:
                d1[k] = v2

    # Create dict of of choice options in the form of choice_lists[list_name][answer_code] = answer_label
    # Merge the choice lists into one, with the first versions taking precedence
    choice_lists = {}
    for asset in reversed(assets):
        merge_dicts(choice_lists, kobo.get_choices(asset))
    return choice_lists
Exemplo n.º 3
0
def get_contact_values(labeled_results, flat_questions, value_type):
    if value_type != "labels" and value_type != "codes":
        printMsgAndQuit("Invalid value_type for get_data_values().")

    contact_upload_values = []
    for labeled_result in labeled_results:
        if '/'.join([GROUP_CODES['intro'], QUESTION_CODES['interviewer']
                     ]) in labeled_result['results']:
            interviewer = labeled_result['results']['/'.join(
                [GROUP_CODES['intro'],
                 QUESTION_CODES['interviewer']])]['answer_code']
        else:
            interviewer = ''

        contact_values = [
            labeled_result['meta']['_submission_time'], FORMULAS['datetime'],
            labeled_result['meta']['_id'],
            getUniqueId(labeled_result), interviewer
        ]

        for question in flat_questions:
            new_values = []
            new_values.append(get_answer(question, labeled_result, value_type))
            if question['group_code'].startswith(GROUP_CODES['contact']):
                contact_values += new_values
        contact_upload_values.append(contact_values)
    return contact_upload_values
Exemplo n.º 4
0
def get_data_values(labeled_results, flat_questions, value_type):
    if value_type != "labels" and value_type != "codes":
        printMsgAndQuit("Invalid value_type for get_data_values().")

    upload_values = []
    for labeled_result in labeled_results:
        # Determine version
        version, version_ = get_version(labeled_result)

        result_values = [
            labeled_result['meta']['_submission_time'], FORMULAS['datetime'],
            FORMULAS['date'], version_, version, labeled_result['meta']['_id']
        ]

        for question in flat_questions:
            new_values = []
            new_values.append(get_answer(question, labeled_result, value_type))
            if not question['group_code'].startswith(GROUP_CODES['contact']):
                result_values += new_values
            # Add the unique ID and row # of last response
            if question['group_code'] == INSERT_UNIQUE_ID_AFTER[
                    'group'] and question['code'] == INSERT_UNIQUE_ID_AFTER[
                        'question']:
                result_values.append(getUniqueId(labeled_result))
                result_values.append(FORMULAS['latest_response'])
        upload_values.append(result_values)
    return upload_values
Exemplo n.º 5
0
def get_assets(asset_uids):
    global kobo
    if kobo is None:
        printMsgAndQuit("Error in get_assets: KoboExtractor not initialised.")

    assets = []
    for asset_uid in asset_uids:
        assets.append(kobo.get_asset(asset_uid))
    return assets
Exemplo n.º 6
0
def get_labeled_result(new_data, choice_lists, questions, questions_list):
    global kobo
    if kobo is None:
        printMsgAndQuit(
            "Error in get_choice_lists: KoboExtractor not initialised.")

    labeled_results = []
    for i in range(0, len(new_data)):
        for result in new_data[i]['results']:
            labeled_results.append(
                kobo.label_result(unlabeled_result=result,
                                  choice_lists=choice_lists,
                                  questions=questions_list[i],
                                  unpack_multiples=True))
    return sorted(labeled_results,
                  key=lambda result: result['meta']['_submission_time'])
Exemplo n.º 7
0
def get_asset_data(asset_uids, last_submit_time):
    global kobo
    if kobo is None:
        printMsgAndQuit(
            "Error in get_asset_data: KoboExtractor not initialised.")

    new_data = []
    for asset_uid in asset_uids:
        asset_data = kobo.get_data(asset_uid, submitted_after=last_submit_time)
        #asset_data = kobo.get_data(asset_uid, query='{"_id":80353595}') # Get one of Heiko's responses for v34
        if asset_uid == 'aAYAW5qZHEcroKwvEq8pRb':
            # Special treatment to re-arrange the interview version
            asset_data = move_question(asset_data, 'S40/residence',
                                       'S10/residence')
            asset_data = move_question(asset_data, 'S40/residence_99',
                                       'S10/residence_99')
            asset_data = move_question(asset_data, 'S10/email', 'S70/email')
        new_data.append(asset_data)
    return new_data