mirror of
https://github.com/django/django.git
synced 2024-11-18 15:34:16 +00:00
8662654d6d
Since the original ones in django.db.models.loading were kept only for backwards compatibility, there's no need to recreate them. However, many internals of Django still relied on them. They were also imported in django.db.models. They never appear in the documentation, except a quick mention of get_models and get_app in the 1.2 release notes to document an edge case in GIS. I don't think that makes them a public API. This commit doesn't change the overall amount of global state but clarifies that it's tied to the app_cache object instead of hiding it behind half a dozen functions.
66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
from __future__ import unicode_literals
|
|
|
|
import os
|
|
import sys
|
|
|
|
from django.apps import app_cache
|
|
from django.conf import settings
|
|
from django.core.management import call_command
|
|
from django.test import TestCase, TransactionTestCase
|
|
from django.test.utils import override_settings
|
|
from django.utils._os import upath
|
|
|
|
from .models import (ConcreteModel, ConcreteModelSubclass,
|
|
ConcreteModelSubclassProxy)
|
|
|
|
|
|
@override_settings(INSTALLED_APPS=('app1', 'app2'))
|
|
class ProxyModelInheritanceTests(TransactionTestCase):
|
|
"""
|
|
Proxy model inheritance across apps can result in migrate not creating the table
|
|
for the proxied model (as described in #12286). This test creates two dummy
|
|
apps and calls migrate, then verifies that the table has been created.
|
|
"""
|
|
|
|
available_apps = []
|
|
|
|
def setUp(self):
|
|
self.old_sys_path = sys.path[:]
|
|
sys.path.append(os.path.dirname(os.path.abspath(upath(__file__))))
|
|
for app in settings.INSTALLED_APPS:
|
|
app_cache.load_app(app)
|
|
|
|
def tearDown(self):
|
|
sys.path = self.old_sys_path
|
|
del app_cache.app_labels['app1']
|
|
del app_cache.app_labels['app2']
|
|
del app_cache.app_models['app1']
|
|
del app_cache.app_models['app2']
|
|
|
|
def test_table_exists(self):
|
|
try:
|
|
app_cache.set_available_apps(settings.INSTALLED_APPS)
|
|
call_command('migrate', verbosity=0)
|
|
finally:
|
|
app_cache.unset_available_apps()
|
|
from .app1.models import ProxyModel
|
|
from .app2.models import NiceModel
|
|
self.assertEqual(NiceModel.objects.all().count(), 0)
|
|
self.assertEqual(ProxyModel.objects.all().count(), 0)
|
|
|
|
|
|
class MultiTableInheritanceProxyTest(TestCase):
|
|
|
|
def test_model_subclass_proxy(self):
|
|
"""
|
|
Deleting an instance of a model proxying a multi-table inherited
|
|
subclass should cascade delete down the whole inheritance chain (see
|
|
#18083).
|
|
|
|
"""
|
|
instance = ConcreteModelSubclassProxy.objects.create()
|
|
instance.delete()
|
|
self.assertEqual(0, ConcreteModelSubclassProxy.objects.count())
|
|
self.assertEqual(0, ConcreteModelSubclass.objects.count())
|
|
self.assertEqual(0, ConcreteModel.objects.count())
|