mirror of https://github.com/jumpserver/jumpserver
Bugfix (#2980)
* [Update] 修改排序,去掉标签 * [Update] 修改批量更新后刷新页面 * [Update] 修改面包屑 * [Update] 修改用户排序 * [Update] 处理未登录主机显示为负数 * [Update] 支持单个资产的搜索pull/2981/head
parent
40de7d64c6
commit
8ed3bb8586
|
@ -70,8 +70,6 @@ $(document).ready(function () {
|
||||||
{% endif %}
|
{% endif %}
|
||||||
var form = $("form");
|
var form = $("form");
|
||||||
var data = form.serializeObject();
|
var data = form.serializeObject();
|
||||||
console.log($("#id_private_key").data("file"));
|
|
||||||
|
|
||||||
data["private_key"] = $("#id_private_key").data('file');
|
data["private_key"] = $("#id_private_key").data('file');
|
||||||
|
|
||||||
var props = {
|
var props = {
|
||||||
|
|
|
@ -346,8 +346,8 @@ $(document).ready(function(){
|
||||||
var data = {
|
var data = {
|
||||||
'resources': id_list
|
'resources': id_list
|
||||||
};
|
};
|
||||||
function refreshTag() {
|
function refreshPage() {
|
||||||
$('#asset_list_table').DataTable().ajax.reload();
|
setTimeout( function () {window.location.reload();}, 300);
|
||||||
}
|
}
|
||||||
|
|
||||||
function doDeactive() {
|
function doDeactive() {
|
||||||
|
@ -356,15 +356,11 @@ $(document).ready(function(){
|
||||||
var obj = {"pk": object_id, "is_active": false};
|
var obj = {"pk": object_id, "is_active": false};
|
||||||
data.push(obj);
|
data.push(obj);
|
||||||
});
|
});
|
||||||
function success() {
|
|
||||||
setTimeout( function () {
|
|
||||||
window.location.reload();}, 500);
|
|
||||||
}
|
|
||||||
requestApi({
|
requestApi({
|
||||||
url: the_url,
|
url: the_url,
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
body: JSON.stringify(data),
|
body: JSON.stringify(data),
|
||||||
success: success
|
success: refreshPage
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function doActive() {
|
function doActive() {
|
||||||
|
@ -373,15 +369,11 @@ $(document).ready(function(){
|
||||||
var obj = {"pk": object_id, "is_active": true};
|
var obj = {"pk": object_id, "is_active": true};
|
||||||
data.push(obj);
|
data.push(obj);
|
||||||
});
|
});
|
||||||
function success() {
|
|
||||||
setTimeout( function () {
|
|
||||||
window.location.reload();}, 300);
|
|
||||||
}
|
|
||||||
requestApi({
|
requestApi({
|
||||||
url: the_url,
|
url: the_url,
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
body: JSON.stringify(data),
|
body: JSON.stringify(data),
|
||||||
success: success
|
success: refreshPage
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
|
@ -400,7 +392,7 @@ $(document).ready(function(){
|
||||||
requestApi({
|
requestApi({
|
||||||
url:url,
|
url:url,
|
||||||
method:'DELETE',
|
method:'DELETE',
|
||||||
success:refreshTag,
|
success:refreshPage,
|
||||||
flash_message:false,
|
flash_message:false,
|
||||||
});
|
});
|
||||||
var msg = "{% trans 'Asset Deleted.' %}";
|
var msg = "{% trans 'Asset Deleted.' %}";
|
||||||
|
|
|
@ -78,43 +78,9 @@ function initTable() {
|
||||||
var detail_btn = '<a href="{% url "assets:system-user-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
|
var detail_btn = '<a href="{% url "assets:system-user-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
|
||||||
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
|
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
|
||||||
}},
|
}},
|
||||||
{#{targets: 6, createdCell: function (td, cellData) {#}
|
{targets: 4, createdCell: function (td, cellData, rowData) {
|
||||||
{# var innerHtml = "";#}
|
$(td).html(rowData.login_mode_display);
|
||||||
{# var data = cellData.reachable;#}
|
}},
|
||||||
{# if (data !== 0) {#}
|
|
||||||
{# innerHtml = "<span class='text-navy'>" + data + "</span>";#}
|
|
||||||
{# } else {#}
|
|
||||||
{# innerHtml = "<span>" + data + "</span>";#}
|
|
||||||
{# }#}
|
|
||||||
{# $(td).html(innerHtml)#}
|
|
||||||
{#}},#}
|
|
||||||
{#{targets: 7, createdCell: function (td, cellData) {#}
|
|
||||||
{# var data = cellData.unreachable;#}
|
|
||||||
{# var innerHtml = "";#}
|
|
||||||
{# if (data !== 0) {#}
|
|
||||||
{# innerHtml = "<span class='text-danger'>" + data + "</span>";#}
|
|
||||||
{# } else {#}
|
|
||||||
{# innerHtml = "<span>" + data + "</span>";#}
|
|
||||||
{# }#}
|
|
||||||
{# $(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + data + '">' + innerHtml + '</span>');#}
|
|
||||||
{#}},#}
|
|
||||||
{#{targets: 8, createdCell: function (td, cellData, rowData) {#}
|
|
||||||
{# var val = 0;#}
|
|
||||||
{# var innerHtml = "";#}
|
|
||||||
{# var total = rowData.assets_amount;#}
|
|
||||||
{# var reachable = cellData.reachable;#}
|
|
||||||
{# if (total && total !== 0) {#}
|
|
||||||
{# val = reachable/total * 100;#}
|
|
||||||
{# }#}
|
|
||||||
{##}
|
|
||||||
{# if (val === 100) {#}
|
|
||||||
{# innerHtml = "<span class='text-navy'>" + val + "% </span>";#}
|
|
||||||
{# } else {#}
|
|
||||||
{# var num = new Number(val);#}
|
|
||||||
{# innerHtml = "<span class='text-danger'>" + num.toFixed(1) + "% </span>";#}
|
|
||||||
{# }#}
|
|
||||||
{# $(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');#}
|
|
||||||
{#}},#}
|
|
||||||
{targets: 7, createdCell: function (td, cellData, rowData) {
|
{targets: 7, createdCell: function (td, cellData, rowData) {
|
||||||
var update_btn = '<a href="{% url "assets:system-user-update" pk=DEFAULT_PK %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
var update_btn = '<a href="{% url "assets:system-user-update" pk=DEFAULT_PK %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
||||||
var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_admin_user_delete" data-uid="{{ DEFAULT_PK }}">{% trans "Delete" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_admin_user_delete" data-uid="{{ DEFAULT_PK }}">{% trans "Delete" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
||||||
|
@ -123,8 +89,9 @@ function initTable() {
|
||||||
],
|
],
|
||||||
ajax_url: '{% url "api-assets:system-user-list" %}',
|
ajax_url: '{% url "api-assets:system-user-list" %}',
|
||||||
columns: [
|
columns: [
|
||||||
{data: "id" }, {data: "name" }, {data: "username" }, {data: "protocol"}, {data: "login_mode_display"}, {data: "assets_amount" },
|
{data: "id" }, {data: "name" }, {data: "username" }, {data: "protocol"},
|
||||||
{data: "comment" }, {data: "id" }
|
{data: "login_mode"}, {data: "assets_amount", orderable: false },
|
||||||
|
{data: "comment" }, {data: "id", orderable: false }
|
||||||
],
|
],
|
||||||
op_html: $('#actions').html()
|
op_html: $('#actions').html()
|
||||||
};
|
};
|
||||||
|
|
|
@ -100,13 +100,19 @@ class IndexView(PermissionsMixin, TemplateView):
|
||||||
return self.session_month.values('user').distinct().count()
|
return self.session_month.values('user').distinct().count()
|
||||||
|
|
||||||
def get_month_inactive_user_total(self):
|
def get_month_inactive_user_total(self):
|
||||||
return current_org.get_org_users().count() - self.get_month_active_user_total()
|
count = current_org.get_org_users().count() - self.get_month_active_user_total()
|
||||||
|
if count < 0:
|
||||||
|
count = 0
|
||||||
|
return count
|
||||||
|
|
||||||
def get_month_active_asset_total(self):
|
def get_month_active_asset_total(self):
|
||||||
return self.session_month.values('asset').distinct().count()
|
return self.session_month.values('asset').distinct().count()
|
||||||
|
|
||||||
def get_month_inactive_asset_total(self):
|
def get_month_inactive_asset_total(self):
|
||||||
return Asset.objects.all().count() - self.get_month_active_asset_total()
|
count = Asset.objects.all().count() - self.get_month_active_asset_total()
|
||||||
|
if count < 0:
|
||||||
|
count = 0
|
||||||
|
return count
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_user_disabled_total():
|
def get_user_disabled_total():
|
||||||
|
@ -180,6 +186,7 @@ class IndexView(PermissionsMixin, TemplateView):
|
||||||
'week_asset_hot_ten': self.get_week_top10_asset(),
|
'week_asset_hot_ten': self.get_week_top10_asset(),
|
||||||
'last_login_ten': self.get_last10_sessions(),
|
'last_login_ten': self.get_last10_sessions(),
|
||||||
'week_user_hot_ten': self.get_week_top10_user(),
|
'week_user_hot_ten': self.get_week_top10_user(),
|
||||||
|
'app': _("Dashboard"),
|
||||||
}
|
}
|
||||||
|
|
||||||
kwargs.update(context)
|
kwargs.update(context)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
from functools import reduce
|
import uuid
|
||||||
from hashlib import md5
|
from hashlib import md5
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
@ -186,6 +186,20 @@ class GrantAssetsMixin(LabelFilterMixin):
|
||||||
data = self.get_serializer_queryset(queryset_list)
|
data = self.get_serializer_queryset(queryset_list)
|
||||||
return super().get_serializer(data, many=True)
|
return super().get_serializer(data, many=True)
|
||||||
|
|
||||||
|
def filter_queryset_by_id(self, assets_items):
|
||||||
|
i = self.request.query_params.get("id")
|
||||||
|
if not i:
|
||||||
|
return assets_items
|
||||||
|
try:
|
||||||
|
pk = uuid.UUID(i)
|
||||||
|
except ValueError:
|
||||||
|
return assets_items
|
||||||
|
assets_map = {asset['id']: asset for asset in assets_items}
|
||||||
|
if pk in assets_map:
|
||||||
|
return [assets_map.get(pk)]
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
def search_queryset(self, assets_items):
|
def search_queryset(self, assets_items):
|
||||||
search = self.request.query_params.get("search")
|
search = self.request.query_params.get("search")
|
||||||
if not search:
|
if not search:
|
||||||
|
@ -221,6 +235,7 @@ class GrantAssetsMixin(LabelFilterMixin):
|
||||||
return [assets_map.get(asset_id) for asset_id in assets_ids_search]
|
return [assets_map.get(asset_id) for asset_id in assets_ids_search]
|
||||||
|
|
||||||
def filter_queryset(self, assets_items):
|
def filter_queryset(self, assets_items):
|
||||||
|
assets_items = self.filter_queryset_by_id(assets_items)
|
||||||
assets_items = self.search_queryset(assets_items)
|
assets_items = self.search_queryset(assets_items)
|
||||||
assets_items = self.filter_queryset_by_label(assets_items)
|
assets_items = self.filter_queryset_by_label(assets_items)
|
||||||
assets_items = self.sort_queryset(assets_items)
|
assets_items = self.sort_queryset(assets_items)
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
import time
|
|
||||||
import traceback
|
|
||||||
from functools import reduce
|
|
||||||
import uuid
|
import uuid
|
||||||
from django.db.models import Q
|
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from rest_framework.views import APIView, Response
|
from rest_framework.views import APIView, Response
|
||||||
from rest_framework.generics import (
|
from rest_framework.generics import (
|
||||||
|
|
|
@ -110,9 +110,6 @@
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<h2></h2>
|
<h2></h2>
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li>
|
|
||||||
<a href="">{% trans 'Dashboard' %}</a>
|
|
||||||
</li>
|
|
||||||
{% if app %}
|
{% if app %}
|
||||||
<li>
|
<li>
|
||||||
<a>{{ app }}</a>
|
<a>{{ app }}</a>
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-9 animated fadeInRight">
|
<div class="col-lg-9 animated fadeInRight">
|
||||||
<div class="mail-box-header">
|
<div class="mail-box-header">
|
||||||
<div class="btn-group" style="float: right">
|
{# <div class="btn-group" style="float: right">#}
|
||||||
<button data-toggle="dropdown" class="btn btn-default btn-sm labels dropdown-toggle">{% trans 'Label' %} <span class="caret"></span></button>
|
{# <button data-toggle="dropdown" class="btn btn-default btn-sm labels dropdown-toggle">{% trans 'Label' %} <span class="caret"></span></button>#}
|
||||||
<ul class="dropdown-menu labels-menu">
|
{# <ul class="dropdown-menu labels-menu">#}
|
||||||
</ul>
|
{# </ul>#}
|
||||||
</div>
|
{# </div>#}
|
||||||
<table class="table table-striped table-bordered table-hover" id="user_assets_table" >
|
<table class="table table-striped table-bordered table-hover" id="user_assets_table" >
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
|
@ -76,10 +76,16 @@ function initTable() {
|
||||||
var detail_btn = '<a href="{% url "users:user-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
|
var detail_btn = '<a href="{% url "users:user-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
|
||||||
$(td).html(detail_btn.replace("{{ DEFAULT_PK }}", rowData.id));
|
$(td).html(detail_btn.replace("{{ DEFAULT_PK }}", rowData.id));
|
||||||
}},
|
}},
|
||||||
|
{targets: 3, createdCell: function (td, cellData, rowData) {
|
||||||
|
$(td).html(rowData.role_display);
|
||||||
|
}},
|
||||||
{targets: 4, createdCell: function (td, cellData) {
|
{targets: 4, createdCell: function (td, cellData) {
|
||||||
var innerHtml = cellData.length > 20 ? cellData.substring(0, 20) + '...': cellData;
|
var innerHtml = cellData.length > 20 ? cellData.substring(0, 20) + '...': cellData;
|
||||||
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');
|
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');
|
||||||
}},
|
}},
|
||||||
|
{targets: 5, createdCell: function (td, cellData, rowData) {
|
||||||
|
$(td).html(rowData.source_display);
|
||||||
|
}},
|
||||||
{targets: 6, createdCell: function (td, cellData, rowData) {
|
{targets: 6, createdCell: function (td, cellData, rowData) {
|
||||||
if (cellData) {
|
if (cellData) {
|
||||||
$(td).html('<i class="fa fa-check text-navy"></i>')
|
$(td).html('<i class="fa fa-check text-navy"></i>')
|
||||||
|
@ -114,9 +120,9 @@ function initTable() {
|
||||||
ajax_url: '{% url "api-users:user-list" %}',
|
ajax_url: '{% url "api-users:user-list" %}',
|
||||||
columns: [
|
columns: [
|
||||||
{data: "id"}, {data: "name" }, {data: "username" },
|
{data: "id"}, {data: "name" }, {data: "username" },
|
||||||
{data: "role_display", orderable: false},
|
{data: "role"},
|
||||||
{data: "groups_display", orderable: false},
|
{data: "groups_display", orderable: false},
|
||||||
{data: "source_display", orderable: false},
|
{data: "source"},
|
||||||
{data: "is_valid", orderable: false},
|
{data: "is_valid", orderable: false},
|
||||||
{data: "id", orderable: false}
|
{data: "id", orderable: false}
|
||||||
],
|
],
|
||||||
|
@ -209,8 +215,8 @@ $(document).ready(function(){
|
||||||
var data = {
|
var data = {
|
||||||
'resources': id_list
|
'resources': id_list
|
||||||
};
|
};
|
||||||
function refreshTag() {
|
function reloadPage() {
|
||||||
$('#user_list_table').DataTable().ajax.reload()
|
setTimeout( function () {window.location.reload();}, 300);
|
||||||
}
|
}
|
||||||
function doDeactive() {
|
function doDeactive() {
|
||||||
var data = [];
|
var data = [];
|
||||||
|
@ -218,15 +224,11 @@ $(document).ready(function(){
|
||||||
var obj = {"pk": object_id, "is_active": false};
|
var obj = {"pk": object_id, "is_active": false};
|
||||||
data.push(obj);
|
data.push(obj);
|
||||||
});
|
});
|
||||||
function success() {
|
|
||||||
setTimeout( function () {
|
|
||||||
window.location.reload();}, 300);
|
|
||||||
}
|
|
||||||
requestApi({
|
requestApi({
|
||||||
url: the_url,
|
url: the_url,
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
body: JSON.stringify(data),
|
body: JSON.stringify(data),
|
||||||
success: success
|
success: reloadPage
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function doActive() {
|
function doActive() {
|
||||||
|
@ -235,15 +237,11 @@ $(document).ready(function(){
|
||||||
var obj = {"pk": object_id, "is_active": true};
|
var obj = {"pk": object_id, "is_active": true};
|
||||||
data.push(obj);
|
data.push(obj);
|
||||||
});
|
});
|
||||||
function success() {
|
|
||||||
setTimeout( function () {
|
|
||||||
window.location.reload();}, 300);
|
|
||||||
}
|
|
||||||
requestApi({
|
requestApi({
|
||||||
url: the_url,
|
url: the_url,
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
body: JSON.stringify(data),
|
body: JSON.stringify(data),
|
||||||
success: success
|
success: reloadPage
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function doDelete() {
|
function doDelete() {
|
||||||
|
@ -262,7 +260,7 @@ $(document).ready(function(){
|
||||||
requestApi({
|
requestApi({
|
||||||
url:url,
|
url:url,
|
||||||
method:'DELETE',
|
method:'DELETE',
|
||||||
success:refreshTag,
|
success:reloadPage,
|
||||||
flash_message:false,
|
flash_message:false,
|
||||||
});
|
});
|
||||||
var msg = "{% trans 'User Deleted.' %}";
|
var msg = "{% trans 'User Deleted.' %}";
|
||||||
|
|
Loading…
Reference in New Issue