From 2b7bfaccf2d9b9f19595e8024620ee988d1305e7 Mon Sep 17 00:00:00 2001 From: Arthur Koziel Date: Wed, 11 Aug 2010 01:39:37 +0000 Subject: [PATCH] [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 --- django/core/apps.py | 14 +++++++++----- tests/appcachetests/model_app/__init__.py | 8 ++++++++ tests/appcachetests/model_app/othermodels.py | 5 +++++ tests/appcachetests/runtests.py | 17 ++++++++++++----- 4 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 tests/appcachetests/model_app/othermodels.py 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 '' % 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 '' % 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