mirror of https://github.com/jumpserver/jumpserver
[Bugfix] 修复动态系统用户更新用户时无法推送的bug, 修复通过relation api无法触发m2m_change的bug
parent
00b3c7c945
commit
55554a025f
|
@ -1,6 +1,8 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
|
from collections import defaultdict
|
||||||
from django.db.models import F, Value
|
from django.db.models import F, Value
|
||||||
|
from django.db.models.signals import m2m_changed
|
||||||
from django.db.models.functions import Concat
|
from django.db.models.functions import Concat
|
||||||
|
|
||||||
from common.permissions import IsOrgAdmin
|
from common.permissions import IsOrgAdmin
|
||||||
|
@ -26,6 +28,34 @@ class RelationMixin:
|
||||||
))
|
))
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
def send_post_add_signal(self, instance):
|
||||||
|
if not isinstance(instance, list):
|
||||||
|
instance = [instance]
|
||||||
|
|
||||||
|
system_users_objects_map = defaultdict(list)
|
||||||
|
model, object_field = self.get_objects_attr()
|
||||||
|
|
||||||
|
for i in instance:
|
||||||
|
_id = getattr(i, object_field).id
|
||||||
|
system_users_objects_map[i.systemuser].append(_id)
|
||||||
|
|
||||||
|
sender = self.get_sender()
|
||||||
|
for system_user, objects in system_users_objects_map.items():
|
||||||
|
m2m_changed.send(
|
||||||
|
sender=sender, instance=system_user, action='post_add',
|
||||||
|
reverse=False, model=model, pk_set=objects
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_sender(self):
|
||||||
|
return self.model
|
||||||
|
|
||||||
|
def get_objects_attr(self):
|
||||||
|
return models.Asset, 'asset'
|
||||||
|
|
||||||
|
def perform_create(self, serializer):
|
||||||
|
instance = serializer.save()
|
||||||
|
self.send_post_add_signal(instance)
|
||||||
|
|
||||||
|
|
||||||
class BaseRelationViewSet(RelationMixin, OrgBulkModelViewSet):
|
class BaseRelationViewSet(RelationMixin, OrgBulkModelViewSet):
|
||||||
pass
|
pass
|
||||||
|
@ -43,6 +73,9 @@ class SystemUserAssetRelationViewSet(BaseRelationViewSet):
|
||||||
"systemuser__name", "systemuser__username"
|
"systemuser__name", "systemuser__username"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def get_objects_attr(self):
|
||||||
|
return models.Asset, 'asset'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
queryset = super().get_queryset()
|
queryset = super().get_queryset()
|
||||||
queryset = queryset.annotate(
|
queryset = queryset.annotate(
|
||||||
|
@ -65,6 +98,9 @@ class SystemUserNodeRelationViewSet(BaseRelationViewSet):
|
||||||
"node__value", "systemuser__name", "systemuser_username"
|
"node__value", "systemuser__name", "systemuser_username"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def get_objects_attr(self):
|
||||||
|
return models.Node, 'node'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
queryset = super().get_queryset()
|
queryset = super().get_queryset()
|
||||||
queryset = queryset \
|
queryset = queryset \
|
||||||
|
@ -84,6 +120,10 @@ class SystemUserUserRelationViewSet(BaseRelationViewSet):
|
||||||
"systemuser__name", "systemuser__username",
|
"systemuser__name", "systemuser__username",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def get_objects_attr(self):
|
||||||
|
from users.models import User
|
||||||
|
return User, 'user'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
queryset = super().get_queryset()
|
queryset = super().get_queryset()
|
||||||
queryset = queryset.annotate(
|
queryset = queryset.annotate(
|
||||||
|
|
|
@ -16,6 +16,8 @@ from .tasks import (
|
||||||
update_assets_hardware_info_util,
|
update_assets_hardware_info_util,
|
||||||
test_asset_connectivity_util,
|
test_asset_connectivity_util,
|
||||||
push_system_user_to_assets,
|
push_system_user_to_assets,
|
||||||
|
push_system_user_to_assets_manual,
|
||||||
|
push_system_user_to_assets,
|
||||||
add_nodes_assets_to_system_users
|
add_nodes_assets_to_system_users
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -95,6 +97,25 @@ def on_system_user_assets_change(sender, instance=None, action='', model=None, p
|
||||||
push_system_user_to_assets.delay(system_user, assets)
|
push_system_user_to_assets.delay(system_user, assets)
|
||||||
|
|
||||||
|
|
||||||
|
@receiver(m2m_changed, sender=SystemUser.users.through)
|
||||||
|
def on_system_user_users_change(sender, instance=None, action='', model=None, pk_set=None, **kwargs):
|
||||||
|
"""
|
||||||
|
当系统用户和用户关系发生变化时,应该重新推送系统用户资产中
|
||||||
|
"""
|
||||||
|
if action != "post_add":
|
||||||
|
return
|
||||||
|
if not instance.username_same_with_user:
|
||||||
|
return
|
||||||
|
logger.debug("System user users change signal recv: {}".format(instance))
|
||||||
|
queryset = model.objects.filter(pk__in=pk_set)
|
||||||
|
if model == SystemUser:
|
||||||
|
system_users = queryset
|
||||||
|
else:
|
||||||
|
system_users = [instance]
|
||||||
|
for s in system_users:
|
||||||
|
push_system_user_to_assets_manual.delay(s)
|
||||||
|
|
||||||
|
|
||||||
@receiver(m2m_changed, sender=SystemUser.nodes.through)
|
@receiver(m2m_changed, sender=SystemUser.nodes.through)
|
||||||
def on_system_user_nodes_change(sender, instance=None, action=None, model=None, pk_set=None, **kwargs):
|
def on_system_user_nodes_change(sender, instance=None, action=None, model=None, pk_set=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -193,10 +193,10 @@ def push_system_user_util(system_user, assets, task_name, username=None):
|
||||||
|
|
||||||
|
|
||||||
@shared_task(queue="ansible")
|
@shared_task(queue="ansible")
|
||||||
def push_system_user_to_assets_manual(system_user):
|
def push_system_user_to_assets_manual(system_user, username=None):
|
||||||
assets = system_user.get_related_assets()
|
assets = system_user.get_related_assets()
|
||||||
task_name = _("Push system users to assets: {}").format(system_user.name)
|
task_name = _("Push system users to assets: {}").format(system_user.name)
|
||||||
return push_system_user_util(system_user, assets, task_name=task_name)
|
return push_system_user_util(system_user, assets, task_name=task_name, username=username)
|
||||||
|
|
||||||
|
|
||||||
@shared_task(queue="ansible")
|
@shared_task(queue="ansible")
|
||||||
|
@ -210,9 +210,9 @@ def push_system_user_a_asset_manual(system_user, asset, username=None):
|
||||||
|
|
||||||
|
|
||||||
@shared_task(queue="ansible")
|
@shared_task(queue="ansible")
|
||||||
def push_system_user_to_assets(system_user, assets):
|
def push_system_user_to_assets(system_user, assets, username=None):
|
||||||
task_name = _("Push system users to assets: {}").format(system_user.name)
|
task_name = _("Push system users to assets: {}").format(system_user.name)
|
||||||
return push_system_user_util(system_user, assets, task_name)
|
return push_system_user_util(system_user, assets, task_name, username=username)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,34 @@ def on_asset_permission_system_users_changed(sender, instance=None, action='',
|
||||||
system_user.users.add(*tuple(users))
|
system_user.users.add(*tuple(users))
|
||||||
|
|
||||||
|
|
||||||
|
@receiver(m2m_changed, sender=AssetPermission.users.through)
|
||||||
|
def on_asset_permission_users_changed(sender, instance=None, action='',
|
||||||
|
reverse=False, **kwargs):
|
||||||
|
if action != 'post_add' and reverse:
|
||||||
|
return
|
||||||
|
logger.debug("Asset permission users change signal received")
|
||||||
|
users = kwargs['model'].objects.filter(pk__in=kwargs['pk_set'])
|
||||||
|
system_users = instance.system_users.all()
|
||||||
|
|
||||||
|
for system_user in system_users:
|
||||||
|
if system_user.username_same_with_user:
|
||||||
|
system_user.users.add(*tuple(users))
|
||||||
|
|
||||||
|
|
||||||
|
@receiver(m2m_changed, sender=AssetPermission.user_groups.through)
|
||||||
|
def on_asset_permission_user_groups_changed(sender, instance=None, action='',
|
||||||
|
reverse=False, **kwargs):
|
||||||
|
if action != 'post_add' and reverse:
|
||||||
|
return
|
||||||
|
logger.debug("Asset permission user groups change signal received")
|
||||||
|
groups = kwargs['model'].objects.filter(pk__in=kwargs['pk_set'])
|
||||||
|
system_users = instance.system_users.all()
|
||||||
|
|
||||||
|
for system_user in system_users:
|
||||||
|
if system_user.username_same_with_user:
|
||||||
|
system_user.groups.add(*tuple(groups))
|
||||||
|
|
||||||
|
|
||||||
@receiver(m2m_changed, sender=RemoteAppPermission.system_users.through)
|
@receiver(m2m_changed, sender=RemoteAppPermission.system_users.through)
|
||||||
def on_remote_app_permission_system_users_changed(sender, instance=None,
|
def on_remote_app_permission_system_users_changed(sender, instance=None,
|
||||||
action='', reverse=False, **kwargs):
|
action='', reverse=False, **kwargs):
|
||||||
|
@ -77,3 +105,17 @@ def on_remote_app_permission_system_users_changed(sender, instance=None,
|
||||||
if system_user.username_same_with_user:
|
if system_user.username_same_with_user:
|
||||||
system_user.groups.add(*tuple(groups))
|
system_user.groups.add(*tuple(groups))
|
||||||
system_user.users.add(*tuple(users))
|
system_user.users.add(*tuple(users))
|
||||||
|
|
||||||
|
|
||||||
|
@receiver(m2m_changed, sender=RemoteAppPermission.users.through)
|
||||||
|
def on_remoteapps_permission_users_changed(sender, instance=None, action='',
|
||||||
|
reverse=False, **kwargs):
|
||||||
|
on_asset_permission_users_changed(sender, instance=instance, action=action,
|
||||||
|
reverse=reverse, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
@receiver(m2m_changed, sender=RemoteAppPermission.user_groups.through)
|
||||||
|
def on_remoteapps_permission_user_groups_changed(sender, instance=None, action='',
|
||||||
|
reverse=False, **kwargs):
|
||||||
|
on_asset_permission_user_groups_changed(sender, instance=instance,
|
||||||
|
action=action, reverse=reverse, **kwargs)
|
||||||
|
|
Loading…
Reference in New Issue