Commit 2f06a2b1 authored by ibuler's avatar ibuler

[Feature] tree增删功能

parent 1ac30ed0
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from rest_framework import generics from rest_framework import generics, mixins
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework_bulk import BulkModelViewSet from rest_framework_bulk import BulkModelViewSet
...@@ -21,6 +21,7 @@ from rest_framework_bulk import ListBulkCreateUpdateDestroyAPIView ...@@ -21,6 +21,7 @@ from rest_framework_bulk import ListBulkCreateUpdateDestroyAPIView
from rest_framework.pagination import LimitOffsetPagination from rest_framework.pagination import LimitOffsetPagination
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.db.models import Q, Count from django.db.models import Q, Count
from django.utils.translation import ugettext_lazy as _
from common.mixins import CustomFilterMixin from common.mixins import CustomFilterMixin
from common.utils import get_logger from common.utils import get_logger
...@@ -311,21 +312,41 @@ class LabelViewSet(BulkModelViewSet): ...@@ -311,21 +312,41 @@ class LabelViewSet(BulkModelViewSet):
return super().list(request, *args, **kwargs) return super().list(request, *args, **kwargs)
class TreeViewApi(APIView): class NodeViewSet(BulkModelViewSet):
queryset = Node.objects.all()
permission_classes = (IsSuperUser,)
serializer_class = serializers.NodeSerializer
def get_queryset(self): def perform_create(self, serializer):
return Node.objects.all() child_id = Node.get_root_node().get_next_child_id()
serializer.validated_data["id"] = child_id
def get(self, request): serializer.save()
data = []
for node in self.get_queryset():
parent = ":".join(node.id.split(":")[:-1]) class NodeChildrenApi(mixins.ListModelMixin, generics.CreateAPIView):
d = { queryset = Node.objects.all()
"id": node.id, permission_classes = (IsSuperUser,)
"pId": parent, serializer_class = serializers.NodeSerializer
"name": node.name instance = None
}
if node.id == "0": def post(self, request, *args, **kwargs):
d["open"] = True if not request.data.get("name"):
data.append(d) request.data["name"] = _("New node {}").format(
return Response(data) Node.get_root_node().get_next_child_id().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)
def get(self, request, *args, **kwargs):
instance = self.get_object()
if self.request.query_params.get("all"):
children = instance.get_all_children()
else:
children = instance.get_children()
response = [{"id": node.id, "name": node.name} for node in children]
return Response(response, status=200)
...@@ -4,8 +4,8 @@ from rest_framework import serializers ...@@ -4,8 +4,8 @@ from rest_framework import serializers
from rest_framework_bulk.serializers import BulkListSerializer from rest_framework_bulk.serializers import BulkListSerializer
from common.mixins import BulkSerializerMixin from common.mixins import BulkSerializerMixin
from .models import AssetGroup, Asset, Cluster, AdminUser, SystemUser, Label from .models import AssetGroup, Asset, Cluster, AdminUser, SystemUser, Label, Node
from .const import ADMIN_USER_CONN_CACHE_KEY, SYSTEM_USER_CONN_CACHE_KEY from .const import ADMIN_USER_CONN_CACHE_KEY
class AssetGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer): class AssetGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
...@@ -316,3 +316,26 @@ class LabelDistinctSerializer(serializers.ModelSerializer): ...@@ -316,3 +316,26 @@ class LabelDistinctSerializer(serializers.ModelSerializer):
def get_value(obj): def get_value(obj):
labels = Label.objects.filter(name=obj["name"]) labels = Label.objects.filter(name=obj["name"])
return ', '.join([label.value for label in labels]) return ', '.join([label.value for label in labels])
class NodeSerializer(serializers.ModelSerializer):
parent = serializers.SerializerMethodField()
class Meta:
model = Node
fields = ['id', 'name', 'parent']
list_serializer_class = BulkListSerializer
@staticmethod
def get_parent(obj):
if obj.id == "0":
return "#"
if not obj.id.startswith("0"):
return "0"
return ":".join(obj.id.split(":")[:-1])
def get_fields(self):
fields = super().get_fields()
field = fields["id"]
field.required = False
return fields
This diff is collapsed.
...@@ -13,6 +13,7 @@ router.register(r'v1/clusters', api.ClusterViewSet, 'cluster') ...@@ -13,6 +13,7 @@ router.register(r'v1/clusters', api.ClusterViewSet, 'cluster')
router.register(r'v1/admin-user', api.AdminUserViewSet, 'admin-user') router.register(r'v1/admin-user', api.AdminUserViewSet, 'admin-user')
router.register(r'v1/system-user', api.SystemUserViewSet, 'system-user') router.register(r'v1/system-user', api.SystemUserViewSet, 'system-user')
router.register(r'v1/labels', api.LabelViewSet, 'label') router.register(r'v1/labels', api.LabelViewSet, 'label')
router.register(r'v1/nodes', api.NodeViewSet, 'node')
urlpatterns = [ urlpatterns = [
url(r'^v1/assets-bulk/$', api.AssetListUpdateApi.as_view(), name='asset-bulk-update'), url(r'^v1/assets-bulk/$', api.AssetListUpdateApi.as_view(), name='asset-bulk-update'),
...@@ -42,7 +43,7 @@ urlpatterns = [ ...@@ -42,7 +43,7 @@ urlpatterns = [
api.SystemUserPushApi.as_view(), name='system-user-push'), api.SystemUserPushApi.as_view(), name='system-user-push'),
url(r'^v1/system-user/(?P<pk>[0-9a-zA-Z\-]{36})/connective/$', url(r'^v1/system-user/(?P<pk>[0-9a-zA-Z\-]{36})/connective/$',
api.SystemUserTestConnectiveApi.as_view(), name='system-user-connective'), api.SystemUserTestConnectiveApi.as_view(), name='system-user-connective'),
url(r'^v1/tree/$', api.TreeViewApi.as_view(), name='tree-view') url(r'^v1/nodes/(?P<pk>[0-9:]+)/children/$', api.NodeChildrenApi.as_view(), name='node-children'),
] ]
urlpatterns += router.urls urlpatterns += router.urls
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment