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 }
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}
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
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 })
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'
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