mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-19 01:45:27 +00:00
perf: 优化命令记录慢的问题
This commit is contained in:
@@ -7,7 +7,7 @@ from common.utils import get_logger
|
||||
from perms.pagination import NodeGrantedAssetPagination, AllGrantedAssetPagination
|
||||
from assets.models import Asset, Node
|
||||
from perms import serializers
|
||||
from perms.utils.asset.user_permission import UserGrantedAssetsQueryUtils, QuerySetStage
|
||||
from perms.utils.asset.user_permission import UserGrantedAssetsQueryUtils
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
@@ -53,122 +53,6 @@ def get_user_all_asset_perm_ids(user) -> set:
|
||||
return asset_perm_ids
|
||||
|
||||
|
||||
class QuerySetStage:
|
||||
def __init__(self):
|
||||
self._prefetch_related = set()
|
||||
self._only = ()
|
||||
self._filters = []
|
||||
self._querysets_and = []
|
||||
self._querysets_or = []
|
||||
self._order_by = None
|
||||
self._annotate = []
|
||||
self._before_union_merge_funs = set()
|
||||
self._after_union_merge_funs = set()
|
||||
|
||||
def annotate(self, *args, **kwargs):
|
||||
self._annotate.append((args, kwargs))
|
||||
self._before_union_merge_funs.add(self._merge_annotate)
|
||||
return self
|
||||
|
||||
def prefetch_related(self, *lookups):
|
||||
self._prefetch_related.update(lookups)
|
||||
self._before_union_merge_funs.add(self._merge_prefetch_related)
|
||||
return self
|
||||
|
||||
def only(self, *fields):
|
||||
self._only = fields
|
||||
self._before_union_merge_funs.add(self._merge_only)
|
||||
return self
|
||||
|
||||
def order_by(self, *field_names):
|
||||
self._order_by = field_names
|
||||
self._after_union_merge_funs.add(self._merge_order_by)
|
||||
return self
|
||||
|
||||
def filter(self, *args, **kwargs):
|
||||
self._filters.append((args, kwargs))
|
||||
self._before_union_merge_funs.add(self._merge_filters)
|
||||
return self
|
||||
|
||||
def and_with_queryset(self, qs: QuerySet):
|
||||
assert isinstance(qs, QuerySet), f'Must be `QuerySet`'
|
||||
self._order_by = qs.query.order_by
|
||||
self._after_union_merge_funs.add(self._merge_order_by)
|
||||
self._querysets_and.append(qs.order_by())
|
||||
self._before_union_merge_funs.add(self._merge_querysets_and)
|
||||
return self
|
||||
|
||||
def or_with_queryset(self, qs: QuerySet):
|
||||
assert isinstance(qs, QuerySet), f'Must be `QuerySet`'
|
||||
self._order_by = qs.query.order_by
|
||||
self._after_union_merge_funs.add(self._merge_order_by)
|
||||
self._querysets_or.append(qs.order_by())
|
||||
self._before_union_merge_funs.add(self._merge_querysets_or)
|
||||
return self
|
||||
|
||||
def merge_multi_before_union(self, *querysets):
|
||||
ret = []
|
||||
for qs in querysets:
|
||||
qs = self.merge_before_union(qs)
|
||||
ret.append(qs)
|
||||
return ret
|
||||
|
||||
def _merge_only(self, qs: QuerySet):
|
||||
if self._only:
|
||||
qs = qs.only(*self._only)
|
||||
return qs
|
||||
|
||||
def _merge_filters(self, qs: QuerySet):
|
||||
if self._filters:
|
||||
for args, kwargs in self._filters:
|
||||
qs = qs.filter(*args, **kwargs)
|
||||
return qs
|
||||
|
||||
def _merge_querysets_and(self, qs: QuerySet):
|
||||
if self._querysets_and:
|
||||
for qs_and in self._querysets_and:
|
||||
qs &= qs_and
|
||||
return qs
|
||||
|
||||
def _merge_annotate(self, qs: QuerySet):
|
||||
if self._annotate:
|
||||
for args, kwargs in self._annotate:
|
||||
qs = qs.annotate(*args, **kwargs)
|
||||
return qs
|
||||
|
||||
def _merge_querysets_or(self, qs: QuerySet):
|
||||
if self._querysets_or:
|
||||
for qs_or in self._querysets_or:
|
||||
qs |= qs_or
|
||||
return qs
|
||||
|
||||
def _merge_prefetch_related(self, qs: QuerySet):
|
||||
if self._prefetch_related:
|
||||
qs = qs.prefetch_related(*self._prefetch_related)
|
||||
return qs
|
||||
|
||||
def _merge_order_by(self, qs: QuerySet):
|
||||
if self._order_by is not None:
|
||||
qs = qs.order_by(*self._order_by)
|
||||
return qs
|
||||
|
||||
def merge_before_union(self, qs: QuerySet) -> QuerySet:
|
||||
assert isinstance(qs, QuerySet), f'Must be `QuerySet`'
|
||||
for fun in self._before_union_merge_funs:
|
||||
qs = fun(qs)
|
||||
return qs
|
||||
|
||||
def merge_after_union(self, qs: QuerySet) -> QuerySet:
|
||||
for fun in self._after_union_merge_funs:
|
||||
qs = fun(qs)
|
||||
return qs
|
||||
|
||||
def merge(self, qs: QuerySet) -> QuerySet:
|
||||
qs = self.merge_before_union(qs)
|
||||
qs = self.merge_after_union(qs)
|
||||
return qs
|
||||
|
||||
|
||||
class UserGrantedTreeRefreshController:
|
||||
key_template = 'perms.user.node_tree.builded_orgs.user_id:{user_id}'
|
||||
|
||||
|
Reference in New Issue
Block a user