Commit 7d25a6d6 authored by xinwen's avatar xinwen
Browse files

feat: 个人页面接口

parent ac9e7e9b
No related merge requests found
Showing with 78 additions and 6 deletions
+78 -6
......@@ -3,7 +3,9 @@
from rest_framework.mixins import ListModelMixin, CreateModelMixin
from django.db.models import F, Value
from django.db.models.functions import Concat
from rest_framework.permissions import IsAuthenticated
from common.drf.api import JMSReadOnlyModelViewSet
from common.permissions import IsOrgAdminOrAppUser, IsOrgAuditor, IsOrgAdmin
from common.drf.filters import DatetimeRangeFilter
from common.api import CommonGenericViewSet
......@@ -30,7 +32,7 @@ class FTPLogViewSet(CreateModelMixin,
ordering = ['-date_start']
class UserLoginLogViewSet(ListModelMixin, CommonGenericViewSet):
class UserLoginCommonMixin:
queryset = UserLoginLog.objects.all()
permission_classes = [IsOrgAdmin | IsOrgAuditor]
serializer_class = UserLoginLogSerializer
......@@ -41,6 +43,9 @@ class UserLoginLogViewSet(ListModelMixin, CommonGenericViewSet):
filterset_fields = ['username', 'ip', 'city', 'type', 'status', 'mfa']
search_fields = ['username', 'ip', 'city']
class UserLoginLogViewSet(UserLoginCommonMixin, ListModelMixin, CommonGenericViewSet):
@staticmethod
def get_org_members():
users = current_org.get_members().values_list('username', flat=True)
......@@ -55,6 +60,15 @@ class UserLoginLogViewSet(ListModelMixin, CommonGenericViewSet):
return queryset
class MyLoginLogViewSet(UserLoginCommonMixin, JMSReadOnlyModelViewSet):
permission_classes = [IsAuthenticated]
def get_queryset(self):
qs = super().get_queryset()
qs = qs.filter(username=self.request.user.username)
return qs
class OperateLogViewSet(ListModelMixin, OrgGenericViewSet):
model = OperateLog
serializer_class = OperateLogSerializer
......
......@@ -12,6 +12,7 @@ app_name = "audits"
router = DefaultRouter()
router.register(r'ftp-logs', api.FTPLogViewSet, 'ftp-log')
router.register(r'login-logs/my', api.MyLoginLogViewSet, 'my-login-log')
router.register(r'login-logs', api.UserLoginLogViewSet, 'login-log')
router.register(r'operate-logs', api.OperateLogViewSet, 'operate-log')
router.register(r'password-change-logs', api.PasswordChangeLogViewSet, 'password-change-log')
......
......@@ -3,19 +3,23 @@
import os
import tarfile
from django.db.models import F, Max
from django.shortcuts import get_object_or_404, reverse
from django.utils.translation import ugettext as _
from django.utils.encoding import escape_uri_path
from django.http import FileResponse, HttpResponse
from django.http import FileResponse
from django.core.files.storage import default_storage
from rest_framework import viewsets, views
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from assets.models import Asset
from common.drf.api import JMSReadOnlyModelViewSet
from common.utils import model_to_json
from .. import utils
from common.const.http import GET
from common.utils import is_uuid, get_logger, get_object_or_none
from common.utils import get_logger, get_object_or_none
from common.mixins.api import AsyncApiMixin
from common.permissions import IsOrgAdminOrAppUser, IsOrgAuditor, IsAppUser
from common.drf.filters import DatetimeRangeFilter
......@@ -24,17 +28,18 @@ from orgs.mixins.api import OrgBulkModelViewSet
from orgs.utils import tmp_to_root_org, tmp_to_org
from users.models import User
from ..utils import find_session_replay_local, download_session_replay
from ..hands import SystemUser
from ..models import Session
from .. import serializers
from assets.serializers import AssetSerializer
__all__ = [
'SessionViewSet', 'SessionReplayViewSet', 'SessionJoinValidateAPI'
'SessionViewSet', 'SessionReplayViewSet', 'SessionJoinValidateAPI',
'MySessionViewSet', 'MySessionAssetViewSet',
]
logger = get_logger(__name__)
class SessionViewSet(OrgBulkModelViewSet):
class CommonSessionMixin:
model = Session
serializer_classes = {
'default': serializers.SessionSerializer,
......@@ -50,6 +55,56 @@ class SessionViewSet(OrgBulkModelViewSet):
]
extra_filter_backends = [DatetimeRangeFilter]
class MySessionViewSet(CommonSessionMixin, JMSReadOnlyModelViewSet):
queryset = Session.objects.all()
permission_classes = (IsAuthenticated, )
def get_queryset(self):
user = self.request.user
qs = super().get_queryset()
qs = qs.filter(user_id=user.id)
return qs
class MySessionAssetViewSet(JMSReadOnlyModelViewSet):
queryset = Asset.objects.all()
permission_classes = (IsAuthenticated, )
serializer_class = AssetSerializer
def list(self, request, *args, **kwargs):
user = self.request.user
sessions = Session.objects.filter(user_id=user.id).values_list('asset_id').annotate(
max_date_start=Max(F('date_start'))
).order_by('-max_date_start').values_list('asset_id', flat=True)
page = self.paginate_queryset(sessions)
if page is not None:
serializer = self._to_serializer(page)
return self.get_paginated_response(serializer.data)
serializer = self._to_serializer(sessions)
return Response(serializer.data)
def _to_serializer(self, asset_ids):
asset_ids = [i for i in asset_ids if i != ''] # xrdp bug 没有提交 asset_id,已修复,但要兼容旧数据
self._paginator.count = len(asset_ids)
assets_qs = Asset.objects.filter(id__in=asset_ids)
serializer_cls = self.get_serializer_class()
if hasattr(serializer_cls, 'setup_eager_loading'):
assets_qs = serializer_cls.setup_eager_loading(assets_qs)
id_asset_map = {str(asset.id): asset for asset in assets_qs}
assets = []
for i in asset_ids:
assets.append(id_asset_map[i])
serializer = self.get_serializer(assets, many=True)
return serializer
class SessionViewSet(CommonSessionMixin, OrgBulkModelViewSet):
@staticmethod
def prepare_offline_file(session, local_path):
replay_path = default_storage.path(local_path)
......
......@@ -11,6 +11,8 @@ from .. import api
app_name = 'terminal'
router = BulkRouter()
router.register(r'sessions/my', api.MySessionViewSet, 'my-session')
router.register(r'sessions/asset/my', api.MySessionAssetViewSet, 'my-asset')
router.register(r'sessions', api.SessionViewSet, 'session')
router.register(r'terminals/(?P<terminal>[a-zA-Z0-9\-]{36})?/?status', api.StatusViewSet, 'terminal-status')
router.register(r'terminals/(?P<terminal>[a-zA-Z0-9\-]{36})?/?sessions', api.SessionViewSet, 'terminal-sessions')
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment