diff --git a/apps/assets/api/asset.py b/apps/assets/api/asset.py index abb0243db..a734806fb 100644 --- a/apps/assets/api/asset.py +++ b/apps/assets/api/asset.py @@ -1,19 +1,25 @@ # -*- coding: utf-8 -*- # +import uuid import random from rest_framework import generics +from rest_framework.views import APIView from rest_framework.response import Response from rest_framework_bulk import BulkModelViewSet from rest_framework_bulk import ListBulkCreateUpdateDestroyAPIView from rest_framework.pagination import LimitOffsetPagination +from django.utils.translation import ugettext_lazy as _ from django.shortcuts import get_object_or_404 +from django.urls import reverse_lazy +from django.core.cache import cache from django.db.models import Q from common.mixins import IDInFilterMixin from common.utils import get_logger from common.permissions import IsOrgAdmin, IsOrgAdminOrAppUser +from ..const import CACHE_KEY_ASSET_BULK_UPDATE_ID_PREFIX from ..models import Asset, AdminUser, Node from .. import serializers from ..tasks import update_asset_hardware_info_manual, \ @@ -25,7 +31,7 @@ logger = get_logger(__file__) __all__ = [ 'AssetViewSet', 'AssetListUpdateApi', 'AssetRefreshHardwareApi', 'AssetAdminUserTestApi', - 'AssetGatewayApi' + 'AssetGatewayApi', 'AssetBulkUpdateSelectAPI' ] @@ -92,6 +98,21 @@ class AssetListUpdateApi(IDInFilterMixin, ListBulkCreateUpdateDestroyAPIView): permission_classes = (IsOrgAdmin,) +class AssetBulkUpdateSelectAPI(APIView): + permission_classes = (IsOrgAdmin,) + + def post(self, request, *args, **kwargs): + assets_id = request.data.get('assets_id', '') + if assets_id: + spm = uuid.uuid4().hex + key = CACHE_KEY_ASSET_BULK_UPDATE_ID_PREFIX.format(spm) + cache.set(key, assets_id, 300) + url = reverse_lazy('assets:asset-bulk-update') + '?spm=%s' % spm + return Response({'url': url}) + error = _('Please select assets that need to be updated') + return Response({'error': error}, status=400) + + class AssetRefreshHardwareApi(generics.RetrieveAPIView): """ Refresh asset hardware info diff --git a/apps/assets/const.py b/apps/assets/const.py index 901ade1ff..a110683d0 100644 --- a/apps/assets/const.py +++ b/apps/assets/const.py @@ -48,3 +48,6 @@ TASK_OPTIONS = { 'timeout': 10, 'forks': 10, } + +CACHE_KEY_ASSET_BULK_UPDATE_ID_PREFIX = '_KEY_ASSET_BULK_UPDATE_ID_{}' + diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index edd82cf0f..8adc81de9 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -657,9 +657,23 @@ $(document).ready(function(){ }); } function doUpdate() { - var id_list_string = id_list.join(','); - var url = "{% url 'assets:asset-bulk-update' %}?assets_id=" + id_list_string; - location.href = url + var data = { + 'assets_id':id_list + }; + function error(data) { + toastr.error(JSON.parse(data).error) + } + function success(data) { + location.href = data.url; + } + APIUpdateAttr({ + 'url': "{% url 'api-assets:asset-bulk-update-select' %}", + 'method': 'POST', + 'body': JSON.stringify(data), + 'flash_message': false, + 'success': success, + 'error': error, + }) } function doRemove() { diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index 6ad54cf7e..fec960dab 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -25,6 +25,8 @@ cmd_filter_router.register(r'rules', api.CommandFilterRuleViewSet, 'cmd-filter-r urlpatterns = [ path('assets-bulk/', api.AssetListUpdateApi.as_view(), name='asset-bulk-update'), + path('asset/update/select/', + api.AssetBulkUpdateSelectAPI.as_view(), name='asset-bulk-update-select'), path('assets//refresh/', api.AssetRefreshHardwareApi.as_view(), name='asset-refresh'), path('assets//alive/', diff --git a/apps/assets/views/asset.py b/apps/assets/views/asset.py index b7493e047..96bc451f0 100644 --- a/apps/assets/views/asset.py +++ b/apps/assets/views/asset.py @@ -28,6 +28,7 @@ from common.mixins import JSONResponseMixin from common.utils import get_object_or_none, get_logger from common.permissions import AdminUserRequiredMixin from common.const import create_success_msg, update_success_msg +from ..const import CACHE_KEY_ASSET_BULK_UPDATE_ID_PREFIX from orgs.utils import current_org from .. import forms from ..models import Asset, AdminUser, SystemUser, Label, Node, Domain @@ -120,15 +121,12 @@ class AssetBulkUpdateView(AdminUserRequiredMixin, ListView): form = None def get(self, request, *args, **kwargs): - assets_id = self.request.GET.get('assets_id', '') - self.id_list = [i for i in assets_id.split(',')] - + spm = request.GET.get('spm', '') + assets_id = cache.get(CACHE_KEY_ASSET_BULK_UPDATE_ID_PREFIX.format(spm)) if kwargs.get('form'): self.form = kwargs['form'] elif assets_id: - self.form = self.form_class( - initial={'assets': self.id_list} - ) + self.form = self.form_class(initial={'assets': assets_id}) else: self.form = self.form_class() return super().get(request, *args, **kwargs)