summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Koziel <arthur@arthurkoziel.com>2010-06-28 20:22:42 +0000
committerArthur Koziel <arthur@arthurkoziel.com>2010-06-28 20:22:42 +0000
commit06f15e49b8a3973ff32b635a0b41bd18c2f2799e (patch)
tree0edbcaf47d2698f33bb993ee64c099cda042015a
parentab037f2b8df241a1ae3b31542cf1f58e2a50daf2 (diff)
downloaddjango-06f15e49b8a3973ff32b635a0b41bd18c2f2799e.tar.gz
[soc2010/app-loading] save models in app; adjust get_model/get_models
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/app-loading@13403 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/core/apps.py14
-rw-r--r--django/db/models/loading.py36
2 files changed, 39 insertions, 11 deletions
diff --git a/django/core/apps.py b/django/core/apps.py
index 5c2844e036..0b4e6924ba 100644
--- a/django/core/apps.py
+++ b/django/core/apps.py
@@ -1,9 +1,11 @@
class App(object):
- def __init__(self, name, models):
- # fully qualified name (e.g. 'django.contrib.auth')
- self.name = name
- self.label = name.split('.')[-1]
- self.models = models
+ def __init__(self, label):
+ if '.' in label:
+ label = label.split('.')[-1]
+ self.label = label
+ self.errors = {}
+ self.models = []
+ self.models_module = None
def __repr__(self):
- return '<App: %s>' % self.name
+ return '<App: %s>' % self.label
diff --git a/django/db/models/loading.py b/django/db/models/loading.py
index d01e33b411..6009d41c58 100644
--- a/django/db/models/loading.py
+++ b/django/db/models/loading.py
@@ -46,6 +46,9 @@ class AppCache(object):
def __init__(self):
self.__dict__ = self.__shared_state
+ # Create App instances for the apps in INSTALLED_APPS
+ for app_name in settings.INSTALLED_APPS:
+ self.app_instances.append(App(app_name))
def _populate(self):
"""
@@ -103,9 +106,17 @@ class AppCache(object):
self.nesting_level -= 1
if models not in self.app_store:
self.app_store[models] = len(self.app_store)
- self.app_instances.append(App(app_name, models))
+ app = self.find_app(app_name.split('.')[-1])
+ if app:
+ app.models_module = models
return models
+ def find_app(self, app_label):
+ "Returns the App instance that matches app_label"
+ for app in self.app_instances:
+ if app.label == app_label:
+ return app
+
def app_cache_ready(self):
"""
Returns true if the model cache is fully populated.
@@ -149,7 +160,9 @@ class AppCache(object):
def get_app_errors(self):
"Returns the map of known problems with the INSTALLED_APPS."
self._populate()
- return self.app_errors
+ for app in app_instances:
+ self.app_errors.update(app.errors)
+ return errors
def get_models(self, app_mod=None, include_auto_created=False, include_deferred=False):
"""
@@ -173,11 +186,13 @@ class AppCache(object):
if app_mod:
app_list = [self.app_models.get(app_mod.__name__.split('.')[-2], SortedDict())]
else:
- app_list = self.app_models.itervalues()
+ #app_list = self.app_models.itervalues()
+ app_list = self.app_instances
model_list = []
for app in app_list:
+ models = app.models
model_list.extend(
- model for model in app.values()
+ model for model in models#app.values()
if ((not model._deferred or include_deferred)
and (not model._meta.auto_created or include_auto_created))
)
@@ -193,12 +208,22 @@ class AppCache(object):
"""
if seed_cache:
self._populate()
- return self.app_models.get(app_label, SortedDict()).get(model_name.lower())
+ app = self.find_app(app_label)
+ if app:
+ for model in app.models:
+ if model_name.lower() == model._meta.object_name.lower():
+ return model
def register_models(self, app_label, *models):
"""
Register a set of models as belonging to an app.
"""
+ # Create a new App instance if an app in INSTALLED_APPS
+ # imports another package that has models
+ app = self.find_app(app_label)
+ if not app:
+ app = App(app_label)
+ self.app_instances.append(app)
for model in models:
# Store as 'name: model' pair in a dictionary
# in the app_models dictionary
@@ -216,6 +241,7 @@ class AppCache(object):
if os.path.splitext(fname1)[0] == os.path.splitext(fname2)[0]:
continue
model_dict[model_name] = model
+ app.models.append(model)
self._get_models_cache.clear()
cache = AppCache()