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