urls.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. from importlib import import_module
  2. from django.apps import apps
  3. from django.conf import settings
  4. from django.conf.urls import include
  5. from django.contrib.admin.views.decorators import staff_member_required
  6. from django.urls import path
  7. from django.utils.module_loading import import_string, module_has_submodule
  8. from . import views
  9. # Initialize URL base, API, and admin URL patterns for plugins
  10. plugin_patterns = []
  11. plugin_api_patterns = [
  12. path('', views.PluginsAPIRootView.as_view(), name='api-root'),
  13. path('installed-plugins/', views.InstalledPluginsAPIView.as_view(), name='plugins-list')
  14. ]
  15. plugin_admin_patterns = [
  16. path('installed-plugins/', staff_member_required(views.InstalledPluginsAdminView.as_view()), name='plugins_list')
  17. ]
  18. # Register base/API URL patterns for each plugin
  19. for plugin_path in settings.PLUGINS:
  20. plugin = import_module(plugin_path)
  21. plugin_name = plugin_path.split('.')[-1]
  22. app = apps.get_app_config(plugin_name)
  23. base_url = getattr(app, 'base_url') or app.label
  24. # Check if the plugin specifies any base URLs
  25. if module_has_submodule(plugin, 'urls'):
  26. urlpatterns = import_string(f"{plugin_path}.urls.urlpatterns")
  27. plugin_patterns.append(
  28. path(f"{base_url}/", include((urlpatterns, app.label)))
  29. )
  30. # Check if the plugin specifies any API URLs
  31. if module_has_submodule(plugin, 'api.urls'):
  32. urlpatterns = import_string(f"{plugin_path}.api.urls.urlpatterns")
  33. plugin_api_patterns.append(
  34. path(f"{base_url}/", include((urlpatterns, f"{app.label}-api")))
  35. )