From 429e1a41dcb7f6e39208053bbd837ee307347ad8 Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Fri, 4 Dec 2015 14:44:50 +0000 Subject: [PATCH] Try to detect the autoconfig module without importing the app, and hence triggering imports in apps that don't support autoconfig. Fixes #23 --- django_autoconfig/autoconfig.py | 26 ++++++++++++---------- django_autoconfig/tests/test_autoconfig.py | 9 -------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/django_autoconfig/autoconfig.py b/django_autoconfig/autoconfig.py index 0f6cfd9..f8d4511 100644 --- a/django_autoconfig/autoconfig.py +++ b/django_autoconfig/autoconfig.py @@ -7,6 +7,7 @@ from django.conf.urls import include, patterns, url from django.utils.functional import Promise from django.utils.module_loading import module_has_submodule +import imp import importlib import operator @@ -15,13 +16,6 @@ MAX_ITERATIONS = 1000 -SETTINGS = { - 'AUTOCONFIG_DISABLED_APPS': [ - 'django.contrib.admin', - 'django.contrib.auth', - ], -} - class OrderingRelationship(object): ''' This class defines a relationship between an element in a setting @@ -144,6 +138,18 @@ def merge_dictionaries(current, new, only_defaults=False, template_special_case= changes += 1 return changes +def autoconfig_module_exists(app_name): + names = app_name.split('.') + path = None + for name in names: + _, path, _ = imp.find_module(name, path) + path = [path] + try: + imp.find_module('autoconfig', path) + return True + except ImportError: + return False + def configure_settings(settings, environment_settings=True): ''' Given a settings object, run automatic configuration of all @@ -158,12 +164,8 @@ def configure_settings(settings, environment_settings=True): if environment_settings: app_names.append('django_autoconfig.environment_settings') for app_name in app_names: - if app_name not in settings.get('AUTOCONFIG_DISABLED_APPS', ()): - app_module = importlib.import_module(app_name) - else: - app_module = None import django_autoconfig.contrib - if app_module and module_has_submodule(app_module, 'autoconfig'): + if autoconfig_module_exists(app_name): module = importlib.import_module("%s.autoconfig" % (app_name,)) elif app_name in django_autoconfig.contrib.CONTRIB_CONFIGS: module = django_autoconfig.contrib.CONTRIB_CONFIGS[app_name] diff --git a/django_autoconfig/tests/test_autoconfig.py b/django_autoconfig/tests/test_autoconfig.py index 9261489..1f69366 100644 --- a/django_autoconfig/tests/test_autoconfig.py +++ b/django_autoconfig/tests/test_autoconfig.py @@ -141,15 +141,6 @@ def test_importerror_from_import_error(self): autoconfig.configure_settings(self.settings_dict) self.assertIn('flibble', str(exception_manager.exception)) - def test_disabled_autoconfig(self): - ''' - Test the ability to disable autoconfig for some apps. - ''' - self.settings_dict['INSTALLED_APPS'] = ['django_autoconfig.tests.app_list'] - self.settings_dict['AUTOCONFIG_DISABLED_APPS'] = ['django_autoconfig.tests.app_list'] - autoconfig.configure_settings(self.settings_dict) - self.assertEqual(self.settings_dict['LIST_SETTING'], [1, 2]) - def test_contrib_autoconfig(self): ''' Test autoconfig provided by us instead of the app.