diff --git a/apps/assets/models.py b/apps/assets/models.py index 1b13b8621..5d6d18096 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -233,6 +233,10 @@ class SystemUser(models.Model): def assets_amount(self): return self.assets.count() + @property + def asset_group_amount(self): + return self.asset_groups.count() + class Meta: db_table = 'system_user' diff --git a/apps/assets/serializers.py b/apps/assets/serializers.py index 9613da621..e035d58e4 100644 --- a/apps/assets/serializers.py +++ b/apps/assets/serializers.py @@ -35,7 +35,7 @@ class SystemUserSerializer(serializers.ModelSerializer): def get_field_names(self, declared_fields, info): fields = super(SystemUserSerializer, self).get_field_names(declared_fields, info) - fields.append('assets_amount') + fields.extend(['assets_amount']) return fields diff --git a/apps/assets/templates/assets/admin_user_list.html b/apps/assets/templates/assets/admin_user_list.html index ea35972a0..35d6b6789 100644 --- a/apps/assets/templates/assets/admin_user_list.html +++ b/apps/assets/templates/assets/admin_user_list.html @@ -39,13 +39,6 @@ $(document).ready(function(){ var innerHtml = cellData.length > 8 ? cellData.substring(0, 24) + '...': cellData; $(td).html('<a href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</a>'); }}, -{# {targets: 6, createdCell: function (td, cellData) {#} -{# if (!cellData) {#} -{# $(td).html('<i class="fa fa-times text-danger"></i>')#} -{# } else {#} -{# $(td).html('<i class="fa fa-check text-navy"></i>')#} -{# }#} -{# }},#} {targets: 6, createdCell: function (td, cellData, rowData) { var script_btn = '<a href="{% url "assets:admin-user-update" pk=99991937 %}" class="btn btn-xs btn-primary">{% trans "Script" %}</a>'.replace('99991937', cellData); var update_btn = '<a href="{% url "assets:admin-user-update" pk=99991937 %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>'.replace('99991937', cellData); @@ -55,7 +48,6 @@ $(document).ready(function(){ ajax_url: '{% url "api-assets: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/system_user_list.html b/apps/assets/templates/assets/system_user_list.html index fb1e41323..77526ff37 100644 --- a/apps/assets/templates/assets/system_user_list.html +++ b/apps/assets/templates/assets/system_user_list.html @@ -1,43 +1,60 @@ {% extends '_base_list.html' %} {% load i18n %} {% load common_tags %} -{% block content_left_head %} + +{% block table_search %} +{% endblock %} + +{% block table_container %} +<div class="uc pull-left m-l-5 m-r-5"> <a href="{% url 'assets:system-user-create' %}" class="btn btn-sm btn-primary "> {% trans "Create system user" %} </a> +</div> +<table class="table table-striped table-bordered table-hover " id="system_user_list_table" > + <thead> + <tr> + <th class="text-center"> + <input type="checkbox" id="check_all" class="ipt_check_all" > + </th> + <th class="text-center">{% trans 'Name' %}</th> + <th class="text-center">{% trans 'Username' %}</th> + <th class="text-center">{% trans 'Asset' %}</th> + <th class="text-center">{% trans 'Unreachable' %}</th> + <th class="text-center">{% trans 'Comment' %}</th> + <th class="text-center">{% trans 'Action' %}</th> + </tr> + </thead> + <tbody> + </tbody> +</table> +{% endblock %} +{% block custom_foot_js %} +<script> + $(document).ready(function(){ + var options = { + ele: $('#system_user_list_table'), + columnDefs: [ + {targets: 1, createdCell: function (td, cellData, rowData) { + var detail_btn = '<a href="{% url "assets:system-user-detail" pk=99991937 %}">' + cellData + '</a>'; + $(td).html(detail_btn.replace('99991937', rowData.id)); + }}, + {targets: 5, createdCell: function (td, cellData) { + var innerHtml = cellData.length > 30 ? cellData.substring(0, 30) + '...': cellData; + $(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>'); + }}, + {targets: 6, createdCell: function (td, cellData, rowData) { + var script_btn = '<a href="{% url "assets:system-user-update" pk=99991937 %}" class="btn btn-xs btn-primary">{% trans "Script" %}</a>'.replace('99991937', cellData); + var update_btn = '<a href="{% url "assets:system-user-update" pk=99991937 %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>'.replace('99991937', cellData); + var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_admin_user_delete" data-uid="99991937">{% trans "Delete" %}</a>'.replace('99991937', cellData); + $(td).html(script_btn + update_btn + del_btn) + }}], + ajax_url: '{% url "api-assets:system-user-list" %}', + columns: [{data: "id" }, {data: "name" }, {data: "username" }, {data: "assets_amount" }, {data: function () { return "3"}}, + {data: "comment" }, {data: "id" }], + }; + jumpserver.initDataTable(options); + }); +</script> {% endblock %} -{% block table_head %} - <th class="text-center">{% trans 'ID' %}</th> - <th class="text-center"><a href="{% url 'assets:system-user-list' %}?sort=name">{% trans 'Name' %}</a></th> - <th class="text-center"><a href="{% url 'assets:system-user-list' %}?sort=username">{% trans 'Username' %}</a></th> - <th class="text-center">{% trans 'Asset num' %}</th> - <th class="text-center">{% trans 'Asset group num' %}</th> - <th class="text-center">{% trans 'Unreachable' %}</th> - <th class="text-center">{% trans 'Comment' %}</th> - <th class="text-center"></th> -{% endblock %} -{% block table_body %} - {% for system_user in system_user_list %} - <tr class="gradeX"> - <td class="text-center">{{ system_user.id }}</td> - <td> - <a href="{% url 'assets:system-user-detail' pk=system_user.id %}"> - {{ system_user.name }} - </a> - </td> - <td class="text-center">{{ system_user.username }}</td> - <td class="text-center">{{ system_user.get_assets|length }}</td> - <td class="text-center">{{ system_user.asset_groups.count }}</td> - <td class="text-center">{{ system_user.assets.count }}</td> - <td class="text-center">{{ system_user.comment|truncatewords:4 }}</td> - <td class="text-center"> - <!-- Todo: Click script button will paste a url to clipboard like: curl http://url/system_user_create.sh | bash --> - <a href="{% url 'assets:system-user-update' pk=system_user.id %}" class="btn btn-xs btn-primary">{% trans 'Script' %}</a> - <!-- Todo: Click refresh button will run a task to test admin user could connect asset or not immediately --> - <a href="{% url 'assets:system-user-update' pk=system_user.id %}" class="btn btn-xs btn-warning">{% trans 'Refresh' %}</a> - <a href="{% url 'assets:system-user-update' pk=system_user.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a> - <a onclick="obj_del(this,'{{ system_user.name }}','{% url 'assets:system-user-delete' system_user.id %}')" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a> - </td> - </tr> - {% endfor %} -{% endblock %} + diff --git a/apps/assets/views.py b/apps/assets/views.py index 31619621d..c8bbc3911 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -478,35 +478,17 @@ class AdminUserDeleteView(AdminUserRequiredMixin, DeleteView): success_url = reverse_lazy('assets:admin-user-list') -class SystemUserListView(AdminUserRequiredMixin, ListView): - model = SystemUser - paginate_by = settings.CONFIG.DISPLAY_PER_PAGE - context_object_name = 'system_user_list' +class SystemUserListView(AdminUserRequiredMixin, TemplateView): template_name = 'assets/system_user_list.html' def get_context_data(self, **kwargs): context = { 'app': _('Assets'), 'action': _('System user list'), - 'keyword': self.request.GET.get('keyword', '') } kwargs.update(context) return super(SystemUserListView, self).get_context_data(**kwargs) - def get_queryset(self): - # Todo: Default order by lose asset connection num - self.queryset = super(SystemUserListView, 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 SystemUserCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): model = SystemUser diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index e107832f4..5593fec2a 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -292,7 +292,7 @@ jumpserver.initDataTable = function (options) { columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs; var table = ele.DataTable({ pageLength: options.pageLength || 15, - dom: options.dom || '<"#uc.pull-left"><"html5buttons"B>flti<"row m-t"<"#op.col-md-6"><"col-md-6"p>>', + dom: options.dom || '<"#uc.pull-left">flt<"row m-t"<"col-md-8"<"#op.col-md-6"><"col-md-6 text-center"i>><"col-md-4"p>>', language: { url: options.i18n_url || "/static/js/plugins/dataTables/i18n/zh-hans.json" },