Moved list of models inside AppConfig instances.

This commit is a refactoring with no change of functionality, according
to the following invariants:

- An app_label that was in app_configs and app_models stays in
  app_config and has its 'installed' attribute set to True.

- An app_label that was in app_models but not in app_configs is added to
  app_configs and has its 'installed' attribute set to True.

As a consequence, all the code that iterated on app_configs is modified
to check for the 'installed' attribute. Code that iterated on app_models
is rewritten in terms of app_configs.

Many tests that stored and restored the state of the app cache were
updated.

In the long term, we should reconsider the usefulness of allowing
importing models from non-installed applications. This doesn't sound
particularly useful, can be a trap in some circumstances, and causes
significant complexity in sensitive areas of Django.
This commit is contained in:
Aymeric Augustin 2013-12-12 21:34:39 +01:00
parent 2c9e84af4a
commit b55282b98b
10 changed files with 87 additions and 73 deletions

View file

@ -1,5 +1,4 @@
from __future__ import unicode_literals
import copy
from django.apps import app_cache
from django.contrib import admin
@ -155,12 +154,11 @@ class ProxyModelTests(TestCase):
@override_settings(TEST_SWAPPABLE_MODEL='proxy_models.AlternateModel')
def test_swappable(self):
try:
# This test adds dummy applications to the app cache. These
# need to be removed in order to prevent bad interactions
# with the flush operation in other tests.
old_app_models = copy.deepcopy(app_cache.app_models)
# The models need to be removed after the test in order to prevent bad
# interactions with the flush operation in other tests.
_old_models = app_cache.app_configs['proxy_models'].models.copy()
try:
class SwappableModel(models.Model):
class Meta:
@ -176,7 +174,8 @@ class ProxyModelTests(TestCase):
class Meta:
proxy = True
finally:
app_cache.app_models = old_app_models
app_cache.app_configs['proxy_models'].models = _old_models
app_cache._get_models_cache = {}
def test_myperson_manager(self):
Person.objects.create(name="fred")