diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index 5faca5da8..21b7c9a41 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -118,6 +118,8 @@ class SystemUser(AssetUser): shell = models.CharField(max_length=64, default='/bin/bash', verbose_name=_('Shell')) login_mode = models.CharField(choices=LOGIN_MODE_CHOICES, default=AUTO_LOGIN, max_length=10, verbose_name=_('Login mode')) + cache_key = "__SYSTEM_USER_CACHED_{}" + def __str__(self): return '{0.name}({0.username})'.format(self) @@ -154,6 +156,24 @@ class SystemUser(AssetUser): else: return False + def set_cache(self): + cache.set(self.cache_key.format(self.id), self, 3600) + + def expire_cache(self): + cache.delete(self.cache_key.format(self.id)) + + @classmethod + def get_system_user_by_id_or_cached(cls, sid): + cached = cache.get(cls.cache_key.format(sid)) + if cached: + return cached + try: + system_user = cls.objects.get(id=sid) + system_user.set_cache() + return system_user + except cls.DoesNotExist: + return None + class Meta: ordering = ['name'] verbose_name = _("System user") diff --git a/apps/terminal/api.py b/apps/terminal/api.py index b428acb3e..956491f21 100644 --- a/apps/terminal/api.py +++ b/apps/terminal/api.py @@ -4,7 +4,6 @@ from collections import OrderedDict import logging import os import uuid -import copy from django.core.cache import cache from django.shortcuts import get_object_or_404, redirect @@ -16,12 +15,13 @@ from django.conf import settings import jms_storage -from rest_framework import viewsets, serializers +from rest_framework import viewsets from rest_framework.views import APIView, Response from rest_framework.permissions import AllowAny from rest_framework_bulk import BulkModelViewSet -from common.utils import get_object_or_none +from common.utils import get_object_or_none, is_uuid +from .hands import SystemUser from .models import Terminal, Status, Session, Task from .serializers import TerminalSerializer, StatusSerializer, \ SessionSerializer, TaskSerializer, ReplaySerializer @@ -187,8 +187,13 @@ class SessionViewSet(viewsets.ModelViewSet): return self.queryset def perform_create(self, serializer): - if self.request.user.terminal: + if hasattr(self.request.user, 'terminal'): serializer.validated_data["terminal"] = self.request.user.terminal + sid = serializer.validated_data["system_user"] + if is_uuid(sid): + _system_user = SystemUser.get_system_user_by_id_or_cached(sid) + if _system_user: + serializer.validated_data["system_user"] = _system_user.name return super().perform_create(serializer) diff --git a/apps/terminal/hands.py b/apps/terminal/hands.py index ce075bfc5..3461730b8 100644 --- a/apps/terminal/hands.py +++ b/apps/terminal/hands.py @@ -4,4 +4,5 @@ from users.models import User from users.permissions import IsSuperUserOrAppUser, IsAppUser, \ IsSuperUserOrAppUserOrUserReadonly -from users.utils import AdminUserRequiredMixin \ No newline at end of file +from users.utils import AdminUserRequiredMixin +from assets.models import SystemUser \ No newline at end of file diff --git a/apps/terminal/templates/terminal/session_list.html b/apps/terminal/templates/terminal/session_list.html index 33ae09877..4bdf61fab 100644 --- a/apps/terminal/templates/terminal/session_list.html +++ b/apps/terminal/templates/terminal/session_list.html @@ -58,7 +58,7 @@