''' Created on Dec 28, 2011 @author: givity The manage.py reboot function deletes all database data recreates tables via syncdb (populating with fixtures) ''' import os from django.conf import settings from django.core.management.base import BaseCommand, CommandError # http://stackoverflow.com/questions/1007481/how-do-i-replace-whitespaces-with-underscore-and-vice-versa from django.template.defaultfilters import slugify # https://docs.djangoproject.com/en/dev/topics/auth/ from django.contrib.auth.models import User class Command(BaseCommand): help = 'Deletes all data across all apps listed in settings.INSTALLED_APPS, then recreates the database via syncdb (with population from fixtures)' def handle(self, *args, **options): self.stdout.write('beginning reboot...\n') # reset the db try: # use the DATABASES.default.user as the user/pass for recreated superuser, etc. if 'default' in settings.DATABASES: username = settings.DATABASES['default']['USER'] self.stdout.write('username found in settings.DATABASES: %s\n' % username) elif hasattr(settings, 'PROJECT_NAME'): username = slugify(settings.PROJECT_NAME) self.stdout.write('username found in settings.PROJECT_NAME: %s\n' % username) else: username = 'root' self.stdout.write('username not found in settings via (DATABASES[default] or PROJECT_NAME), reverting to: %s\n' % username) # we need a domain name for setting up a root email if hasattr(settings, 'PROJECT_DOMAIN'): domain = settings.PROJECT_DOMAIN self.stdout.write('domain found in settings.PROJECT_DOMAIN: %s\n' % domain) else: domain = 'example.com' self.stdout.write('domain not found in settings via (PROJECT_DOMAIN), reverting to: %s\n' % domain) # dump db with django-extensions self.stdout.write('reset_db... ') os.system('python manage.py reset_db --router=default --noinput') self.stdout.write('done!\n') # TODO: do something with the apps? for app in settings.INSTALLED_APPS: # split the actual app name from a package.class.app syntax if '.' in app: app = app.rsplit('.')[-1] else: pass # app does not need to stripped out of package.app.syntax # sync data and use fixtures to pop db with presets os.system('python manage.py syncdb --noinput --verbosity 0') # create the super user os.system('python manage.py createsuperuser --username=%s --email=%s@%s --noinput' % (username, username, domain)) # set the password user = User.objects.get(username=username) user.set_password(username) user.save() self.stdout.write('setting superuser username:password [%s:%s]... done!\n' % (username, username)) # create the super user os.system('python manage.py loaddata user_profile.json') # run the server! os.system('python manage.py runserver') except: raise CommandError('process terminated.')