def get_pack_by_url(url): ''' Возвращает набор экшенов по переданному url ''' ControllerCache.populate() packs = collections.deque([]) for controller in ControllerCache.get_controllers(): packs.extend(controller.top_level_packs) while len(packs) > 0: pack = packs.popleft() if hasattr(pack, 'subpacks'): packs.extend(pack.subpacks) cleaned_pack = _get_instance(pack) if url == cleaned_pack.__class__.absolute_url(): return cleaned_pack return None
def get_pack_by_url(url): ''' Возвращает набор экшенов по переданному url ''' ControllerCache.populate() packs = collections.deque([]) for controller in ControllerCache.get_controllers(): packs.extend(controller.top_level_packs) while len(packs) > 0: pack = packs.popleft() if hasattr(pack, 'subpacks'): packs.extend(pack.subpacks) cleaned_pack = _get_instance(pack) if url == cleaned_pack.__class__.absolute_url(): return cleaned_pack return None
def inner_name_cache_handler(for_actions=True): ''' Внутренний метод обхода дерева паков и экшенов. Используется в хендлерах сборки кешей ''' def get_shortname(obj): ''' Возвращает короткое имя для экшена или пака. Сам объект экшена или пака передается в параметре obj. ''' names = ['shortname', 'short_name', ] objects = [obj.__class__, obj] for o in objects: for name in names: if hasattr(o, name) and isinstance(getattr(o, name), str): return getattr(o, name, '') return '' # TODO посмотреть как работает для врапнутых классов result = {} # fullpaths - словарь, который хранит соответствие объекта (контроллера, # пака или экшена) и полного пути до него по шортнеймам fullpaths = {} ControllerCache.populate() # что-то внутренность данного метода не вызывает # доверия, если честно packs = collections.deque([]) controllers = ControllerCache.get_controllers() # считываем паки верхнего уровня for controller in controllers: packs.extend(controller.top_level_packs) # добавляем полные пути в fullpaths fullpaths[controller] = get_shortname(controller) for pack in controller.top_level_packs: fullpaths[pack] = '%s.%s' % ( fullpaths.get(controller, ''), get_shortname(pack) ) while len(packs) > 0: pack = packs.popleft() # субпаки - в очередь! if hasattr(pack, 'subpacks'): packs.extend(pack.subpacks) for subpack in pack.subpacks: fullpaths[subpack] = '%s.%s' % ( fullpaths.get(pack, ''), get_shortname(subpack), ) if for_actions and hasattr(pack, 'actions'): for action in pack.actions: keys = [] cache_object = None # если имеем дело с экземпляром # экшена, то ключем будет его # полный url if isinstance(action, Action): cleaned_action = action url = cleaned_action.get_absolute_url() long_class_name = ( cleaned_action.__class__.__module__ + '.' + cleaned_action.__class__.__name__ ) # регистрируем для url и для класса cache_object = ( cleaned_action.__class__, url, cleaned_action) keys.extend([url, long_class_name]) else: # неважно что нам передали, нам нужен экземпляр класса cleaned_action = _get_instance(action) # TODO: здесь url может быть не # правильный, т.к. мы сами создали # экземпляр и у него нет ни Pack, ни # Controller. # TODO: поэтому берем его через # absolute_url, т.к. он ищет экземпляр # экшена во всех контроллерах # TODO: а это работает только для единичных экземпляров url = cleaned_action.__class__.absolute_url() long_class_name = ( cleaned_action.__class__.__module__ + '.' + cleaned_action.__class__.__name__ ) # регистрируем для класса cache_object = ( cleaned_action.__class__, url, cleaned_action) keys.append(long_class_name) # регистрируем для shortname shortname = get_shortname(cleaned_action) if shortname: keys.append(shortname) keys.append('%s.%s' % (fullpaths.get(pack, ''), shortname)) # регистрируем for key in keys: result[key] = cache_object else: cleaned_pack = _get_instance(pack) url = cleaned_pack.__class__.absolute_url() cache_object = (cleaned_pack.__class__, url, cleaned_pack) # регистрируем как полный класс с модулем, так и просто имя класса keys = [ '%s.%s' % ( cleaned_pack.__class__.__module__, cleaned_pack.__class__.__name__ ), cleaned_pack.__class__.__name__ ] # регистрируем shortname shortname = get_shortname(cleaned_pack) if shortname: keys.append(shortname) if pack in fullpaths: keys.append(fullpaths[pack]) # регистрируем for key in keys: result[key] = cache_object return result
def inner_name_cache_handler(for_actions=True): ''' Внутренний метод обхода дерева паков и экшенов. Используется в хендлерах сборки кешей ''' def get_shortname(obj): ''' Возвращает короткое имя для экшена или пака. Сам объект экшена или пака передается в параметре obj. ''' names = [ 'shortname', 'short_name', ] objects = [obj.__class__, obj] for o in objects: for name in names: if hasattr(o, name) and isinstance(getattr(o, name), str): return getattr(o, name, '') return '' # TODO посмотреть как работает для врапнутых классов result = {} # fullpaths - словарь, который хранит соответствие объекта (контроллера, # пака или экшена) и полного пути до него по шортнеймам fullpaths = {} ControllerCache.populate() # что-то внутренность данного метода не вызывает # доверия, если честно packs = collections.deque([]) controllers = ControllerCache.get_controllers() # считываем паки верхнего уровня for controller in controllers: packs.extend(controller.top_level_packs) # добавляем полные пути в fullpaths fullpaths[controller] = get_shortname(controller) for pack in controller.top_level_packs: fullpaths[pack] = '%s.%s' % (fullpaths.get( controller, ''), get_shortname(pack)) while len(packs) > 0: pack = packs.popleft() # субпаки - в очередь! if hasattr(pack, 'subpacks'): packs.extend(pack.subpacks) for subpack in pack.subpacks: fullpaths[subpack] = '%s.%s' % ( fullpaths.get(pack, ''), get_shortname(subpack), ) if for_actions and hasattr(pack, 'actions'): for action in pack.actions: keys = [] cache_object = None # если имеем дело с экземпляром # экшена, то ключем будет его # полный url if isinstance(action, Action): cleaned_action = action url = cleaned_action.get_absolute_url() long_class_name = (cleaned_action.__class__.__module__ + '.' + cleaned_action.__class__.__name__) # регистрируем для url и для класса cache_object = (cleaned_action.__class__, url, cleaned_action) keys.extend([url, long_class_name]) else: # неважно что нам передали, нам нужен экземпляр класса cleaned_action = _get_instance(action) # TODO: здесь url может быть не # правильный, т.к. мы сами создали # экземпляр и у него нет ни Pack, ни # Controller. # TODO: поэтому берем его через # absolute_url, т.к. он ищет экземпляр # экшена во всех контроллерах # TODO: а это работает только для единичных экземпляров url = cleaned_action.__class__.absolute_url() long_class_name = (cleaned_action.__class__.__module__ + '.' + cleaned_action.__class__.__name__) # регистрируем для класса cache_object = (cleaned_action.__class__, url, cleaned_action) keys.append(long_class_name) # регистрируем для shortname shortname = get_shortname(cleaned_action) if shortname: keys.append(shortname) keys.append('%s.%s' % (fullpaths.get(pack, ''), shortname)) # регистрируем for key in keys: result[key] = cache_object else: cleaned_pack = _get_instance(pack) url = cleaned_pack.__class__.absolute_url() cache_object = (cleaned_pack.__class__, url, cleaned_pack) # регистрируем как полный класс с модулем, так и просто имя класса keys = [ '%s.%s' % (cleaned_pack.__class__.__module__, cleaned_pack.__class__.__name__), cleaned_pack.__class__.__name__ ] # регистрируем shortname shortname = get_shortname(cleaned_pack) if shortname: keys.append(shortname) if pack in fullpaths: keys.append(fullpaths[pack]) # регистрируем for key in keys: result[key] = cache_object return result