|
|
|
|
import uuid
|
|
|
|
|
|
|
|
|
|
from common.exceptions import JMSException
|
|
|
|
|
from orgs.models import Organization
|
|
|
|
|
from .. import models
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ApplicationAttrsSerializerViewMixin:
|
|
|
|
|
|
|
|
|
|
def get_serializer_class(self):
|
|
|
|
|
serializer_class = super().get_serializer_class()
|
|
|
|
|
if getattr(self, 'swagger_fake_view', False):
|
|
|
|
|
return 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())
|
|
|
|
|
|
|
|
|
|
# ListAPIView 没有 action 属性
|
|
|
|
|
# 不使用method属性,因为options请求时为method为post
|
|
|
|
|
action = getattr(self, 'action', 'list')
|
|
|
|
|
|
|
|
|
|
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 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(action)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if app_type:
|
|
|
|
|
# action: create / update / list / retrieve / metadata
|
|
|
|
|
attrs_cls = models.Category.get_type_serializer_cls(app_type)
|
|
|
|
|
class_name = 'ApplicationDynamicSerializer{}'.format(app_type.title())
|
|
|
|
|
elif app_category:
|
|
|
|
|
# action: list / retrieve / metadata
|
|
|
|
|
attrs_cls = models.Category.get_category_serializer_cls(app_category)
|
|
|
|
|
class_name = 'ApplicationDynamicSerializer{}'.format(app_category.title())
|
|
|
|
|
else:
|
|
|
|
|
attrs_cls = models.Category.get_no_password_serializer_cls()
|
|
|
|
|
class_name = 'ApplicationDynamicSerializer'
|
|
|
|
|
cls = type(class_name, (serializer_class,), {'attrs': attrs_cls()})
|
|
|
|
|
return cls
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SerializeApplicationToTreeNodeMixin:
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def _serialize_db(db):
|
|
|
|
|
return {
|
|
|
|
|
'id': db.id,
|
|
|
|
|
'name': db.name,
|
|
|
|
|
'title': db.name,
|
|
|
|
|
'pId': '',
|
|
|
|
|
'open': False,
|
|
|
|
|
'iconSkin': 'database',
|
|
|
|
|
'meta': {'type': 'database_app'}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def _serialize_remote_app(remote_app):
|
|
|
|
|
return {
|
|
|
|
|
'id': remote_app.id,
|
|
|
|
|
'name': remote_app.name,
|
|
|
|
|
'title': remote_app.name,
|
|
|
|
|
'pId': '',
|
|
|
|
|
'open': False,
|
|
|
|
|
'isParent': False,
|
|
|
|
|
'iconSkin': 'chrome',
|
|
|
|
|
'meta': {'type': 'remote_app'}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def _serialize_cloud(cloud):
|
|
|
|
|
return {
|
|
|
|
|
'id': cloud.id,
|
|
|
|
|
'name': cloud.name,
|
|
|
|
|
'title': cloud.name,
|
|
|
|
|
'pId': '',
|
|
|
|
|
'open': False,
|
|
|
|
|
'isParent': False,
|
|
|
|
|
'iconSkin': 'k8s',
|
|
|
|
|
'meta': {'type': 'k8s_app'}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def _serialize_application(self, application):
|
|
|
|
|
method_name = f'_serialize_{application.category}'
|
|
|
|
|
data = getattr(self, method_name)(application)
|
|
|
|
|
data.update({
|
|
|
|
|
'pId': application.org.id,
|
|
|
|
|
'org_name': application.org_name
|
|
|
|
|
})
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
def serialize_applications(self, applications):
|
|
|
|
|
data = [self._serialize_application(application) for application in applications]
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def _serialize_organization(org):
|
|
|
|
|
return {
|
|
|
|
|
'id': org.id,
|
|
|
|
|
'name': org.name,
|
|
|
|
|
'title': org.name,
|
|
|
|
|
'pId': '',
|
|
|
|
|
'open': True,
|
|
|
|
|
'isParent': True,
|
|
|
|
|
'meta': {
|
|
|
|
|
'type': 'node'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def serialize_organizations(self, organizations):
|
|
|
|
|
data = [self._serialize_organization(org) for org in organizations]
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def filter_organizations(applications):
|
|
|
|
|
organizations_id = set(applications.values_list('org_id', flat=True))
|
|
|
|
|
organizations = [Organization.get_instance(org_id) for org_id in organizations_id]
|
|
|
|
|
return organizations
|
|
|
|
|
|
|
|
|
|
def serialize_applications_with_org(self, applications):
|
|
|
|
|
organizations = self.filter_organizations(applications)
|
|
|
|
|
data_organizations = self.serialize_organizations(organizations)
|
|
|
|
|
data_applications = self.serialize_applications(applications)
|
|
|
|
|
data = data_organizations + data_applications
|
|
|
|
|
return data
|