returns a triple tuple representing the location of the key/key-list.
    returns: (parent_dictionary, final_key, value_found)
    If unable to locate the key, then (None, None, None) is returned.

def dict_crawl(entry, key):
    ''' returns a triple tuple representing the location of the key/key-list.
    returns: (parent_dictionary, final_key, value_found)
    If unable to locate the key, then (None, None, None) is returned.
    '''
    value = None
    key_list = make_list(key)
    try:
        result = None
        success_flag = True
        temp = entry
        for next_key in key_list:
            parent = temp
            actual_type = detect_type(temp)
            if actual_type=="mongoengine":
                if next_key in temp.__dict__['_data']:
                    temp = temp.__dict__['_data'][next_key]
                else:
                    break
            elif actual_type=="class":
                if next_key in temp.__dict__:
                    temp = temp.__dict__[next_key]
                else:
                    break
            elif actual_type=="dict":
                if next_key in temp:
                    temp = temp[next_key]
                else:
                    break
            elif actual_type=="iterable_dict":
                if next_key in convert_to_dict(temp): # 'contains' method might not be there
                    temp = temp[next_key]
                else:
                    break
            elif actual_type=="list":
                if next_key in temp:
                    temp = temp[next_key]
                else:
                    break
            else:  ## I'm unsure we can really 'crawl' an 'object'
                break
        else:
            return (parent, key_list[-1], temp)
        return (None, None, None)
    except:
        pass
    return (None, None, None)