diff --git a/apps/assets/serializers.py b/apps/assets/serializers.py
index 49ea18313..1e6662160 100644
--- a/apps/assets/serializers.py
+++ b/apps/assets/serializers.py
@@ -216,6 +216,7 @@ class ClusterSerializer(BulkSerializerMixin, serializers.ModelSerializer):
assets_amount = serializers.SerializerMethodField()
admin_user_name = serializers.SerializerMethodField()
assets = serializers.PrimaryKeyRelatedField(many=True, queryset=Asset.objects.all())
+ system_users = serializers.SerializerMethodField()
class Meta:
model = Cluster
@@ -232,6 +233,10 @@ class ClusterSerializer(BulkSerializerMixin, serializers.ModelSerializer):
except AttributeError:
return ''
+ @staticmethod
+ def get_system_users(obj):
+ return ', '.join(obj.name for obj in obj.systemuser_set.all())
+
class AssetGroupGrantedSerializer(BulkSerializerMixin, serializers.ModelSerializer):
"""
diff --git a/apps/assets/templates/assets/asset_detail.html b/apps/assets/templates/assets/asset_detail.html
index cb5b082cc..a67fe5f70 100644
--- a/apps/assets/templates/assets/asset_detail.html
+++ b/apps/assets/templates/assets/asset_detail.html
@@ -373,7 +373,7 @@ $(document).ready(function () {
url: the_url,
error: error,
method: 'GET',
- success_message: "{% trans "Pong" %}"
+ success_message: "{% trans "Reachable" %}"
});
})
diff --git a/apps/assets/templates/assets/cluster_list.html b/apps/assets/templates/assets/cluster_list.html
index 55a3532ee..17482ed4f 100644
--- a/apps/assets/templates/assets/cluster_list.html
+++ b/apps/assets/templates/assets/cluster_list.html
@@ -19,9 +19,7 @@
{% trans 'Name' %} |
{% trans 'Admin user' %} |
{% trans 'Asset num' %} |
- {% trans 'Contact' %} |
- {% trans 'Phone' %} |
- {% trans 'Operator' %} |
+ {% trans 'System users' %} |
{% trans 'Action' %} |
@@ -41,14 +39,16 @@ $(document).ready(function(){
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
}},
- {targets: 7, createdCell: function (td, cellData, rowData) {
+ {targets: 5, createdCell: function (td, cellData, rowData) {
var update_btn = '{% trans "Update" %}'.replace('{{ DEFAULT_PK }}', cellData);
var del_btn = '{% trans "Delete" %}'.replace('{{ DEFAULT_PK }}', cellData);
$(td).html(update_btn + del_btn)
}}],
ajax_url: '{% url "api-assets:cluster-list" %}',
- columns: [{data: function(){return ""}}, {data: "name" }, {data: "admin_user_name"}, {data: "assets_amount" }, {data: "contact" }, {data: "phone" },
- {data: "operator" }, {data: "id" }],
+ columns: [
+ {data: "id"}, {data: "name" }, {data: "admin_user_name"}, {data: "assets_amount" },
+ {data: "system_users" }, {data: "id" }
+ ],
op_html: $('#actions').html()
};
jumpserver.initDataTable(options);
diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js
index 6d25198fe..90bc501d7 100644
--- a/apps/static/js/jumpserver.js
+++ b/apps/static/js/jumpserver.js
@@ -257,10 +257,13 @@ jumpserver.initDataTable = function (options) {
$(td).html(''.replace('99991937', cellData));
}
},
- // className: 'select-checkbox'
{className: 'text-center', targets: '_all'}
];
columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs;
+ var select = {
+ style: 'multi',
+ selector: 'td:first-child'
+ };
var table = ele.DataTable({
pageLength: options.pageLength || 15,
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>>',
@@ -273,9 +276,16 @@ jumpserver.initDataTable = function (options) {
dataSrc: ""
},
columns: options.columns || [],
- select: {
- style: 'multi',
- selector: 'td:first-child'
+ select: options.select || select,
+ language: {
+ search: "搜索",
+ lengthMenu: "每页 _MENU_",
+ paginate: {
+ first: "第一页",
+ previous: "上一页",
+ next: "下一页",
+ last: "最后"
+ }
},
lengthMenu: [[15, 25, 50, -1], [15, 25, 50, "All"]]
});
@@ -292,17 +302,17 @@ jumpserver.initDataTable = function (options) {
$('#op').html(options.op_html || '');
$('#uc').html(options.uc_html || '');
});
- // $('.ipt_check_all').on('click', function() {
- // if (!jumpserver.checked) {
- // $(this).closest('table').find('.ipt_check').prop('checked', true);
- // jumpserver.checked = true;
- // table.rows().select();
- // } else {
- // $(this).closest('table').find('.ipt_check').prop('checked', false);
- // jumpserver.checked = false;
- // table.rows().deselect();
- // }
- // });
+ $('.ipt_check_all').on('click', function() {
+ if (!jumpserver.checked) {
+ $(this).closest('table').find('.ipt_check').prop('checked', true);
+ jumpserver.checked = true;
+ table.rows().select();
+ } else {
+ $(this).closest('table').find('.ipt_check').prop('checked', false);
+ jumpserver.checked = false;
+ table.rows().deselect();
+ }
+ });
return table;
};
diff --git a/apps/terminal/templates/terminal/session_list.html b/apps/terminal/templates/terminal/session_list.html
index 1b655bd66..1a2a949d9 100644
--- a/apps/terminal/templates/terminal/session_list.html
+++ b/apps/terminal/templates/terminal/session_list.html
@@ -91,7 +91,7 @@
{{ session.id | get_session_command_amount }} |
{{ session.date_start }} |
- {{ session.date_end|default_if_none:now|timeuntil:session.date_start }} |
+ {{ session.date_end|timeuntil:session.date_start }} |
{% if session.is_finished %}
{% trans "Replay" %}
diff --git a/apps/users/templates/users/login_log_list.html b/apps/users/templates/users/login_log_list.html
index e68bfc606..e35dbb21e 100644
--- a/apps/users/templates/users/login_log_list.html
+++ b/apps/users/templates/users/login_log_list.html
@@ -24,10 +24,10 @@
-
diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html
index 7612b1dfd..4b32612dd 100644
--- a/apps/users/templates/users/user_list.html
+++ b/apps/users/templates/users/user_list.html
@@ -88,8 +88,10 @@ function initTable() {
$(td).html(update_btn + del_btn)
}}],
ajax_url: '{% url "api-users:user-list" %}',
- columns: [{data: "id"}, {data: "name" }, {data: "username" }, {data: "get_role_display" },
- {data: "groups_display" }, {data: "is_valid" }, {data: "id" }],
+ columns: [
+ {data: "id"}, {data: "name" }, {data: "username" }, {data: "get_role_display" },
+ {data: "groups_display" }, {data: "is_valid" }, {data: "id" }
+ ],
op_html: $('#actions').html()
};
table = jumpserver.initDataTable(options);
diff --git a/apps/users/views/login.py b/apps/users/views/login.py
index ee567c862..51a48878b 100644
--- a/apps/users/views/login.py
+++ b/apps/users/views/login.py
@@ -215,20 +215,20 @@ class LoginLogListView(DatetimeSearchMixin, ListView):
template_name = 'users/login_log_list.html'
model = LoginLog
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
- username = keyword = ""
+ user = keyword = ""
date_to = date_from = None
date_format = '%m/%d/%Y'
def get_queryset(self):
- self.username = self.request.GET.get('user', '')
+ self.user = self.request.GET.get('user', '')
self.keyword = self.request.GET.get("keyword", '')
queryset = super().get_queryset()
queryset = queryset.filter(
datetime__gt=self.date_from, datetime__lt=self.date_to
)
- if self.username:
- queryset = queryset.filter(username=self.username)
+ if self.user:
+ queryset = queryset.filter(username=self.user)
if self.keyword:
queryset = self.queryset.filter(
Q(ip__contains=self.keyword) |
@@ -243,7 +243,7 @@ class LoginLogListView(DatetimeSearchMixin, ListView):
'action': _('Login log list'),
'date_from': self.date_from,
'date_to': self.date_to,
- 'username': self.username,
+ 'user': self.user,
'keyword': self.keyword,
'user_list': set(LoginLog.objects.all().values_list('username', flat=True))
}
diff --git a/apps/users/views/user.py b/apps/users/views/user.py
index 04e182fab..ec54e1d0c 100644
--- a/apps/users/views/user.py
+++ b/apps/users/views/user.py
@@ -305,8 +305,8 @@ class UserGrantedAssetView(AdminUserRequiredMixin, DetailView):
def get_context_data(self, **kwargs):
context = {
- 'app': 'User',
- 'action': 'User granted asset',
+ 'app': _('Users'),
+ 'action': _('User granted assets'),
}
kwargs.update(context)
return super().get_context_data(**kwargs)
@@ -319,8 +319,8 @@ class UserProfileView(LoginRequiredMixin, TemplateView):
from perms.utils import get_user_granted_assets
assets = get_user_granted_assets(self.request.user)
context = {
- 'app': 'User',
- 'action': 'User Profile',
+ 'app': _('Users'),
+ 'action': _('Profile'),
'assets': assets,
}
kwargs.update(context)
@@ -345,8 +345,8 @@ class UserProfileUpdateView(LoginRequiredMixin, UpdateView):
def get_context_data(self, **kwargs):
context = {
- 'app': 'User',
- 'action': 'Profile update',
+ 'app': _('User'),
+ 'action': _('Profile setting'),
}
kwargs.update(context)
return super().get_context_data(**kwargs)
@@ -363,8 +363,8 @@ class UserPasswordUpdateView(LoginRequiredMixin, UpdateView):
def get_context_data(self, **kwargs):
context = {
- 'app': 'User',
- 'action': 'Password update',
+ 'app': _('Users'),
+ 'action': _('Password update'),
}
kwargs.update(context)
return super().get_context_data(**kwargs)
@@ -385,8 +385,8 @@ class UserPublicKeyUpdateView(LoginRequiredMixin, UpdateView):
def get_context_data(self, **kwargs):
context = {
- 'app': 'User',
- 'action': 'Public key update',
+ 'app': _('Users'),
+ 'action': _('Public key update'),
}
kwargs.update(context)
return super().get_context_data(**kwargs)
diff --git a/run_server.py b/run_server.py
index 9ae558f98..ec0a73a89 100644
--- a/run_server.py
+++ b/run_server.py
@@ -61,7 +61,7 @@ def start_gunicorn():
cmd += log
if DEBUG:
cmd += " --reload"
- p = subprocess.call(cmd, shell=True, stdout=sys.stdout, stderr=sys.stderr)
+ p = subprocess.Popen(cmd, shell=True, stdout=sys.stdout, stderr=sys.stderr)
return p
|