web/lib/django/core/management/commands/flush.py
changeset 0 0d40e90630ef
child 29 cc9b7e14412b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/django/core/management/commands/flush.py	Wed Jan 20 00:34:04 2010 +0100
@@ -0,0 +1,68 @@
+from django.core.management.base import NoArgsCommand, CommandError
+from django.core.management.color import no_style
+from django.utils.importlib import import_module
+from optparse import make_option
+
+class Command(NoArgsCommand):
+    option_list = NoArgsCommand.option_list + (
+        make_option('--noinput', action='store_false', dest='interactive', default=True,
+            help='Tells Django to NOT prompt the user for input of any kind.'),
+    )
+    help = "Executes ``sqlflush`` on the current database."
+
+    def handle_noargs(self, **options):
+        from django.conf import settings
+        from django.db import connection, transaction, models
+        from django.core.management.sql import sql_flush, emit_post_sync_signal
+
+        verbosity = int(options.get('verbosity', 1))
+        interactive = options.get('interactive')
+
+        self.style = no_style()
+
+        # Import the 'management' module within each installed app, to register
+        # dispatcher events.
+        for app_name in settings.INSTALLED_APPS:
+            try:
+                import_module('.management', app_name)
+            except ImportError:
+                pass
+
+        sql_list = sql_flush(self.style, only_django=True)
+
+        if interactive:
+            confirm = raw_input("""You have requested a flush of the database.
+This will IRREVERSIBLY DESTROY all data currently in the %r database,
+and return each table to the state it was in after syncdb.
+Are you sure you want to do this?
+
+    Type 'yes' to continue, or 'no' to cancel: """ % settings.DATABASE_NAME)
+        else:
+            confirm = 'yes'
+
+        if confirm == 'yes':
+            try:
+                cursor = connection.cursor()
+                for sql in sql_list:
+                    cursor.execute(sql)
+            except Exception, e:
+                transaction.rollback_unless_managed()
+                raise CommandError("""Database %s couldn't be flushed. Possible reasons:
+      * The database isn't running or isn't configured correctly.
+      * At least one of the expected database tables doesn't exist.
+      * The SQL was invalid.
+    Hint: Look at the output of 'django-admin.py sqlflush'. That's the SQL this command wasn't able to run.
+    The full error: %s""" % (settings.DATABASE_NAME, e))
+            transaction.commit_unless_managed()
+
+            # Emit the post sync signal. This allows individual
+            # applications to respond as if the database had been
+            # sync'd from scratch.
+            emit_post_sync_signal(models.get_models(), verbosity, interactive)
+
+            # Reinstall the initial_data fixture.
+            from django.core.management import call_command
+            call_command('loaddata', 'initial_data', **options)
+
+        else:
+            print "Flush cancelled."