From e6e2a3574552e3a438b9d7ccb2cebc73602515b6 Mon Sep 17 00:00:00 2001 From: Michael Bai Date: Tue, 14 Sep 2021 14:36:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=9C=AA=E5=88=86=E7=BB=84=E8=8A=82=E7=82=B9=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E6=8E=88=E6=9D=83=E8=B5=84=E4=BA=A7=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=97=B6=EF=BC=8C=E7=94=A8=E6=88=B7=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E6=A0=91=E6=B2=A1=E6=9C=89=E5=8F=98=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/perms/utils/asset/user_permission.py | 41 ++++++++++++++++------- apps/settings/signals_handler.py | 6 ++++ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/apps/perms/utils/asset/user_permission.py b/apps/perms/utils/asset/user_permission.py index 980a0e101..1ea189230 100644 --- a/apps/perms/utils/asset/user_permission.py +++ b/apps/perms/utils/asset/user_permission.py @@ -54,13 +54,24 @@ def get_user_all_asset_perm_ids(user) -> set: class UserGrantedTreeRefreshController: - key_template = 'perms.user.node_tree.builded_orgs.user_id:{user_id}' + key_template = 'perms.user.node_tree.built_orgs.user_id:{user_id}' def __init__(self, user): self.user = user self.key = self.key_template.format(user_id=user.id) self.client = self.get_redis_client() + @classmethod + def clean_all_user_tree_built_mark(cls): + """ 清除所有用户已构建树的标记 """ + client = cls.get_redis_client() + key_match = cls.key_template.format(user_id='*') + keys = client.keys(key_match) + with client.pipeline() as p: + for key in keys: + p.delete(key) + p.execute() + @classmethod def get_redis_client(cls): return cache.client.get_client(write=True) @@ -69,13 +80,13 @@ class UserGrantedTreeRefreshController: org_ids = self.client.smembers(self.key) return {org_id.decode() for org_id in org_ids} - def set_all_orgs_as_builed(self): + def set_all_orgs_as_built(self): self.client.sadd(self.key, *self.org_ids) def have_need_refresh_orgs(self): - builded_org_ids = self.client.smembers(self.key) - builded_org_ids = {org_id.decode() for org_id in builded_org_ids} - have = self.org_ids - builded_org_ids + built_org_ids = self.client.smembers(self.key) + built_org_ids = {org_id.decode() for org_id in built_org_ids} + have = self.org_ids - built_org_ids return have def get_need_refresh_orgs_and_fill_up(self): @@ -85,15 +96,18 @@ class UserGrantedTreeRefreshController: p.smembers(self.key) p.sadd(self.key, *org_ids) ret = p.execute() - builded_org_ids = {org_id.decode() for org_id in ret[0]} - ids = org_ids - builded_org_ids + built_org_ids = {org_id.decode() for org_id in ret[0]} + ids = org_ids - built_org_ids orgs = {*Organization.objects.filter(id__in=ids)} - logger.info(f'Need rebuild orgs are {orgs}, builed orgs are {ret[0]}, all orgs are {org_ids}') + logger.info( + f'Need rebuild orgs are {orgs}, built orgs are {ret[0]}, ' + f'all orgs are {org_ids}' + ) return orgs @classmethod @on_transaction_commit - def remove_builed_orgs_from_users(cls, org_ids, user_ids): + def remove_built_orgs_from_users(cls, org_ids, user_ids): client = cls.get_redis_client() org_ids = [str(org_id) for org_id in org_ids] @@ -102,11 +116,12 @@ class UserGrantedTreeRefreshController: key = cls.key_template.format(user_id=user_id) p.srem(key, *org_ids) p.execute() - logger.info(f'Remove orgs from users builded tree: users:{user_ids} orgs:{org_ids}') + logger.info(f'Remove orgs from users built tree: users:{user_ids} ' + f'orgs:{org_ids}') @classmethod def add_need_refresh_orgs_for_users(cls, org_ids, user_ids): - cls.remove_builed_orgs_from_users(org_ids, user_ids) + cls.remove_built_orgs_from_users(org_ids, user_ids) @classmethod @ensure_in_real_or_default_org @@ -168,7 +183,7 @@ class UserGrantedTreeRefreshController: ).values_list('user_id', flat=True) user_ids.update(group_user_ids) - cls.remove_builed_orgs_from_users( + cls.remove_built_orgs_from_users( [current_org.id], user_ids ) @@ -193,7 +208,7 @@ class UserGrantedTreeRefreshController: with UserGrantedTreeRebuildLock(user_id=user.id): if force: orgs = self.orgs - self.set_all_orgs_as_builed() + self.set_all_orgs_as_built() else: orgs = self.get_need_refresh_orgs_and_fill_up() diff --git a/apps/settings/signals_handler.py b/apps/settings/signals_handler.py index 6264fb9e6..46439e75d 100644 --- a/apps/settings/signals_handler.py +++ b/apps/settings/signals_handler.py @@ -36,6 +36,12 @@ def refresh_settings_on_changed(sender, instance=None, **kwargs): if instance: setting_pub_sub.publish(instance.name) + if instance.name == 'PERM_SINGLE_ASSET_TO_UNGROUP_NODE': + # 清除所有用户授权树已构建的标记,下次访问重新生成 + logger.debug('Clean ALL User perm tree built mark') + from perms.utils.asset import UserGrantedTreeRefreshController + UserGrantedTreeRefreshController.clean_all_user_tree_built_mark() + @receiver(django_ready) def on_django_ready_add_db_config(sender, **kwargs):