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'
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"
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_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] }
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'
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)
def ensure_survey_exists(survey_id): survey_utils.get_survey_metadata_by_id(survey_id, ['survey_id'], True)