def construct_managers(self): "Deep-clone the managers using deconstruction" # Sort all managers by their creation counter sorted_managers = sorted(self.managers, key=lambda v: v[1].creation_counter) for mgr_name, manager in sorted_managers: mgr_name = force_text(mgr_name) as_manager, manager_path, qs_path, args, kwargs = manager.deconstruct() if as_manager: qs_class = import_string(qs_path) yield mgr_name, qs_class.as_manager() else: manager_class = import_string(manager_path) yield mgr_name, manager_class(*args, **kwargs)
def get_engine(cls, engine=None): if engine is None: engine = settings.DEFAULT_REPORT_ENGINE if isinstance(engine, str): if '.' in engine: engine = import_string(engine) for e in cls.engines: if e.__class__ is engine: return e return cls.load_engine(engine)
def get_hashers(): hashers = [] for hasher_path in settings['PASSWORD_HASHERS']: hasher_cls = import_string(hasher_path) hasher = hasher_cls() if not getattr(hasher, 'algorithm'): raise ImproperlyConfigured("hasher doesn't specify an " "algorithm name: %s" % hasher_path) hashers.append(hasher) return hashers
def get_hashers(): hashers = [] for hasher_path in settings.PASSWORD_HASHERS: hasher_cls = import_string(hasher_path) hasher = hasher_cls() if not getattr(hasher, 'algorithm'): raise ImproperlyConfigured("hasher doesn't specify an " "algorithm name: %s" % hasher_path) hashers.append(hasher) return hashers
def routers(self): if self._routers is None: self._routers = settings.DATABASE_ROUTERS routers = [] for r in self._routers: if isinstance(r, str): router = import_string(r)() else: router = r routers.append(router) return routers
def get_info(self): info = self.info if self.type_name: tp = import_string(self.type_name) info = tp.get_info() return { 'id': self.pk, 'name': gettext(self.name), 'tag': self.tag, 'description': self.description, 'info': info, }
def _get_info(self, context): from orun.contrib.admin.models.ui import View res = super()._get_info(context) # it's a system class if self.qualname: admin_class = import_string(self.qualname) res.update(admin_class.render(None)) del res['qualname'] view = res.get('view') if view and view['id']: res['template'] = View.objects.get(pk=view['id']).get_content() return res
def get_backend(engine): backend = 'orun.db.backends.' + engine + '.base.DatabaseWrapper' return import_string(backend)
def create(cls, entry, registry=None): """ Factory that creates an app config from an entry in INSTALLED_APPS. """ # create() eventually returns app_config_class(app_name, app_module). app_config_class = None app_name = None app_module = None # If import_module succeeds, entry points to the app module. try: app_module = import_module(entry) except Exception: pass else: # If app_module has an apps submodule that defines a single # AppConfig subclass, use it automatically. # To prevent this, an AppConfig subclass can declare a class # variable default = False. # If the apps module defines more than one AppConfig subclass, # the default one can declare default = True. if module_has_submodule(app_module, APPS_MODULE_NAME): mod_path = '%s.%s' % (entry, APPS_MODULE_NAME) mod = import_module(mod_path) # Check if there's exactly one AppConfig candidate, # excluding those that explicitly define default = False. app_configs = [ (name, candidate) for name, candidate in inspect.getmembers( mod, inspect.isclass) if (issubclass(candidate, cls) and candidate is not cls and getattr(candidate, 'default', True)) ] if len(app_configs) == 1: app_config_class = app_configs[0][1] app_config_name = '%s.%s' % (mod_path, app_configs[0][0]) else: # Check if there's exactly one AppConfig subclass, # among those that explicitly define default = True. app_configs = [(name, candidate) for name, candidate in app_configs if getattr(candidate, 'default', False)] if len(app_configs) > 1: candidates = [repr(name) for name, _ in app_configs] raise RuntimeError( '%r declares more than one default AppConfig: ' '%s.' % (mod_path, ', '.join(candidates))) elif len(app_configs) == 1: app_config_class = app_configs[0][1] app_config_name = '%s.%s' % (mod_path, app_configs[0][0]) # If app_module specifies a default_app_config, follow the link. # default_app_config is deprecated, but still takes over the # automatic detection for backwards compatibility during the # deprecation period. try: new_entry = app_module.default_app_config except AttributeError: # Use the default app config class if we didn't find anything. if app_config_class is None: app_config_class = cls app_name = entry else: entry = new_entry app_config_class = None # If import_string succeeds, entry is an app config class. if app_config_class is None: try: app_config_class = import_string(entry) except Exception: pass # If both import_module and import_string failed, it means that entry # doesn't have a valid value. if app_module is None and app_config_class is None: # If the last component of entry starts with an uppercase letter, # then it was likely intended to be an app config class; if not, # an app module. Provide a nice error message in both cases. mod_path, _, cls_name = entry.rpartition('.') if mod_path and cls_name[0].isupper(): # We could simply re-trigger the string import exception, but # we're going the extra mile and providing a better error # message for typos in INSTALLED_APPS. # This may raise ImportError, which is the best exception # possible if the module at mod_path cannot be imported. mod = import_module(mod_path) candidates = [ repr(name) for name, candidate in inspect.getmembers( mod, inspect.isclass) if issubclass(candidate, cls) and candidate is not cls ] msg = "Module '%s' does not contain a '%s' class." % (mod_path, cls_name) if candidates: msg += ' Choices are: %s.' % ', '.join(candidates) raise ImportError(msg) else: # Re-trigger the module import exception. import_module(entry) # Check for obvious errors. (This check prevents duck typing, but # it could be removed if it became a problem in practice.) if not issubclass(app_config_class, AppConfig): raise ImproperlyConfigured("'%s' isn't a subclass of AppConfig." % entry) # Obtain app name here rather than in AppClass.__init__ to keep # all error checking for entries in INSTALLED_APPS in one place. if app_name is None: try: app_name = app_config_class.name except AttributeError: raise ImproperlyConfigured( "'%s' must supply a name attribute." % entry) # Ensure app_name points to a valid module. try: app_module = import_module(app_name) except ImportError: raise ImproperlyConfigured( "Cannot import '%s'. Check that '%s.%s.name' is correct." % ( app_name, app_config_class.__module__, app_config_class.__qualname__, )) # Adjust app config dependencies app_config = app_config_class(app_name, app_module) if app_config.dependencies: for dep in app_config.dependencies: if dep not in registry.app_configs: registry.app_configs[dep] = cls.create(dep, registry) # Entry is a path to an app config class. return app_config
def load_backend(path): return import_string(path)()
def load_engine(cls, engine): if isinstance(engine, str): engine = import_string(engine) e = engine() cls.engines.append(e) return e
def get_storage_class(import_path=None): return import_string(import_path or settings.DEFAULT_FILE_STORAGE)