diff options
author | Arthur Koziel <arthur@arthurkoziel.com> | 2010-08-11 01:39:37 +0000 |
---|---|---|
committer | Arthur Koziel <arthur@arthurkoziel.com> | 2010-08-11 01:39:37 +0000 |
commit | 2b7bfaccf2d9b9f19595e8024620ee988d1305e7 (patch) | |
tree | 5d0ab78182ad7507dc010b5b65a043a9518bb072 | |
parent | 9cf522e6932213b75742f7be70153a27492c4424 (diff) | |
download | django-2b7bfaccf2d9b9f19595e8024620ee988d1305e7.tar.gz |
[soc2010/app-loading] load custom models if specified with models_path attribute
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/app-loading@13570 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r-- | django/core/apps.py | 14 | ||||
-rw-r--r-- | tests/appcachetests/model_app/__init__.py | 8 | ||||
-rw-r--r-- | tests/appcachetests/model_app/othermodels.py | 5 | ||||
-rw-r--r-- | tests/appcachetests/runtests.py | 17 |
4 files changed, 34 insertions, 10 deletions
diff --git a/django/core/apps.py b/django/core/apps.py index 850621fc85..9535e08822 100644 --- a/django/core/apps.py +++ b/django/core/apps.py @@ -25,7 +25,6 @@ class App(object): # errors raised when trying to import the app self.errors = [] self.models = [] - self.models_module = None def __repr__(self): return '<App: %s>' % self.name @@ -112,8 +111,15 @@ class AppCache(object): app_instance = app_class(app_instance_name) self.app_instances.append(app_instance) + # check if the app instance specifies a path to models + # if not, we use the models.py file from the package dir try: - models = import_module('.models', app_name) + models_path = app_instance.models_path + except AttributeError: + models_path = '%s.models' % app_name + + try: + models = import_module(models_path) except ImportError: self.nesting_level -= 1 # If the app doesn't have a models module, we can just ignore the @@ -135,9 +141,7 @@ class AppCache(object): raise self.nesting_level -= 1 - app = self.find_app(app_name.split('.')[-1]) - if app and models is not app.models_module: - app.models_module = models + app_instance.models_module = models return models def find_app(self, name): diff --git a/tests/appcachetests/model_app/__init__.py b/tests/appcachetests/model_app/__init__.py index e69de29bb2..214e438e38 100644 --- a/tests/appcachetests/model_app/__init__.py +++ b/tests/appcachetests/model_app/__init__.py @@ -0,0 +1,8 @@ +from django.core.apps import App + +class MyApp(App): + models_path = 'model_app.othermodels' + + def __repr__(self): + return '<MyApp: %s>' % self.name + diff --git a/tests/appcachetests/model_app/othermodels.py b/tests/appcachetests/model_app/othermodels.py new file mode 100644 index 0000000000..ffb04e89c4 --- /dev/null +++ b/tests/appcachetests/model_app/othermodels.py @@ -0,0 +1,5 @@ +from django.db import models + +class Person(models.Model): + first_name = models.CharField(max_length=30) + last_name = models.CharField(max_length=30) diff --git a/tests/appcachetests/runtests.py b/tests/appcachetests/runtests.py index 83730cc4af..719e54f533 100644 --- a/tests/appcachetests/runtests.py +++ b/tests/appcachetests/runtests.py @@ -221,10 +221,9 @@ class LoadAppTests(AppCacheTestCase): app = cache.app_instances[0] self.assertEqual(len(cache.app_instances), 1) self.assertEqual(app.name, 'nomodel_app') - self.assertEqual(app.models_module, None) self.assertEqual(rv, None) - def test_load_app_custom(self): + def test_custom_app(self): """ Test that a custom app instance is created if the function gets passed a classname @@ -235,10 +234,18 @@ class LoadAppTests(AppCacheTestCase): self.assertEqual(len(cache.app_instances), 1) self.assertEqual(app.name, 'nomodel_app') self.assertTrue(isinstance(app, MyApp)) - self.assertEqual(app.models_module, None) self.assertEqual(rv, None) - def test_load_app_twice(self): + def test_custom_models_path(self): + """ + Test that custom models are imported correctly + """ + rv = cache.load_app('model_app.MyApp') + app = cache.app_instances[0] + self.assertEqual(app.models_module.__name__, 'model_app.othermodels') + self.assertEqual(rv.__name__, 'model_app.othermodels') + + def test_twice(self): """ Test that loading an app twice results in only one app instance """ @@ -248,7 +255,7 @@ class LoadAppTests(AppCacheTestCase): self.assertEqual(rv.__name__, 'model_app.models') self.assertEqual(rv2.__name__, 'model_app.models') - def test_load_app_importerror(self): + def test_importerror(self): """ Test that an ImportError exception is raised if a package cannot be imported |