69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			69 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:
 | |
|             return self.show_help()
 | |
| 
 | |
|         available_scripts = self.get_scripts()
 | |
|         try:
 | |
|             script = available_scripts[name]
 | |
|         except KeyError:
 | |
|             raise CommandError(
 | |
|                 "{} is not a valid script. Run funkwhale-manage 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):
 | |
|         self.stdout.write("")
 | |
|         self.stdout.write("Available scripts:")
 | |
|         self.stdout.write("Launch with: funkwhale-manage script <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(f"     {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
 |