Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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