web/lib/django/core/management/commands/loaddata.py
author ymh <ymh.work@gmail.com>
Wed, 02 Jun 2010 18:57:35 +0200
changeset 38 77b6da96e6f1
permissions -rw-r--r--
update django
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
import sys
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
import os
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
import gzip
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
import zipfile
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from optparse import make_option
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from django.conf import settings
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from django.core import serializers
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
from django.core.management.base import BaseCommand
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
from django.core.management.color import no_style
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
from django.db import connections, router, transaction, DEFAULT_DB_ALIAS
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
from django.db.models import get_apps
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
from django.utils.itercompat import product
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    import bz2
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    has_bz2 = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
except ImportError:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    has_bz2 = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
class Command(BaseCommand):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    help = 'Installs the named fixture(s) in the database.'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    args = "fixture [fixture ...]"
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    option_list = BaseCommand.option_list + (
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
        make_option('--database', action='store', dest='database',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
            default=DEFAULT_DB_ALIAS, help='Nominates a specific database to load '
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
                'fixtures into. Defaults to the "default" database.'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    def handle(self, *fixture_labels, **options):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
        using = options.get('database', DEFAULT_DB_ALIAS)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
        connection = connections[using]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
        self.style = no_style()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        verbosity = int(options.get('verbosity', 1))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
        show_traceback = options.get('traceback', False)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
        # commit is a stealth option - it isn't really useful as
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        # a command line option, but it can be useful when invoking
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        # loaddata from within another script.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        # If commit=True, loaddata will use its own transaction;
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        # if commit=False, the data load SQL will become part of
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        # the transaction in place when loaddata was invoked.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        commit = options.get('commit', True)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        # Keep a count of the installed objects and fixtures
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        fixture_count = 0
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        object_count = 0
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        models = set()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        humanize = lambda dirname: dirname and "'%s'" % dirname or 'absolute path'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        # Get a cursor (even though we don't need one yet). This has
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        # the side effect of initializing the test database (if
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        # it isn't already initialized).
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        cursor = connection.cursor()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        # Start transaction management. All fixtures are installed in a
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        # single transaction to ensure that all references are resolved.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
        if commit:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
            transaction.commit_unless_managed(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
            transaction.enter_transaction_management(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
            transaction.managed(True, using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        class SingleZipReader(zipfile.ZipFile):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
            def __init__(self, *args, **kwargs):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
                zipfile.ZipFile.__init__(self, *args, **kwargs)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
                if settings.DEBUG:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
                    assert len(self.namelist()) == 1, "Zip-compressed fixtures must contain only one file."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
            def read(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
                return zipfile.ZipFile.read(self, self.namelist()[0])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
        compression_types = {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            None:   file,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
            'gz':   gzip.GzipFile,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
            'zip':  SingleZipReader
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
        }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
        if has_bz2:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
            compression_types['bz2'] = bz2.BZ2File
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        app_module_paths = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        for app in get_apps():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
            if hasattr(app, '__path__'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
                # It's a 'models/' subpackage
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
                for path in app.__path__:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
                    app_module_paths.append(path)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
            else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
                # It's a models.py module
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
                app_module_paths.append(app.__file__)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
        app_fixtures = [os.path.join(os.path.dirname(path), 'fixtures') for path in app_module_paths]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
        for fixture_label in fixture_labels:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
            parts = fixture_label.split('.')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
            if len(parts) > 1 and parts[-1] in compression_types:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
                compression_formats = [parts[-1]]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
                parts = parts[:-1]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
            else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
                compression_formats = compression_types.keys()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
            if len(parts) == 1:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
                fixture_name = parts[0]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
                formats = serializers.get_public_serializer_formats()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
            else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
                fixture_name, format = '.'.join(parts[:-1]), parts[-1]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
                if format in serializers.get_public_serializer_formats():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
                    formats = [format]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
                else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
                    formats = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
            if formats:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
                if verbosity > 1:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
                    print "Loading '%s' fixtures..." % fixture_name
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
            else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
                sys.stderr.write(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
                    self.style.ERROR("Problem installing fixture '%s': %s is not a known serialization format." %
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
                        (fixture_name, format)))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
                transaction.rollback(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
                transaction.leave_transaction_management(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
                return
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
            if os.path.isabs(fixture_name):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
                fixture_dirs = [fixture_name]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
            else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
                fixture_dirs = app_fixtures + list(settings.FIXTURE_DIRS) + ['']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
            for fixture_dir in fixture_dirs:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
                if verbosity > 1:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
                    print "Checking %s for fixtures..." % humanize(fixture_dir)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
                label_found = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
                for combo in product([using, None], formats, compression_formats):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
                    database, format, compression_format = combo
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
                    file_name = '.'.join(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
                        p for p in [
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
                            fixture_name, database, format, compression_format
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
                        ]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
                        if p
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
                    )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
                    if verbosity > 1:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
                        print "Trying %s for %s fixture '%s'..." % \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
                            (humanize(fixture_dir), file_name, fixture_name)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
                    full_path = os.path.join(fixture_dir, file_name)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
                    open_method = compression_types[compression_format]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
                    try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
                        fixture = open_method(full_path, 'r')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
                        if label_found:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
                            fixture.close()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
                            print self.style.ERROR("Multiple fixtures named '%s' in %s. Aborting." %
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
                                (fixture_name, humanize(fixture_dir)))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
                            transaction.rollback(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
                            transaction.leave_transaction_management(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
                            return
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
                        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
                            fixture_count += 1
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
                            objects_in_fixture = 0
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
                            if verbosity > 0:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
                                print "Installing %s fixture '%s' from %s." % \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
                                    (format, fixture_name, humanize(fixture_dir))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
                            try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
                                objects = serializers.deserialize(format, fixture, using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
                                for obj in objects:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
                                    if router.allow_syncdb(using, obj.object.__class__):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
                                        objects_in_fixture += 1
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
                                        models.add(obj.object.__class__)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
                                        obj.save(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
                                object_count += objects_in_fixture
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
                                label_found = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
                            except (SystemExit, KeyboardInterrupt):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
                                raise
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
                            except Exception:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
                                import traceback
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
                                fixture.close()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
                                transaction.rollback(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
                                transaction.leave_transaction_management(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
                                if show_traceback:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
                                    traceback.print_exc()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
                                else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
                                    sys.stderr.write(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
                                        self.style.ERROR("Problem installing fixture '%s': %s\n" %
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
                                             (full_path, ''.join(traceback.format_exception(sys.exc_type,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
                                                 sys.exc_value, sys.exc_traceback)))))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
                                return
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
                            fixture.close()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
                            # If the fixture we loaded contains 0 objects, assume that an
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
                            # error was encountered during fixture loading.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
                            if objects_in_fixture == 0:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
                                sys.stderr.write(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
                                    self.style.ERROR("No fixture data found for '%s'. (File format may be invalid.)" %
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
                                        (fixture_name)))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
                                transaction.rollback(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
                                transaction.leave_transaction_management(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
                                return
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
                    except Exception, e:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
                        if verbosity > 1:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
                            print "No %s fixture '%s' in %s." % \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
                                (format, fixture_name, humanize(fixture_dir))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
        # If we found even one object in a fixture, we need to reset the
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
        # database sequences.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
        if object_count > 0:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
            sequence_sql = connection.ops.sequence_reset_sql(self.style, models)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
            if sequence_sql:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
                if verbosity > 1:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
                    print "Resetting sequences"
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
                for line in sequence_sql:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
                    cursor.execute(line)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
        if commit:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
            transaction.commit(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
            transaction.leave_transaction_management(using=using)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
        if object_count == 0:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
            if verbosity > 0:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
                print "No fixtures found."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
            if verbosity > 0:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
                print "Installed %d object(s) from %d fixture(s)" % (object_count, fixture_count)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
        # Close the DB connection. This is required as a workaround for an
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
        # edge case in MySQL: if the same connection is used to
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
        # create tables, load data, and query, the query can return
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
        # incorrect results. See Django #7572, MySQL #37735.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
        if commit:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
            connection.close()