66 lines
2.3 KiB
Python
66 lines
2.3 KiB
Python
|
|
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
|