mirror of
https://github.com/jumpserver/jumpserver.git
synced 2026-07-02 23:23:21 +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
46 lines
1.4 KiB
Python
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
|