mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
2.2 KiB
58 lines
2.2 KiB
# coding: utf-8
|
|
#
|
|
|
|
from orgs.mixins.api import OrgBulkModelViewSet
|
|
|
|
from common.exceptions import JMSException
|
|
from .. import models
|
|
from .. import serializers
|
|
from ..hands import IsOrgAdminOrAppUser
|
|
|
|
__all__ = [
|
|
'ApplicationViewSet',
|
|
]
|
|
|
|
|
|
class ApplicationViewSet(OrgBulkModelViewSet):
|
|
model = models.Application
|
|
filter_fields = ('name', 'type', 'category')
|
|
search_fields = filter_fields
|
|
permission_classes = (IsOrgAdminOrAppUser,)
|
|
serializer_class = serializers.ApplicationSerializer
|
|
|
|
def get_serializer_class(self):
|
|
serializer_class = super().get_serializer_class()
|
|
app_type = self.request.query_params.get('type')
|
|
app_category = self.request.query_params.get('category')
|
|
type_options = list(dict(models.Category.get_all_type_serializer_mapper()).keys())
|
|
category_options = list(dict(models.Category.get_category_serializer_mapper()).keys())
|
|
|
|
if app_type and app_type not in type_options:
|
|
raise JMSException(
|
|
'Invalid query parameter `type`, select from the following options: {}'
|
|
''.format(type_options)
|
|
)
|
|
if app_category and app_category not in category_options:
|
|
raise JMSException(
|
|
'Invalid query parameter `category`, select from the following options: {}'
|
|
''.format(category_options)
|
|
)
|
|
|
|
if self.action in [
|
|
'create', 'update', 'partial_update', 'bulk_update', 'partial_bulk_update'
|
|
] and not app_type:
|
|
# action: create / update
|
|
raise JMSException(
|
|
'The `{}` action must take the `type` query parameter'.format(self.action)
|
|
)
|
|
|
|
if app_type:
|
|
# action: create / update / list / retrieve / metadata
|
|
attrs_cls = models.Category.get_type_serializer_cls(app_type)
|
|
elif app_category:
|
|
# action: list / retrieve / metadata
|
|
attrs_cls = models.Category.get_category_serializer_cls(app_category)
|
|
else:
|
|
attrs_cls = models.Category.get_no_password_serializer_cls()
|
|
return type('ApplicationDynamicSerializer', (serializer_class,), {'attrs': attrs_cls()})
|