1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Don't ignore ImportErrors raised when loading a plugin. Fixes #4805

This commit is contained in:
Glenn Matthews
2020-07-01 15:23:38 -04:00
parent 43d610405f
commit f807d3a024
3 changed files with 66 additions and 32 deletions

View File

@@ -1,9 +1,11 @@
import importlib
import sys
from django.apps import apps
from django.conf import settings
from django.conf.urls import include
from django.contrib.admin.views.decorators import staff_member_required
from django.urls import path
from django.utils.module_loading import import_string
from . import views
@@ -24,19 +26,29 @@ for plugin_path in settings.PLUGINS:
base_url = getattr(app, 'base_url') or app.label
# Check if the plugin specifies any base URLs
try:
urlpatterns = import_string(f"{plugin_path}.urls.urlpatterns")
plugin_patterns.append(
path(f"{base_url}/", include((urlpatterns, app.label)))
)
except ImportError:
pass
spec = importlib.util.find_spec(f"{plugin_path}.urls")
if spec is not None:
# The plugin has a .urls module - import it
urls = importlib.util.module_from_spec(spec)
sys.modules[f"{plugin_path}.urls"] = urls
spec.loader.exec_module(urls)
if hasattr(urls, "urlpatterns"):
urlpatterns = urls.urlpatterns
plugin_patterns.append(
path(f"{base_url}/", include((urlpatterns, app.label)))
)
# Check if the plugin specifies any API URLs
try:
urlpatterns = import_string(f"{plugin_path}.api.urls.urlpatterns")
plugin_api_patterns.append(
path(f"{base_url}/", include((urlpatterns, f"{app.label}-api")))
)
except ImportError:
pass
spec = importlib.util.find_spec(f"{plugin_path}.api")
if spec is not None:
spec = importlib.util.find_spec(f"{plugin_path}.api.urls")
if spec is not None:
# The plugin has a .api.urls module - import it
api_urls = importlib.util.module_from_spec(spec)
sys.modules[f"{plugin_path}.api.urls"] = api_urls
spec.loader.exec_module(api_urls)
if hasattr(api_urls, "urlpatterns"):
urlpatterns = api_urls.urlpatterns
plugin_api_patterns.append(
path(f"{base_url}/", include((urlpatterns, f"{app.label}-api")))
)