From e89d3b380715674e82dd879fd7dd957e0302c6c2 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 17 Nov 2016 19:28:45 +0800 Subject: [PATCH] Update asset --- apps/assets/api.py | 11 +- apps/assets/serializers.py | 17 +- .../assets/templates/assets/asset_detail.html | 5 +- .../templates/assets/asset_group_detail.html | 199 +++++------- .../templates/assets/asset_group_list.html | 103 +++--- apps/assets/templates/assets/asset_list.html | 307 +++++------------- apps/assets/templates/assets/idc_assets.html | 2 +- apps/assets/views.py | 78 +---- apps/users/templates/users/user_list.html | 3 +- 9 files changed, 247 insertions(+), 478 deletions(-) diff --git a/apps/assets/api.py b/apps/assets/api.py index f6d6926bb..e3570e0f1 100644 --- a/apps/assets/api.py +++ b/apps/assets/api.py @@ -20,9 +20,14 @@ class AssetViewSet(viewsets.ModelViewSet): def get_queryset(self): queryset = super(AssetViewSet, self).get_queryset() - idc = self.request.query_params.get('idc', '') - if idc: - queryset = queryset.filter(idc__id=idc) + idc_id = self.request.query_params.get('idc_id', '') + asset_group_id = self.request.query_params.get('asset_group_id', '') + if idc_id: + queryset = queryset.filter(idc__id=idc_id) + + if asset_group_id: + queryset = queryset.filter(groups__id=asset_group_id) + return queryset diff --git a/apps/assets/serializers.py b/apps/assets/serializers.py index 86acbff37..9613da621 100644 --- a/apps/assets/serializers.py +++ b/apps/assets/serializers.py @@ -40,13 +40,26 @@ class SystemUserSerializer(serializers.ModelSerializer): class AssetSerializer(BulkSerializerMixin, serializers.ModelSerializer): - system_users = SystemUserSerializer(many=True, read_only=True) - admin_user = AdminUserSerializer(many=False, read_only=True) + # system_users = SystemUserSerializer(many=True, read_only=True) + # admin_user = AdminUserSerializer(many=False, read_only=True) + hardware = serializers.SerializerMethodField() + type_display = serializers.SerializerMethodField() class Meta(object): model = Asset list_serializer_class = BulkListSerializer + @staticmethod + def get_hardware(obj): + return '%s %s %s' % (obj.cpu, obj.memory, obj.disk) + + @staticmethod + def get_type_display(obj): + if obj.type: + return obj.type.value + else: + return '' + class AssetGrantedSerializer(serializers.ModelSerializer): system_users = SystemUserSerializer(many=True, read_only=True) diff --git a/apps/assets/templates/assets/asset_detail.html b/apps/assets/templates/assets/asset_detail.html index bcb3560ce..22af9acaa 100644 --- a/apps/assets/templates/assets/asset_detail.html +++ b/apps/assets/templates/assets/asset_detail.html @@ -19,9 +19,6 @@
  • {% trans 'Asset detail' %}
  • -
  • - {% trans 'Asset login log' %} -
  • Update
  • @@ -236,7 +233,7 @@
    - {% trans 'Asset groups' %} + {% trans 'System users' %}
    diff --git a/apps/assets/templates/assets/asset_group_detail.html b/apps/assets/templates/assets/asset_group_detail.html index 50cf2a4a5..2785918ff 100644 --- a/apps/assets/templates/assets/asset_group_detail.html +++ b/apps/assets/templates/assets/asset_group_detail.html @@ -23,48 +23,7 @@
    -
    -
    -
    - {{ asset_group.name }} -
    - - - - - - - - - - -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    {% trans 'Name' %}:{{ asset_group.name }}
    {% trans 'Date created' %}:{{ asset_group.date_created|date:"Y-m-d H:i:s" }}
    {% trans 'Created by' %}:{{ asset_group.created_by }}
    {% trans 'Comment' %}:{{ asset_group.comment }}
    -
    -
    - +
    {% trans 'Asset list of ' %} {{ asset_group.name }} @@ -83,7 +42,7 @@
    - +
    @@ -93,68 +52,13 @@ - {% for asset in page_obj %} - - - - - - - {% endfor %}
    {% trans 'Hostname' %}
    {{ asset.hostname }}{{ asset.ip }}{{ asset.port }}Alive
    -
    - {% include '_pagination.html' %} -
    -
    - {% trans 'Associate system user' %} -
    -
    - - - - - - - - - - - - - - - {% for group in user.groups.all %} - - - - - {% endfor %} - -
    {% trans 'repush system user' %}: - - - -
    - -
    - -
    {{ group.name }} - -
    -
    -
    - -
    {% trans 'Add asset to this group' %}
    @@ -164,20 +68,48 @@
    - + {% for asset in assets_remain %} + {% endfor %} - +
    - {% for group in user.groups.all %} + + +
    +
    + +
    +
    + {% trans 'Associate system user' %} +
    +
    + + + + + + + + + + + {% for system_user in system_users %} - - - - -{% endblock %} - -{% block table_body %} - {% for asset_group in asset_group_list %} - - - - - - - - {% endfor %} -{% endblock %} - -{% block content_bottom_left %} - -
    - - -
    - -
    - -
    - -{% endblock %} diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index aadd5c388..c50361782 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -8,16 +8,26 @@ {% endblock %} {% block content_left_head %}{% endblock %} -{% block table_search %}{% endblock %} -{% block tags_list %} +{% block table_search %} + +{% endblock %} + +{% block tags_list %} - - - - - - - - -{% endblock %} - -{% block table_body %} - {% for asset in asset_list %} - - - - - - - - - - - - {% endfor %} -{% endblock %} - -{% block content_bottom_left %} -
    - -
    - -
    +{% block table_container %} + + +
    + +
    + +
    {{ group.name }} @@ -201,25 +133,52 @@ {% endblock %} {% block custom_foot_js %} {% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/asset_group_list.html b/apps/assets/templates/assets/asset_group_list.html index 4d3e4c58b..245ae3bf4 100644 --- a/apps/assets/templates/assets/asset_group_list.html +++ b/apps/assets/templates/assets/asset_group_list.html @@ -1,57 +1,52 @@ {% extends '_base_list.html' %} -{% load i18n %} -{% load common_tags %} -{% block content_left_head %} - {% trans "Create asset group" %} +{% load i18n static %} +{% block table_search %} +{% endblock %} +{% block table_container %} + + + + + + + + + + + + + +
    + + {% trans 'Name' %}{% trans 'Asset' %}{% trans 'Comment' %}{% trans 'Action' %}
    +{% endblock %} +{% block content_bottom_left %}{% endblock %} +{% block custom_foot_js %} + {% endblock %} -{% block table_head %} -
    - - {% trans 'Name' %}{% trans 'Asset num' %}{% trans 'Comment' %}
    - - - - {{ asset_group.name }} - - {{ asset_group.assets.count }}{{ asset_group.comment|truncatewords:8 }} - {% trans 'Update' %} - {% trans 'Delete' %} -
    id{% trans 'Hostname' %}{% trans 'IP' %}{% trans 'Port' %}{% trans 'Type' %}{% trans 'Hardware' %}{% trans 'Valid' %}
    - - {{ asset.id }} - - {{ asset.hostname }} - - {{ asset.ip }}{{ asset.port }}{{ asset.type }}{{ asset.cpu }} {{ asset.memory }} {{ asset.disk }} - {% if asset.is_valid.0 %} - - {% else %} - - {% endif %} - - {% trans 'Update' %} - - {% trans 'Delete' %} -
    + + + + + + + + + + + + + + + + +
    {% trans 'Hostname' %}{% trans 'IP' %}{% trans 'Port' %}{% trans 'Type' %}{% trans 'Env' %}{% trans 'Hardware' %}{% trans 'Valid' %}{% trans 'Alive' %}{% trans 'Action' %}
    +
    +
    + +
    +
    -{% include "assets/_asset_bulk_update_modal.html" %} - - -
    {% endblock %} @@ -122,165 +99,43 @@ }else{ oDiv.style.display = "none"; } - };//onload; + }; //onload; $(document).ready(function(){ - $('#modal').modal({ - show: false, - backdrop: 'static', - keyboard: 'false', - //remote:"{% url 'assets:asset-modal-update' %}", - }); - - $('#asset_bulk_update_modal').on('shown.bs.modal',function(){ - //alert('当弹窗完全加载完后,再触发;') - $('.select2').select2(); - $("#id_tags").select2({ - tags: true, - maximumSelectionLength: 8, //最多能够选择的个数 - //closeOnSelect: false - }); - }); - - $('#asset_bulk_update_modal').modal({ - show: false, - backdrop: 'static', - keyboard: 'false', - }); - var oTags = document.getElementById("ydxbd"); - var table = $('#editable').DataTable({ - "aLengthMenu": [[10, 25, 50, -1], ["10", "25", "50", "all"]], - "iDisplayLength":25, - "aaSorting": [[7, "asc"]], - "aoColumnDefs": [ { "bSortable": false, "aTargets": [ 0 ] }], - "bAutoWidth": false, - "language": {"url": "/static/js/plugins/dataTables/i18n/zh-hans.json"}, - "dom": '<"custom"fl>tip', - "initComplete": function() { - //alert( 'DataTables has finished its initialisation.' ); - $('#editable_length').before(" {% trans 'Create asset' %}   "); - $('#editable').before(oTags); - }, - columns: [ - {data: "checkbox"}, - {data: "id"}, - {data: "name"}, - {data: "ip"}, - {data: "port"}, - {data: "type"}, - {data: "group"}, - {data: "dp"}, - {data: "op"} - ] - }); - //将ID列隐藏 - table.column('1').visible(false); - $('#editable tbody').on( 'click', 'tr', function () { - //alert($(this).hasClass('selected')); - if($(this).hasClass('selected')){ - $(this).removeClass('selected'); - this.children[0].children[0].checked=0; - }else{ - $(this).addClass('selected'); - this.children[0].children[0].checked=1; - } - }); - - $('#btn_bulk_update').on('click',function(){ - var column2 = table.rows('.selected').data(); - var id_list = []; - var plain_id_list = []; - var the_url = "{% url 'api-assets:asset-bulk-update' %}"; - for(var i=0;i'; + $(td).html(detail_btn.replace('99991937', rowData.id)); + }}, + {targets: 7, createdCell: function (td, cellData) { + if (!cellData) { + $(td).html('') + } else { + $(td).html('') + } + }}, + {targets: 8, createdCell: function (td, cellData) { + if (!cellData) { + $(td).html('') + } else { + $(td).html('') + } + }}, + {targets: 9, createdCell: function (td, cellData, rowData) { + var update_btn = '{% trans "Update" %}'.replace('99991937', cellData); + var del_btn = '{% trans "Delete" %}'.replace('99991937', cellData); + $(td).html(update_btn + del_btn) + }} + ], + ajax_url: '{% url "api-assets:asset-list" %}', + columns: [{data: "id"}, {data: "hostname" }, {data: "ip" }, {data: "port" }, + {data: "type_display" }, {data: "env"}, {data: "hardware"}, {data: "is_active" }, + {data: "is_active"}, {data: "id" }], + op_html: $('#actions').html() }; - }; - + var table = jumpserver.initDataTable(options); + }); {% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/idc_assets.html b/apps/assets/templates/assets/idc_assets.html index a8fc27550..8e4783a49 100644 --- a/apps/assets/templates/assets/idc_assets.html +++ b/apps/assets/templates/assets/idc_assets.html @@ -118,7 +118,7 @@ $(td).html('') } }}], - ajax_url: '{% url "api-assets:asset-list" %}?idc={{ idc.id }}', + ajax_url: '{% url "api-assets:asset-list" %}?idc_id={{ idc.id }}', columns: [{data: function(){return ""}}, {data: "hostname" }, {data: "ip" }, {data: "port" }, {data: "type" }, {data: "is_active" }] }; diff --git a/apps/assets/views.py b/apps/assets/views.py index ea8981ba9..31619621d 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -16,23 +16,9 @@ from .forms import * from .hands import AdminUserRequiredMixin -class AssetListView(AdminUserRequiredMixin, ListView): - paginate_by = settings.CONFIG.DISPLAY_PER_PAGE - model = Asset - context_object_name = 'asset_list' +class AssetListView(AdminUserRequiredMixin, TemplateView): template_name = 'assets/asset_list.html' - def get_queryset(self): - queryset = super(AssetListView, self).get_queryset() - queryset = sorted(queryset, key=self.sorted_by_valid_and_ip) - return queryset - - @staticmethod - def sorted_by_valid_and_ip(asset): - ip_list = int_seq(asset.ip.split('.')) - ip_list.insert(0, asset.is_valid[0]) - return ip_list - def get_context_data(self, **kwargs): context = { 'app': 'Assets', @@ -73,7 +59,6 @@ class AssetCreateView(AdminUserRequiredMixin, CreateAssetTagsMiXin, CreateView): class AssetModalCreateView(AdminUserRequiredMixin, CreateAssetTagsMiXin, ListView): model = Asset - # tag_type = 'asset' form_class = AssetCreateForm template_name = 'assets/asset_modal_update.html' success_url = reverse_lazy('assets:asset-list') @@ -119,16 +104,10 @@ class AssetUpdateView(AdminUserRequiredMixin, UpdateAssetTagsMiXin, UpdateView): 'admin_user', ] self.assets_ids = self.request.POST.getlist('assets_ids') - print self.assets_ids self.new_form = self.request.POST.copy() - print len(self.new_form) - print type(self.new_form) for i in default_keys: if self.new_form.has_key(i): self.new_form.pop(i) - print self.new_form.items() - for i in self.new_form: - print i return super(AssetUpdateView, self).post(request, *args, **kwargs) @@ -145,10 +124,7 @@ class AssetUpdateView(AdminUserRequiredMixin, UpdateAssetTagsMiXin, UpdateView): return super(AssetUpdateView, self).form_invalid(form) def form_valid(self, form): - print self.new_form.keys() - print form.clean().keys() asset = form.save(commit=False) - print "1111" def prn_obj_key(obj_form): return obj_form.clean().keys() @@ -264,12 +240,8 @@ class AssetGroupCreateView(AdminUserRequiredMixin, CreateView): return super(AssetGroupCreateView, self).form_valid(form) -class AssetGroupListView(AdminUserRequiredMixin, ListView): - model = AssetGroup - paginate_by = settings.CONFIG.DISPLAY_PER_PAGE - context_object_name = 'asset_group_list' +class AssetGroupListView(AdminUserRequiredMixin, TemplateView): template_name = 'assets/asset_group_list.html' - ordering = '-id' def get_context_data(self, **kwargs): context = { @@ -280,34 +252,22 @@ class AssetGroupListView(AdminUserRequiredMixin, ListView): kwargs.update(context) return super(AssetGroupListView, self).get_context_data(**kwargs) - def get_queryset(self): - self.queryset = super(AssetGroupListView, self).get_queryset() - self.keyword = keyword = self.request.GET.get('keyword', '') - self.sort = sort = self.request.GET.get('sort', '-date_created') - if keyword: - self.queryset = self.queryset.filter(Q(name__icontains=keyword) | - Q(comment__icontains=keyword)) - if sort: - self.queryset = self.queryset.order_by(sort) - return self.queryset - -class AssetGroupDetailView(SingleObjectMixin, AdminUserRequiredMixin, ListView): +class AssetGroupDetailView(AdminUserRequiredMixin, DetailView): + model = AssetGroup template_name = 'assets/asset_group_detail.html' - paginate_by = settings.CONFIG.DISPLAY_PER_PAGE - - def get(self, request, *args, **kwargs): - self.object = self.get_object(queryset=AssetGroup.objects.all()) - return super(AssetGroupDetailView, self).get(request, *args, **kwargs) - - def get_queryset(self): - return self.object.assets.all() + context_object_name = 'asset_group' def get_context_data(self, **kwargs): + assets_remain = Asset.objects.exclude(id__in=self.object.assets.all()) + system_users = self.object.system_users.all() + system_users_remain = SystemUser.objects.exclude(id__in=system_users) context = { 'app': _('Assets'), 'action': _('Asset group detail'), - 'asset_group': self.object, + 'assets_remain': assets_remain, + 'system_users': system_users, + 'system_users_remain': system_users_remain, } kwargs.update(context) return super(AssetGroupDetailView, self).get_context_data(**kwargs) @@ -343,9 +303,6 @@ class AssetGroupDeleteView(AdminUserRequiredMixin, DeleteView): class IDCListView(AdminUserRequiredMixin, TemplateView): - # model = IDC - # paginate_by = settings.CONFIG.DISPLAY_PER_PAGE - # context_object_name = 'idc_list' template_name = 'assets/idc_list.html' def get_context_data(self, **kwargs): @@ -357,19 +314,6 @@ class IDCListView(AdminUserRequiredMixin, TemplateView): kwargs.update(context) return super(IDCListView, self).get_context_data(**kwargs) - # def get_queryset(self): - # self.queryset = super(IDCListView, self).get_queryset() - # self.keyword = keyword = self.request.GET.get('keyword', '') - # self.sort = sort = self.request.GET.get('sort', '-date_created') - # - # if keyword: - # self.queryset = self.queryset.filter(Q(name__icontains=keyword) | - # Q(comment__icontains=keyword)) - # - # if sort: - # self.queryset = self.queryset.order_by(sort) - # return self.queryset - class IDCCreateView(AdminUserRequiredMixin, CreateView): model = IDC diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html index b0c8cee92..5168bed8d 100644 --- a/apps/users/templates/users/user_list.html +++ b/apps/users/templates/users/user_list.html @@ -83,7 +83,8 @@ $(document).ready(function(){ }}], ajax_url: '{% url "api-users:user-list" %}', columns: [{data: "id"}, {data: "username" }, {data: "name" }, {data: "get_role_display" }, - {data: "groups_display" }, {data: "is_valid" }, {data: "id" }] + {data: "groups_display" }, {data: "is_valid" }, {data: "id" }], + op_html: $('#actions').html() }; var table = jumpserver.initDataTable(options);