diff options
author | Arthur Koziel <arthur@arthurkoziel.com> | 2010-06-28 20:22:42 +0000 |
---|---|---|
committer | Arthur Koziel <arthur@arthurkoziel.com> | 2010-06-28 20:22:42 +0000 |
commit | 06f15e49b8a3973ff32b635a0b41bd18c2f2799e (patch) | |
tree | 0edbcaf47d2698f33bb993ee64c099cda042015a | |
parent | ab037f2b8df241a1ae3b31542cf1f58e2a50daf2 (diff) | |
download | django-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.py | 14 | ||||
-rw-r--r-- | django/db/models/loading.py | 36 |
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() |