diff --git a/apps/assets/api.py b/apps/assets/api.py
index adf7c3011..71399c78e 100644
--- a/apps/assets/api.py
+++ b/apps/assets/api.py
@@ -23,7 +23,7 @@ from django.shortcuts import get_object_or_404
from django.db.models import Q, Count
from django.utils.translation import ugettext_lazy as _
-from common.mixins import CustomFilterMixin
+from common.mixins import IDInFilterMixin
from common.utils import get_logger
from .hands import IsSuperUser, IsValidUser, IsSuperUserOrAppUser, \
get_user_granted_assets
@@ -38,7 +38,7 @@ from .utils import LabelFilter
logger = get_logger(__file__)
-class AssetViewSet(CustomFilterMixin, LabelFilter, BulkModelViewSet):
+class AssetViewSet(IDInFilterMixin, LabelFilter, BulkModelViewSet):
"""
API endpoint that allows Asset to be viewed or edited.
"""
@@ -56,6 +56,7 @@ class AssetViewSet(CustomFilterMixin, LabelFilter, BulkModelViewSet):
asset_group_id = self.request.query_params.get('asset_group_id')
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 cluster_id:
queryset = queryset.filter(cluster__id=cluster_id)
@@ -70,6 +71,9 @@ class AssetViewSet(CustomFilterMixin, LabelFilter, BulkModelViewSet):
system_user = get_object_or_404(SystemUser, id=system_user_id)
clusters = system_user.get_clusters()
queryset = queryset.filter(cluster__in=clusters)
+ if node_id:
+ node = get_object_or_404(Node, id=node_id)
+ queryset = queryset.filter(nodes__key__startswith=node.key)
return queryset
@@ -86,7 +90,7 @@ class UserAssetListView(generics.ListAPIView):
return queryset
-class AssetGroupViewSet(CustomFilterMixin, BulkModelViewSet):
+class AssetGroupViewSet(IDInFilterMixin, BulkModelViewSet):
"""
Asset group api set, for add,delete,update,list,retrieve resource
"""
@@ -120,7 +124,7 @@ class GroupAddAssetsApi(generics.UpdateAPIView):
return Response({'error': serializer.errors}, status=400)
-class ClusterViewSet(CustomFilterMixin, BulkModelViewSet):
+class ClusterViewSet(IDInFilterMixin, BulkModelViewSet):
"""
Cluster api set, for add,delete,update,list,retrieve resource
"""
@@ -161,7 +165,7 @@ class ClusterAddAssetsApi(generics.UpdateAPIView):
return Response({'error': serializer.errors}, status=400)
-class AdminUserViewSet(CustomFilterMixin, BulkModelViewSet):
+class AdminUserViewSet(IDInFilterMixin, BulkModelViewSet):
"""
Admin user api set, for add,delete,update,list,retrieve resource
"""
@@ -197,7 +201,7 @@ class SystemUserViewSet(BulkModelViewSet):
permission_classes = (IsSuperUserOrAppUser,)
-class AssetListUpdateApi(CustomFilterMixin, ListBulkCreateUpdateDestroyAPIView):
+class AssetListUpdateApi(IDInFilterMixin, ListBulkCreateUpdateDestroyAPIView):
"""
Asset bulk update api
"""
@@ -318,8 +322,8 @@ class NodeViewSet(BulkModelViewSet):
serializer_class = serializers.NodeSerializer
def perform_create(self, serializer):
- child_id = Node.root().get_next_child_id()
- serializer.validated_data["id"] = child_id
+ child_key = Node.root().get_next_child_key()
+ serializer.validated_data["key"] = child_key
serializer.save()
@@ -330,17 +334,20 @@ class NodeChildrenApi(mixins.ListModelMixin, generics.CreateAPIView):
instance = None
def post(self, request, *args, **kwargs):
- if not request.data.get("name"):
- request.data["name"] = _("New node {}").format(
- Node.root().get_next_child_id().split(":")[-1]
+ if not request.data.get("value"):
+ request.data["value"] = _("New node {}").format(
+ Node.root().get_next_child_key().split(":")[-1]
)
return super().post(request, *args, **kwargs)
def create(self, request, *args, **kwargs):
instance = self.get_object()
- name = request.data.get("name")
- node = instance.create_child(name=name)
- return Response({"id": node.id, "name": node.name}, status=201)
+ value = request.data.get("value")
+ node = instance.create_child(value=value)
+ return Response(
+ {"id": node.id, "key": node.key, "value": node.value},
+ status=201,
+ )
def get(self, request, *args, **kwargs):
instance = self.get_object()
@@ -348,5 +355,5 @@ class NodeChildrenApi(mixins.ListModelMixin, generics.CreateAPIView):
children = instance.get_all_children()
else:
children = instance.get_children()
- response = [{"id": node.id, "name": node.name} for node in children]
+ response = [{"id": node.id, "key": node.key, "value": node.value} for node in children]
return Response(response, status=200)
diff --git a/apps/assets/models/tree.py b/apps/assets/models/tree.py
index 492bede65..1a4e51588 100644
--- a/apps/assets/models/tree.py
+++ b/apps/assets/models/tree.py
@@ -17,7 +17,14 @@ class Node(models.Model):
date_create = models.DateTimeField(auto_now_add=True)
def __str__(self):
- return self.value
+ return self.full_value
+
+ @property
+ def full_value(self):
+ if self == self.__class__.root():
+ return self.value
+ else:
+ return '{}/{}'.format( self.value, self.parent.full_value)
@property
def level(self):
@@ -52,6 +59,21 @@ class Node(models.Model):
assets = Asset.objects.filter(nodes__in=children)
return assets
+ @property
+ def parent(self):
+ if self.key == "0":
+ return self.__class__.root()
+ elif not self.key.startswith("0"):
+ return self.__class__.root()
+
+ parent_key = ":".join(self.key.split(":")[:-1])
+ try:
+ parent = self.__class__.objects.get(key=parent_key)
+ except Node.DoesNotExist:
+ return self.__class__.root()
+ else:
+ return parent
+
@classmethod
def root(cls):
obj, created = cls.objects.get_or_create(
diff --git a/apps/assets/serializers.py b/apps/assets/serializers.py
index 05fde6904..df7623bf4 100644
--- a/apps/assets/serializers.py
+++ b/apps/assets/serializers.py
@@ -328,11 +328,7 @@ class NodeSerializer(serializers.ModelSerializer):
@staticmethod
def get_parent(obj):
- if obj.key == "0":
- return "#"
- if not obj.key.startswith("0"):
- return "0"
- return ":".join(obj.key.split(":")[:-1])
+ return obj.parent.id
def get_fields(self):
fields = super().get_fields()
diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html
index 3d6a42e5e..d4b2a5bb4 100644
--- a/apps/assets/templates/assets/asset_list.html
+++ b/apps/assets/templates/assets/asset_list.html
@@ -64,7 +64,6 @@
{% include 'assets/_asset_import_modal.html' %}
-{#{% include 'assets/_asset_bulk_update_modal.html' %}#}
{% endblock %}
{% block custom_foot_js %}
@@ -126,15 +125,7 @@ $(document).ready(function(){
})
.on('click', '.labels li', function () {
var val = $(this).text();
- {#var origin_val = $("#asset_list_table_filter input").val();#}
- {#var new_val;#}
- {#if (origin_val === "") {#}
- {# new_val = val;#}
- {# } else { #}
- {# new_val = origin_val + " " + val;#}
- {# } #}
$("#asset_list_table_filter input").val(val);
- {#$('#asset_list_table').DataTable().search(val).draw();#}
jumpserver.table.search(val).draw();
})
.on('click', '.btn_export', function () {
diff --git a/apps/assets/templates/assets/tree.html b/apps/assets/templates/assets/tree.html
index 0a50df960..1bf970ba3 100644
--- a/apps/assets/templates/assets/tree.html
+++ b/apps/assets/templates/assets/tree.html
@@ -5,13 +5,7 @@
{% block custom_head_css_js %}
-{# #}
-
+
{% endblock %}
-{% block help_message %}
-
-
-{% endblock %}
-
-{% block table_container %}
-
-
- {% trans "Create permission" %}
-
+{% block content %}
+
-
{% endblock %}
{% block custom_foot_js %}
+
{% endblock %}
diff --git a/apps/perms/views.py b/apps/perms/views.py
index b5163946c..120fb07e5 100644
--- a/apps/perms/views.py
+++ b/apps/perms/views.py
@@ -10,9 +10,9 @@ from django.urls import reverse_lazy
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.detail import DetailView, SingleObjectMixin
-from common.const import create_success_msg, update_success_msg
+from common.utils import get_object_or_none
from .hands import AdminUserRequiredMixin, User, UserGroup, SystemUser, \
- Asset, AssetGroup
+ Asset, AssetGroup, Node
from .models import AssetPermission, NodePermission
from .forms import AssetPermissionForm
@@ -37,6 +37,15 @@ class AssetPermissionCreateView(AdminUserRequiredMixin, CreateView):
template_name = 'perms/asset_permission_create_update.html'
success_url = reverse_lazy('perms:asset-permission-list')
+ def get_form(self, form_class=None):
+ form = super().get_form(form_class=form_class)
+ node_id = self.request.GET.get("node_id")
+ node = get_object_or_none(Node, id=node_id)
+ if not node:
+ node = Node.root()
+ form['node'].initial = node
+ return form
+
def get_context_data(self, **kwargs):
context = {
'app': _('Perms'),
diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js
index 5f0b148a0..00cf1f55c 100644
--- a/apps/static/js/jumpserver.js
+++ b/apps/static/js/jumpserver.js
@@ -530,4 +530,44 @@ function createPopover(dataset, title, callback) {
var html = "
" + dataset.length + "";
return html;
-}
\ No newline at end of file
+}
+
+
+ $(function () {
+ (function ($) {
+ $.getUrlParam = function (name) {
+ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+ var r = window.location.search.substr(1).match(reg);
+ if (r != null) return unescape(r[2]); return null;
+ }
+ })(jQuery);
+});
+
+function getUrlParam(name) {
+ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+ var r = window.location.search.substr(1).match(reg);
+ if (r != null) return unescape(r[2]); return null;
+}
+
+function setUrlParam(url, name, value) {
+ var urlArray = url.split("?");
+ if (urlArray.length===1){
+ url += "?" + name + "=" + value;
+ } else {
+ var oriParam = urlArray[1].split("&");
+ var oriParamMap = {};
+ $.each(oriParam, function (index, value) {
+ var v = value.split("=");
+ oriParamMap[v[0]] = v[1];
+ });
+ oriParamMap[name] = value;
+ url = urlArray[0] + "?";
+ var newParam = [];
+ $.each(oriParamMap, function (index, value) {
+ console.log(index, value);
+ newParam.push(index + "=" + value);
+ });
+ url += newParam.join("&")
+ }
+ return url
+}
diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html
index 1edadb8e5..c7dafcc95 100644
--- a/apps/templates/_nav.html
+++ b/apps/templates/_nav.html
@@ -20,8 +20,6 @@
- {% trans 'Asset' %}
- - {% trans 'Asset group' %}
- - {% trans 'Cluster' %}
- {% trans 'Admin user' %}
- {% trans 'System user' %}
- {% trans 'Labels' %}
diff --git a/apps/users/api.py b/apps/users/api.py
index 98d174124..0d99e0a4c 100644
--- a/apps/users/api.py
+++ b/apps/users/api.py
@@ -17,14 +17,14 @@ from .models import User, UserGroup
from .permissions import IsSuperUser, IsValidUser, IsCurrentUserOrReadOnly, \
IsSuperUserOrAppUser
from .utils import check_user_valid, generate_token
-from common.mixins import CustomFilterMixin
+from common.mixins import IDInFilterMixin
from common.utils import get_logger
logger = get_logger(__name__)
-class UserViewSet(CustomFilterMixin, BulkModelViewSet):
+class UserViewSet(IDInFilterMixin, BulkModelViewSet):
queryset = User.objects.exclude(role="App")
# queryset = User.objects.all().exclude(role="App").order_by("date_joined")
serializer_class = UserSerializer
@@ -88,7 +88,7 @@ class UserUpdatePKApi(generics.UpdateAPIView):
user.save()
-class UserGroupViewSet(CustomFilterMixin, BulkModelViewSet):
+class UserGroupViewSet(IDInFilterMixin, BulkModelViewSet):
queryset = UserGroup.objects.all()
serializer_class = UserGroupSerializer