Files
jumpserver/apps/assets/models/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

46 lines
1.4 KiB
Python

# -*- coding: utf-8 -*-
#
from django.db import models
from django.utils.translation import gettext_lazy as _
from common.db.models import JMSBaseModel
__all__ = ['FavoriteAsset', 'FavoriteFolder']
class FavoriteFolder(JMSBaseModel):
"""User custom favorite folder, owned by a user, visible across orgs, supports nesting"""
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
name = models.CharField(max_length=128, verbose_name=_("Name"))
parent = models.ForeignKey(
'self', on_delete=models.CASCADE,
null=True, blank=True, related_name='children'
)
class Meta:
unique_together = ('user', 'name', 'parent')
verbose_name = _("Favorite folder")
def __str__(self):
return self.name
class FavoriteAsset(JMSBaseModel):
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE)
folder = models.ForeignKey(
'assets.FavoriteFolder', on_delete=models.CASCADE,
null=True, blank=True, related_name='assets'
)
class Meta:
unique_together = ('user', 'asset', 'folder')
verbose_name = _("Favorite asset")
@classmethod
def get_user_favorite_asset_ids(cls, user):
return cls.objects.filter(user=user).values_list('asset', flat=True)
def __str__(self):
return '%s' % self.asset