Fixed #21551 -- Reenabled loading fixtures from subdirectory

This was a regression in Django 1.6 that was only partially
restored in 839940f27f.
Thanks Jonas Haag for the report.
This commit is contained in:
Claude Paroz 2013-12-05 22:55:33 +01:00
parent 8a9c8bb907
commit 41ebc4838d
4 changed files with 26 additions and 9 deletions

View File

@ -178,11 +178,15 @@ class Command(BaseCommand):
if self.verbosity >= 2: if self.verbosity >= 2:
self.stdout.write("Loading '%s' fixtures..." % fixture_name) self.stdout.write("Loading '%s' fixtures..." % fixture_name)
if os.path.sep in fixture_name: if os.path.isabs(fixture_name):
fixture_dirs = [os.path.dirname(fixture_name)] fixture_dirs = [os.path.dirname(fixture_name)]
fixture_name = os.path.basename(fixture_name) fixture_name = os.path.basename(fixture_name)
else: else:
fixture_dirs = self.fixture_dirs fixture_dirs = self.fixture_dirs
if os.path.sep in fixture_name:
fixture_dirs = [os.path.join(dir_, os.path.dirname(fixture_name))
for dir_ in fixture_dirs]
fixture_name = os.path.basename(fixture_name)
suffixes = ('.'.join(ext for ext in combo if ext) suffixes = ('.'.join(ext for ext in combo if ext)
for combo in product(databases, ser_fmts, cmp_fmts)) for combo in product(databases, ser_fmts, cmp_fmts))

View File

@ -28,7 +28,8 @@ Bug fixes
* Fixed ``django.contrib.humanize`` translations where the unicode sequence * Fixed ``django.contrib.humanize`` translations where the unicode sequence
for the non-breaking space was returned verbatim (#21415). for the non-breaking space was returned verbatim (#21415).
* Fixed :djadmin:`loaddata` error when fixture file name contained any dots * Fixed :djadmin:`loaddata` error when fixture file name contained any dots
non related to file extensions (#21457). non related to file extensions (#21457) or when fixture path was relative
but located in a subdirectory (#21551).
* Fixed display of inline instances in formsets when parent has 0 for primary * Fixed display of inline instances in formsets when parent has 0 for primary
key (#21472). key (#21472).
* Fixed a regression where custom querysets for foreign keys were overwritten * Fixed a regression where custom querysets for foreign keys were overwritten

View File

@ -0,0 +1,9 @@
[
{
"pk": "1",
"model": "fixtures_regress.absolute",
"fields": {
"name": "Load Absolute Path Test"
}
}
]

View File

@ -2,6 +2,7 @@
# Unittests for fixtures. # Unittests for fixtures.
from __future__ import unicode_literals from __future__ import unicode_literals
import json
import os import os
import re import re
import warnings import warnings
@ -19,12 +20,13 @@ from django.utils.encoding import force_text
from django.utils._os import upath from django.utils._os import upath
from django.utils import six from django.utils import six
from django.utils.six import PY3, StringIO from django.utils.six import PY3, StringIO
import json
from .models import (Animal, Stuff, Absolute, Parent, Child, Article, Widget, from .models import (Animal, Stuff, Absolute, Parent, Child, Article, Widget,
Store, Person, Book, NKChild, RefToNKChild, Circle1, Circle2, Circle3, Store, Person, Book, NKChild, RefToNKChild, Circle1, Circle2, Circle3,
ExternalDependency, Thingy) ExternalDependency, Thingy)
_cur_dir = os.path.dirname(os.path.abspath(upath(__file__)))
class TestFixtures(TestCase): class TestFixtures(TestCase):
@ -150,12 +152,11 @@ class TestFixtures(TestCase):
) )
self.assertEqual(Absolute.objects.count(), 1) self.assertEqual(Absolute.objects.count(), 1)
def test_relative_path(self): def test_relative_path(self, path=['fixtures', 'absolute.json']):
directory = os.path.dirname(upath(__file__)) relative_path = os.path.join(*path)
relative_path = os.path.join('fixtures', 'absolute.json')
cwd = os.getcwd() cwd = os.getcwd()
try: try:
os.chdir(directory) os.chdir(_cur_dir)
management.call_command( management.call_command(
'loaddata', 'loaddata',
relative_path, relative_path,
@ -165,6 +166,10 @@ class TestFixtures(TestCase):
os.chdir(cwd) os.chdir(cwd)
self.assertEqual(Absolute.objects.count(), 1) self.assertEqual(Absolute.objects.count(), 1)
@override_settings(FIXTURE_DIRS=[os.path.join(_cur_dir, 'fixtures_1')])
def test_relative_path_in_fixture_dirs(self):
self.test_relative_path(path=['inner', 'absolute.json'])
def test_path_containing_dots(self): def test_path_containing_dots(self):
management.call_command( management.call_command(
'loaddata', 'loaddata',
@ -424,8 +429,6 @@ class TestFixtures(TestCase):
verbosity=0, verbosity=0,
) )
_cur_dir = os.path.dirname(os.path.abspath(upath(__file__)))
@override_settings(FIXTURE_DIRS=[os.path.join(_cur_dir, 'fixtures_1'), @override_settings(FIXTURE_DIRS=[os.path.join(_cur_dir, 'fixtures_1'),
os.path.join(_cur_dir, 'fixtures_2')]) os.path.join(_cur_dir, 'fixtures_2')])
def test_loaddata_forward_refs_split_fixtures(self): def test_loaddata_forward_refs_split_fixtures(self):