def register_desktop_menu(): generic_metarole = metaroles.get_metarole(GENERIC_USER) reports_root = DesktopShortcut(name=ReportListActionPack.title, pack=find_pack(ReportListActionPack), index=20) DesktopLoader.add( metarole=generic_metarole, place=DesktopLoader.TOPTOOLBAR, element=reports_root, )
def register_desktop_menu(): generic_metarole = metaroles.get_metarole(GENERIC_USER) designer_root = DesktopShortcut(name=CreadocDesignerActionPack.title, pack=find_pack(CreadocDesignerActionPack), index=10) DesktopLoader.add( metarole=generic_metarole, place=DesktopLoader.TOPTOOLBAR, element=designer_root, )
def add_desktop_launcher( name='', url='', icon='', path=None, metaroles=None, places=None ): """ Шорткат для добавления ланчеров в элементы рабочего стола. :param name: подпись ланчера на рабочем столе/в меню :type name: str :param url: url, по которому происходит обращение к ланчеру :type url: str :param icon: класс, на основе которого рисуется иконка ланчера :type icon: m3_ext.icons.Icon :param path: список кортежей, которые задают путь к ланчеру в случае, если этот ланчер спрятан в подменю. .. note:: Каждый элемент пути задается либо в одном из форматов: "(название,)", "(название, иконка,)", "(название, иконка, индекс)" :type path: list :param metaroles: список метаролей (либо одиночная метароль) """ if not metaroles or not places: return launcher = DesktopLauncher(url=url, name=name, icon=icon) # "чистый" список метаролей, для которых выполняется регистрация метаролей cleaned_metaroles = [] cleaned_places = [] cleaned_metaroles.extend( metaroles if isinstance(metaroles, list) else [metaroles]) cleaned_places.extend( places if isinstance(places, list) else [places]) root = None parent_group = None for slug in (path or []): group = DesktopLaunchGroup(name=slug[0]) if len(slug) > 1 and slug[1]: group.icon = slug[1] elif len(slug) > 2 and isinstance(slug[2], int): group.index = slug[2] if not root: root = group if parent_group: parent_group.subitems.append(group) parent_group = group if root: root.subitems.append(launcher) launcher = root # мы в ланчеры, значится, будем добавлять самого рута. for metarole in cleaned_metaroles: if isinstance(metarole, basestring): metarole = get_metarole(metarole) if metarole: for place in cleaned_places: DesktopLoader.add(metarole, place, launcher)
def add(cls, metarole, place, element): """ Добавление элемента дектопа в кэш заданной метароли :param metarole: роль :type metarole: str :param place: место размещения элемента (рабочий стол, меню и тулбоксы) :type place: int :raise: AssertionError """ def find_by_name(existed_list, name): """ Поиск внутри списка группы с заданным именем name :param existed_list: список группы :type existing_list: list :param name: имя :type name: unicode """ for item in existed_list: if isinstance(item, DesktopLaunchGroup) and item.name == name: return item def insert_item(existed_list, item): """ Если добавляемый элемент - группа, то нужно проверить есть ли у нас уже такая группа. Если нет - добавляем, иначе нужно зайти в нее и продолжить проверку вниз по дереву :param existed_list: список группы :type existing_list: list :param item: элемент :type item: DesktopShortcut / DesktopLauncher """ if isinstance(item, DesktopLaunchGroup): collision_item = find_by_name(existed_list, item.name) if collision_item is None: # Раз нет переcений по имени, то можно добавлять existed_list.append(item) else: for i in item.subitems: insert_item(collision_item.subitems, i) elif item not in existed_list: existed_list.append(item) def insert_for_role(metarole, elem, processed_metaroles): """ Добавление элемента для метароли :param metarole: роль :type metarole: str :param elem: элемент :type elem: DesktopShortcut / DesktopLauncher :param processed_metaroles: обработанные метароли :type processed_metaroles: list """ if metarole not in processed_metaroles: processed_metaroles.append(metarole) element = elem.clone() # Кэш состоит из 3х уровней: словарь с метаролями, # словарь с местами и список конечных элементов items_for_role = cls._cache.get(metarole.code, {}) items_for_place = items_for_role.get(place, []) insert_item(items_for_place, element) items_for_role[place] = items_for_place cls._cache[metarole.code] = items_for_role # Недостаточно добавить элементы только в одну метароль, # т.к. она может входить внутрь другой метароли. # Так что нужно пробежаться по ролям, # которые включают в себя нашу роль. for role in metarole.get_owner_metaroles(): insert_for_role(role, element, processed_metaroles) #=============================================== assert place in ( cls.DESKTOP, cls.START_MENU, cls.TOOLBOX, cls.TOPTOOLBAR ) if isinstance(metarole, basestring): metarole = get_metarole(metarole) assert isinstance(metarole, UserMetarole) insert_for_role(metarole, element, processed_metaroles=[])