From d5104b63a3f17f4739325dc13b29ce1e6a013ef1 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Tue, 22 Dec 2009 06:08:15 +0000 Subject: [PATCH] [soc2009/multidb] Merged up to trunk r11938. git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/multidb@11939 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/loading.py | 23 ++++++++++++------- tests/modeltests/defer/models.py | 6 ----- tests/regressiontests/defer_regress/models.py | 13 +++++++---- tests/regressiontests/test_runner/tests.py | 14 +++++------ 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/django/db/models/loading.py b/django/db/models/loading.py index f86b691cc9..fbded9afd2 100644 --- a/django/db/models/loading.py +++ b/django/db/models/loading.py @@ -132,7 +132,7 @@ class AppCache(object): self._populate() return self.app_errors - def get_models(self, app_mod=None, include_auto_created=False): + def get_models(self, app_mod=None, include_auto_created=False, include_deferred=False): """ Given a module containing models, returns a list of the models. Otherwise returns a list of all installed models. @@ -140,21 +140,28 @@ class AppCache(object): By default, auto-created models (i.e., m2m models without an explicit intermediate table) are not included. However, if you specify include_auto_created=True, they will be. + + By default, models created to satisfy deferred attribute + queries are *not* included in the list of models. However, if + you specify include_deferred, they will be. """ - cache_key = (app_mod, include_auto_created) + cache_key = (app_mod, include_auto_created, include_deferred) try: return self._get_models_cache[cache_key] except KeyError: pass self._populate() if app_mod: - model_list = self.app_models.get(app_mod.__name__.split('.')[-2], SortedDict()).values() + app_list = [self.app_models.get(app_mod.__name__.split('.')[-2], SortedDict())] else: - model_list = [] - for app_entry in self.app_models.itervalues(): - model_list.extend(app_entry.values()) - if not include_auto_created: - model_list = filter(lambda o: not o._meta.auto_created, model_list) + app_list = self.app_models.itervalues() + model_list = [] + for app in app_list: + model_list.extend( + model for model in app.values() + if ((not model._deferred or include_deferred) + and (not model._meta.auto_created or include_auto_created)) + ) self._get_models_cache[cache_key] = model_list return model_list diff --git a/tests/modeltests/defer/models.py b/tests/modeltests/defer/models.py index 96eb427811..ac3c876a57 100644 --- a/tests/modeltests/defer/models.py +++ b/tests/modeltests/defer/models.py @@ -183,10 +183,4 @@ u"bar" >>> obj.name = "bb" >>> obj.save() -# Finally, we need to flush the app cache for the defer module. -# Using only/defer creates some artifical entries in the app cache -# that messes up later tests. Purge all entries, just to be sure. ->>> from django.db.models.loading import cache ->>> cache.app_models['defer'] = {} - """} diff --git a/tests/regressiontests/defer_regress/models.py b/tests/regressiontests/defer_regress/models.py index 90d975d14b..efd0226007 100644 --- a/tests/regressiontests/defer_regress/models.py +++ b/tests/regressiontests/defer_regress/models.py @@ -136,11 +136,14 @@ False >>> i2._deferred # Item must still be non-deferred False -# Finally, we need to flush the app cache for the defer module. -# Using only/defer creates some artifical entries in the app cache -# that messes up later tests. Purge all entries, just to be sure. ->>> from django.db.models.loading import cache ->>> cache.app_models['defer_regress'] = {} +# Regression for #11936 - loading.get_models should not return deferred models by default. +>>> from django.db.models.loading import get_models +>>> sorted(get_models(models.get_app('defer_regress')), key=lambda obj: obj.__class__.__name__) +[, , , ] + +>>> sorted(get_models(models.get_app('defer_regress'), include_deferred=True), key=lambda obj: obj.__class__.__name__) +[, , , , , , , , , , , ] """ } + diff --git a/tests/regressiontests/test_runner/tests.py b/tests/regressiontests/test_runner/tests.py index af8a29328a..d8db7baf94 100644 --- a/tests/regressiontests/test_runner/tests.py +++ b/tests/regressiontests/test_runner/tests.py @@ -4,25 +4,25 @@ Tests for django test runner import StringIO import unittest import django -from django.test import TestCase, TransactionTestCase, simple +from django.test import simple + +class DjangoTestRunnerTests(unittest.TestCase): -class DjangoTestRunnerTests(TestCase): - def test_failfast(self): - class MockTestOne(TransactionTestCase): + class MockTestOne(unittest.TestCase): def runTest(self): assert False - class MockTestTwo(TransactionTestCase): + class MockTestTwo(unittest.TestCase): def runTest(self): assert False - + suite = unittest.TestSuite([MockTestOne(), MockTestTwo()]) mock_stream = StringIO.StringIO() dtr = simple.DjangoTestRunner(verbosity=0, failfast=False, stream=mock_stream) result = dtr.run(suite) self.assertEqual(2, result.testsRun) self.assertEqual(2, len(result.failures)) - + dtr = simple.DjangoTestRunner(verbosity=0, failfast=True, stream=mock_stream) result = dtr.run(suite) self.assertEqual(1, result.testsRun)