From 29341aaffc28866e15e11109b26c6446f39cb68d Mon Sep 17 00:00:00 2001 From: Karen Tracey Date: Thu, 15 Apr 2010 18:44:51 +0000 Subject: Fixed #13348: Restored ability to load models from apps in eggs. Thanks Ramiro and metzen for pointers on how to find out if a module loaded from an egg has a particular submodule. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12982 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/utils/module_loading.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 django/utils/module_loading.py (limited to 'django/utils/module_loading.py') diff --git a/django/utils/module_loading.py b/django/utils/module_loading.py new file mode 100644 index 0000000000..b23336e9df --- /dev/null +++ b/django/utils/module_loading.py @@ -0,0 +1,27 @@ +import os +import imp + +def module_has_submodule(mod, submod_name): + # If the module was loaded from an egg, __loader__ will be set and + # its find_module must be used to search for submodules. + loader = getattr(mod, '__loader__', None) + if loader: + mod_path = "%s.%s" % (mod.__name__, submod_name) + mod_path = mod_path[len(loader.prefix):] + x = loader.find_module(mod_path) + if x is None: + # zipimport.zipimporter.find_module is documented to take + # dotted paths but in fact through Pyton 2.7 is observed + # to require os.sep in place of dots...so try using os.sep + # if the dotted path version failed to find the requested + # submodule. + x = loader.find_module(mod_path.replace('.', os.sep)) + return x is not None + + try: + imp.find_module(submod_name, mod.__path__) + return True + except ImportError: + return False + + -- cgit v1.3