import re import os from optparse import make_option from django.core.management.base import BaseCommand from orchestra.utils.paths import get_site_dir from orchestra.utils.sys import run, check_root def deprecate_periodic_tasks(names): from djcelery.models import PeriodicTask for name in names: PeriodicTask.objects.filter(name=name).delete() run('rabbitmqctl stop_app') run('rabbitmqctl reset') run('rabbitmqctl start_app') run('service celeryd restart') class Command(BaseCommand): def __init__(self, *args, **kwargs): super(Command, self).__init__(*args, **kwargs) self.option_list = BaseCommand.option_list + ( make_option('--no-restart', action='store_false', dest='restart', default=True, help='Only install local requirements'), make_option('--specifics', action='store_true', dest='specifics_only', default=False, help='Only run version specific operations'), make_option('--no-upgrade-notes', action='store_false', default=True, dest='print_upgrade_notes', help='Do not print specific upgrade notes'), make_option('--from', dest='version', default=False, help="Orchestra's version from where you are upgrading, i.e 0.0.1"), ) option_list = BaseCommand.option_list help = 'Upgrades django-orchestra installation' # This command must be able to run in an environment with unsatisfied dependencies leave_locale_alone = True can_import_settings = False requires_model_validation = False @check_root def handle(self, *args, **options): version = options.get('version') upgrade_notes = [] if version: version_re = re.compile(r'^\s*(\d+)\.(\d+)\.(\d+).*') minor_release = version_re.search(version) if minor_release is not None: major, major2, minor = version_re.search(version).groups() else: version_re = re.compile(r'^\s*(\d+)\.(\d+).*') major, major2 = version_re.search(version).groups() minor = 0 # Represent version as two digits per number: 1.2.2 -> 10202 version = int(str(major) + "%02d" % int(major2) + "%02d" % int(minor)) # Pre version specific upgrade operations if version < 001: pass if not options.get('specifics_only'): # Common stuff orchestra_admin = os.path.join(os.path.dirname(__file__), '../../bin/') orchestra_admin = os.path.join(orchestra_admin, 'orchestra-admin') run('chmod +x %s' % orchestra_admin) run("%s install_requirements" % orchestra_admin) manage_path = os.path.join(get_site_dir(), 'manage.py') run("python %s collectstatic --noinput" % manage_path) run("python %s migrate --noinput accounts" % manage_path) run("python %s migrate --noinput" % manage_path) if options.get('restart'): run("python %s restartservices" % manage_path) if not version: self.stderr.write('\n' 'Next time you migth want to provide a --from argument in order ' 'to run version specific upgrade operations\n') return # Post version specific operations if version <= 001: pass if upgrade_notes and options.get('print_upgrade_notes'): self.stdout.write('\n\033[1m\n' ' ===================\n' ' ** UPGRADE NOTES **\n' ' ===================\n\n' + '\n'.join(upgrade_notes) + '\033[m\n')