Fixed #18990 -- Loaddata now complains if fixture doesn't exist

If the fixture doesn't exist, loaddata will output a warning.

The fixture named "initial_data" is exceptional though; if it
doesn't exist, the warning is not emitted. This allows syncdb and
flush management commands to attempt to load it without causing
spurious warnings.

Thanks to Derega, ptone, dirigeant and d1ffuz0r for contributions
to the ticket.
This commit is contained in:
Senko Rasic 2013-05-19 11:20:10 +02:00
parent cc3b3ba93a
commit c44a2c40fe
4 changed files with 20 additions and 9 deletions

View File

@ -4,6 +4,7 @@ import os
import gzip
import zipfile
from optparse import make_option
import warnings
from django.conf import settings
from django.core import serializers
@ -169,7 +170,7 @@ class Command(BaseCommand):
label_found = label_found or found
if fixture_name != 'initial_data' and not label_found:
raise CommandError("No fixture named '%s' found." % fixture_name)
warnings.warn("No fixture named '%s' found." % fixture_name)
def process_dir(self, fixture_dir, fixture_name, compression_formats,
serialization_formats):

View File

@ -1,5 +1,7 @@
from __future__ import absolute_import
import warnings
from django.contrib.sites.models import Site
from django.core import management
from django.db import connection, IntegrityError
@ -137,14 +139,18 @@ class FixtureLoadingTests(DumpDataAssertMixin, TestCase):
'<Book: Music for all ages by Artist formerly known as "Prince" and Django Reinhardt>'
])
# Loading a fixture that doesn't exist results in an error
with self.assertRaises(management.CommandError):
# Loading a fixture that doesn't exist emits a warning
with warnings.catch_warnings(record=True) as w:
management.call_command('loaddata', 'unknown.json', verbosity=0,
commit=False)
self.assertEqual(len(w), 1)
self.assertTrue(w[0].message, "No fixture named 'unknown' found.")
# An attempt to load a nonexistent 'initial_data' fixture isn't an error
management.call_command('loaddata', 'initial_data.json', verbosity=0,
commit=False)
with warnings.catch_warnings(record=True) as w:
management.call_command('loaddata', 'initial_data.json', verbosity=0,
commit=False)
self.assertEqual(len(w), 0)
# object list is unaffected
self.assertQuerysetEqual(Article.objects.all(), [
@ -279,10 +285,10 @@ class FixtureLoadingTests(DumpDataAssertMixin, TestCase):
def test_unmatched_identifier_loading(self):
# Try to load db fixture 3. This won't load because the database identifier doesn't match
with self.assertRaises(management.CommandError):
with warnings.catch_warnings(record=True):
management.call_command('loaddata', 'db_fixture_3', verbosity=0, commit=False)
with self.assertRaises(management.CommandError):
with warnings.catch_warnings(record=True):
management.call_command('loaddata', 'db_fixture_3', verbosity=0, using='default', commit=False)
self.assertQuerysetEqual(Article.objects.all(), [])

View File

@ -100,7 +100,10 @@ class FixtureTestCase(TestCase):
)
# Load a fixture that doesn't exist
management.call_command("loaddata", "unknown.json", verbosity=0, commit=False)
import warnings
with warnings.catch_warnings(record=True):
management.call_command("loaddata", "unknown.json", verbosity=0, commit=False)
self.assertQuerysetEqual(
Article.objects.all(), [
"Django conquers world!",

View File

@ -441,7 +441,8 @@ class TestFixtures(TestCase):
def test_loaddata_not_existant_fixture_file(self):
stdout_output = StringIO()
with self.assertRaises(management.CommandError):
import warnings
with warnings.catch_warnings(record=True):
management.call_command(
'loaddata',
'this_fixture_doesnt_exist',