Exemple #1
0
def post(request, survey_id, question):
    validation_common.validate_survey_id(survey_id)
    validation_common.validate_question(question)

    survey_common.ensure_survey_exists(survey_id)

    question_id = str(uuid.uuid4())

    survey_utils.get_survey_table().update_item(
        Key={'survey_id':survey_id},
        UpdateExpression='SET questions = list_append(questions, :question) ADD num_active_questions :one',
        ExpressionAttributeValues={
            ':question': [{'id': question_id, 'active': True}],
            ':one': 1
        }
    )

    item = {}
    item['survey_id'] = survey_id
    item['question_id'] = question_id
    item['metadata'] = survey_common.extract_question_metadata(question)
    item['title'] = question['title']
    item['type'] = question['type']
    survey_utils.get_question_table().put_item(
        Item=item
    )

    return {
        'question_id': question_id
    }
Exemple #2
0
def clone_survey(survey_name, survey_id_to_clone):
    survey = survey_common.get_survey(survey_id_to_clone, None, None, False,
                                      True)
    survey_id = str(uuid.uuid4())
    questions = []
    for question in survey['questions']:
        question_id = str(uuid.uuid4())
        questions.append({'id': question_id, 'active': True})
        item = {}
        item['survey_id'] = survey_id
        item['question_id'] = question_id
        item['metadata'] = survey_common.extract_question_metadata(question)
        item['title'] = question['title']
        item['type'] = question['type']
        survey_utils.get_question_table().put_item(Item=item)

    creation_time = int(time.time())
    survey_utils.get_survey_table().put_item(
        Item={
            'survey_id': survey_id,
            'survey_name': survey_name,
            'creation_time_dummy_hash': 1,
            'creation_time': creation_time,
            'activation_start_time': 0,
            'num_active_questions': len(questions),
            'questions': questions,
            'num_responses': 0
        })

    return {'survey_id': survey_id, 'creation_time': creation_time}
Exemple #3
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'
def get_questions(survey_id, question_ids):
    if len(question_ids) == 0:
        return []

    question_map = {}
    params = {}
    params['KeyConditionExpression'] = 'survey_id = :survey_id'
    params['ExpressionAttributeValues'] = {':survey_id': survey_id}
    params['ProjectionExpression'] = 'question_id, title, #type, metadata'
    params['ExpressionAttributeNames'] = {'#type': 'type'}
    while True:
        query_result = survey_utils.get_question_table().query(**params)
        for question in query_result['Items']:
            question_map[question['question_id']] = question

        last_evaluated_key = query_result.get('LastEvaluatedKey')
        if last_evaluated_key is None:
            break
        params['ExclusiveStartKey'] = last_evaluated_key

    # only return questions that actually exists in Question table
    questions = []
    for question_id in question_ids:
        question = question_map.get(question_id)
        if question:
            # flatten metadata
            metadata = question.get('metadata')
            if metadata is not None:
                question.update(metadata)
                del question['metadata']
            questions.append(question)
    return questions
Exemple #5
0
def delete_questions(survey_id):
    question_table = survey_utils.get_question_table()
    question_ids = survey_common.get_survey_question_ids(survey_id)
    for question_id in question_ids:
        question_table.delete_item(Key={
            'survey_id': survey_id,
            'question_id': question_id
        })
Exemple #6
0
def put(request, survey_id, question_id, question):
    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)
    validation_common.validate_question(question)

    survey_common.ensure_question_belongs_to_survey(survey_id, question_id)

    item = {}
    item['survey_id'] = survey_id
    item['question_id'] = question_id
    item['metadata'] = survey_common.extract_question_metadata(question)
    item['title'] = question['title']
    item['type'] = question['type']
    survey_utils.get_question_table().put_item(
        Item=item
    )

    return 'success'
Exemple #7
0
def get_survey_question_ids(survey_id):
    params = {}
    params['KeyConditionExpression'] = 'survey_id = :survey_id'
    params['ExpressionAttributeValues'] = {':survey_id': survey_id}
    params['ProjectionExpression'] ='question_id'
    question_ids = []
    while True:
        query_result = survey_utils.get_question_table().query(**params)
        for question in query_result['Items']:
            question_ids.append(question['question_id'])
        last_evaluated_key = query_result.get('LastEvaluatedKey')
        if last_evaluated_key is None:
            break
        params['ExclusiveStartKey'] = last_evaluated_key
    return question_ids