Merge pull request #9689 from jumpserver/pr@dev@fix_operatelog_root_org

fix: 操作日志、Activity日志显示当前组织和SYSTEM组织下的内容
pull/9707/head
老广 2023-02-22 22:09:26 +08:00 committed by GitHub
commit 58341a9e85
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 9 deletions

View File

@ -12,6 +12,7 @@ from common.plugins.es import QuerySet as ESQuerySet
from common.utils import is_uuid from common.utils import is_uuid
from orgs.mixins.api import OrgReadonlyModelViewSet, OrgModelViewSet from orgs.mixins.api import OrgReadonlyModelViewSet, OrgModelViewSet
from orgs.utils import current_org, tmp_to_root_org from orgs.utils import current_org, tmp_to_root_org
from orgs.models import Organization
from users.models import User from users.models import User
from .backends import TYPE_ENGINE_MAPPING from .backends import TYPE_ENGINE_MAPPING
from .const import ActivityChoices from .const import ActivityChoices
@ -91,13 +92,13 @@ class ResourceActivityAPIView(generics.ListAPIView):
} }
@staticmethod @staticmethod
def get_operate_log_qs(fields, limit=30, resource_id=None): def get_operate_log_qs(fields, limit, org_q, resource_id=None):
q, user = Q(resource_id=resource_id), None q, user = Q(resource_id=resource_id), None
if is_uuid(resource_id): if is_uuid(resource_id):
user = User.objects.filter(id=resource_id).first() user = User.objects.filter(id=resource_id).first()
if user is not None: if user is not None:
q |= Q(user=str(user)) q |= Q(user=str(user))
queryset = OperateLog.objects.filter(q).annotate( queryset = OperateLog.objects.filter(q, org_q).annotate(
r_type=Value(ActivityChoices.operate_log, CharField()), r_type=Value(ActivityChoices.operate_log, CharField()),
r_detail_id=F('id'), r_detail=Value(None, CharField()), r_detail_id=F('id'), r_detail=Value(None, CharField()),
r_user=F('user'), r_action=F('action'), r_user=F('user'), r_action=F('action'),
@ -105,8 +106,8 @@ class ResourceActivityAPIView(generics.ListAPIView):
return queryset return queryset
@staticmethod @staticmethod
def get_activity_log_qs(fields, limit=30, **filters): def get_activity_log_qs(fields, limit, org_q, **filters):
queryset = ActivityLog.objects.filter(**filters).annotate( queryset = ActivityLog.objects.filter(org_q, **filters).annotate(
r_type=F('type'), r_detail_id=F('detail_id'), r_type=F('type'), r_detail_id=F('detail_id'),
r_detail=F('detail'), r_user=Value(None, CharField()), r_detail=F('detail'), r_user=Value(None, CharField()),
r_action=Value(None, CharField()), r_action=Value(None, CharField()),
@ -120,9 +121,10 @@ class ResourceActivityAPIView(generics.ListAPIView):
'id', 'datetime', 'r_detail', 'r_detail_id', 'id', 'datetime', 'r_detail', 'r_detail_id',
'r_user', 'r_action', 'r_type' 'r_user', 'r_action', 'r_type'
) )
org_q = Q(org_id=Organization.SYSTEM_ID) | Q(org_id=current_org.id)
with tmp_to_root_org(): with tmp_to_root_org():
qs1 = self.get_operate_log_qs(fields, resource_id=resource_id) qs1 = self.get_operate_log_qs(fields, limit, org_q, resource_id=resource_id)
qs2 = self.get_activity_log_qs(fields, resource_id=resource_id) qs2 = self.get_activity_log_qs(fields, limit, org_q, resource_id=resource_id)
queryset = qs2.union(qs1) queryset = qs2.union(qs1)
return queryset.order_by('-datetime')[:limit] return queryset.order_by('-datetime')[:limit]
@ -147,7 +149,9 @@ class OperateLogViewSet(OrgReadonlyModelViewSet):
return super().get_serializer_class() return super().get_serializer_class()
def get_queryset(self): def get_queryset(self):
qs = OperateLog.objects.all() org_q = Q(org_id=Organization.SYSTEM_ID) | Q(org_id=current_org.id)
with tmp_to_root_org():
qs = OperateLog.objects.filter(org_q)
es_config = settings.OPERATE_LOG_ELASTICSEARCH_CONFIG es_config = settings.OPERATE_LOG_ELASTICSEARCH_CONFIG
if es_config: if es_config:
engine_mod = import_module(TYPE_ENGINE_MAPPING['es']) engine_mod = import_module(TYPE_ENGINE_MAPPING['es'])

View File

@ -10,7 +10,7 @@ from common.utils import i18n_fmt, get_logger
from jumpserver.utils import current_request from jumpserver.utils import current_request
from ops.celery import app from ops.celery import app
from orgs.models import Organization from orgs.models import Organization
from orgs.utils import current_org from orgs.utils import current_org, tmp_to_org
from terminal.models import Session from terminal.models import Session
from users.models import User from users.models import User
from ..const import ActivityChoices from ..const import ActivityChoices
@ -77,7 +77,8 @@ def create_activities(resource_ids, detail, detail_id, action, org_id):
) )
for resource_id in resource_ids for resource_id in resource_ids
] ]
ActivityLog.objects.bulk_create(activities) with tmp_to_org(org_id):
ActivityLog.objects.bulk_create(activities)
return activities return activities