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 %} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + +
+ + {% trans 'Node' %}{% trans 'User group' %}{% trans 'System user' %}{% trans 'Is active' %}{% trans 'Date expired' %}{% trans 'Action' %}
+
+
+
- - - - - - - - - - - - - - -
- - {% trans 'Node' %}{% trans 'User group' %}{% trans 'System user' %}{% trans 'Is active' %}{% trans 'Date expired' %}{% trans 'Action' %}
{% 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 @@