Commit 45c0d2e1 authored by Claude Paroz's avatar Claude Paroz
Browse files

[1.6.x] Fixed #21551 -- Reenabled loading fixtures from subdirectory

This was a regression in Django 1.6 that was only partially
restored in 839940f2.
Thanks Jonas Haag for the report.
Backport of 41ebc483 from master.
parent 34c4b93c
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -175,11 +175,15 @@ class Command(BaseCommand):
        if self.verbosity >= 2:
            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_name = os.path.basename(fixture_name)
        else:
            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)
                for combo in product(databases, ser_fmts, cmp_fmts))
+2 −1
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@ Bug fixes
* Fixed ``django.contrib.humanize`` translations where the unicode sequence
  for the non-breaking space was returned verbatim (#21415).
* 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
  key (#21472).
* Fixed a regression where custom querysets for foreign keys were overwritten
+9 −0
Original line number Diff line number Diff line
[
    {
        "pk": "1",
        "model": "fixtures_regress.absolute",
        "fields": {
            "name": "Load Absolute Path Test"
        }
    }
]
+10 −7
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
# Unittests for fixtures.
from __future__ import absolute_import, unicode_literals

import json
import os
import re
import warnings
@@ -19,12 +20,13 @@ from django.utils.encoding import force_text
from django.utils._os import upath
from django.utils import six
from django.utils.six import PY3, StringIO
import json

from .models import (Animal, Stuff, Absolute, Parent, Child, Article, Widget,
    Store, Person, Book, NKChild, RefToNKChild, Circle1, Circle2, Circle3,
    ExternalDependency, Thingy)

_cur_dir = os.path.dirname(os.path.abspath(upath(__file__)))


class TestFixtures(TestCase):

@@ -150,12 +152,11 @@ class TestFixtures(TestCase):
        )
        self.assertEqual(Absolute.objects.count(), 1)

    def test_relative_path(self):
        directory = os.path.dirname(upath(__file__))
        relative_path = os.path.join('fixtures', 'absolute.json')
    def test_relative_path(self, path=['fixtures', 'absolute.json']):
        relative_path = os.path.join(*path)
        cwd = os.getcwd()
        try:
            os.chdir(directory)
            os.chdir(_cur_dir)
            management.call_command(
                'loaddata',
                relative_path,
@@ -165,6 +166,10 @@ class TestFixtures(TestCase):
            os.chdir(cwd)
        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):
        management.call_command(
            'loaddata',
@@ -412,8 +417,6 @@ class TestFixtures(TestCase):
                verbosity=0,
            )

    _cur_dir = os.path.dirname(os.path.abspath(upath(__file__)))

    @override_settings(FIXTURE_DIRS=[os.path.join(_cur_dir, 'fixtures_1'),
                                     os.path.join(_cur_dir, 'fixtures_2')])
    def test_loaddata_forward_refs_split_fixtures(self):