Files
jumpserver/apps/assets/serializers/favorite_asset.py
LDX ec9e76e405 feat(assets): add user custom favorite folders (#16949)
* 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
2026-06-26 16:29:25 +08:00

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,
},
},
}