views.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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.utils.module_loading import import_string
  7. from django.views.generic import View
  8. from rest_framework import permissions
  9. from rest_framework.response import Response
  10. from rest_framework.reverse import reverse
  11. from rest_framework.views import APIView
  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. try:
  52. api_app_name = import_string(f"{plugin}.api.urls.app_name")
  53. except (ImportError, ModuleNotFoundError):
  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
  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. )))