mirror of https://github.com/jumpserver/jumpserver
fix: raise http 400 when batch delete in component settings
parent
23c81cf5eb
commit
2bd09f246d
|
@ -1,7 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
from django.contrib.auth import get_user_model
|
||||
from rest_framework.exceptions import ValidationError
|
||||
from django.db.models import Q
|
||||
from rest_framework.request import Request
|
||||
|
||||
from common.utils import lazyproperty
|
||||
|
@ -14,14 +14,32 @@ class AllowBulkDestroyMixin:
|
|||
"""
|
||||
我们规定,批量删除的情况必须用 `id` 指定要删除的数据。
|
||||
"""
|
||||
query = str(filtered.query)
|
||||
can = (
|
||||
'`id` IN (' in query or '`id` =' in query or
|
||||
'ptr_id` IN (' in query or
|
||||
'."id" IN' in query # for postgresql
|
||||
)
|
||||
if not can:
|
||||
raise ValidationError('Bulk destroy all is not allowed')
|
||||
where = filtered.query.where
|
||||
|
||||
def has_id_condition(node):
|
||||
# 检查是否有 `id` 或 `ptr_id` 的条件
|
||||
if isinstance(node, Q):
|
||||
return any(
|
||||
lookup in str(node)
|
||||
for lookup in ['id', 'ptr_id']
|
||||
)
|
||||
if hasattr(node, 'lhs') and hasattr(node, 'rhs'):
|
||||
return any(
|
||||
lookup in str(node.lhs)
|
||||
for lookup in ['id', 'ptr_id']
|
||||
)
|
||||
return False
|
||||
|
||||
def check_conditions(where):
|
||||
if hasattr(where, 'children'):
|
||||
for child in where.children:
|
||||
if has_id_condition(child):
|
||||
return True
|
||||
if hasattr(child, 'children') and check_conditions(child):
|
||||
return True
|
||||
return False
|
||||
|
||||
can = check_conditions(where)
|
||||
return can
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue