Skip to content
Snippets Groups Projects
script.py 2.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django.core.management.base import BaseCommand, CommandError
    
    from funkwhale_api.common import scripts
    
    
    class Command(BaseCommand):
        help = 'Run a specific script from funkwhale_api/common/scripts/'
    
        def add_arguments(self, parser):
            parser.add_argument('script_name', nargs='?', type=str)
            parser.add_argument(
                '--noinput', '--no-input', action='store_false', dest='interactive',
                help="Do NOT prompt the user for input of any kind.",
            )
    
        def handle(self, *args, **options):
            name = options['script_name']
            if not name:
                self.show_help()
    
            available_scripts = self.get_scripts()
            try:
                script = available_scripts[name]
            except KeyError:
                raise CommandError(
                    '{} is not a valid script. Run python manage.py script for a '
                    'list of available scripts'.format(name))
    
            self.stdout.write('')
            if options['interactive']:
                message = (
                    'Are you sure you want to execute the script {}?\n\n'
                    "Type 'yes' to continue, or 'no' to cancel: "
                ).format(name)
                if input(''.join(message)) != 'yes':
                    raise CommandError("Script cancelled.")
            script['entrypoint'](self, **options)
    
        def show_help(self):
            indentation = 4
            self.stdout.write('')
            self.stdout.write('Available scripts:')
            self.stdout.write('Launch with: python manage.py <script_name>')
            available_scripts = self.get_scripts()
            for name, script in sorted(available_scripts.items()):
                self.stdout.write('')
                self.stdout.write(self.style.SUCCESS(name))
                self.stdout.write('')
                for line in script['help'].splitlines():
                    self.stdout.write('     {}'.format(line))
            self.stdout.write('')
    
        def get_scripts(self):
            available_scripts = [
                k for k in sorted(scripts.__dict__.keys())
                if not k.startswith('__')
            ]
            data = {}
            for name in available_scripts:
                module = getattr(scripts, name)
                data[name] = {
                    'name': name,
                    'help': module.__doc__.strip(),
                    'entrypoint': module.main
                }
            return data