diff --git a/apps/terminal/api/component/storage.py b/apps/terminal/api/component/storage.py index 0121ac18a..9465106a8 100644 --- a/apps/terminal/api/component/storage.py +++ b/apps/terminal/api/component/storage.py @@ -9,9 +9,9 @@ from rest_framework.decorators import action from rest_framework.request import Request from rest_framework.response import Response +from common.api.mixin import CommonApiMixin from common.const.http import GET from common.drf.filters import BaseFilterSet -from common.api.mixin import CommonApiMixin from terminal import const from terminal.filters import CommandStorageFilter, CommandFilter, CommandFilterForStorageTree from terminal.models import CommandStorage, ReplayStorage @@ -30,8 +30,10 @@ class BaseStorageViewSetMixin(CommonApiMixin): if instance.type_null_or_server or instance.is_default: data = {'msg': _('Deleting the default storage is not allowed')} return Response(data=data, status=status.HTTP_400_BAD_REQUEST) - if instance.is_use(): - data = {'msg': _('Cannot delete storage that is being used')} + used_by = instance.used_by() + if used_by: + names = ', '.join(list(used_by.values_list('name', flat=True))) + data = {'msg': _('Cannot delete storage that is being used: {}').format(names)} return Response(data=data, status=status.HTTP_400_BAD_REQUEST) return super().destroy(request, *args, **kwargs) diff --git a/apps/terminal/models/component/storage.py b/apps/terminal/models/component/storage.py index 40c0c0f79..985fc1012 100644 --- a/apps/terminal/models/component/storage.py +++ b/apps/terminal/models/component/storage.py @@ -105,10 +105,10 @@ class CommandStorage(CommonStorageModelMixin, JMSBaseModel): store = engine_mod.CommandStore(self.config) return store.ping(timeout=3) - def is_use(self): + def used_by(self): return Terminal.objects.filter( command_storage=self.name, is_deleted=False - ).exists() + ) def get_command_queryset(self): if self.type_null: diff --git a/apps/terminal/models/component/terminal.py b/apps/terminal/models/component/terminal.py index 8666c5da2..b361102c4 100644 --- a/apps/terminal/models/component/terminal.py +++ b/apps/terminal/models/component/terminal.py @@ -158,7 +158,6 @@ class Terminal(StorageMixin, TerminalStatusMixin, JMSBaseModel): self.user = None self.is_deleted = True self.save() - return def __str__(self): status = "Active" diff --git a/apps/terminal/serializers/applet_host.py b/apps/terminal/serializers/applet_host.py index 00cabf2e7..e625fc84f 100644 --- a/apps/terminal/serializers/applet_host.py +++ b/apps/terminal/serializers/applet_host.py @@ -18,11 +18,13 @@ __all__ = [ 'AppletHostStartupSerializer', 'AppletSetupSerializer' ] +RDS_LICENSE_DOC_URL = 'https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/rds-client-access-license' + class DeployOptionsSerializer(serializers.Serializer): LICENSE_MODE_CHOICES = ( - (4, _('Per Session')), - (2, _('Per Device')), + (2, _('Per Device (Device number limit)')), + (4, _('Per User (User number limit)')), ) # 单用户单会话, @@ -44,11 +46,20 @@ class DeployOptionsSerializer(serializers.Serializer): """) ) IGNORE_VERIFY_CERTS = serializers.BooleanField(default=True, label=_("Ignore Certificate Verification")) - RDS_Licensing = serializers.BooleanField(default=False, label=_("Existing RDS license")) + RDS_Licensing = serializers.BooleanField( + default=False, label=_("Existing RDS license"), + help_text=_('If not exist, the RDS will be in trial mode, and the trial period is 120 days. ' + 'Detail').format(RDS_LICENSE_DOC_URL) + ) RDS_LicenseServer = serializers.CharField(default='127.0.0.1', label=_('RDS License Server'), max_length=1024) - RDS_LicensingMode = serializers.ChoiceField(choices=LICENSE_MODE_CHOICES, default=2, label=_('RDS Licensing Mode')) - RDS_fSingleSessionPerUser = serializers.ChoiceField(choices=SESSION_PER_USER, default=1, - label=_("RDS Single Session Per User")) + RDS_LicensingMode = serializers.ChoiceField( + choices=LICENSE_MODE_CHOICES, default=2, label=_('RDS Licensing Mode'), + ) + RDS_fSingleSessionPerUser = serializers.ChoiceField( + choices=SESSION_PER_USER, default=1, label=_("RDS Single Session Per User"), + help_text=_('Tips: A RDS user can have only one session at a time. If set, when next login connected, ' + 'previous session will be disconnected.') + ) RDS_MaxDisconnectionTime = serializers.IntegerField( default=60000, label=_("RDS Max Disconnection Time (ms)"), help_text=_(