|
|
|
|
# ~*~ coding: utf-8 ~*~
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
from orgs.utils import set_to_root_org
|
|
|
|
|
|
|
|
|
|
__all__ = [
|
|
|
|
|
'AssetsFilterMixin', 'RemoteAppFilterMixin', 'ChangeOrgIfNeedMixin',
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AssetsFilterMixin(object):
|
|
|
|
|
"""
|
|
|
|
|
对资产进行过滤(查询,排序)
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def filter_queryset(self, queryset):
|
|
|
|
|
queryset = self.search_assets(queryset)
|
|
|
|
|
queryset = self.filter_labels(queryset)
|
|
|
|
|
queryset = self.sort_assets(queryset)
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
def search_assets(self, queryset):
|
|
|
|
|
from perms.utils import is_obj_attr_has
|
|
|
|
|
value = self.request.query_params.get('search')
|
|
|
|
|
if not value:
|
|
|
|
|
return queryset
|
|
|
|
|
queryset = [asset for asset in queryset if is_obj_attr_has(asset, value)]
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
def sort_assets(self, queryset):
|
|
|
|
|
from perms.utils import sort_assets
|
|
|
|
|
order_by = self.request.query_params.get('order')
|
|
|
|
|
if not order_by:
|
|
|
|
|
order_by = 'hostname'
|
|
|
|
|
|
|
|
|
|
if order_by.startswith('-'):
|
|
|
|
|
order_by = order_by.lstrip('-')
|
|
|
|
|
reverse = True
|
|
|
|
|
else:
|
|
|
|
|
reverse = False
|
|
|
|
|
|
|
|
|
|
queryset = sort_assets(queryset, order_by=order_by, reverse=reverse)
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
def filter_labels(self, queryset):
|
|
|
|
|
from assets.models import Label
|
|
|
|
|
query_keys = self.request.query_params.keys()
|
|
|
|
|
all_label_keys = Label.objects.values_list('name', flat=True)
|
|
|
|
|
valid_keys = set(all_label_keys) & set(query_keys)
|
|
|
|
|
labels_query = {}
|
|
|
|
|
for key in valid_keys:
|
|
|
|
|
labels_query[key] = self.request.query_params.get(key)
|
|
|
|
|
if not labels_query:
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
labels = set()
|
|
|
|
|
for k, v in labels_query.items():
|
|
|
|
|
label = Label.objects.filter(name=k, value=v).first()
|
|
|
|
|
if not label:
|
|
|
|
|
continue
|
|
|
|
|
labels.add(label)
|
|
|
|
|
|
|
|
|
|
_queryset = []
|
|
|
|
|
for asset in queryset:
|
|
|
|
|
_labels = set(asset.labels.all()) & set(labels)
|
|
|
|
|
if _labels and len(_labels) == len(set(labels)):
|
|
|
|
|
_queryset.append(asset)
|
|
|
|
|
return _queryset
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RemoteAppFilterMixin(object):
|
|
|
|
|
"""
|
|
|
|
|
对RemoteApp进行过滤(查询,排序)
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def filter_queryset(self, queryset):
|
|
|
|
|
queryset = self.search_remote_apps(queryset)
|
|
|
|
|
queryset = self.sort_remote_apps(queryset)
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
def search_remote_apps(self, queryset):
|
|
|
|
|
value = self.request.query_params.get('search')
|
|
|
|
|
if not value:
|
|
|
|
|
return queryset
|
|
|
|
|
queryset = [
|
|
|
|
|
remote_app for remote_app in queryset if value in remote_app.name
|
|
|
|
|
]
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
def sort_remote_apps(self, queryset):
|
|
|
|
|
order_by = self.request.query_params.get('order')
|
|
|
|
|
if not order_by:
|
|
|
|
|
order_by = 'name'
|
|
|
|
|
if order_by.startswith('-'):
|
|
|
|
|
order_by = order_by.lstrip('-')
|
|
|
|
|
reverse = True
|
|
|
|
|
else:
|
|
|
|
|
reverse = False
|
|
|
|
|
|
|
|
|
|
queryset = sorted(
|
|
|
|
|
queryset, key=lambda x: getattr(x, order_by), reverse=reverse
|
|
|
|
|
)
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ChangeOrgIfNeedMixin(object):
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def change_org_if_need(request, kwargs):
|
|
|
|
|
if request.user.is_authenticated and request.user.is_superuser \
|
|
|
|
|
or request.user.is_app \
|
|
|
|
|
or kwargs.get('pk') is None:
|
|
|
|
|
set_to_root_org()
|
|
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
|
|
|
self.change_org_if_need(request, kwargs)
|
|
|
|
|
return super().get(request, *args, **kwargs)
|