mirror of
https://github.com/jumpserver/jumpserver.git
synced 2026-07-03 07:39:39 +00:00
* feat(assets): add user custom favorite folders - Add FavoriteFolder model (per-user, nested via self parent FK) - Add nullable folder FK on FavoriteAsset, allow one asset in multiple folders - Add FavoriteFolderViewSet and folder filter on FavoriteAssetViewSet - Serializer outputs asset_info for building connectable tree nodes - Register favorite-folders route; exclude favoritefolder from rbac/audit * feat(assets): register favorite-folders route and add migration - Register favorite-folders router endpoint - Add migration 0020 creating FavoriteFolder and folder FK on FavoriteAsset * feat(rbac): exclude favoritefolder from permission management Keep favoritefolder consistent with favoriteasset (user-owned, not RBAC managed) * feat(audits): exclude FavoriteFolder from operate log
61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
#
|
|
|
|
from rest_framework import serializers
|
|
|
|
from common.serializers import BulkSerializerMixin
|
|
from ..models import FavoriteAsset, FavoriteFolder
|
|
|
|
__all__ = ['FavoriteAssetSerializer', 'FavoriteFolderSerializer']
|
|
|
|
|
|
class FavoriteFolderSerializer(BulkSerializerMixin, serializers.ModelSerializer):
|
|
user = serializers.HiddenField(
|
|
default=serializers.CurrentUserDefault()
|
|
)
|
|
|
|
class Meta:
|
|
model = FavoriteFolder
|
|
fields = ['id', 'user', 'name', 'parent', 'date_created']
|
|
read_only_fields = ['id', 'date_created']
|
|
|
|
|
|
class FavoriteAssetSerializer(BulkSerializerMixin, serializers.ModelSerializer):
|
|
user = serializers.HiddenField(
|
|
default=serializers.CurrentUserDefault()
|
|
)
|
|
asset_info = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = FavoriteAsset
|
|
fields = ['user', 'asset', 'folder', 'asset_info']
|
|
|
|
@staticmethod
|
|
def _get_icon(asset, platform):
|
|
from assets.const import AllTypes
|
|
support_types = AllTypes.get_types_values(exclude_custom=True)
|
|
if asset.category == 'device':
|
|
return 'switch'
|
|
if asset.type in support_types:
|
|
return asset.type
|
|
return 'file'
|
|
|
|
def get_asset_info(self, obj):
|
|
asset = obj.asset
|
|
platform = asset.platform
|
|
return {
|
|
'id': str(asset.id),
|
|
'name': asset.name,
|
|
'iconSkin': self._get_icon(asset, platform),
|
|
'chkDisabled': not asset.is_active,
|
|
'meta': {
|
|
'type': 'asset',
|
|
'data': {
|
|
'platform_type': platform.type,
|
|
'org_name': asset.org_name,
|
|
'name': asset.name,
|
|
'address': asset.address,
|
|
},
|
|
},
|
|
}
|