mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-22 03:47:38 +00:00
perf: Export resources to add operation logs
This commit is contained in:
69
apps/common/drf/renders/mixins.py
Normal file
69
apps/common/drf/renders/mixins.py
Normal file
@@ -0,0 +1,69 @@
|
||||
from django.utils.translation import gettext_noop
|
||||
|
||||
from audits.const import ActionChoices
|
||||
from audits.utils import record_operate_log_and_activity_log
|
||||
from common.utils import get_logger
|
||||
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
|
||||
class LogMixin(object):
|
||||
@staticmethod
|
||||
def _clean_params(query_params):
|
||||
clean_params = {}
|
||||
ignore_params = ('format', 'order')
|
||||
for key, value in dict(query_params).items():
|
||||
if key in ignore_params:
|
||||
continue
|
||||
if isinstance(value, list):
|
||||
value = list(filter(None, value))
|
||||
if value:
|
||||
clean_params[key] = value
|
||||
return clean_params
|
||||
|
||||
@staticmethod
|
||||
def _get_model(view):
|
||||
model = getattr(view, 'model', None)
|
||||
if not model:
|
||||
serializer = view.get_serializer()
|
||||
if serializer:
|
||||
model = serializer.Meta.model
|
||||
return model
|
||||
|
||||
@staticmethod
|
||||
def _build_after(params, data):
|
||||
base = {
|
||||
gettext_noop('Resource count'): {'value': len(data)}
|
||||
}
|
||||
extra = {key: {'value': value} for key, value in params.items()}
|
||||
return {**extra, **base}
|
||||
|
||||
@staticmethod
|
||||
def get_resource_display(params):
|
||||
spm_filter = params.pop("spm", None)
|
||||
if not params and not spm_filter:
|
||||
display_message = gettext_noop("Export all")
|
||||
elif spm_filter:
|
||||
display_message = gettext_noop("Export only selected items")
|
||||
else:
|
||||
display_message = gettext_noop("Export filtered")
|
||||
return display_message
|
||||
|
||||
def record_logs(self, request, view, data):
|
||||
activity_ids, activity_detail = [], ''
|
||||
model = self._get_model(view)
|
||||
if not model:
|
||||
logger.warning('Model is not defined in view: %s' % view)
|
||||
return
|
||||
|
||||
params = self._clean_params(request.query_params)
|
||||
resource_display = self.get_resource_display(params)
|
||||
after = self._build_after(params, data)
|
||||
if hasattr(view, 'get_activity_detail_msg'):
|
||||
activity_detail = view.get_activity_detail_msg()
|
||||
activity_ids = [d['id'] for d in data if 'id' in d]
|
||||
record_operate_log_and_activity_log(
|
||||
activity_ids, ActionChoices.export, activity_detail,
|
||||
model, resource_display=resource_display, after=after
|
||||
)
|
Reference in New Issue
Block a user