def direct_granted_asset_id_node_id_str_pairs(self): node_asset_pairs = Asset.nodes.through.objects.filter( asset_id__in=self.direct_granted_asset_ids).annotate( asset_id_str=output_as_string('asset_id'), node_id_str=output_as_string('node_id')).values_list( 'node_id_str', 'asset_id_str') node_asset_pairs = list(node_asset_pairs) return node_asset_pairs
def direct_granted_asset_ids(self) -> list: # 3.15 asset_ids = AssetPermission.assets.through.objects.filter( assetpermission_id__in=self.asset_perm_ids).annotate( asset_id_str=output_as_string('asset_id')).values_list( 'asset_id_str', flat=True).distinct() asset_ids = list(asset_ids) return asset_ids
def generate_node_all_asset_ids_mapping(cls, org_id): from .asset import Asset logger.info(f'Generate node asset mapping: ' f'thread={threading.get_ident()} ' f'org_id={org_id}') t1 = time.time() with tmp_to_org(org_id): node_ids_key = Node.objects.annotate( char_id=output_as_string('id')).values_list('char_id', 'key') # * 直接取出全部. filter(node__org_id=org_id)(大规模下会更慢) nodes_asset_ids = Asset.nodes.through.objects.all() \ .annotate(char_node_id=output_as_string('node_id')) \ .annotate(char_asset_id=output_as_string('asset_id')) \ .values_list('char_node_id', 'char_asset_id') node_id_ancestor_keys_mapping = { node_id: cls.get_node_ancestor_keys(node_key, with_self=True) for node_id, node_key in node_ids_key } nodeid_assetsid_mapping = defaultdict(set) for node_id, asset_id in nodes_asset_ids: nodeid_assetsid_mapping[node_id].add(asset_id) t2 = time.time() mapping = defaultdict(set) for node_id, node_key in node_ids_key: asset_ids = nodeid_assetsid_mapping[node_id] node_ancestor_keys = node_id_ancestor_keys_mapping[node_id] for ancestor_key in node_ancestor_keys: mapping[ancestor_key].update(asset_ids) t3 = time.time() logger.info( 't1-t2(DB Query): {} s, t3-t2(Generate mapping): {} s'.format( t2 - t1, t3 - t2)) return mapping
def test_it(cls): from assets.models import Node, Asset nodes = list(Node.objects.all()) nodes_assets = Asset.nodes.through.objects.all()\ .annotate(aid=output_as_string('asset_id'))\ .values_list('node__key', 'aid') mapping = defaultdict(set) for key, asset_id in nodes_assets: mapping[key].add(asset_id) util = cls(nodes, mapping) util.generate() return util