1 @lru_cache.lru_cache(maxsize=None) 2 def get_commands(): 3 """ 4 Returns a dictionary mapping command names to their callback applications. 5 6 This works by looking for a management.commands package in django.core, and 7 in each installed application -- if a commands package exists, all commands 8 in that package are registered. 9 10 Core commands are always included. If a settings module has been 11 specified, user-defined commands will also be included. 12 13 The dictionary is in the format {command_name: app_name}. Key-value 14 pairs from this dictionary can then be used in calls to 15 load_command_class(app_name, command_name) 16 17 If a specific version of a command must be loaded (e.g., with the 18 startapp command), the instantiated module can be placed in the 19 dictionary in place of the application name. 20 21 The dictionary is cached on the first call and reused on subsequent 22 calls. 23 """ 24 commands = {name: 'django.core' for name in find_commands(upath(__path__[0]))} 25 26 if not settings.configured: 27 return commands 28 29 for app_config in reversed(list(apps.get_app_configs())): 30 path = os.path.join(app_config.path, 'management') 31 commands.update({name: app_config.name for name in find_commands(path)}) 32 33 return commands