""" DynamoDB Utils ============== Utils for any dynamodb operations for ows-accounting """ import boto3 from boto3.dynamodb.conditions import Attr from boto3.dynamodb.conditions import Key def get_table(table_name): """Get Dynamodb Table by name. Args: table_name (str): name of the dynamodb table. Returns: dynamodb.Table. """ resource = boto3.resource('dynamodb') return resource.Table(table_name) def query_items( table, partition_key, partition_key_value, sort_key=None, sort_key_value=None, **filters): """Get dynamodb items with user_id_type and filters. Args: table (dynamodb.Table): table object from dynamodb. partition_key (str): partition_key. partition_key_value (str): value of the partition key. sort_key (str): partition sort key. sort_key_value (str): partition sort key value. filters (dict): optional filters. Example: file_type='txt'. Returns: list: list of reports dicts. Example: [{'user_id_type': '18805L', 'number_format': 'en_US', 'user_params': '206__all__en_US__xls', 'period_ids': '206', 'transaction_types': 'all', 'account_type': 'label', 'status': 'GENERATED', 'payment_interval': 'month', 'file_type': 'xls', 'account_id': '18805', 'download_avro_file_start': '2016-05-26 17:45:45'}] """ filter_expressions = None key_condition_expression = Key(partition_key).eq( partition_key_value) if sort_key and sort_key_value: key_condition_expression = ( key_condition_expression & Key(sort_key).eq(sort_key_value)) query_params = { 'KeyConditionExpression': key_condition_expression, 'ScanIndexForward': False, 'ConsistentRead': True } for attribute, value in filters.items(): if not filter_expressions: filter_expressions = Attr(attribute).eq(value) filter_expressions = filter_expressions & Attr(attribute).eq(value) if filter_expressions: query_params['FilterExpression'] = filter_expressions return table.query(**query_params).get('Items')