|
|
|
@ -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,12 +28,13 @@ def on_org_create_or_update(sender, instance=None, created=False, **kwargs):
|
|
|
|
|
instance.expire_cache() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _remove_users(model, users, org, reverse=False): |
|
|
|
|
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: |
|
|
|
|
if model.users.reverse: |
|
|
|
|
m2m_field_name = model.users.field.m2m_reverse_field_name() |
|
|
|
|
else: |
|
|
|
|
m2m_field_name = model.users.field.m2m_field_name() |
|
|
|
@ -39,18 +42,33 @@ def _remove_users(model, users, org, reverse=False):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|