def create_download_file():
    """Create Excel file from action resource records and return URI to file"""
    if request.method == 'OPTIONS':
        return make_api_response()

    qb = QueryBuilder(request.args)
    if qb.query_type == 'aggregate':
        query_cursor = db.action.aggregate(qb.get_query())
        data = [elem for elem in query_cursor]
    else:
        query_cursor = db.action.find(qb.get_query()).sort('timestamp', pymongo.DESCENDING)
        data = process_query_results(query_cursor, 'action')

    username = g.user.username
    filename = username + ''.join(random.choice(string.ascii_uppercase + string.digits) for x in xrange(16))

    make_excel_file(filename, data)

    token = AuthToken.generate(filename)
    urlsafe_token = urllib.quote(token)
    tempDownloadUri = request.base_url + '/report.xlsx?fileToken=' + urlsafe_token

    return make_api_response(json_util.dumps({'file_token': tempDownloadUri}))
def get_action_resource():
    """Return action resource records"""
    if request.method == 'OPTIONS':
        return make_api_response()

    qb = QueryBuilder(request.args)
    if qb.query_type == 'aggregate':
        query_cursor = db.action.aggregate(qb.get_query())
        data = [elem for elem in query_cursor]
    else:
        query_cursor = db.action.find(qb.get_query()).sort('timestamp', pymongo.DESCENDING)
        data = process_query_results(query_cursor, 'action')

    query_string = urllib.urlencode(request.args)
    uri = '/api/v1/action?' + query_string

    response_data = {
        'uri': uri,
        'type': qb.query_type,
        'total': len(data),
        'results': data
    }

    return make_api_response(json_util.dumps(response_data))