From c8728cace4a3d353f51251703081f97cbcf9cb11 Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 9 Feb 2018 15:24:44 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=20=E5=AE=8C=E6=88=90=E6=A0=91=E5=BD=A2?= =?UTF-8?q?=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/__cluster.py | 73 ----- apps/assets/api/__group.py | 68 ----- apps/assets/api/admin_user.py | 21 +- apps/assets/api/asset.py | 3 - apps/assets/forms/asset.py | 5 +- apps/assets/models/asset.py | 2 +- apps/assets/models/node.py | 6 +- apps/assets/serializers/admin_user.py | 10 +- apps/assets/tasks.py | 2 +- .../assets/templates/assets/__asset_list.html | 280 ------------------ .../templates/assets/admin_user_assets.html | 16 - .../templates/assets/admin_user_detail.html | 62 ++-- .../assets/templates/assets/asset_detail.html | 60 ++-- .../templates/assets/asset_group_create.html | 31 -- .../templates/assets/asset_group_detail.html | 244 --------------- .../templates/assets/asset_group_list.html | 168 ----------- apps/assets/templates/assets/asset_list.html | 6 +- .../templates/assets/cluster_assets.html | 215 -------------- .../assets/cluster_create_update.html | 76 ----- .../templates/assets/cluster_detail.html | 164 ---------- .../assets/templates/assets/cluster_list.html | 119 -------- .../templates/assets/system_user_asset.html | 3 - .../templates/assets/system_user_detail.html | 47 ++- apps/assets/urls/api_urls.py | 4 +- apps/assets/urls/views_urls.py | 20 -- apps/assets/views/__cluster.py | 111 ------- apps/assets/views/__group.py | 97 ------ apps/assets/views/__init__.py | 3 - apps/assets/views/admin_user.py | 3 +- apps/assets/views/asset.py | 42 ++- apps/assets/views/node.py | 25 -- apps/assets/views/system_user.py | 3 +- .../perms/asset_permission_asset.html | 10 +- .../perms/asset_permission_list.html | 8 +- .../perms/asset_permission_user.html | 10 +- apps/users/templates/users/user_detail.html | 14 +- 36 files changed, 161 insertions(+), 1870 deletions(-) delete mode 100644 apps/assets/api/__cluster.py delete mode 100644 apps/assets/api/__group.py delete mode 100644 apps/assets/templates/assets/__asset_list.html delete mode 100644 apps/assets/templates/assets/asset_group_create.html delete mode 100644 apps/assets/templates/assets/asset_group_detail.html delete mode 100644 apps/assets/templates/assets/asset_group_list.html delete mode 100644 apps/assets/templates/assets/cluster_assets.html delete mode 100644 apps/assets/templates/assets/cluster_create_update.html delete mode 100644 apps/assets/templates/assets/cluster_detail.html delete mode 100644 apps/assets/templates/assets/cluster_list.html delete mode 100644 apps/assets/views/__cluster.py delete mode 100644 apps/assets/views/__group.py delete mode 100644 apps/assets/views/node.py diff --git a/apps/assets/api/__cluster.py b/apps/assets/api/__cluster.py deleted file mode 100644 index 3f0cd1585..000000000 --- a/apps/assets/api/__cluster.py +++ /dev/null @@ -1,73 +0,0 @@ -# ~*~ coding: utf-8 ~*~ -# Copyright (C) 2014-2018 Beijing DuiZhan Technology Co.,Ltd. All Rights Reserved. -# -# Licensed under the GNU General Public License v2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.gnu.org/licenses/gpl-2.0.html -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from rest_framework import generics -from rest_framework.response import Response -from rest_framework_bulk import BulkModelViewSet - - -from common.mixins import IDInFilterMixin -from common.utils import get_logger -from ..hands import IsSuperUser -from ..models import Cluster -from .. import serializers -from ..tasks import test_admin_user_connectability_manual - - -logger = get_logger(__file__) -__all__ = [ - 'ClusterViewSet', 'ClusterTestAssetsAliveApi', 'ClusterAddAssetsApi', -] - - -class ClusterViewSet(IDInFilterMixin, BulkModelViewSet): - """ - Cluster api set, for add,delete,update,list,retrieve resource - """ - queryset = Cluster.objects.all() - serializer_class = serializers.ClusterSerializer - permission_classes = (IsSuperUser,) - - -class ClusterTestAssetsAliveApi(generics.RetrieveAPIView): - """ - Test cluster asset can connect using admin user or not - """ - queryset = Cluster.objects.all() - permission_classes = (IsSuperUser,) - - def retrieve(self, request, *args, **kwargs): - cluster = self.get_object() - admin_user = cluster.admin_user - test_admin_user_connectability_manual.delay(admin_user) - return Response("Task has been send, seen left assets status") - - -class ClusterAddAssetsApi(generics.UpdateAPIView): - queryset = Cluster.objects.all() - serializer_class = serializers.ClusterUpdateAssetsSerializer - permission_classes = (IsSuperUser,) - - def update(self, request, *args, **kwargs): - cluster = self.get_object() - serializer = self.serializer_class(data=request.data) - if serializer.is_valid(): - assets = serializer.validated_data['assets'] - for asset in assets: - asset.cluster = cluster - asset.save() - return Response({"msg": "ok"}) - else: - return Response({'error': serializer.errors}, status=400) \ No newline at end of file diff --git a/apps/assets/api/__group.py b/apps/assets/api/__group.py deleted file mode 100644 index eae848466..000000000 --- a/apps/assets/api/__group.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -# -# ~*~ coding: utf-8 ~*~ -# Copyright (C) 2014-2018 Beijing DuiZhan Technology Co.,Ltd. All Rights Reserved. -# -# Licensed under the GNU General Public License v2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.gnu.org/licenses/gpl-2.0.html -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from rest_framework import generics -from rest_framework.response import Response -from rest_framework_bulk import BulkModelViewSet -from django.db.models import Count - -from common.mixins import IDInFilterMixin -from common.utils import get_logger -from ..hands import IsSuperUser -from ..models import AssetGroup -from .. import serializers - - -logger = get_logger(__file__) - -__all__ = [ - 'AssetGroupViewSet', 'GroupUpdateAssetsApi', 'GroupAddAssetsApi' -] - - -class AssetGroupViewSet(IDInFilterMixin, BulkModelViewSet): - """ - Asset group api set, for add,delete,update,list,retrieve resource - """ - queryset = AssetGroup.objects.all().annotate(asset_count=Count("assets")) - serializer_class = serializers.AssetGroupSerializer - permission_classes = (IsSuperUser,) - - -class GroupUpdateAssetsApi(generics.RetrieveUpdateAPIView): - """ - Asset group, update it's asset member - """ - queryset = AssetGroup.objects.all() - serializer_class = serializers.GroupUpdateAssetsSerializer - permission_classes = (IsSuperUser,) - - -class GroupAddAssetsApi(generics.UpdateAPIView): - queryset = AssetGroup.objects.all() - serializer_class = serializers.GroupUpdateAssetsSerializer - permission_classes = (IsSuperUser,) - - def update(self, request, *args, **kwargs): - group = self.get_object() - serializer = self.serializer_class(data=request.data) - if serializer.is_valid(): - assets = serializer.validated_data['assets'] - group.assets.add(*tuple(assets)) - return Response({"msg": "ok"}) - else: - return Response({'error': serializer.errors}, status=400) \ No newline at end of file diff --git a/apps/assets/api/admin_user.py b/apps/assets/api/admin_user.py index 3960ab50c..a69d771b3 100644 --- a/apps/assets/api/admin_user.py +++ b/apps/assets/api/admin_user.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from django.db import transaction from rest_framework import generics from rest_framework.response import Response from rest_framework_bulk import BulkModelViewSet @@ -20,14 +21,14 @@ from rest_framework_bulk import BulkModelViewSet from common.mixins import IDInFilterMixin from common.utils import get_logger from ..hands import IsSuperUser -from ..models import AdminUser +from ..models import AdminUser, Asset from .. import serializers from ..tasks import test_admin_user_connectability_manual logger = get_logger(__file__) __all__ = [ - 'AdminUserViewSet', 'AdminUserAddClustersApi', 'AdminUserTestConnectiveApi' + 'AdminUserViewSet', 'ReplaceNodesAdminUserApi', 'AdminUserTestConnectiveApi' ] @@ -40,19 +41,23 @@ class AdminUserViewSet(IDInFilterMixin, BulkModelViewSet): permission_classes = (IsSuperUser,) -class AdminUserAddClustersApi(generics.UpdateAPIView): +class ReplaceNodesAdminUserApi(generics.UpdateAPIView): queryset = AdminUser.objects.all() - serializer_class = serializers.AdminUserUpdateClusterSerializer + serializer_class = serializers.ReplaceNodeAdminUserSerializer permission_classes = (IsSuperUser,) def update(self, request, *args, **kwargs): admin_user = self.get_object() serializer = self.serializer_class(data=request.data) if serializer.is_valid(): - clusters = serializer.validated_data['clusters'] - for cluster in clusters: - cluster.admin_user = admin_user - cluster.save() + nodes = serializer.validated_data['nodes'] + assets = [] + for node in nodes: + assets.extend([asset.id for asset in node.get_all_assets()]) + + with transaction.atomic(): + Asset.objects.filter(id__in=assets).update(admin_user=admin_user) + return Response({"msg": "ok"}) else: return Response({'error': serializer.errors}, status=400) diff --git a/apps/assets/api/asset.py b/apps/assets/api/asset.py index 8e9edc3e2..0a73a7fad 100644 --- a/apps/assets/api/asset.py +++ b/apps/assets/api/asset.py @@ -42,14 +42,11 @@ class AssetViewSet(IDInFilterMixin, LabelFilter, BulkModelViewSet): def get_queryset(self): queryset = super().get_queryset() admin_user_id = self.request.query_params.get('admin_user_id') - system_user_id = self.request.query_params.get('system_user_id') node_id = self.request.query_params.get("node_id") if admin_user_id: admin_user = get_object_or_404(AdminUser, id=admin_user_id) queryset = queryset.filter(admin_user=admin_user) - if system_user_id: - system_user = get_object_or_404(SystemUser, id=system_user_id) if node_id: node = get_object_or_404(Node, id=node_id) queryset = queryset.filter(nodes__key__startswith=node.key).distinct() diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py index 8aaf8158b..f2d3d2783 100644 --- a/apps/assets/forms/asset.py +++ b/apps/assets/forms/asset.py @@ -86,7 +86,7 @@ class AssetBulkUpdateForm(forms.ModelForm): class Meta: model = Asset fields = [ - 'assets', 'port', 'labels', 'admin_user' + 'assets', 'port', 'admin_user', 'nodes', ] widgets = { 'admin_user': forms.SelectMultiple( @@ -95,6 +95,9 @@ class AssetBulkUpdateForm(forms.ModelForm): 'labels': forms.SelectMultiple( attrs={'class': 'select2', 'data-placeholder': _('Labels')} ), + 'nodes': forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Nodes')} + ), } def save(self, commit=True): diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index b101d63f9..561628a75 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -30,7 +30,7 @@ def default_cluster(): def default_node(): try: - from .tree import Node + from .node import Node return Node.root() except: return None diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index 7c5e8f450..9fb164250 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -17,7 +17,11 @@ class Node(models.Model): date_create = models.DateTimeField(auto_now_add=True) def __str__(self): - return self.full_value + return self.value + + @property + def name(self): + return self.value @property def full_value(self): diff --git a/apps/assets/serializers/admin_user.py b/apps/assets/serializers/admin_user.py index d38105106..d59ca64ae 100644 --- a/apps/assets/serializers/admin_user.py +++ b/apps/assets/serializers/admin_user.py @@ -2,7 +2,7 @@ # from django.core.cache import cache from rest_framework import serializers -from ..models import Cluster, AdminUser +from ..models import Node, AdminUser from ..const import ADMIN_USER_CONN_CACHE_KEY @@ -39,14 +39,14 @@ class AdminUserSerializer(serializers.ModelSerializer): return obj.assets_amount -class AdminUserUpdateClusterSerializer(serializers.ModelSerializer): +class ReplaceNodeAdminUserSerializer(serializers.ModelSerializer): """ 管理用户更新关联到的集群 """ - clusters = serializers.PrimaryKeyRelatedField( - many=True, queryset=Cluster.objects.all() + nodes = serializers.PrimaryKeyRelatedField( + many=True, queryset=Node.objects.all() ) class Meta: model = AdminUser - fields = ['id', 'clusters'] \ No newline at end of file + fields = ['id', 'nodes'] diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py index 25dec8af7..a64eff231 100644 --- a/apps/assets/tasks.py +++ b/apps/assets/tasks.py @@ -46,7 +46,7 @@ def set_assets_hardware_info(result, **kwargs): continue ___vendor = info.get('ansible_system_vendor', 'Unknown') - ___model = info.get('ansible_product_version', 'Unknown') + ___model = info.get('ansible_product_name', 'Unknown') ___sn = info.get('ansible_product_serial', 'Unknown') for ___cpu_model in info.get('ansible_processor', []): diff --git a/apps/assets/templates/assets/__asset_list.html b/apps/assets/templates/assets/__asset_list.html deleted file mode 100644 index d4b2a5bb4..000000000 --- a/apps/assets/templates/assets/__asset_list.html +++ /dev/null @@ -1,280 +0,0 @@ -{% extends '_base_list.html' %} -{% load i18n %} -{% load static %} -{% block custom_head_css_js %} - - - -{% endblock %} -{% block content_left_head %}{% endblock %} - -{% block table_search %} -
- -
-{% endblock %} - -{% block table_container %} -
{% trans "Create asset" %}
-
- - -
- - - - - - - - - - - - - - - - -
{% trans 'Hostname' %}{% trans 'IP' %}{% trans 'Port' %}{% trans 'Cluster' %}{% trans 'Hardware' %}{% trans 'Active' %}{% trans 'Reachable' %}{% trans 'Action' %}
-
-
- -
- -
-
-
-{% include 'assets/_asset_import_modal.html' %} -{% endblock %} - -{% block custom_foot_js %} - - -{% endblock %} diff --git a/apps/assets/templates/assets/admin_user_assets.html b/apps/assets/templates/assets/admin_user_assets.html index 3140c36c3..fa72abaa5 100644 --- a/apps/assets/templates/assets/admin_user_assets.html +++ b/apps/assets/templates/assets/admin_user_assets.html @@ -20,14 +20,6 @@
  • {% trans 'Assets list' %}
  • -
  • - {% trans 'Update' %} -
  • -
  • - - {% trans 'Delete' %} - -
  • @@ -127,14 +119,6 @@ function initTable() { $(document).ready(function () { initTable(); }) -.on('click', '.btn-delete-admin-user', function () { - var $this = $(this); - var name = "{{ admin_user.name }}"; - var uid = "{{ admin_user.id }}"; - var the_url = '{% url "api-assets:admin-user-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid); - var redirect_url = "{% url 'assets:admin-user-list' %}"; - objectDelete($this, name, the_url, redirect_url); -}) .on('click', '.btn-test-connective', function () { var the_url = "{% url 'api-assets:admin-user-connective' pk=admin_user.id %}"; var error = function (data) { diff --git a/apps/assets/templates/assets/admin_user_detail.html b/apps/assets/templates/assets/admin_user_detail.html index 18464dde4..899b69f26 100644 --- a/apps/assets/templates/assets/admin_user_detail.html +++ b/apps/assets/templates/assets/admin_user_detail.html @@ -31,7 +31,7 @@
    -
    +
    {{ admin_user.name }} @@ -77,11 +77,10 @@
    -
    - -
    +
    +
    - {% trans 'Using this as cluster admin user' %} + {% trans 'Replace assets admin user with this' %}
    @@ -89,25 +88,19 @@ - - {% for cluster in admin_user.cluster_set.all %} - - - - {% endfor %}
    - + {% for node in nodes %} + {% endfor %}
    - +
    {{ cluster.name }}
    @@ -123,29 +116,20 @@ {% endblock %} {% block custom_foot_js %} {% endblock %} diff --git a/apps/assets/templates/assets/asset_detail.html b/apps/assets/templates/assets/asset_detail.html index 675cb99a1..80916340f 100644 --- a/apps/assets/templates/assets/asset_detail.html +++ b/apps/assets/templates/assets/asset_detail.html @@ -73,10 +73,6 @@ {% trans 'Admin user' %}: {{ asset.admin_user }} - - {% trans 'Cluster' %}: - {{ asset.cluster.name }} - {% trans 'Vendor' %}: {{ asset.vendor|default:"" }} @@ -182,7 +178,7 @@
    - {% trans 'Asset groups' %} + {% trans 'Nodes' %}
    @@ -190,25 +186,25 @@ - {% for asset_group in asset_groups %} + {% for node in asset.nodes.all %} - + {% endfor %} @@ -239,28 +235,28 @@ {% endblock %} {% block custom_foot_js %} -{% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/asset_group_detail.html b/apps/assets/templates/assets/asset_group_detail.html deleted file mode 100644 index b779ce0f9..000000000 --- a/apps/assets/templates/assets/asset_group_detail.html +++ /dev/null @@ -1,244 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{% load i18n %} - -{% block custom_head_css_js %} - - -{% endblock %} -{% block content %} -
    -
    -
    -
    - -
    -
    -
    -
    - {% trans 'Asset list of ' %} {{ asset_group.name }} {{ asset_group.assets.all.count }} -
    - - - - - - - - - - -
    -
    -
    -
    - + {% for node in nodes_remain %} + {% endfor %}
    - +
    {{ asset_group.name }}{{ node.name }} - +
    - - - - - - - - - - - -
    {% trans 'Hostname' %}{% trans 'IP' %}{% trans 'Port' %}{% trans 'Alive' %}{% trans 'Action' %}
    -
    -
    -
    -
    -
    -
    - {% trans 'Add assets to this group' %} -
    -
    - - - - - - - - - - - -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -{% endblock %} -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/assets/templates/assets/asset_group_list.html b/apps/assets/templates/assets/asset_group_list.html deleted file mode 100644 index 449486e58..000000000 --- a/apps/assets/templates/assets/asset_group_list.html +++ /dev/null @@ -1,168 +0,0 @@ -{% extends '_base_list.html' %} -{% load i18n static %} -{% block table_search %} -{% endblock %} -{% block table_container %} -
    - {% trans "Create asset group" %} -
    - - - - - - - - - - - - -
    - - {% trans 'Name' %}{% trans 'Asset' %}{% trans 'Comment' %}{% trans 'Action' %}
    -{% include 'assets/_asset_group_bulk_update_modal.html' %} -{% endblock %} -{% block content_bottom_left %}{% endblock %} -{% block custom_foot_js %} - -{% endblock %} - diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index 5e113d879..dbcb8a350 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -325,9 +325,9 @@ function initTree() { $.get("{% url 'api-assets:node-list' %}", function(data, status){ $.each(data, function (index, value) { value["pId"] = value["parent"]; - if (value["key"] === "0") { - value["open"] = true; - } + {#if (value["key"] === "0") {#} + value["open"] = true; + {# }#} value["name"] = value["value"] }); zNodes = data; diff --git a/apps/assets/templates/assets/cluster_assets.html b/apps/assets/templates/assets/cluster_assets.html deleted file mode 100644 index 0582ac643..000000000 --- a/apps/assets/templates/assets/cluster_assets.html +++ /dev/null @@ -1,215 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{% load i18n %} - -{% block custom_head_css_js %} - - - -{% endblock %} -{% block content %} -
    -
    -
    -
    - -
    -
    -
    -
    - {% trans 'Cluster assets' %} {{ cluster.name }} -
    - - - - - - - - - - -
    -
    - -
    - - - - - - - - - - - - -
    {% trans 'Hostname' %}{% trans 'IP' %}{% trans 'Port' %}{% trans 'Alive' %}{% trans 'Action' %}
    -
    -
    -
    -
    -
    -
    - {% trans 'Quick update' %} -
    -
    - - - - - - - -
    {% trans 'Test assets connective' %}: - - - -
    -
    -
    -
    -
    - {% trans 'Add assets to' %} {{ cluster.name }} -
    -
    - - - - - - - - - - - -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -{% endblock %} -{% block custom_foot_js %} - - -{% endblock %} diff --git a/apps/assets/templates/assets/cluster_create_update.html b/apps/assets/templates/assets/cluster_create_update.html deleted file mode 100644 index 66c36bece..000000000 --- a/apps/assets/templates/assets/cluster_create_update.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% load static %} -{% load bootstrap3 %} -{% block custom_head_css_js %} - - -{% endblock %} -{% block content %} -
    -
    -
    -
    -
    -
    {{ action }}
    - -
    - -
    -
    -
    -
    -
    - {% csrf_token %} -

    {% trans 'Basic' %}

    - {% bootstrap_field form.name layout="horizontal" %} - {% bootstrap_field form.address layout="horizontal" %} - {% bootstrap_field form.contact layout="horizontal" %} - {% bootstrap_field form.phone layout="horizontal" %} - -

    {% trans 'Setting' %}

    - {% bootstrap_field form.admin_user layout="horizontal" %} - {% bootstrap_field form.system_users layout="horizontal" %} - -
    -

    {% trans 'Other' %}

    - {% bootstrap_field form.operator layout="horizontal" %} - {% bootstrap_field form.intranet layout="horizontal" %} - {% bootstrap_field form.extranet layout="horizontal" %} - -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -{% endblock %} - -{% block custom_foot_js %} - -{% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/cluster_detail.html b/apps/assets/templates/assets/cluster_detail.html deleted file mode 100644 index 837e36e68..000000000 --- a/apps/assets/templates/assets/cluster_detail.html +++ /dev/null @@ -1,164 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{% load i18n %} - -{% block custom_head_css_js %} - - -{% endblock %} -{% block content %} -
    -
    -
    -
    - -
    -
    -
    -
    - {{ cluster.name }} -
    - - - - - - - - - - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {% trans 'Name' %}:{{ cluster.name }}
    {% trans 'Bandwidth' %}:{{ cluster.bandwidth }}
    {% trans 'Contact' %}:{{ cluster.contact }}
    {% trans 'Phone' %}:{{ cluster.phone }}
    {% trans 'Address' %}:{{ cluster.address }}
    {% trans 'Intranet' %}:{{ cluster.Intranet }}
    {% trans 'Extranet' %}:{{ cluster.extranet }}
    {% trans 'Operator' %}:{{ cluster.operator }}
    {% trans 'Date created' %}:{{ system_user.date_created }}
    {% trans 'Created by' %}:{{ asset_group.created_by }}
    {% trans 'Comment' %}:{{ system_user.comment }}
    -
    -
    -
    -{#
    #} -{#
    #} -{#
    #} -{# {% trans 'Update admin user' %}#} -{#
    #} -{#
    #} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{##} -{# {% for cluster in system_user.cluster.all %}#} -{# #} -{# #} -{# #} -{# #} -{# {% endfor %}#} -{# #} -{#
    #} -{# #} -{#
    #} -{# #} -{#
    {{ cluster.name }}#} -{# #} -{#
    #} -{#
    #} -{#
    #} -{#
    #} -
    -
    -
    -
    -
    - -{% endblock %} -{% block custom_foot_js %} - -{% endblock %} diff --git a/apps/assets/templates/assets/cluster_list.html b/apps/assets/templates/assets/cluster_list.html deleted file mode 100644 index e4743b346..000000000 --- a/apps/assets/templates/assets/cluster_list.html +++ /dev/null @@ -1,119 +0,0 @@ -{% extends '_base_list.html' %} -{% load i18n static %} -{% block custom_head_css_js %} - - -{% endblock %} - -{% block table_search %}{% endblock %} -{% block table_container %} -
    - {% trans "Create cluster" %} -
    - - - - - - - - - - - - - -
    - - {% trans 'Name' %}{% trans 'Admin user' %}{% trans 'Asset num' %}{% trans 'System users' %}{% trans 'Action' %}
    -{% endblock %} -{% block content_bottom_left %}{% endblock %} -{% block custom_foot_js %} - -{% endblock %} - - - diff --git a/apps/assets/templates/assets/system_user_asset.html b/apps/assets/templates/assets/system_user_asset.html index 91c2ffbe0..f82f97ab8 100644 --- a/apps/assets/templates/assets/system_user_asset.html +++ b/apps/assets/templates/assets/system_user_asset.html @@ -21,9 +21,6 @@ {% trans 'Assets' %} -
  • - {% trans 'Update' %} -
  • diff --git a/apps/assets/templates/assets/system_user_detail.html b/apps/assets/templates/assets/system_user_detail.html index 0bf591bb2..46cabb336 100644 --- a/apps/assets/templates/assets/system_user_detail.html +++ b/apps/assets/templates/assets/system_user_detail.html @@ -17,11 +17,11 @@
  • {% trans 'Detail' %}
  • -
  • - - {% trans 'Attached assets' %} - -
  • +{#
  • #} +{# #} +{# {% trans 'Attached assets' %}#} +{# #} +{#
  • #}
  • {% trans 'Update' %}
  • @@ -130,6 +130,23 @@ + + {% trans 'Push system user manually' %}: + + + + + + + + {% trans 'Test assets connective' %}: + + + + + + + {# #} {# {% trans 'Change auth period' %}:#} {# #} @@ -144,7 +161,7 @@
    - {% trans 'Clusters' %} + {% trans 'Nodes' %}
    @@ -152,9 +169,9 @@ @@ -166,9 +183,9 @@ - {% for cluster in system_user.cluster.all %} + {% for node in system_user.nodes.all %} - + @@ -201,7 +218,7 @@ function updateSystemUserCluster(clusters) { // change tr html of user groups. $('.cluster_edit tbody').append( '' + - '' + + '' + '' + '' ) @@ -242,7 +259,7 @@ $(document).ready(function () { if (Object.keys(jumpserver.cluster_selected).length === 0) { return false; } - var clusters = $('.bdg_cluster').map(function() { + var clusters = $('.bdg_node').map(function() { return $(this).data('gid'); }).get(); $.map(jumpserver.cluster_selected, function(value, index) { @@ -253,14 +270,14 @@ $(document).ready(function () { .on('click', '.btn-remove-from-cluster', function() { var $this = $(this); var $tr = $this.closest('tr'); - var $badge = $tr.find('.bdg_cluster'); + var $badge = $tr.find('.bdg_node'); var gid = $badge.data('gid'); var cluster_name = $badge.html() || $badge.text(); $('#groups_selected').append( '' ); $tr.remove(); - var clusters = $('.bdg_cluster').map(function () { + var clusters = $('.bdg_node').map(function () { return $(this).data('gid'); }).get(); updateSystemUserCluster(clusters); diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index 8847b6397..236a1f854 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -35,8 +35,8 @@ urlpatterns = [ # api.ClusterAddAssetsApi.as_view(), name='cluster-add-assets'), #url(r'^v1/cluster/(?P[0-9a-zA-Z\-]{36})/assets/connective/$', # api.ClusterTestAssetsAliveApi.as_view(), name='cluster-test-connective'), - url(r'^v1/admin-user/(?P[0-9a-zA-Z\-]{36})/clusters/$', - api.AdminUserAddClustersApi.as_view(), name='admin-user-add-clusters'), + url(r'^v1/admin-user/(?P[0-9a-zA-Z\-]{36})/nodes/$', + api.ReplaceNodesAdminUserApi.as_view(), name='replace-nodes-admin-user'), url(r'^v1/admin-user/(?P[0-9a-zA-Z\-]{36})/connective/$', api.AdminUserTestConnectiveApi.as_view(), name='admin-user-connective'), url(r'^v1/system-user/(?P[0-9a-zA-Z\-]{36})/push/$', diff --git a/apps/assets/urls/views_urls.py b/apps/assets/urls/views_urls.py index 1704531d2..545e7b062 100644 --- a/apps/assets/urls/views_urls.py +++ b/apps/assets/urls/views_urls.py @@ -14,27 +14,11 @@ urlpatterns = [ url(r'^asset/(?P[0-9a-zA-Z\-]{36})/$', views.AssetDetailView.as_view(), name='asset-detail'), url(r'^asset/(?P[0-9a-zA-Z\-]{36})/update/$', views.AssetUpdateView.as_view(), name='asset-update'), url(r'^asset/(?P[0-9a-zA-Z\-]{36})/delete/$', views.AssetDeleteView.as_view(), name='asset-delete'), - url(r'^asset-modal$', views.AssetModalListView.as_view(), name='asset-modal-list'), url(r'^asset/update/$', views.AssetBulkUpdateView.as_view(), name='asset-bulk-update'), # User asset view url(r'^user-asset/$', views.UserAssetListView.as_view(), name='user-asset-list'), - # # Resource asset group url - # url(r'^asset-group/$', views.AssetGroupListView.as_view(), name='asset-group-list'), - # url(r'^asset-group/create/$', views.AssetGroupCreateView.as_view(), name='asset-group-create'), - # url(r'^asset-group/(?P[0-9a-zA-Z\-]{36})/$', views.AssetGroupDetailView.as_view(), name='asset-group-detail'), - # url(r'^asset-group/(?P[0-9a-zA-Z\-]{36})/update/$', views.AssetGroupUpdateView.as_view(), name='asset-group-update'), - # url(r'^asset-group/(?P[0-9a-zA-Z\-]{36})/delete/$', views.AssetGroupDeleteView.as_view(), name='asset-group-delete'), - - # Resource cluster url - # url(r'^cluster/$', views.ClusterListView.as_view(), name='cluster-list'), - # url(r'^cluster/create/$', views.ClusterCreateView.as_view(), name='cluster-create'), - # url(r'^cluster/(?P[0-9a-zA-Z\-]{36})/$', views.ClusterDetailView.as_view(), name='cluster-detail'), - # url(r'^cluster/(?P[0-9a-zA-Z\-]{36})/update/', views.ClusterUpdateView.as_view(), name='cluster-update'), - # url(r'^cluster/(?P[0-9a-zA-Z\-]{36})/delete/$', views.ClusterDeleteView.as_view(), name='cluster-delete'), - # url(r'^cluster/(?P[0-9a-zA-Z\-]{36})/assets/$', views.ClusterAssetsView.as_view(), name='cluster-assets'), - # Resource admin user url url(r'^admin-user/$', views.AdminUserListView.as_view(), name='admin-user-list'), url(r'^admin-user/create/$', views.AdminUserCreateView.as_view(), name='admin-user-create'), @@ -50,14 +34,10 @@ urlpatterns = [ url(r'^system-user/(?P[0-9a-zA-Z\-]{36})/update/$', views.SystemUserUpdateView.as_view(), name='system-user-update'), url(r'^system-user/(?P[0-9a-zA-Z\-]{36})/delete/$', views.SystemUserDeleteView.as_view(), name='system-user-delete'), url(r'^system-user/(?P[0-9a-zA-Z\-]{36})/asset/$', views.SystemUserAssetView.as_view(), name='system-user-asset'), - # url(r'^system-user/(?P[0-9a-zA-Z\-]{36})/asset-group$', views.SystemUserAssetGroupView.as_view(), - # name='system-user-asset-group'), url(r'^label/$', views.LabelListView.as_view(), name='label-list'), url(r'^label/create/$', views.LabelCreateView.as_view(), name='label-create'), url(r'^label/(?P[0-9a-zA-Z\-]{36})/update/$', views.LabelUpdateView.as_view(), name='label-update'), url(r'^label/(?P[0-9a-zA-Z\-]{36})/delete/$', views.LabelDeleteView.as_view(), name='label-delete'), - - url(r'^tree/$', views.TreeView.as_view(), name='tree-view'), ] diff --git a/apps/assets/views/__cluster.py b/apps/assets/views/__cluster.py deleted file mode 100644 index 5df58953c..000000000 --- a/apps/assets/views/__cluster.py +++ /dev/null @@ -1,111 +0,0 @@ -# coding:utf-8 -from django.utils.translation import ugettext as _ -from django.views.generic import TemplateView, ListView, View -from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView -from django.urls import reverse_lazy -from django.views.generic.detail import DetailView, SingleObjectMixin -from django.contrib.messages.views import SuccessMessageMixin - -from common.const import create_success_msg, update_success_msg -from .. import forms -from ..models import Asset, AssetGroup, AdminUser, Cluster, SystemUser -from ..hands import AdminUserRequiredMixin - - -__all__ = [ - 'ClusterListView', 'ClusterCreateView', 'ClusterUpdateView', - 'ClusterDetailView', 'ClusterDeleteView', 'ClusterAssetsView', -] - - -class ClusterListView(AdminUserRequiredMixin, TemplateView): - template_name = 'assets/cluster_list.html' - - def get_context_data(self, **kwargs): - context = { - 'app': _('Assets'), - 'action': _('Cluster list'), - } - kwargs.update(context) - return super().get_context_data(**kwargs) - - -class ClusterCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): - model = Cluster - form_class = forms.ClusterForm - template_name = 'assets/cluster_create_update.html' - success_url = reverse_lazy('assets:cluster-list') - success_message = create_success_msg - - def get_context_data(self, **kwargs): - context = { - 'app': _('assets'), - 'action': _('Create cluster'), - } - kwargs.update(context) - return super().get_context_data(**kwargs) - - def form_valid(self, form): - cluster = form.save() - cluster.created_by = self.request.user.username - cluster.save() - return super().form_valid(form) - - -class ClusterUpdateView(AdminUserRequiredMixin, SuccessMessageMixin, UpdateView): - model = Cluster - form_class = forms.ClusterForm - template_name = 'assets/cluster_create_update.html' - context_object_name = 'cluster' - success_url = reverse_lazy('assets:cluster-list') - success_message = update_success_msg - - def get_context_data(self, **kwargs): - context = { - 'app': _('assets'), - 'action': _('Update Cluster'), - } - kwargs.update(context) - return super().get_context_data(**kwargs) - - -class ClusterDetailView(AdminUserRequiredMixin, DetailView): - model = Cluster - template_name = 'assets/cluster_detail.html' - context_object_name = 'cluster' - - def get_context_data(self, **kwargs): - admin_user_list = AdminUser.objects.exclude() - context = { - 'app': _('Assets'), - 'action': _('Cluster detail'), - 'admin_user_list': admin_user_list, - } - kwargs.update(context) - return super().get_context_data(**kwargs) - - -class ClusterAssetsView(AdminUserRequiredMixin, DetailView): - model = Cluster - template_name = 'assets/cluster_assets.html' - context_object_name = 'cluster' - - def get_context_data(self, **kwargs): - assets_remain = Asset.objects.exclude(id__in=self.object.assets.all()) - - context = { - 'app': _('Assets'), - 'action': _('Asset detail'), - 'groups': AssetGroup.objects.all(), - 'system_users': SystemUser.objects.all(), - 'assets_remain': assets_remain, - 'assets': [asset for asset in Asset.objects.all() if asset not in assets_remain], - } - kwargs.update(context) - return super().get_context_data(**kwargs) - - -class ClusterDeleteView(AdminUserRequiredMixin, DeleteView): - model = Cluster - template_name = 'delete_confirm.html' - success_url = reverse_lazy('assets:cluster-list') diff --git a/apps/assets/views/__group.py b/apps/assets/views/__group.py deleted file mode 100644 index 0ae65eaa0..000000000 --- a/apps/assets/views/__group.py +++ /dev/null @@ -1,97 +0,0 @@ -# coding:utf-8 -from __future__ import absolute_import, unicode_literals - -from django.utils.translation import ugettext as _ -from django.views.generic import TemplateView, ListView, View -from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView -from django.urls import reverse_lazy -from django.views.generic.detail import DetailView, SingleObjectMixin -from django.shortcuts import get_object_or_404, reverse, redirect -from django.contrib.messages.views import SuccessMessageMixin - -from common.const import create_success_msg, update_success_msg -from .. import forms -from ..models import Asset, AssetGroup, AdminUser, Cluster, SystemUser -from ..hands import AdminUserRequiredMixin - - -__all__ = [ - 'AssetGroupCreateView', 'AssetGroupDetailView', - 'AssetGroupUpdateView', 'AssetGroupListView', - 'AssetGroupDeleteView', -] - - -class AssetGroupCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): - model = AssetGroup - form_class = forms.AssetGroupForm - template_name = 'assets/asset_group_create.html' - success_url = reverse_lazy('assets:asset-group-list') - success_message = create_success_msg - - def get_context_data(self, **kwargs): - context = { - 'app': _('Assets'), - 'action': _('Create asset group'), - } - kwargs.update(context) - return super().get_context_data(**kwargs) - - def form_valid(self, form): - group = form.save() - group.created_by = self.request.user.username - group.save() - return super().form_valid(form) - - -class AssetGroupListView(AdminUserRequiredMixin, TemplateView): - template_name = 'assets/asset_group_list.html' - - def get_context_data(self, **kwargs): - context = { - 'app': _('Assets'), - 'action': _('Asset group list'), - 'assets': Asset.objects.all(), - 'system_users': SystemUser.objects.all(), - } - kwargs.update(context) - return super(AssetGroupListView, self).get_context_data(**kwargs) - - -class AssetGroupDetailView(AdminUserRequiredMixin, DetailView): - model = AssetGroup - template_name = 'assets/asset_group_detail.html' - context_object_name = 'asset_group' - - def get_context_data(self, **kwargs): - assets_remain = Asset.objects.exclude(groups__in=[self.object]) - context = { - 'app': _('Assets'), - 'action': _('Asset group detail'), - 'assets_remain': assets_remain, - 'assets': self.object.assets.all(), - } - kwargs.update(context) - return super().get_context_data(**kwargs) - - -class AssetGroupUpdateView(AdminUserRequiredMixin, SuccessMessageMixin, UpdateView): - model = AssetGroup - form_class = forms.AssetGroupForm - template_name = 'assets/asset_group_create.html' - success_url = reverse_lazy('assets:asset-group-list') - success_message = update_success_msg - - def get_context_data(self, **kwargs): - context = { - 'app': _('Assets'), - 'action': _('Create asset group'), - } - kwargs.update(context) - return super().get_context_data(**kwargs) - - -class AssetGroupDeleteView(AdminUserRequiredMixin, DeleteView): - template_name = 'delete_confirm.html' - model = AssetGroup - success_url = reverse_lazy('assets:asset-group-list') diff --git a/apps/assets/views/__init__.py b/apps/assets/views/__init__.py index 488d04262..097dec3ae 100644 --- a/apps/assets/views/__init__.py +++ b/apps/assets/views/__init__.py @@ -1,8 +1,5 @@ # coding:utf-8 from .asset import * -# from .group import * -# from .cluster import * from .system_user import * from .admin_user import * from .label import * -from .node import * diff --git a/apps/assets/views/admin_user.py b/apps/assets/views/admin_user.py index ec27a1466..7d7878e88 100644 --- a/apps/assets/views/admin_user.py +++ b/apps/assets/views/admin_user.py @@ -10,7 +10,7 @@ from django.views.generic.detail import DetailView, SingleObjectMixin from common.const import create_success_msg, update_success_msg from .. import forms -from ..models import AdminUser, Cluster +from ..models import AdminUser, Node from ..hands import AdminUserRequiredMixin __all__ = [ @@ -77,6 +77,7 @@ class AdminUserDetailView(AdminUserRequiredMixin, DetailView): context = { 'app': _('Assets'), 'action': _('Admin user detail'), + 'nodes': Node.objects.all() } kwargs.update(context) return super().get_context_data(**kwargs) diff --git a/apps/assets/views/asset.py b/apps/assets/views/asset.py index b14282f74..62148d6b2 100644 --- a/apps/assets/views/asset.py +++ b/apps/assets/views/asset.py @@ -34,8 +34,7 @@ from ..hands import AdminUserRequiredMixin __all__ = [ 'AssetListView', 'AssetCreateView', 'AssetUpdateView', 'UserAssetListView', 'AssetBulkUpdateView', 'AssetDetailView', - 'AssetModalListView', 'AssetDeleteView', 'AssetExportView', - 'BulkImportAssetView', + 'AssetDeleteView', 'AssetExportView', 'BulkImportAssetView', ] logger = get_logger(__file__) @@ -102,22 +101,22 @@ class AssetCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): return create_success_msg % ({"name": cleaned_data["hostname"]}) -class AssetModalListView(AdminUserRequiredMixin, ListView): - paginate_by = settings.DISPLAY_PER_PAGE - model = Asset - context_object_name = 'asset_modal_list' - template_name = 'assets/asset_modal_list.html' - - def get_context_data(self, **kwargs): - assets = Asset.objects.all() - assets_id = self.request.GET.get('assets_id', '') - assets_id_list = [i for i in assets_id.split(',') if i.isdigit()] - context = { - 'all_assets': assets_id_list, - 'assets': assets - } - kwargs.update(context) - return super().get_context_data(**kwargs) +# class AssetModalListView(AdminUserRequiredMixin, ListView): +# paginate_by = settings.DISPLAY_PER_PAGE +# model = Asset +# context_object_name = 'asset_modal_list' +# template_name = 'assets/_asset_list_modal.html' +# +# def get_context_data(self, **kwargs): +# assets = Asset.objects.all() +# assets_id = self.request.GET.get('assets_id', '') +# assets_id_list = [i for i in assets_id.split(',') if i.isdigit()] +# context = { +# 'all_assets': assets_id_list, +# 'assets': assets +# } +# kwargs.update(context) +# return super().get_context_data(**kwargs) class AssetBulkUpdateView(AdminUserRequiredMixin, ListView): @@ -191,14 +190,11 @@ class AssetDetailView(DetailView): template_name = 'assets/asset_detail.html' def get_context_data(self, **kwargs): - asset_groups = self.object.groups.all() + nodes_remain = Node.objects.exclude(assets=self.object) context = { 'app': _('Assets'), 'action': _('Asset detail'), - 'asset_groups_remain': [asset_group for asset_group in AssetGroup.objects.all() - if asset_group not in asset_groups], - 'asset_groups': asset_groups, - 'system_users_all': SystemUser.objects.all(), + 'nodes_remain': nodes_remain, } kwargs.update(context) return super().get_context_data(**kwargs) diff --git a/apps/assets/views/node.py b/apps/assets/views/node.py deleted file mode 100644 index 8c8a463c7..000000000 --- a/apps/assets/views/node.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# - -from django.views.generic import TemplateView -from django.utils.translation import ugettext_lazy as _ - -from common.mixins import AdminUserRequiredMixin -from ..models import Label - - -__all__ = ['TreeView'] - - -class TreeView(AdminUserRequiredMixin, TemplateView): - template_name = 'assets/tree.html' - - def get_context_data(self, **kwargs): - context = { - 'app': _('Assets'), - 'action': _('Tree view'), - 'labels': Label.objects.all(), - } - kwargs.update(context) - return super().get_context_data(**kwargs) - diff --git a/apps/assets/views/system_user.py b/apps/assets/views/system_user.py index 3b79d0391..2e4eacf56 100644 --- a/apps/assets/views/system_user.py +++ b/apps/assets/views/system_user.py @@ -9,7 +9,7 @@ from django.views.generic.detail import DetailView from common.const import create_success_msg, update_success_msg from ..forms import SystemUserForm -from ..models import SystemUser, Cluster +from ..models import SystemUser, Node from ..hands import AdminUserRequiredMixin @@ -73,6 +73,7 @@ class SystemUserDetailView(AdminUserRequiredMixin, DetailView): context = { 'app': _('Assets'), 'action': _('System user detail'), + 'nodes_remain': Node.objects.exclude(systemuser=self.object) } kwargs.update(context) return super().get_context_data(**kwargs) diff --git a/apps/perms/templates/perms/asset_permission_asset.html b/apps/perms/templates/perms/asset_permission_asset.html index 5cfc44c05..12369574d 100644 --- a/apps/perms/templates/perms/asset_permission_asset.html +++ b/apps/perms/templates/perms/asset_permission_asset.html @@ -191,7 +191,7 @@ function updateGroup(groups) { } jumpserver.assets_selected = {}; -jumpserver.groups_selected = {}; +jumpserver.nodes_selected = {}; $(document).ready(function () { $('.select2.asset').select2() @@ -206,11 +206,11 @@ $(document).ready(function () { $('.select2.group').select2() .on('select2:select', function(evt) { var data = evt.params.data; - jumpserver.groups_selected[data.id] = data.text; + jumpserver.nodes_selected[data.id] = data.text; }) .on('select2:unselect', function(evt) { var data = evt.params.data; - delete jumpserver.groups_selected[data.id] + delete jumpserver.nodes_selected[data.id] }) }) .on('click', '.btn-add-assets', function () { @@ -232,7 +232,7 @@ $(document).ready(function () { removeAssets(assets) }) .on('click', '#btn-add-group', function () { - if (Object.keys(jumpserver.groups_selected).length === 0) { + if (Object.keys(jumpserver.nodes_selected).length === 0) { return false; } @@ -240,7 +240,7 @@ $(document).ready(function () { return $(this).data('gid'); }).get(); - $.map(jumpserver.groups_selected, function(group_name, index) { + $.map(jumpserver.nodes_selected, function(group_name, index) { groups.push(index); $('#opt_' + index).remove(); $('.group_edit tbody').append( diff --git a/apps/perms/templates/perms/asset_permission_list.html b/apps/perms/templates/perms/asset_permission_list.html index 9f8e26a43..279b0eaaf 100644 --- a/apps/perms/templates/perms/asset_permission_list.html +++ b/apps/perms/templates/perms/asset_permission_list.html @@ -85,7 +85,7 @@ function initTable() { ele: $('#permission_list_table'), columnDefs: [ {targets: 1, createdCell: function (td, cellData) { - var html = '' + cellData.name + ''; + var html = '' + cellData.name + ''; $(td).html(html.replace("99899", cellData.pk)); }}, {targets: 2, createdCell: function (td, cellData) { @@ -178,9 +178,9 @@ function initTree() { $.get("{% url 'api-assets:node-list' %}", function(data, status){ $.each(data, function (index, value) { value["pId"] = value["parent"]; - if (value["key"] === "0") { - value["open"] = true; - } + {#if (value["key"] === "0") {#} + value["open"] = true; + {# }#} value["name"] = value["value"] }); zNodes = data; diff --git a/apps/perms/templates/perms/asset_permission_user.html b/apps/perms/templates/perms/asset_permission_user.html index 2e64368aa..bee5b0e35 100644 --- a/apps/perms/templates/perms/asset_permission_user.html +++ b/apps/perms/templates/perms/asset_permission_user.html @@ -150,7 +150,7 @@ {% block custom_foot_js %}
    - + {% for node in nodes_remain %} + {% endfor %}
    {{ cluster.name }}{{ node.name }}
    ' + cluster_name + '' + cluster_name + '