api/utils.py (38 lines of code) (raw):
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License").
# You may not use this file except in compliance with the License.
# A copy of the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is distributed
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language governing
# permissions and limitations under the License.
import boto3
import datetime
import os
import uuid
from base import NotFoundError
dynamodb = boto3.resource('dynamodb')
Wheel = dynamodb.Table(os.environ.get('WHEEL_TABLE', 'DevOpsWheel-Wheels'))
WheelParticipant = dynamodb.Table(os.environ.get('PARTICIPANT_TABLE', 'DevOpsWheel-Participants'))
def add_extended_table_functions(table):
def get_existing_item(Key, *args, **kwargs):
"""
Add a new 'get_existing_item' method for our tables that will throw a 404 when it doesn't exist
"""
response = table.get_item(Key=Key, *args, **kwargs)
if 'Item' not in response:
raise NotFoundError(f"{table.name} : {Key} Could Not Be Found")
return response['Item']
def iter_query(*args, **kwargs):
"""Unwrap pagination from DynamoDB query results to yield items"""
query_results = None
while query_results is None or 'LastEvaluatedKey' in query_results:
if query_results is not None:
kwargs['ExclusiveStartKey'] = query_results['LastEvaluatedKey']
query_results = table.query(*args, **kwargs)
for item in query_results['Items']:
yield item
table.get_existing_item = get_existing_item
table.iter_query = iter_query
add_extended_table_functions(Wheel)
add_extended_table_functions(WheelParticipant)
def check_string(string):
return isinstance(string, str) and len(string) > 0
def get_uuid():
return str(uuid.uuid4())
def get_utc_timestamp():
return datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
def to_update_kwargs(attributes):
"""
For an attribute dictionary, make a default update expression for setting the values
Notes: Use an expression attribute name to replace that attribute's name with reserved word in the expression,
reference can be found here:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html#ExpressionAttributeNames
"""
return {
'UpdateExpression': 'set {}'.format(', '.join([f"#{k} = :{k}" for k in attributes])),
'ExpressionAttributeValues': {f":{k}": v for k, v in attributes.items()},
'ExpressionAttributeNames': {f"#{k}": k for k in attributes}
}