views.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from collections import OrderedDict
  2. from django.apps import apps
  3. from django.conf import settings
  4. from django.shortcuts import render
  5. from django.urls.exceptions import NoReverseMatch
  6. from django.views.generic import View
  7. from rest_framework import permissions
  8. from rest_framework.response import Response
  9. from rest_framework.reverse import reverse
  10. from rest_framework.views import APIView
  11. from extras.plugins.utils import import_object
  12. class InstalledPluginsAdminView(View):
  13. """
  14. Admin view for listing all installed plugins
  15. """
  16. def get(self, request):
  17. plugins = [apps.get_app_config(plugin) for plugin in settings.PLUGINS]
  18. return render(request, 'extras/admin/plugins_list.html', {
  19. 'plugins': plugins,
  20. })
  21. class InstalledPluginsAPIView(APIView):
  22. """
  23. API view for listing all installed plugins
  24. """
  25. permission_classes = [permissions.IsAdminUser]
  26. _ignore_model_permissions = True
  27. exclude_from_schema = True
  28. swagger_schema = None
  29. def get_view_name(self):
  30. return "Installed Plugins"
  31. @staticmethod
  32. def _get_plugin_data(plugin_app_config):
  33. return {
  34. 'name': plugin_app_config.verbose_name,
  35. 'package': plugin_app_config.name,
  36. 'author': plugin_app_config.author,
  37. 'author_email': plugin_app_config.author_email,
  38. 'description': plugin_app_config.description,
  39. 'verison': plugin_app_config.version
  40. }
  41. def get(self, request, format=None):
  42. return Response([self._get_plugin_data(apps.get_app_config(plugin)) for plugin in settings.PLUGINS])
  43. class PluginsAPIRootView(APIView):
  44. _ignore_model_permissions = True
  45. exclude_from_schema = True
  46. swagger_schema = None
  47. def get_view_name(self):
  48. return "Plugins"
  49. @staticmethod
  50. def _get_plugin_entry(plugin, app_config, request, format):
  51. # Check if the plugin specifies any API URLs
  52. api_app_name = import_object(f"{plugin}.api.urls.app_name")
  53. if api_app_name is None:
  54. # Plugin does not expose an API
  55. return None
  56. try:
  57. entry = (getattr(app_config, 'base_url', app_config.label), reverse(
  58. f"plugins-api:{api_app_name}:api-root",
  59. request=request,
  60. format=format
  61. ))
  62. except NoReverseMatch:
  63. # The plugin does not include an api-root url
  64. entry = None
  65. return entry
  66. def get(self, request, format=None):
  67. entries = []
  68. for plugin in settings.PLUGINS:
  69. app_config = apps.get_app_config(plugin)
  70. entry = self._get_plugin_entry(plugin, app_config, request, format)
  71. if entry is not None:
  72. entries.append(entry)
  73. return Response(OrderedDict((
  74. ('installed-plugins', reverse('plugins-api:plugins-list', request=request, format=format)),
  75. *entries
  76. )))