mirror of
https://github.com/django/django.git
synced 2025-07-06 18:59:13 +00:00
[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
This commit is contained in:
parent
ab037f2b8d
commit
06f15e49b8
@ -1,9 +1,11 @@
|
|||||||
class App(object):
|
class App(object):
|
||||||
def __init__(self, name, models):
|
def __init__(self, label):
|
||||||
# fully qualified name (e.g. 'django.contrib.auth')
|
if '.' in label:
|
||||||
self.name = name
|
label = label.split('.')[-1]
|
||||||
self.label = name.split('.')[-1]
|
self.label = label
|
||||||
self.models = models
|
self.errors = {}
|
||||||
|
self.models = []
|
||||||
|
self.models_module = None
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '<App: %s>' % self.name
|
return '<App: %s>' % self.label
|
||||||
|
@ -46,6 +46,9 @@ class AppCache(object):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.__dict__ = self.__shared_state
|
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):
|
def _populate(self):
|
||||||
"""
|
"""
|
||||||
@ -103,9 +106,17 @@ class AppCache(object):
|
|||||||
self.nesting_level -= 1
|
self.nesting_level -= 1
|
||||||
if models not in self.app_store:
|
if models not in self.app_store:
|
||||||
self.app_store[models] = len(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
|
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):
|
def app_cache_ready(self):
|
||||||
"""
|
"""
|
||||||
Returns true if the model cache is fully populated.
|
Returns true if the model cache is fully populated.
|
||||||
@ -149,7 +160,9 @@ class AppCache(object):
|
|||||||
def get_app_errors(self):
|
def get_app_errors(self):
|
||||||
"Returns the map of known problems with the INSTALLED_APPS."
|
"Returns the map of known problems with the INSTALLED_APPS."
|
||||||
self._populate()
|
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):
|
def get_models(self, app_mod=None, include_auto_created=False, include_deferred=False):
|
||||||
"""
|
"""
|
||||||
@ -173,11 +186,13 @@ class AppCache(object):
|
|||||||
if app_mod:
|
if app_mod:
|
||||||
app_list = [self.app_models.get(app_mod.__name__.split('.')[-2], SortedDict())]
|
app_list = [self.app_models.get(app_mod.__name__.split('.')[-2], SortedDict())]
|
||||||
else:
|
else:
|
||||||
app_list = self.app_models.itervalues()
|
#app_list = self.app_models.itervalues()
|
||||||
|
app_list = self.app_instances
|
||||||
model_list = []
|
model_list = []
|
||||||
for app in app_list:
|
for app in app_list:
|
||||||
|
models = app.models
|
||||||
model_list.extend(
|
model_list.extend(
|
||||||
model for model in app.values()
|
model for model in models#app.values()
|
||||||
if ((not model._deferred or include_deferred)
|
if ((not model._deferred or include_deferred)
|
||||||
and (not model._meta.auto_created or include_auto_created))
|
and (not model._meta.auto_created or include_auto_created))
|
||||||
)
|
)
|
||||||
@ -193,12 +208,22 @@ class AppCache(object):
|
|||||||
"""
|
"""
|
||||||
if seed_cache:
|
if seed_cache:
|
||||||
self._populate()
|
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):
|
def register_models(self, app_label, *models):
|
||||||
"""
|
"""
|
||||||
Register a set of models as belonging to an app.
|
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:
|
for model in models:
|
||||||
# Store as 'name: model' pair in a dictionary
|
# Store as 'name: model' pair in a dictionary
|
||||||
# in the app_models dictionary
|
# in the app_models dictionary
|
||||||
@ -216,6 +241,7 @@ class AppCache(object):
|
|||||||
if os.path.splitext(fname1)[0] == os.path.splitext(fname2)[0]:
|
if os.path.splitext(fname1)[0] == os.path.splitext(fname2)[0]:
|
||||||
continue
|
continue
|
||||||
model_dict[model_name] = model
|
model_dict[model_name] = model
|
||||||
|
app.models.append(model)
|
||||||
self._get_models_cache.clear()
|
self._get_models_cache.clear()
|
||||||
|
|
||||||
cache = AppCache()
|
cache = AppCache()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user