From 072da114dbfb8cd381ce150da874624dee707ea7 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sun, 6 Nov 2016 22:45:26 +0800 Subject: [PATCH] Finish system user list --- apps/assets/api.py | 29 ++++--- apps/assets/models.py | 10 ++- apps/assets/serializers.py | 10 +++ .../templates/assets/admin_user_list.html | 75 +++++-------------- apps/assets/templates/assets/asset_list.html | 12 +-- apps/assets/templates/assets/idc_assets.html | 12 +-- apps/assets/templates/assets/idc_list.html | 15 +--- apps/assets/urls.py | 53 +++---------- apps/assets/views.py | 34 ++++----- apps/static/css/jumpserver.css | 9 +++ apps/static/css/style.css | 6 +- apps/static/js/jumpserver.js | 5 +- .../templates/users/user_group_list.html | 19 +---- apps/users/templates/users/user_list.html | 13 ---- 14 files changed, 103 insertions(+), 199 deletions(-) diff --git a/apps/assets/api.py b/apps/assets/api.py index 05ca46331..820f418ef 100644 --- a/apps/assets/api.py +++ b/apps/assets/api.py @@ -26,6 +26,13 @@ class AssetViewSet(viewsets.ModelViewSet): queryset = Asset.objects.all() serializer_class = serializers.AssetSerializer + 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) + return queryset + class IDCViewSet(viewsets.ModelViewSet): """API endpoint that allows IDC to be viewed or edited.""" @@ -46,17 +53,17 @@ class SystemUserViewSet(viewsets.ModelViewSet): permission_classes = (IsSuperUser,) -class IDCAssetsApi(generics.ListAPIView): - model = IDC - serializer_class = serializers.AssetSerializer - - def get(self, request, *args, **kwargs): - filter_kwargs = {self.lookup_field: self.kwargs[self.lookup_field]} - self.object = get_object_or_404(self.model, **filter_kwargs) - return super(IDCAssetsApi, self).get(request, *args, **kwargs) - - def get_queryset(self): - return self.object.assets.all() +# class IDCAssetsApi(generics.ListAPIView): +# model = IDC +# serializer_class = serializers.AssetSerializer +# +# def get(self, request, *args, **kwargs): +# filter_kwargs = {self.lookup_field: self.kwargs[self.lookup_field]} +# self.object = get_object_or_404(self.model, **filter_kwargs) +# return super(IDCAssetsApi, self).get(request, *args, **kwargs) +# +# def get_queryset(self): +# return self.object.assets.all() class AssetListUpdateApi(BulkDeleteApiMixin, ListBulkCreateUpdateDestroyAPIView): diff --git a/apps/assets/models.py b/apps/assets/models.py index fdb298e3c..c07833982 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -107,7 +107,7 @@ class AdminUser(models.Model): @property def password(self): - return decrypt(self._password) + return signer.unsign(self._password) @password.setter def password(self, password_raw): @@ -129,6 +129,10 @@ class AdminUser(models.Model): def public_key(self, public_key_raw): self._public_key = signer.sign(public_key_raw) + @property + def assets_amount(self): + return self.assets.count() + class Meta: db_table = 'admin_user' @@ -216,6 +220,10 @@ class SystemUser(models.Model): assets = set(self.assets.all()) | self.get_assets_inherit_from_asset_groups() return list(assets) + @property + def assets_amount(self): + return self.assets.count() + class Meta: db_table = 'system_user' diff --git a/apps/assets/serializers.py b/apps/assets/serializers.py index cc00144ec..9044c3cc6 100644 --- a/apps/assets/serializers.py +++ b/apps/assets/serializers.py @@ -38,11 +38,21 @@ class AdminUserSerializer(serializers.ModelSerializer): class Meta: model = AdminUser + def get_field_names(self, declared_fields, info): + fields = super(AdminUserSerializer, self).get_field_names(declared_fields, info) + fields.append('assets_amount') + return fields + class SystemUserSerializer(serializers.ModelSerializer): class Meta: model = SystemUser + def get_field_names(self, declared_fields, info): + fields = super(SystemUserSerializer, self).get_field_names(declared_fields, info) + fields.append('assets_amount') + return fields + class IDCSerializer(serializers.ModelSerializer): assets_amount = serializers.SerializerMethodField() diff --git a/apps/assets/templates/assets/admin_user_list.html b/apps/assets/templates/assets/admin_user_list.html index e204b2e15..bc5d01692 100644 --- a/apps/assets/templates/assets/admin_user_list.html +++ b/apps/assets/templates/assets/admin_user_list.html @@ -1,57 +1,16 @@ {% extends '_base_list.html' %} -{#{% load i18n %}#} -{#{% load common_tags %}#} -{#{% block content_left_head %}#} -{# {% trans "Create admin user" %} #} -{#{% endblock %}#} -{##} -{#{% block table_head %}#} -{# {% trans 'ID' %}#} -{# {% trans 'Name' %}#} -{# {% trans 'Username' %}#} -{# {% trans 'Asset num' %}#} -{# {% trans 'Lost connection' %}#} -{# {% trans 'Comment' %}#} -{# #} -{#{% endblock %}#} -{##} -{#{% block table_body %}#} -{# {% for admin_user in admin_user_list %}#} -{# #} -{# {{ admin_user.id }}#} -{# #} -{# #} -{# {{ admin_user.name }}#} -{# #} -{# #} -{# {{ admin_user.username }}#} -{# {{ admin_user.assets.count }}#} -{# {{ admin_user.assets.count }}#} -{# {{ admin_user.comment|truncatewords:8 }}#} -{# #} -{# #} -{# {% trans 'Script' %}#} -{# #} -{# {% trans 'Refresh' %}#} -{# {% trans 'Update' %}#} -{# {% trans 'Delete' %}#} -{# #} -{# #} -{# {% endfor %}#} -{#{% endblock %}#} -{% extends '_base_list.html' %} {% load i18n static %} {% block custom_head_css_js %} {{ block.super }} {% endblock %} {% block table_search %}{% endblock %} @@ -85,13 +44,13 @@ $(document).ready(function(){ ele: $('#admin_user_list_table'), columnDefs: [ {targets: 1, createdCell: function (td, cellData, rowData) { - var detail_btn = '' + cellData + ''; + var detail_btn = '' + cellData + ''; $(td).html(detail_btn.replace('99991937', rowData.id)); }}, -{# {targets: 4, createdCell: function (td, cellData) {#} -{# var innerHtml = cellData.length > 8 ? cellData.substring(0, 8) + '...': cellData;#} -{# $(td).html('' + innerHtml + '');#} -{# }},#} + {targets: 5, createdCell: function (td, cellData) { + var innerHtml = cellData.length > 8 ? cellData.substring(0, 24) + '...': cellData; + $(td).html('' + innerHtml + ''); + }}, {# {targets: 6, createdCell: function (td, cellData) {#} {# if (!cellData) {#} {# $(td).html('')#} @@ -100,13 +59,13 @@ $(document).ready(function(){ {# }#} {# }},#} {targets: 6, createdCell: function (td, cellData, rowData) { - var update_btn = '{% trans "Update" %}'.replace('99991937', cellData); - var del_btn = '{% trans "Delete" %}'.replace('99991937', cellData); + 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 "assets:idc-list-create-api" %}', - columns: [{data: function(){return ""}}, {data: "name" }, {data: "assets_amount" }, {data: "contact" }, {data: "phone" }, - {data: "operator" }, {data: "id" }], + ajax_url: '{% url "assets:api-admin-user-list" %}', + columns: [{data: function(){return ""}}, {data: "name" }, {data: "username" }, {data: "assets_amount" }, {data: function () {return 'lost'} }, + {data: "comment" }, {data: "id" }], op_html: $('#actions').html() }; jumpserver.initDataTable(options); diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index d8229855a..549a6bab3 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -7,14 +7,6 @@ {% endblock %} {% block content %}
@@ -128,7 +118,7 @@ $(td).html('') } }}], - ajax_url: '{% url "assets:idc-assets-api" pk=idc.id %}', + ajax_url: '{% url "assets:api-asset-list" %}?idc={{ idc.id }}', columns: [{data: function(){return ""}}, {data: "hostname" }, {data: "ip" }, {data: "port" }, {data: "type" }, {data: "is_active" }] }; diff --git a/apps/assets/templates/assets/idc_list.html b/apps/assets/templates/assets/idc_list.html index e7bb236ca..924b05fc8 100644 --- a/apps/assets/templates/assets/idc_list.html +++ b/apps/assets/templates/assets/idc_list.html @@ -1,18 +1,5 @@ {% extends '_base_list.html' %} {% load i18n static %} -{% block custom_head_css_js %} -{{ block.super }} - -{% endblock %} {% block table_search %}{% endblock %} {% block table_container %}
@@ -63,7 +50,7 @@ $(document).ready(function(){ var del_btn = '{% trans "Delete" %}'.replace('99991937', cellData); $(td).html(update_btn + del_btn) }}], - ajax_url: '{% url "assets:idc-list-create-api" %}', + ajax_url: '{% url "assets:api-idc-list" %}', columns: [{data: function(){return ""}}, {data: "name" }, {data: "assets_amount" }, {data: "contact" }, {data: "phone" }, {data: "operator" }, {data: "id" }], op_html: $('#actions').html() diff --git a/apps/assets/urls.py b/apps/assets/urls.py index 01c431ec3..be53759ca 100644 --- a/apps/assets/urls.py +++ b/apps/assets/urls.py @@ -58,50 +58,17 @@ urlpatterns = [ ] -# router = routers.DefaultRouter() -# router.register(r'v1/asset-groups/', api.AssetGroupViewSet) -# router.register(r'v1/assets/', api.AssetViewSet) -# router.register(r'v1/idc/', api.IDCViewSet) - -asset_list_view = api.AssetViewSet.as_view({ - 'get': 'list', - 'post': 'create' -}) - -asset_detail_view = api.AssetViewSet.as_view({ - 'get': 'retrieve', - 'put': 'update', - 'patch': 'partial_update', - 'delete': 'destroy', -}) - -idc_list_view = api.IDCViewSet.as_view({ - 'get': 'list', - 'post': 'create', -}) - -idc_detail_view = api.IDCViewSet.as_view({ - 'get': 'retrieve', - 'put': 'update', - 'patch': 'partial_update', - 'delete': 'destroy', -}) - -admin_user_list_view = api.AdminUserViewSet.as_view({ - 'get': 'list', - 'post': 'create', -}) +router = routers.DefaultRouter() +router.register(r'v1/asset-groups', api.AssetGroupViewSet, 'api-asset-group') +router.register(r'v1/assets', api.AssetViewSet, 'api-asset') +router.register(r'v1/idc', api.IDCViewSet, 'api-idc') +router.register(r'v1/admin-user', api.AdminUserViewSet, 'api-admin-user') +router.register(r'v1/system-user', api.SystemUserViewSet, 'api-system-user') urlpatterns += [ - url(r'^v1/assets/$', asset_list_view, name='asset-list-create-api'), - url(r'^v1/assets/(?P[0-9]+)/$', asset_detail_view, name='asset-detail-update-delete-api'), - url(r'^v1/assets_bulk/$', api.AssetListUpdateApi.as_view(), name='asset-bulk-update-api'), - url(r'^v1/idc/$', idc_list_view, name='idc-list-create-api'), - url(r'^v1/idc/(?P[0-9]+)/$', idc_detail_view, name='idc-detail-update-delete-api'), - url(r'^v1/idc/(?P[0-9]+)/assets/$', api.IDCAssetsApi.as_view(), name='idc-assets-api'), - url(r'^v1/admin-user/$', idc_list_view, name='idc-list-create-api'), - url(r'^v1/idc/(?P[0-9]+)/$', idc_detail_view, name='idc-detail-update-delete-api'), - url(r'^v1/system-user/auth/', api.SystemUserAuthApi.as_view(), name='system-user-auth'), + url(r'^v1/assets_bulk/$', api.AssetListUpdateApi.as_view(), name='api-asset-bulk-update'), + # url(r'^v1/idc/(?P[0-9]+)/assets/$', api.IDCAssetsApi.as_view(), name='api-idc-assets'), + url(r'^v1/system-user/auth/', api.SystemUserAuthApi.as_view(), name='api-system-user-auth'), ] - +urlpatterns += router.urls diff --git a/apps/assets/views.py b/apps/assets/views.py index 837dc3fed..8f5803552 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -431,34 +431,34 @@ class IDCDeleteView(AdminUserRequiredMixin, DeleteView): success_url = reverse_lazy('assets:idc-list') -class AdminUserListView(AdminUserRequiredMixin, ListView): +class AdminUserListView(AdminUserRequiredMixin, TemplateView): model = AdminUser - paginate_by = settings.CONFIG.DISPLAY_PER_PAGE - context_object_name = 'admin_user_list' + # paginate_by = settings.CONFIG.DISPLAY_PER_PAGE + # context_object_name = 'admin_user_list' template_name = 'assets/admin_user_list.html' def get_context_data(self, **kwargs): context = { 'app': _('Assets'), 'action': _('Admin user list'), - 'keyword': self.request.GET.get('keyword', '') + # 'keyword': self.request.GET.get('keyword', '') } kwargs.update(context) return super(AdminUserListView, self).get_context_data(**kwargs) - def get_queryset(self): - # Todo: Default order by lose asset connection num - self.queryset = super(AdminUserListView, 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 + # def get_queryset(self): + # Todo: Default order by lose asset connection num + # self.queryset = super(AdminUserListView, 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 AdminUserCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): diff --git a/apps/static/css/jumpserver.css b/apps/static/css/jumpserver.css index caa058e97..ecbde4cc4 100644 --- a/apps/static/css/jumpserver.css +++ b/apps/static/css/jumpserver.css @@ -255,3 +255,12 @@ table.dataTable tbody td.selected td i.text-navy font-size: 12px; vertical-align: middle; } + +div.dataTables_wrapper div.dataTables_filter, +.dataTables_length { + float: right !important; +} + +div.dataTables_wrapper div.dataTables_filter { + margin-left: 15px; +} \ No newline at end of file diff --git a/apps/static/css/style.css b/apps/static/css/style.css index fb30bde06..609d1cffb 100644 --- a/apps/static/css/style.css +++ b/apps/static/css/style.css @@ -1585,9 +1585,9 @@ table.dataTable thead .sorting_desc_disabled { .dataTables_wrapper { padding-bottom: 30px; } -.dataTables_length { - float: left; -} +/*.dataTables_length {*/ + /*float: left;*/ +/*}*/ .dataTables_filter label { margin-right: 5px; } diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index e2bc67ba6..c49dc96d3 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -293,7 +293,7 @@ jumpserver.initDataTable = function (options) { ]; columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs; var table = ele.DataTable({ - pageLength: options.pageLength || 25, + pageLength: options.pageLength || 15, dom: options.dom || '<"#uc.pull-left"><"html5buttons"B>flti<"row m-t"<"#op.col-md-6"><"col-md-6"p>>', language: { url: options.i18n_url || "/static/js/plugins/dataTables/i18n/zh-hans.json" @@ -330,7 +330,8 @@ jumpserver.initDataTable = function (options) { url: options.ajax_url , dataSrc: "" }, - columns: options.columns || [] + columns: options.columns || [], + lengthMenu: [[15, 25, 50, -1], [15, 25, 50, "All"]] }); table.on('select', function(e, dt, type, indexes) { var $node = table[ type ]( indexes ).nodes().to$(); diff --git a/apps/users/templates/users/user_group_list.html b/apps/users/templates/users/user_group_list.html index 0463c3305..43101fd87 100644 --- a/apps/users/templates/users/user_group_list.html +++ b/apps/users/templates/users/user_group_list.html @@ -1,18 +1,5 @@ {% extends '_base_list.html' %} {% load i18n static %} -{% block custom_head_css_js %} -{{ block.super }} - -{% endblock %} {% block table_search %}{% endblock %} {% block table_container %} @@ -20,10 +7,10 @@ div.dataTables_wrapper div.dataTables_filter { -
+ - {% trans 'Name' %} - {% trans 'User Amount' %} + {% trans 'Name' %} + {% trans 'User Amount' %} {% trans 'Asset Amount' %} {% trans 'Comment' %} {% trans 'Action' %} diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html index da124adfb..16744c39c 100644 --- a/apps/users/templates/users/user_list.html +++ b/apps/users/templates/users/user_list.html @@ -1,18 +1,5 @@ {% extends '_base_list.html' %} {% load i18n static %} -{% block custom_head_css_js %} -{{ block.super }} - -{% endblock %} {% block table_search %}{% endblock %} {% block table_container %}