def get_pack_instance(self, pack): """ Возвращает экземпляр зарегистрированного ActionPack. @pack может быть: - классом - строкой с именем класса в формате "package/ClassName" """ if inspect.isclass(pack): pack = tools._name_class(pack) return self._pack_instances_by_name.get(pack)
def _populate_pack(self, pack): """ Подписка зарегистрированных слушателей на pack.actions """ # каждый отдельный Pack должен регистрироваться ровно один раз # уникльность Pack определяется следующим ключом pack_name = tools._name_class(pack.__class__) if pack_name in self._pack_instances_by_name: # попытка перерегистрации отмечается предупреждением raise RuntimeError( 'WARNING! Pack reregistration blocked!:\n\tPack: %s' % pack_name ) else: # ActionPack запоминается, как уже зарегистрированный self._pack_instances_by_name[pack_name] = pack self._log( self.LOG_MORE, 'Pack reregistered:\n\tPack: %s' % pack_name) # регистрация ActionPack, как основного для модели model = getattr(pack, 'model', getattr(pack, 'tree_model', None)) if model and getattr(pack, '_is_primary_for_model', True): model_name = model.__name__ try: # если для модели уже зарегистрирован ActionPack # возбуждается исключение raise AssertionError( "For model %s already registered primary pack: %r" % (model_name, self._model_register[model_name])) except KeyError: # модель ещё не регистрировалась - регистрируется self._model_register[model_name] = pack # в Pack инжектируется функция получения Pack`а # для указанной по имени модели pack._get_model_pack = self.get for action in pack.actions: name = self._name_action(action, pack_name) # возбуждение исключения при коллизии short_names if name in self._actions: raise RuntimeError( 'Name="%s" can not be registered for action %r,\n' 'because this name registered for %r!' % (name, action, self._actions[name])) self._actions[name] = action for subpack in pack.subpacks: self._populate_pack(subpack) self._is_configured = False
def _populate_pack(self, pack): """ Подписка зарегистрированных слушателей на pack.actions """ # каждый отдельный Pack должен регистрироваться ровно один раз # уникльность Pack определяется следующим ключом pack_name = tools._name_class(pack.__class__) if pack_name in self._pack_instances_by_name: # попытка перерегистрации отмечается предупреждением raise RuntimeError( 'WARNING! Pack reregistration blocked!:\n\tPack: %s' % pack_name) else: # ActionPack запоминается, как уже зарегистрированный self._pack_instances_by_name[pack_name] = pack self._log(self.LOG_MORE, 'Pack reregistered:\n\tPack: %s' % pack_name) # регистрация ActionPack, как основного для модели model = getattr(pack, 'model', getattr(pack, 'tree_model', None)) if model and getattr(pack, '_is_primary_for_model', True): model_name = model.__name__ try: # если для модели уже зарегистрирован ActionPack # возбуждается исключение raise AssertionError( "For model %s already registered primary pack: %r" % (model_name, self._model_register[model_name])) except KeyError: # модель ещё не регистрировалась - регистрируется self._model_register[model_name] = pack # в Pack инжектируется функция получения Pack`а # для указанной по имени модели pack._get_model_pack = self.get for action in pack.actions: name = self._name_action(action, pack_name) # возбуждение исключения при коллизии short_names if name in self._actions: raise RuntimeError( 'Name="%s" can not be registered for action %r,\n' 'because this name registered for %r!' % (name, action, self._actions[name])) self._actions[name] = action for subpack in pack.subpacks: self._populate_pack(subpack) self._is_configured = False