feat: 支持设置默认存储(命令、录像) (#6336)

* fix: 修改LDAP用户导入的组织为当前组织

* fix: 修改翻译信息

* feat: 支持设置默认存储

* feat: 支持设置默认存储(2)

* feat: 支持设置默认存储(3)
This commit is contained in:
Jiangjie.Bai
2021-06-28 10:32:59 +08:00
committed by GitHub
parent aa6e550ba2
commit c0ec0f1343
9 changed files with 158 additions and 80 deletions

View File

@@ -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

View File

@@ -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:

View 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)
]

View File

@@ -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):

View File

@@ -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:

View File

@@ -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