def update_user_score(self, username, question_id, provided_answer,
is_correct):
update_expression_components = []
expression_attribute_names = {}
expression_attribute_values = {}
update_expression_components.append('#ans.#qid = :answer')
expression_attribute_names['#ans'] = 'answers'
expression_attribute_names['#qid'] = question_id
expression_attribute_values[':answer'] = {
'provided_answer': provided_answer,
'is_correct': is_correct,
}
update_expression_components.append(
'total_answered = total_answered + :inc')
expression_attribute_values[':inc'] = 1
if is_correct:
update_expression_components.append(
'total_correct = total_correct + :inc')
try:
self._dynamodb.Table(self._table_name).update_item(
Key={
'username': username
},
UpdateExpression='SET ' + ', '.join(
update_expression_components),
ExpressionAttributeNames=expression_attribute_names,
ConditionExpression=Attr(
'answers.' + question_id).not_exists(),
ExpressionAttributeValues=expression_attribute_values
)
except self._dynamodb.meta.client.exceptions.\
ConditionalCheckFailedException:
raise UserAlreadyAnsweredError(
'User \'%s\' has already answered this question. A specific '
'user is only allowed to answer a question once.' % username
)
评论列表
文章目录