|
1 | 1 | import collections |
| 2 | +from importlib.util import find_spec |
2 | 3 |
|
3 | 4 | from django.apps import AppConfig |
4 | 5 | from django.conf import settings |
|
21 | 22 | 'template_extensions': collections.defaultdict(list), |
22 | 23 | } |
23 | 24 |
|
| 25 | +DEFAULT_RESOURCE_PATHS = { |
| 26 | + 'search_indexes': 'search.indexes', |
| 27 | + 'graphql_schema': 'graphql.schema', |
| 28 | + 'menu': 'navigation.menu', |
| 29 | + 'menu_items': 'navigation.menu_items', |
| 30 | + 'template_extensions': 'template_content.template_extensions', |
| 31 | + 'user_preferences': 'preferences.preferences', |
| 32 | +} |
| 33 | + |
24 | 34 |
|
25 | 35 | # |
26 | 36 | # Plugin AppConfig class |
@@ -58,58 +68,50 @@ class PluginConfig(AppConfig): |
58 | 68 | # Django apps to append to INSTALLED_APPS when plugin requires them. |
59 | 69 | django_apps = [] |
60 | 70 |
|
61 | | - # Default integration paths. Plugin authors can override these to customize the paths to |
62 | | - # integrated components. |
63 | | - search_indexes = 'search.indexes' |
64 | | - graphql_schema = 'graphql.schema' |
65 | | - menu = 'navigation.menu' |
66 | | - menu_items = 'navigation.menu_items' |
67 | | - template_extensions = 'template_content.template_extensions' |
68 | | - user_preferences = 'preferences.preferences' |
| 71 | + # Optional plugin resources |
| 72 | + search_indexes = None |
| 73 | + graphql_schema = None |
| 74 | + menu = None |
| 75 | + menu_items = None |
| 76 | + template_extensions = None |
| 77 | + user_preferences = None |
| 78 | + |
| 79 | + def _load_resource(self, name): |
| 80 | + # Import from the configured path, if defined. |
| 81 | + if getattr(self, name): |
| 82 | + return import_string(f"{self.__module__}.{self.name}") |
| 83 | + # Fall back to the resource's default path. Return None if the module has not been provided. |
| 84 | + default_path = DEFAULT_RESOURCE_PATHS[name] |
| 85 | + default_module = f'{self.__module__}.{default_path}'.rsplit('.', 1)[0] |
| 86 | + if find_spec(default_module): |
| 87 | + setattr(self, name, default_path) |
| 88 | + return import_string(f"{self.__module__}.{default_path}") |
69 | 89 |
|
70 | 90 | def ready(self): |
71 | 91 | plugin_name = self.name.rsplit('.', 1)[-1] |
72 | 92 |
|
73 | 93 | # Register search extensions (if defined) |
74 | | - try: |
75 | | - search_indexes = import_string(f"{self.__module__}.{self.search_indexes}") |
76 | | - for idx in search_indexes: |
77 | | - register_search(idx) |
78 | | - except ImportError: |
79 | | - pass |
| 94 | + search_indexes = self._load_resource('search_indexes') or [] |
| 95 | + for idx in search_indexes: |
| 96 | + register_search(idx) |
80 | 97 |
|
81 | 98 | # Register template content (if defined) |
82 | | - try: |
83 | | - template_extensions = import_string(f"{self.__module__}.{self.template_extensions}") |
| 99 | + if template_extensions := self._load_resource('template_extensions'): |
84 | 100 | register_template_extensions(template_extensions) |
85 | | - except ImportError: |
86 | | - pass |
87 | 101 |
|
88 | 102 | # Register navigation menu and/or menu items (if defined) |
89 | | - try: |
90 | | - menu = import_string(f"{self.__module__}.{self.menu}") |
| 103 | + if menu := self._load_resource('menu'): |
91 | 104 | register_menu(menu) |
92 | | - except ImportError: |
93 | | - pass |
94 | | - try: |
95 | | - menu_items = import_string(f"{self.__module__}.{self.menu_items}") |
| 105 | + if menu_items := self._load_resource('menu_items'): |
96 | 106 | register_menu_items(self.verbose_name, menu_items) |
97 | | - except ImportError: |
98 | | - pass |
99 | 107 |
|
100 | 108 | # Register GraphQL schema (if defined) |
101 | | - try: |
102 | | - graphql_schema = import_string(f"{self.__module__}.{self.graphql_schema}") |
| 109 | + if graphql_schema := self._load_resource('graphql_schema'): |
103 | 110 | register_graphql_schema(graphql_schema) |
104 | | - except ImportError: |
105 | | - pass |
106 | 111 |
|
107 | 112 | # Register user preferences (if defined) |
108 | | - try: |
109 | | - user_preferences = import_string(f"{self.__module__}.{self.user_preferences}") |
| 113 | + if user_preferences := self._load_resource('user_preferences'): |
110 | 114 | register_user_preferences(plugin_name, user_preferences) |
111 | | - except ImportError: |
112 | | - pass |
113 | 115 |
|
114 | 116 | @classmethod |
115 | 117 | def validate(cls, user_config, netbox_version): |
|
0 commit comments