def list_migrations(apps, database=DEFAULT_DB_ALIAS, **options): """ Prints a list of all available migrations, and which ones are currently applied. Accepts a list of Migrations instances. """ from south.models import MigrationHistory applied_migrations = MigrationHistory.objects.filter( app_name__in=[app.app_label() for app in apps]) if database != DEFAULT_DB_ALIAS: applied_migrations = applied_migrations.using(database) applied_migration_names = [ '%s.%s' % (mi.app_name, mi.migration) for mi in applied_migrations ] print() for app in apps: print(" " + app.app_label()) # Get the migrations object for migration in app: if migration.app_label() + "." + migration.name( ) in applied_migration_names: applied_migration = applied_migrations.get( app_name=migration.app_label(), migration=migration.name()) print( format_migration_list_item( migration.name(), applied=applied_migration.applied, **options)) else: print( format_migration_list_item(migration.name(), applied=False, **options)) print()
def list_migrations(apps, database=DEFAULT_DB_ALIAS, **options): """ Prints a list of all available migrations, and which ones are currently applied. Accepts a list of Migrations instances. """ from south.models import MigrationHistory applied_migrations = MigrationHistory.objects.filter( app_name__in=[app.app_label() for app in apps]) if database != DEFAULT_DB_ALIAS: applied_migrations = applied_migrations.using(database) applied_migrations_lookup = dict(('%s.%s' % (mi.app_name, mi.migration), mi) for mi in applied_migrations) print() for app in apps: print(" " + app.app_label()) # Get the migrations object for migration in app: full_name = migration.app_label() + "." + migration.name() if full_name in applied_migrations_lookup: applied_migration = applied_migrations_lookup[full_name] print( format_migration_list_item( migration.name(), applied=applied_migration.applied, **options)) else: print(format_migration_list_item(migration.name(), applied=False, **options)) print()
def fake_if_needed(self, verbosity=1): # detect installed models # (code borrowed from django syncdb command) tables = connection.introspection.table_names() def model_in_database(model): opts = model._meta converter = connection.introspection.table_name_converter return (converter(opts.db_table) in tables) or \ (opts.auto_created and converter(opts.auto_created._meta.db_table) in tables) # list all applications with south migration # (code borrowed from south migrate command) from south import migration apps = list(migration.all_migrations()) applied_migrations = MigrationHistory.objects.filter(app_name__in=[app.app_label() for app in apps]) applied_migrations_lookup = dict(('%s.%s' % (mi.app_name, mi.migration), mi) for mi in applied_migrations) if verbosity > 0: print 'Status after syncdb:' for app in apps: # for each app with migrations, list already applied migrations applied_migrations = [] for migration in app: full_name = migration.app_label() + "." + migration.name() if full_name in applied_migrations_lookup: applied_migration = applied_migrations_lookup[full_name] if applied_migration.applied: applied_migrations.append(migration.name()) # try all models in database, if there none, the application is new # (because south syncdb does not create any tables) new = True for m in models.get_models(app.get_application().models): if model_in_database(m): new = False break if new: status = 'application-is-new' elif not applied_migrations: status = 'migration-is-new' else: status = 'normal' if verbosity > 0: print ' - %s: %s' % (app.app_label(), status) if status == 'migration-is-new': if verbosity > 0: print ' need fake migration to 0001_initial' # migrate --fake gdc 0001 SouthMigrateCommand().execute(app=app.app_label(), target='0001', fake=True, verbosity=verbosity)
def list_migrations(apps, database = DEFAULT_DB_ALIAS): """ Prints a list of all available migrations, and which ones are currently applied. Accepts a list of Migrations instances. """ from south.models import MigrationHistory applied_migrations = MigrationHistory.objects.filter(app_name__in=[app.app_label() for app in apps]) if database != DEFAULT_DB_ALIAS: applied_migrations = applied_migrations.using(database) applied_migrations = ['%s.%s' % (mi.app_name,mi.migration) for mi in applied_migrations] print for app in apps: print " " + app.app_label() # Get the migrations object for migration in app: if migration.app_label() + "." + migration.name() in applied_migrations: print format_migration_list_item(migration.name()) else: print format_migration_list_item(migration.name(), applied=False) print
from django.conf import settings from south import migration from south.models import MigrationHistory import sys apps = list(migration.all_migrations()) applied_migrations = MigrationHistory.objects.filter( app_name__in=[app.app_label() for app in apps]) applied_migrations = [ '%s.%s' % (mi.app_name, mi.migration) for mi in applied_migrations ] unapplied_migrations = [] num_new_migrations = 0 for app in apps: for migration in app: if migration.app_label() + "." + migration.name( ) not in applied_migrations: num_new_migrations = num_new_migrations + 1 unapplied_migrations.append( '%s.%s' % (migration.app_label(), migration.name())) if num_new_migrations > 0: import pprint sys.exit("%d new migrations to apply:\n%s" % (num_new_migrations, pprint.pformat(unapplied_migrations))) print "No migrations to run."