56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
from rest_framework import viewsets
|
|
|
|
from orchestra.api import router, LogApiMixin
|
|
from orchestra.contrib.accounts.api import AccountApiMixin
|
|
|
|
from . import settings
|
|
from .models import WebApp
|
|
from .options import AppOption
|
|
from .serializers import WebAppSerializer
|
|
from .types import AppType
|
|
|
|
|
|
class WebAppViewSet(LogApiMixin, AccountApiMixin, viewsets.ModelViewSet):
|
|
queryset = WebApp.objects.prefetch_related('options').all()
|
|
serializer_class = WebAppSerializer
|
|
filter_fields = ('name',)
|
|
|
|
def options(self, request):
|
|
metadata = super(WebAppViewSet, self).options(request)
|
|
names = [
|
|
'WEBAPPS_BASE_DIR', 'WEBAPPS_TYPES', 'WEBAPPS_WEBAPP_OPTIONS',
|
|
'WEBAPPS_PHP_DISABLED_FUNCTIONS', 'WEBAPPS_DEFAULT_TYPE'
|
|
]
|
|
metadata.data['settings'] = {
|
|
name.lower(): getattr(settings, name, None) for name in names
|
|
}
|
|
# AppTypes
|
|
meta = self.metadata_class()
|
|
app_types = {}
|
|
for app_type in AppType.get_plugins():
|
|
if app_type.serializer:
|
|
data = meta.get_serializer_info(app_type.serializer())
|
|
else:
|
|
data = {}
|
|
options = []
|
|
for group, option in app_type.get_options():
|
|
options += [opt.name for opt in option]
|
|
app_types[app_type.get_name()] = {
|
|
'data': data,
|
|
'options': options,
|
|
}
|
|
metadata.data['actions']['types'] = app_types
|
|
# Options
|
|
options = {}
|
|
for option in AppOption.get_plugins():
|
|
options[option.get_name()] = {
|
|
'verbose_name': option.get_verbose_name(),
|
|
'help_text': option.help_text,
|
|
'group': option.group,
|
|
}
|
|
metadata.data['actions']['options'] = options
|
|
return metadata
|
|
|
|
|
|
router.register(r'webapps', WebAppViewSet)
|