From 0b299344a7a67637ac4904a443ff514130878193 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sun, 31 Dec 2017 12:20:08 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9database=20?= =?UTF-8?q?=E8=A1=A8=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/serializers.py | 5 +++ .../assets/templates/assets/asset_detail.html | 2 +- .../assets/templates/assets/cluster_list.html | 12 +++--- apps/static/js/jumpserver.js | 40 ++++++++++++------- .../templates/terminal/session_list.html | 2 +- .../users/templates/users/login_log_list.html | 4 +- apps/users/templates/users/user_list.html | 6 ++- apps/users/views/login.py | 10 ++--- apps/users/views/user.py | 20 +++++----- run_server.py | 2 +- 10 files changed, 60 insertions(+), 43 deletions(-) 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 @@
- {% for u in user_list %} - + {% endfor %}
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