mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-19 01:45:27 +00:00
feat: 支持设置默认存储(命令、录像) (#6336)
* fix: 修改LDAP用户导入的组织为当前组织 * fix: 修改翻译信息 * feat: 支持设置默认存储 * feat: 支持设置默认存储(2) * feat: 支持设置默认存储(3)
This commit is contained in:
@@ -36,7 +36,7 @@ class BaseStorageViewSetMixin:
|
||||
|
||||
|
||||
class CommandStorageViewSet(BaseStorageViewSetMixin, viewsets.ModelViewSet):
|
||||
search_fields = ('name', 'type',)
|
||||
search_fields = ('name', 'type')
|
||||
queryset = CommandStorage.objects.all()
|
||||
serializer_class = CommandStorageSerializer
|
||||
permission_classes = (IsSuperUser,)
|
||||
@@ -103,7 +103,7 @@ class CommandStorageViewSet(BaseStorageViewSetMixin, viewsets.ModelViewSet):
|
||||
|
||||
|
||||
class ReplayStorageViewSet(BaseStorageViewSetMixin, viewsets.ModelViewSet):
|
||||
filterset_fields = ('name', 'type',)
|
||||
filterset_fields = ('name', 'type', 'is_default')
|
||||
search_fields = filterset_fields
|
||||
queryset = ReplayStorage.objects.all()
|
||||
serializer_class = ReplayStorageSerializer
|
||||
|
@@ -71,7 +71,7 @@ class CommandStorageFilter(filters.FilterSet):
|
||||
|
||||
class Meta:
|
||||
model = CommandStorage
|
||||
fields = ['real', 'name', 'type']
|
||||
fields = ['real', 'name', 'type', 'is_default']
|
||||
|
||||
def filter_real(self, queryset, name, value):
|
||||
if value:
|
||||
|
37
apps/terminal/migrations/0037_auto_20210623_1748.py
Normal file
37
apps/terminal/migrations/0037_auto_20210623_1748.py
Normal file
@@ -0,0 +1,37 @@
|
||||
# Generated by Django 3.1.6 on 2021-06-23 09:48
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
def set_default_storage(apps, schema_editor):
|
||||
command_storage_model = apps.get_model("terminal", "CommandStorage")
|
||||
command_storage = command_storage_model.objects.filter(name='default', type='server').first()
|
||||
if command_storage:
|
||||
command_storage.is_default = True
|
||||
command_storage.save()
|
||||
replay_storage_model = apps.get_model("terminal", "ReplayStorage")
|
||||
replay_storage = replay_storage_model.objects.filter(name='default', type='server').first()
|
||||
if replay_storage:
|
||||
replay_storage.is_default = True
|
||||
replay_storage.save()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('terminal', '0036_auto_20210604_1124'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='commandstorage',
|
||||
name='is_default',
|
||||
field=models.BooleanField(default=False, verbose_name='Default storage'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='replaystorage',
|
||||
name='is_default',
|
||||
field=models.BooleanField(default=False, verbose_name='Default storage'),
|
||||
),
|
||||
migrations.RunPython(set_default_storage)
|
||||
]
|
@@ -19,17 +19,41 @@ from .. import const
|
||||
logger = get_logger(__file__)
|
||||
|
||||
|
||||
class CommandStorage(CommonModelMixin):
|
||||
class CommonStorageModelMixin(models.Model):
|
||||
name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True)
|
||||
meta = EncryptJsonDictTextField(default={})
|
||||
is_default = models.BooleanField(default=False, verbose_name=_('Default storage'))
|
||||
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def set_to_default(self):
|
||||
self.is_default = True
|
||||
self.save()
|
||||
self.__class__.objects.select_for_update()\
|
||||
.filter(is_default=True)\
|
||||
.exclude(id=self.id)\
|
||||
.update(is_default=False)
|
||||
|
||||
@classmethod
|
||||
def default(cls):
|
||||
objs = cls.objects.filter(is_default=True)
|
||||
if not objs:
|
||||
objs = cls.objects.filter(name='default', type='server')
|
||||
if not objs:
|
||||
objs = cls.objects.all()
|
||||
return objs.first()
|
||||
|
||||
|
||||
class CommandStorage(CommonStorageModelMixin, CommonModelMixin):
|
||||
type = models.CharField(
|
||||
max_length=16, choices=const.CommandStorageTypeChoices.choices,
|
||||
default=const.CommandStorageTypeChoices.server.value, verbose_name=_('Type'),
|
||||
)
|
||||
meta = EncryptJsonDictTextField(default={})
|
||||
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
@property
|
||||
def type_null(self):
|
||||
@@ -86,17 +110,11 @@ class CommandStorage(CommonModelMixin):
|
||||
backend.pre_use_check()
|
||||
|
||||
|
||||
class ReplayStorage(CommonModelMixin):
|
||||
name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True)
|
||||
class ReplayStorage(CommonStorageModelMixin, CommonModelMixin):
|
||||
type = models.CharField(
|
||||
max_length=16, choices=const.ReplayStorageTypeChoices.choices,
|
||||
default=const.ReplayStorageTypeChoices.server.value, verbose_name=_('Type')
|
||||
)
|
||||
meta = EncryptJsonDictTextField(default={})
|
||||
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
@property
|
||||
def type_null(self):
|
||||
|
@@ -176,6 +176,12 @@ class Terminal(StorageMixin, TerminalStatusMixin, models.Model):
|
||||
self.save()
|
||||
return
|
||||
|
||||
def save(self, **kwargs):
|
||||
from .storage import CommandStorage, ReplayStorage
|
||||
self.command_storage = CommandStorage.default().name
|
||||
self.replay_storage = ReplayStorage.default().name
|
||||
return super().save(**kwargs)
|
||||
|
||||
def __str__(self):
|
||||
status = "Active"
|
||||
if not self.is_accepted:
|
||||
|
@@ -119,44 +119,6 @@ replay_storage_type_serializer_classes_mapping = {
|
||||
const.ReplayStorageTypeChoices.obs.value: ReplayStorageTypeOBSSerializer
|
||||
}
|
||||
|
||||
# ReplayStorageSerializer
|
||||
|
||||
|
||||
class ReplayStorageSerializer(serializers.ModelSerializer):
|
||||
meta = MethodSerializer()
|
||||
|
||||
class Meta:
|
||||
model = ReplayStorage
|
||||
fields = ['id', 'name', 'type', 'meta', 'comment']
|
||||
|
||||
def validate_meta(self, meta):
|
||||
_meta = self.instance.meta if self.instance else {}
|
||||
_meta.update(meta)
|
||||
return _meta
|
||||
|
||||
def get_meta_serializer(self):
|
||||
default_serializer = serializers.Serializer(read_only=True)
|
||||
|
||||
if isinstance(self.instance, ReplayStorage):
|
||||
_type = self.instance.type
|
||||
else:
|
||||
_type = self.context['request'].query_params.get('type')
|
||||
|
||||
if _type:
|
||||
serializer_class = replay_storage_type_serializer_classes_mapping.get(_type)
|
||||
else:
|
||||
serializer_class = default_serializer
|
||||
|
||||
if not serializer_class:
|
||||
serializer_class = default_serializer
|
||||
|
||||
if isinstance(serializer_class, type):
|
||||
serializer = serializer_class()
|
||||
else:
|
||||
serializer = serializer_class
|
||||
return serializer
|
||||
|
||||
|
||||
# Command storage serializers
|
||||
# ---------------------------
|
||||
|
||||
@@ -204,15 +166,17 @@ command_storage_type_serializer_classes_mapping = {
|
||||
const.CommandStorageTypeChoices.es.value: CommandStorageTypeESSerializer
|
||||
}
|
||||
|
||||
# CommandStorageSerializer
|
||||
|
||||
# BaseStorageSerializer
|
||||
|
||||
|
||||
class CommandStorageSerializer(serializers.ModelSerializer):
|
||||
class BaseStorageSerializer(serializers.ModelSerializer):
|
||||
storage_type_serializer_classes_mapping = {}
|
||||
meta = MethodSerializer()
|
||||
|
||||
class Meta:
|
||||
model = CommandStorage
|
||||
fields = ['id', 'name', 'type', 'meta', 'comment']
|
||||
model = None
|
||||
fields = ['id', 'name', 'type', 'meta', 'is_default', 'comment']
|
||||
|
||||
def validate_meta(self, meta):
|
||||
_meta = self.instance.meta if self.instance else {}
|
||||
@@ -222,13 +186,13 @@ class CommandStorageSerializer(serializers.ModelSerializer):
|
||||
def get_meta_serializer(self):
|
||||
default_serializer = serializers.Serializer(read_only=True)
|
||||
|
||||
if isinstance(self.instance, CommandStorage):
|
||||
if isinstance(self.instance, self.__class__.Meta.model):
|
||||
_type = self.instance.type
|
||||
else:
|
||||
_type = self.context['request'].query_params.get('type')
|
||||
|
||||
if _type:
|
||||
serializer_class = command_storage_type_serializer_classes_mapping.get(_type)
|
||||
serializer_class = self.storage_type_serializer_classes_mapping.get(_type)
|
||||
else:
|
||||
serializer_class = default_serializer
|
||||
|
||||
@@ -240,3 +204,30 @@ class CommandStorageSerializer(serializers.ModelSerializer):
|
||||
else:
|
||||
serializer = serializer_class
|
||||
return serializer
|
||||
|
||||
def save(self, **kwargs):
|
||||
instance = super().save(**kwargs)
|
||||
if self.validated_data.get('is_default', False):
|
||||
instance.set_to_default()
|
||||
return instance
|
||||
|
||||
|
||||
# CommandStorageSerializer
|
||||
|
||||
|
||||
class CommandStorageSerializer(BaseStorageSerializer):
|
||||
storage_type_serializer_classes_mapping = command_storage_type_serializer_classes_mapping
|
||||
|
||||
class Meta(BaseStorageSerializer.Meta):
|
||||
model = CommandStorage
|
||||
|
||||
|
||||
# ReplayStorageSerializer
|
||||
|
||||
|
||||
class ReplayStorageSerializer(BaseStorageSerializer):
|
||||
storage_type_serializer_classes_mapping = replay_storage_type_serializer_classes_mapping
|
||||
|
||||
class Meta(BaseStorageSerializer.Meta):
|
||||
model = ReplayStorage
|
||||
|
||||
|
Reference in New Issue
Block a user