From 000adb357d7bc527e419b5788f58b6b0192f3064 Mon Sep 17 00:00:00 2001
From: Matthias <matthias.mair@oewf.org>
Date: Thu, 18 Nov 2021 12:50:22 +0100
Subject: [PATCH] refactor plugin urls into plugin dir

---
 InvenTree/InvenTree/settings.py               |  2 --
 InvenTree/InvenTree/urls.py                   | 25 +++----------------
 InvenTree/plugin/apps.py                      |  6 +++--
 .../plugin/builtin/integration/mixins.py      |  4 ++-
 InvenTree/plugin/test_integration.py          |  3 ++-
 InvenTree/plugin/urls.py                      | 21 ++++++++++++++++
 6 files changed, 34 insertions(+), 27 deletions(-)
 create mode 100644 InvenTree/plugin/urls.py

diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py
index 7ce41b2d4c..f8a7f019db 100644
--- a/InvenTree/InvenTree/settings.py
+++ b/InvenTree/InvenTree/settings.py
@@ -871,8 +871,6 @@ MAINTENANCE_MODE_RETRY_AFTER = 60
 
 
 # Plugins
-PLUGIN_URL = 'plugin'
-
 PLUGIN_DIRS = ['plugin.builtin', ]
 
 if not TESTING:
diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py
index 6bd9ec1fb1..1f5e87d047 100644
--- a/InvenTree/InvenTree/urls.py
+++ b/InvenTree/InvenTree/urls.py
@@ -18,6 +18,7 @@ from part.urls import part_urls
 from stock.urls import stock_urls
 from build.urls import build_urls
 from order.urls import order_urls
+from plugin.urls import plugin_urls, PLUGIN_BASE
 
 from barcodes.api import barcode_api_urls
 from common.api import common_api_urls
@@ -124,25 +125,6 @@ translated_javascript_urls = [
     url(r'^table_filters.js', DynamicJsView.as_view(template_name='js/translated/table_filters.js'), name='table_filters.js'),
 ]
 
-# Integration plugin urls
-integration_urls = []
-
-
-def get_integration_urls():
-    urls = []
-    for plugin in settings.INTEGRATION_PLUGINS.values():
-        if plugin.mixin_enabled('urls'):
-            urls.append(plugin.urlpatterns)
-    return urls
-
-
-try:
-    if settings.PLUGIN_TESTING or InvenTreeSetting.get_setting('ENABLE_PLUGINS_URL'):
-        integration_urls = get_integration_urls()
-except (OperationalError, ProgrammingError):
-    # Exception if the database has not been migrated yet
-    pass
-
 urlpatterns = [
     url(r'^part/', include(part_urls)),
     url(r'^manufacturer-part/', include(manufacturer_part_urls)),
@@ -181,8 +163,9 @@ urlpatterns = [
     url(r'^api/', include(apipatterns)),
     url(r'^api-doc/', include_docs_urls(title='InvenTree API')),
 
-    # plugins
-    url(f'^{settings.PLUGIN_URL}/', include((integration_urls, 'plugin'))),
+    # plugin urls
+    url(r'^plugins/', include(plugin_urls)),
+    url(f'^{PLUGIN_BASE}/', include(([], 'plugin'))),  # on startup we do not have any plugins enabled
 
     url(r'^markdownx/', include('markdownx.urls')),
 
diff --git a/InvenTree/plugin/apps.py b/InvenTree/plugin/apps.py
index eca59569a2..78d861d0a5 100644
--- a/InvenTree/plugin/apps.py
+++ b/InvenTree/plugin/apps.py
@@ -25,6 +25,7 @@ from maintenance_mode.core import get_maintenance_mode, set_maintenance_mode
 from plugin import plugins as inventree_plugins
 from plugin.integration import IntegrationPluginBase
 
+
 logger = logging.getLogger('inventree')
 
 
@@ -315,7 +316,8 @@ class PluginAppConfig(AppConfig):
         self._update_urls()
 
     def _update_urls(self):
-        from InvenTree.urls import urlpatterns, get_integration_urls
+        from InvenTree.urls import urlpatterns
+        from plugin.urls import PLUGIN_BASE, get_integration_urls
 
         for index, a in enumerate(urlpatterns):
             if hasattr(a, 'app_name'):
@@ -323,7 +325,7 @@ class PluginAppConfig(AppConfig):
                     urlpatterns[index] = url(r'^admin/', admin.site.urls, name='inventree-admin')
                 elif a.app_name == 'plugin':
                     integ_urls = get_integration_urls()
-                    urlpatterns[index] = url(f'^{settings.PLUGIN_URL}/', include((integ_urls, 'plugin')))
+                    urlpatterns[index] = url(f'^{PLUGIN_BASE}/', include((integ_urls, 'plugin')))
         clear_url_caches()
 
     def _reload_apps(self, populate: bool = False):
diff --git a/InvenTree/plugin/builtin/integration/mixins.py b/InvenTree/plugin/builtin/integration/mixins.py
index d807f931e5..54cfabe82d 100644
--- a/InvenTree/plugin/builtin/integration/mixins.py
+++ b/InvenTree/plugin/builtin/integration/mixins.py
@@ -2,6 +2,8 @@
 from django.conf import settings
 from django.conf.urls import url, include
 
+from plugin.urls import PLUGIN_BASE
+
 
 class GlobalSettingsMixin:
     """Mixin that enables global settings for the plugin"""
@@ -77,7 +79,7 @@ class UrlsMixin:
         """
         returns base url for this plugin
         """
-        return f'{settings.PLUGIN_URL}/{self.slug}/'
+        return f'{PLUGIN_BASE}/{self.slug}/'
 
     @property
     def internal_name(self):
diff --git a/InvenTree/plugin/test_integration.py b/InvenTree/plugin/test_integration.py
index ed6e9760c8..b9951a6831 100644
--- a/InvenTree/plugin/test_integration.py
+++ b/InvenTree/plugin/test_integration.py
@@ -9,6 +9,7 @@ from datetime import datetime
 
 from plugin.integration import IntegrationPluginBase
 from plugin.builtin.integration.mixins import AppMixin, GlobalSettingsMixin, UrlsMixin, NavigationMixin
+from plugin.urls import PLUGIN_BASE
 
 
 class BaseMixinDefinition:
@@ -82,7 +83,7 @@ class UrlsMixinTest(BaseMixinDefinition, TestCase):
         plg_name = self.mixin.plugin_name()
 
         # base_url
-        target_url = f'{settings.PLUGIN_URL}/{plg_name}/'
+        target_url = f'{PLUGIN_BASE}/{plg_name}/'
         self.assertEqual(self.mixin.base_url, target_url)
 
         # urlpattern
diff --git a/InvenTree/plugin/urls.py b/InvenTree/plugin/urls.py
new file mode 100644
index 0000000000..584cf56299
--- /dev/null
+++ b/InvenTree/plugin/urls.py
@@ -0,0 +1,21 @@
+"""
+URL lookup for plugin app
+"""
+
+from django.conf.urls import url, include
+from django.conf import settings
+
+
+PLUGIN_BASE = 'plugin'  # Constant for links
+
+
+def get_integration_urls():
+    urls = []
+    for plugin in settings.INTEGRATION_PLUGINS.values():
+        if plugin.mixin_enabled('urls'):
+            urls.append(plugin.urlpatterns)
+    return urls
+
+
+plugin_urls = [
+]