perf(permission): batch load dept scopes

This commit is contained in:
caoqianming 2026-03-20 08:43:23 +08:00
parent 6c8a029456
commit e153ee6d54
1 changed files with 21 additions and 7 deletions

View File

@ -206,20 +206,34 @@ class CustomGenericViewSet(MyLoggingMixin, GenericViewSet):
elif action_str == '*': elif action_str == '*':
return queryset return queryset
elif action_str in user_perms_map: elif action_str in user_perms_map:
scope_map = user_perms_map[action_str]
new_queryset = queryset.none() new_queryset = queryset.none()
for dept_id, data_range in user_perms_map[action_str].items(): dept_ids = list(scope_map.keys())
dept = Dept.objects.get(id=dept_id) dept_map = Dept.objects.in_bulk(dept_ids)
for dept_id, data_range in scope_map.items():
scoped_queryset = queryset
if data_range == DataFilter.ALL: if data_range == DataFilter.ALL:
return queryset return queryset
elif data_range == DataFilter.SAMELEVE_AND_BELOW: elif data_range == DataFilter.SAMELEVE_AND_BELOW:
queryset = self.filter_s_a_b(queryset, dept) dept = dept_map.get(dept_id)
if dept is None:
continue
scoped_queryset = self.filter_s_a_b(scoped_queryset, dept)
elif data_range == DataFilter.THISLEVEL_AND_BELOW: elif data_range == DataFilter.THISLEVEL_AND_BELOW:
queryset = self.filter_t_a_b(queryset, dept) dept = dept_map.get(dept_id)
if dept is None:
continue
scoped_queryset = self.filter_t_a_b(scoped_queryset, dept)
elif data_range == DataFilter.THISLEVEL: elif data_range == DataFilter.THISLEVEL:
queryset = self.filter_t(queryset, dept) dept = dept_map.get(dept_id)
if dept is None:
continue
scoped_queryset = self.filter_t(scoped_queryset, dept)
elif data_range == DataFilter.MYSELF: elif data_range == DataFilter.MYSELF:
queryset = queryset.filter(create_by=user) scoped_queryset = scoped_queryset.filter(create_by=user)
new_queryset = new_queryset | queryset else:
continue
new_queryset = new_queryset | scoped_queryset
return new_queryset return new_queryset
else: else:
return queryset.none() return queryset.none()