diff --git a/apps/assets/api.py b/apps/assets/api.py index 29e694f6f..334a7842e 100644 --- a/apps/assets/api.py +++ b/apps/assets/api.py @@ -2,6 +2,7 @@ from rest_framework import viewsets, generics, mixins + from rest_framework.response import Response from rest_framework.views import APIView from rest_framework_bulk import BulkModelViewSet, BulkDestroyAPIView @@ -14,6 +15,7 @@ from common.utils import get_object_or_none, signer from .hands import IsSuperUser, IsAppUser, IsValidUser, get_user_granted_assets from .models import AssetGroup, Asset, IDC, SystemUser, AdminUser from . import serializers +from .tasks import update_assets_hardware_info class AssetViewSet(IDInFilterMixin, BulkModelViewSet): @@ -54,29 +56,25 @@ class AssetUpdateGroupApi(generics.RetrieveUpdateAPIView): permission_classes = (IsSuperUser,) -## update the asset group, and add or delete the asset to the group class AssetGroupUpdateApi(generics.RetrieveUpdateAPIView): queryset = AssetGroup.objects.all() serializer_class = serializers.AssetGroupUpdateSerializer permission_classes = (IsSuperUser,) -## update the asset group, and add or delete the system_user to the group class AssetGroupUpdateSystemUserApi(generics.RetrieveUpdateAPIView): queryset = AssetGroup.objects.all() serializer_class = serializers.AssetGroupUpdateSystemUserSerializer permission_classes = (IsSuperUser,) -## update the IDC, and add or delete the assets to the IDC -class IDCupdateAssetsApi(generics.RetrieveUpdateAPIView): +class IDCUpdateAssetsApi(generics.RetrieveUpdateAPIView): queryset = IDC.objects.all() serializer_class = serializers.IDCUpdateAssetsSerializer permission_classes = (IsSuperUser,) class IDCViewSet(IDInFilterMixin, BulkModelViewSet): - """API endpoint that allows IDC to be viewed or edited.""" queryset = IDC.objects.all() serializer_class = serializers.IDCSerializer permission_classes = (IsSuperUser,) @@ -147,3 +145,14 @@ class SystemUserAuthInfoApi(generics.RetrieveAPIView): } return Response(data) + +class AssetRefreshHardwareView(generics.RetrieveAPIView): + queryset = Asset.objects.all() + serializer_class = serializers.AssetSerializer + permission_classes = (IsSuperUser,) + + def retrieve(self, request, *args, **kwargs): + asset_id = kwargs.get('pk') + asset = get_object_or_404(Asset, pk=asset_id) + update_assets_hardware_info([asset]) + return super(AssetRefreshHardwareView, self).retrieve(request, *args, **kwargs) diff --git a/apps/assets/templates/assets/asset_detail.html b/apps/assets/templates/assets/asset_detail.html index 54aa387d6..c56116d61 100644 --- a/apps/assets/templates/assets/asset_detail.html +++ b/apps/assets/templates/assets/asset_detail.html @@ -188,7 +188,7 @@ {% trans 'Rrefresh hardware' %}: - + @@ -353,20 +353,30 @@ function updateAssetSystem(system_users) { }); } +function refreshAssetHardware() { + var the_url = "{% url 'api-assets:asset-refresh' pk=asset.id %}"; + var success = function (data) { + location.reload(); + }; + APIUpdateAttr({ + url: the_url, + success: success, + method: 'GET' + }) +} + $(document).ready(function () { - $('.select2').select2() - .on('select2:select', function(evt) { - var data = evt.params.data; - jumpserver.groups_selected[data.id] = data.text; - }).on('select2:unselect', function(evt) { - var data = evt.params.data; - delete jumpserver.groups_selected[data.id] - }) -}) - .on('click', '#is_active', function () { - var the_url = '{% url "api-assets:asset-detail" pk=asset.id %}'; - var checked = $(this).prop('checked'); + $('.select2').select2().on('select2:select', function(evt) { + var data = evt.params.data; + jumpserver.groups_selected[data.id] = data.text; + }).on('select2:unselect', function(evt) { + var data = evt.params.data; + delete jumpserver.groups_selected[data.id] + }) +}).on('click', '#is_active', function () { + var the_url = '{% url "api-assets:asset-detail" pk=asset.id %}'; + var checked = $(this).prop('checked'); var body = { 'is_active': checked }; @@ -382,21 +392,19 @@ $(document).ready(function () { }else{ $(".ibox-content > table > tbody > tr:nth-child(13) > td:last >b").html('False'); } -}) - .on('click', '#btn_add_user_group', function () { - if (Object.keys(jumpserver.groups_selected).length === 0) { - return false; - } - var groups = $('.bdg_group').map(function() { - return $(this).data('gid'); - }).get(); - $.map(jumpserver.groups_selected, function(value, index) { - groups.push(parseInt(index)); - $('#opt_' + index).remove(); - }); - updateAssetGroups(groups) -}) - .on('click', '.btn_leave_group', function() { +}).on('click', '#btn_add_user_group', function () { + if (Object.keys(jumpserver.groups_selected).length === 0) { + return false; + } + var groups = $('.bdg_group').map(function() { + return $(this).data('gid'); + }).get(); + $.map(jumpserver.groups_selected, function(value, index) { + groups.push(parseInt(index)); + $('#opt_' + index).remove(); + }); + updateAssetGroups(groups) +}).on('click', '.btn_leave_group', function() { var $this = $(this); var $tr = $this.closest('tr'); var $badge = $tr.find('.bdg_group'); @@ -410,35 +418,33 @@ $(document).ready(function () { return $(this).data('gid'); }).get(); updateAssetGroups(groups) -}) - .on('click', '.btn-system-user', function () { - if (Object.keys(jumpserver.groups_selected).length === 0) { - return false; - } - var system_users = $('.bdg_group').map(function() { - return $(this).data('sid'); - }).get(); - $.map(jumpserver.groups_selected, function(value, index) { - system_users.push(parseInt(index)); - $('#opt_' + index).remove(); - }); - updateAssetSystem(system_users) +}).on('click', '.btn-system-user', function () { + if (Object.keys(jumpserver.groups_selected).length === 0) { + return false; + } + var system_users = $('.bdg_group').map(function() { + return $(this).data('sid'); + }).get(); + $.map(jumpserver.groups_selected, function(value, index) { + system_users.push(parseInt(index)); + $('#opt_' + index).remove(); + }); + updateAssetSystem(system_users) -}) - .on('click', '.btn_leave_system', function () { - var $this = $(this); - var $tr = $this.closest('tr'); - var $badge = $tr.find('.bdg_group'); - var sid = $badge.data('sid'); - var name = $badge.html() || $badge.text(); - $('#groups_selected').append( - '' - ); - $tr.remove(); - var system_users = $('.bdg_group').map(function () { - return $(this).data('sid'); - }).get(); - updateAssetSystem(system_users) +}).on('click', '.btn_leave_system', function () { + var $this = $(this); + var $tr = $this.closest('tr'); + var $badge = $tr.find('.bdg_group'); + var sid = $badge.data('sid'); + var name = $badge.html() || $badge.text(); + $('#groups_selected').append( + '' + ); + $tr.remove(); + var system_users = $('.bdg_group').map(function () { + return $(this).data('sid'); + }).get(); + updateAssetSystem(system_users) }).on('click', '.btn-delete-asset', function () { var $this = $(this); @@ -447,6 +453,8 @@ $(document).ready(function () { var the_url = '{% url "api-assets:asset-detail" pk=99991937 %}'.replace('99991937', uid); var redirect_url = "{% url 'assets:asset-list' %}"; objectDelete($this, name, the_url, redirect_url); +}).on('click', '.btn-refresh-asset', function () { + refreshAssetHardware() }) diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index 0abe9db6f..ec1c8433c 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -22,6 +22,9 @@ urlpatterns = [ url(r'^v1/assets/(?P\d+)/groups/$', api.AssetUpdateGroupApi.as_view(), name='asset-update-group'), + url(r'^v1/assets/(?P\d+)/refresh/$', + api.AssetRefreshHardwareView.as_view(), name='asset-refresh'), + url(r'^v1/assets/(?P\d+)/system-users/$', api.SystemUserUpdateApi.as_view(), name='asset-update-system-users'), @@ -42,7 +45,7 @@ urlpatterns = [ # update the IDC, and add or delete the assets to the IDC url(r'^v1/idc/(?P\d+)/assets/$', - api.IDCupdateAssetsApi.as_view(), name='idc-update-assets'), + api.IDCUpdateAssetsApi.as_view(), name='idc-update-assets'), ] diff --git a/apps/assets/urls/views_urls.py b/apps/assets/urls/views_urls.py index 4d3499821..1aa1a4925 100644 --- a/apps/assets/urls/views_urls.py +++ b/apps/assets/urls/views_urls.py @@ -14,6 +14,7 @@ urlpatterns = [ url(r'^asset/(?P[0-9]+)/$', views.AssetDetailView.as_view(), name='asset-detail'), url(r'^asset/(?P[0-9]+)/update/$', views.AssetUpdateView.as_view(), name='asset-update'), url(r'^asset/(?P[0-9]+)/delete/$', views.AssetDeleteView.as_view(), name='asset-delete'), + url(r'^asset/(?P[0-9]+)/refresh/$', views.AssetRefreshHardwareView.as_view(), name='asset-refresh'), url(r'^asset-modal$', views.AssetModalListView.as_view(), name='asset-modal-list'), url(r'^asset-modal-update$', views.AssetModalCreateView.as_view(), name='asset-modal-update'), diff --git a/apps/assets/views/asset.py b/apps/assets/views/asset.py index 2eb1d01a2..69bee748d 100644 --- a/apps/assets/views/asset.py +++ b/apps/assets/views/asset.py @@ -8,6 +8,7 @@ from openpyxl.writer.excel import save_virtual_workbook from openpyxl import load_workbook from django.conf import settings from django.db import IntegrityError +from django.urls import reverse from django.views.generic import TemplateView, ListView, View from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView from django.urls import reverse_lazy @@ -18,6 +19,7 @@ from django.utils.decorators import method_decorator from django.core.cache import cache from django.utils import timezone from django.contrib.auth.mixins import LoginRequiredMixin +from django.shortcuts import get_object_or_404, redirect from common.mixins import JSONResponseMixin from common.utils import get_object_or_none @@ -30,7 +32,7 @@ from ..tasks import update_assets_hardware_info __all__ = ['AssetListView', 'AssetCreateView', 'AssetUpdateView', 'UserAssetListView', 'AssetModalCreateView', 'AssetDetailView', 'AssetModalListView', 'AssetDeleteView', 'AssetExportView', - 'BulkImportAssetView', + 'BulkImportAssetView', 'AssetRefreshHardwareView', ] @@ -324,4 +326,14 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView): 'valid': True, 'msg': 'Created: {}. Updated: {}, Error: {}'.format(len(created), len(updated), len(failed)) } - return self.render_json_response(data) \ No newline at end of file + return self.render_json_response(data) + + +class AssetRefreshHardwareView(AdminUserRequiredMixin, View): + def get(self, request, *args, **kwargs): + asset_id = kwargs.get('pk') + asset = get_object_or_404(Asset, pk=asset_id) + update_assets_hardware_info([asset]) + + return redirect(reverse('assets:asset-detail', kwargs={'pk': asset_id})) +