From a28334b6d83bcb0226d1a73f5abe1621fd153ae3 Mon Sep 17 00:00:00 2001 From: xinwen Date: Thu, 20 Aug 2020 15:19:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(orgs):=20=E5=AE=8C=E5=96=84=E7=BB=84?= =?UTF-8?q?=E7=BB=87=E4=B8=8E=E7=94=A8=E6=88=B7=E5=8F=98=E5=8C=96=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E4=BF=A1=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/orgs/signals_handler.py | 54 ++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/apps/orgs/signals_handler.py b/apps/orgs/signals_handler.py index eb7df9741..8e4d969eb 100644 --- a/apps/orgs/signals_handler.py +++ b/apps/orgs/signals_handler.py @@ -5,9 +5,11 @@ from django.db.models.signals import m2m_changed from django.db.models.signals import post_save from django.dispatch import receiver +from orgs.utils import tmp_to_org from .models import Organization, OrganizationMember from .hands import set_current_org, current_org, Node, get_current_org -from perms.models import AssetPermission +from perms.models import (AssetPermission, DatabaseAppPermission, + K8sAppPermission, RemoteAppPermission) from users.models import UserGroup @@ -26,31 +28,47 @@ def on_org_create_or_update(sender, instance=None, created=False, **kwargs): instance.expire_cache() -def _remove_users(model, users, org, reverse=False): - if not isinstance(users, (tuple, list, set)): - users = (users, ) +def _remove_users(model, users, org): + with tmp_to_org(org): + if not isinstance(users, (tuple, list, set)): + users = (users, ) - m2m_model = model.users.through - if reverse: - m2m_field_name = model.users.field.m2m_reverse_field_name() - else: - m2m_field_name = model.users.field.m2m_field_name() - m2m_model.objects.filter(**{'user__in': users, f'{m2m_field_name}__org_id': org.id}).delete() + m2m_model = model.users.through + if model.users.reverse: + m2m_field_name = model.users.field.m2m_reverse_field_name() + else: + m2m_field_name = model.users.field.m2m_field_name() + m2m_model.objects.filter(**{'user__in': users, f'{m2m_field_name}__org_id': org.id}).delete() def _clear_users_from_org(org, users): + """ + 清理用户在该组织下的相关数据 + """ if not users: return - old_org = current_org - set_current_org(org) - _remove_users(AssetPermission, users, org) - _remove_users(UserGroup, users, org, reverse=True) - set_current_org(old_org) + models = (AssetPermission, DatabaseAppPermission, + RemoteAppPermission, K8sAppPermission, UserGroup) + + for m in models: + _remove_users(m, users, org) @receiver(m2m_changed, sender=OrganizationMember) -def on_org_user_changed(sender, instance=None, action=None, pk_set=None, **kwargs): +def on_org_user_changed(action, instance, reverse, pk_set, **kwargs): if action == 'post_remove': - leaved_users = set(pk_set) - set(instance.members.values_list('id', flat=True)) - _clear_users_from_org(instance, leaved_users) + if reverse: + user = instance + org_pk_set = pk_set + + orgs = Organization.objects.filter(id__in=org_pk_set) + for org in orgs: + if not org.members.filter(id=user.id).exists(): + _clear_users_from_org(org, user) + else: + org = instance + user_pk_set = pk_set + + leaved_users = set(pk_set) - set(org.members.filter(id__in=user_pk_set).values_list('id', flat=True)) + _clear_users_from_org(org, leaved_users)