Beispiel #1
0
def get_survey(survey_id, question_index, question_count, ensure_active, is_admin):
    question_index, end_index = validation_common.validate_question_range_param(question_index, question_count)

    survey_metadata = survey_utils.get_survey_metadata_by_id(
        survey_id, ['questions', 'survey_name', 'activation_start_time', 'activation_end_time', 'published'], True)

    if ensure_active:
        ensure_survey_active_from_metadata(survey_metadata, survey_id)

    question_ids = [x['id'] for x in survey_metadata['questions']]
    question_active_flags = [x['active'] for x in survey_metadata['questions']]
    if is_admin:
        question_ids = question_ids[question_index:end_index]
    else:
        question_ids = [x for i, x in enumerate(question_ids) if question_active_flags[i]][question_index:end_index]

    questions = get_questions(survey_id, question_ids)

    if is_admin:
        for i, enabled in enumerate(question_active_flags[question_index:end_index]):
            questions[i]['enabled'] = enabled

    return {
        'survey_id': survey_id,
        'survey_name': survey_metadata.get('survey_name'),
        'questions': questions
    }
def disable_survey_question(survey_id, question_id):
    survey_metadata = survey_utils.get_survey_metadata_by_id(
        survey_id, ['questions'], True)
    for i, question in enumerate(survey_metadata['questions']):
        if question['id'] == question_id:
            if question['active'] == True:
                try:
                    survey_utils.get_survey_table().update_item(
                        Key={'survey_id': survey_id},
                        UpdateExpression=
                        'SET questions[{}].active = :false ADD num_active_questions :minus_one'
                        .format(i),
                        ConditionExpression=
                        'questions[{}].id = :question_id and questions[{}].active = :true'
                        .format(i, i),
                        ExpressionAttributeValues={
                            ':true': True,
                            ':false': False,
                            ':question_id': question_id,
                            ':minus_one': -1
                        })
                except ClientError as e:
                    if e.response['Error'][
                            'Code'] == 'ConditionalCheckFailedException':
                        raise errors.ClientError(
                            'Survey has been modified before update')
                    else:
                        raise RuntimeError('Failed to update DynamoDB')
            break
    else:
        raise errors.ClientError(
            'No question with id [{}] found for survey [{}]'.format(
                question_id, survey_id))

    return 'success'
Beispiel #3
0
def put(request, survey_id, question_order):
    validation_common.validate_survey_id(survey_id)

    question_id_list = question_order.get('question_id_list')
    validation_utils.validate_param(question_id_list, 'question_id_list',
                                    validation_utils.is_not_none)

    survey_metadata = survey_utils.get_survey_metadata_by_id(
        survey_id, ['questions'], True)
    question_ids = [x['id'] for x in survey_metadata['questions']]
    if set(question_ids) != set(question_id_list):
        raise errors.ClientError(
            "Question IDs from input doesn't match existing question IDs")

    question_map = {}
    for question in survey_metadata['questions']:
        question_map[question['id']] = question

    new_question_list = [
        question_map[question_id] for question_id in question_id_list
    ]

    survey_utils.get_survey_table().update_item(
        Key={'survey_id': survey_id},
        UpdateExpression='SET questions = :new_question_list',
        ExpressionAttributeValues={':new_question_list': new_question_list})

    return "success"
Beispiel #4
0
def delete(request, survey_id, question_id):
    validation_utils.validate_param(survey_id, 'survey_id',
                                    validation_utils.is_not_blank_str)
    validation_utils.validate_param(question_id, 'question_id',
                                    validation_utils.is_not_blank_str)

    survey_metadata = survey_utils.get_survey_metadata_by_id(
        survey_id, ['questions'], True)
    for i, question in enumerate(survey_metadata['questions']):
        if question.get('id') == question_id:
            try:
                if question.get('active'):
                    survey_utils.get_survey_table().update_item(
                        Key={'survey_id': survey_id},
                        UpdateExpression=
                        'REMOVE questions[{}] ADD num_active_questions :minus_one'
                        .format(i),
                        ConditionExpression=
                        'questions[{}].id = :question_id and questions[{}].active = :true'
                        .format(i, i),
                        ExpressionAttributeValues={
                            ':question_id': question_id,
                            ':minus_one': -1,
                            ':true': True
                        })
                else:
                    survey_utils.get_survey_table().update_item(
                        Key={'survey_id': survey_id},
                        UpdateExpression='REMOVE questions[{}]'.format(i),
                        ConditionExpression=
                        'questions[{}].id = :question_id and questions[{}].active = :false'
                        .format(i, i),
                        ExpressionAttributeValues={
                            ':question_id': question_id,
                            ':false': False
                        })
            except ClientError as e:
                if e.response['Error'][
                        'Code'] == 'ConditionalCheckFailedException':
                    raise errors.ClientError(
                        'Survey has been modified before update')
                else:
                    raise RuntimeError('Failed to update DynamoDB')
            break
    else:
        raise errors.ClientError(
            'No question with id [{}] found for survey [{}]'.format(
                question_id, survey_id))

    survey_utils.get_question_table().delete_item(Key={
        'survey_id': survey_id,
        'question_id': question_id
    })

    return 'success'
Beispiel #5
0
def get_survey_metadata_by_id(survey_id, ensure_active):
    survey_metadata = survey_utils.get_survey_metadata_by_id(
        survey_id, ['survey_id', 'survey_name', 'creation_time', 'num_active_questions', 'activation_start_time', 'activation_end_time', 'published'], True)

    if ensure_active:
        ensure_survey_active_from_metadata(survey_metadata)

    __clean_up_attributes(ensure_active, survey_metadata)

    return {
        'metadata_list':[survey_metadata]
    }
Beispiel #6
0
def put(request, survey_id, survey_published_status):
    validation_common.validate_survey_id(survey_id)
    published = survey_published_status.get('published')
    validation_utils.validate_param(published, 'published',
                                    validation_utils.is_not_none)

    if published:
        survey_metadata = survey_utils.get_survey_metadata_by_id(
            survey_id,
            ['questions', 'activation_start_time', 'activation_end_time'])

        validate_eligible_for_publishing(survey_metadata)

        survey_utils.get_survey_table().update_item(
            Key={'survey_id': survey_id},
            UpdateExpression='SET published = :true',
            ExpressionAttributeValues={':true': 1})
    else:
        survey_utils.get_survey_table().update_item(
            Key={'survey_id': survey_id}, UpdateExpression='REMOVE published')

    return 'success'
Beispiel #7
0
def ensure_survey_active(survey_id):
    survey_metadata = survey_utils.get_survey_metadata_by_id(
        survey_id, ['activation_start_time', 'activation_end_time', 'published'], True)
    ensure_survey_active_from_metadata(survey_metadata, survey_id)
Beispiel #8
0
def ensure_survey_exists(survey_id):
    survey_utils.get_survey_metadata_by_id(survey_id, ['survey_id'], True)