diff --git a/server/www/teleport/static/js/asset/account-group-list.js b/server/www/teleport/static/js/asset/account-group-list.js index 37b201b..64a0c98 100644 --- a/server/www/teleport/static/js/asset/account-group-list.js +++ b/server/www/teleport/static/js/asset/account-group-list.js @@ -7,8 +7,8 @@ $app.on_init = function (cb_stack) { chkbox_groups_select_all: $('#table-groups-select-all'), // btn_edit_user: $('#btn-edit-user'), - // btn_lock_user: $('#btn-lock-user'), - // btn_unlock_user: $('#btn-unlock-user'), + btn_lock_group: $('#btn-lock-group'), + btn_unlock_group: $('#btn-unlock-group'), btn_remove_group: $('#btn-remove-group'), chkbox_user_list_select_all: $('#table-user-list-select-all') @@ -75,6 +75,16 @@ $app.create_controls = function (cb_stack) { render: 'members', fields: {id: 'id', member_count: 'member_count', members: 'members'} }, + { + title: "状态", + key: "state", + sort: true, + width: 90, + align: 'center', + header_render: 'filter_state', + render: 'group_state', + fields: {state: 'state'} + }, { title: '操作', key: 'actions', @@ -83,16 +93,6 @@ $app.create_controls = function (cb_stack) { render: 'make_action_btn', fields: {id: 'id'} } - // { - // title: "状态", - // key: "state", - // sort: true, - // width: 120, - // align: 'center', - // header_render: 'filter_user_state', - // render: 'user_state', - // fields: {state: 'state'} - // } ], // 重载回调函数 @@ -113,13 +113,11 @@ $app.create_controls = function (cb_stack) { name: 'search_group', place_holder: '搜索:账号组名称/描述' }); - // $app.table_groups_role_filter = $tp.create_table_filter_role($app.table_groups, $app.role_list); - // $app.table_groups_user_state_filter = $tp.create_table_filter_user_state($app.table_groups, $app.user_states); - // 从cookie中读取用户分页限制的选择 - var _per_page = Cookies.get($app.page_id('acc_group_list') + '_per_page'); + $tp.create_table_header_filter_state($app.table_groups, 'state', $app.obj_states, [TP_STATE_LOCKED]); + $app.table_groups_paging = $tp.create_table_paging($app.table_groups, 'table-groups-paging', { - per_page: _per_page, + per_page: Cookies.get($app.page_id('acc_group_list') + '_per_page'), on_per_page_changed: function (per_page) { Cookies.set($app.page_id('acc_group_list') + '_per_page', per_page, {expires: 365}); } @@ -155,9 +153,13 @@ $app.create_controls = function (cb_stack) { }); } }); - // $app.dom.btn_edit_user.click($app.on_btn_edit_user_click); - // $app.dom.btn_lock_user.click($app.on_btn_lock_user_click); - // $app.dom.btn_unlock_user.click($app.on_btn_unlock_user_click); + + $app.dom.btn_lock_group.click(function(){ + $app.on_btn_lock_group_click(); + }); + $app.dom.btn_unlock_group.click(function(){ + $app.on_btn_unlock_group_click(); + }); $app.dom.btn_remove_group.click(function(){ $app.on_btn_remove_group_click(); }); @@ -214,6 +216,20 @@ $app.on_table_groups_render_created = function (render) { return _ret.join(''); }; + render.filter_state = function (header, title, col) { + var _ret = ['
']; + _ret.push('
'); + _ret.push('
' + title + '
'); + + // 表格内嵌过滤器的DOM实体在这时生成 + var filter_ctrl = header._table_ctrl.get_filter_ctrl('state'); + _ret.push(filter_ctrl.render()); + + _ret.push('
'); + + return _ret.join(''); + }; + render.make_check_box = function (row_id, fields) { return ''; }; @@ -255,6 +271,24 @@ $app.on_table_groups_render_created = function (render) { return '' + fields.member_count; }; + render.group_state = function (row_id, fields) { + var _style, _state; + + for (var i = 0; i < $app.obj_states.length; ++i) { + if ($app.obj_states[i].id === fields.state) { + _style = $app.obj_states[i].style; + _state = $app.obj_states[i].name; + break; + } + } + if (i === $app.obj_states.length) { + _style = 'info'; + _state = ' 未知'; + } + + return '' + _state + '' + }; + render.make_action_btn = function (row_id, fields) { var ret = []; ret.push('
'); @@ -276,6 +310,7 @@ $app.on_table_groups_header_created = function (header) { // 表格内嵌过滤器的事件绑定在这时进行(也可以延期到整个表格创建完成时进行) header._table_ctrl.get_filter_ctrl('search_group').on_created(); + header._table_ctrl.get_filter_ctrl('state').on_created(); }; $app.get_selected_group = function (tbl) { @@ -290,13 +325,82 @@ $app.get_selected_group = function (tbl) { return groups; }; +$app.on_btn_lock_group_click = function (_row_id) { + var group_list = []; + + if (_.isUndefined(_row_id)) { + var groups = $app.get_selected_group($app.table_groups); + if (groups.length === 0) { + $tp.notify_error('请选择要禁用的分组!'); + return; + } + + $.each(groups, function (i, g) { + group_list.push(g.id); + }); + } else { + var _row_data = $app.table_groups.get_row(_row_id); + group_list.push(_row_data.id); + } + + $tp.ajax_post_json('/group/lock', {gtype: TP_GROUP_ACCOUNT, glist: group_list}, + function (ret) { + if (ret.code === TPE_OK) { + $app.table_groups.load_data(); + $tp.notify_success('禁用分组操作成功!'); + } else { + $tp.notify_error('禁用分组操作失败:' + tp_error_msg(ret.code, ret.message)); + } + }, + function () { + $tp.notify_error('网络故障,禁用分组操作失败!'); + } + ); + +}; + +$app.on_btn_unlock_group_click = function (_row_id) { + var group_list = []; + + if (_.isUndefined(_row_id)) { + var groups = $app.get_selected_group($app.table_groups); + if (groups.length === 0) { + $tp.notify_error('请选择要解禁的分组!'); + return; + } + + $.each(groups, function (i, g) { + group_list.push(g.id); + }); + } else { + var _row_data = $app.table_groups.get_row(_row_id); + group_list.push(_row_data.id); + } + + $tp.ajax_post_json('/group/unlock', {gtype: TP_GROUP_ACCOUNT, glist: group_list}, + function (ret) { + if (ret.code === TPE_OK) { + $app.table_groups.load_data(); + $tp.notify_success('分组解禁操作成功!'); + } else { + $tp.notify_error('分组解禁操作失败:' + tp_error_msg(ret.code, ret.message)); + } + }, + function () { + $tp.notify_error('网络故障,分组解禁操作失败!'); + } + ); + +}; + + $app.on_btn_remove_group_click = function (_row_id) { var group_list = []; if (_.isUndefined(_row_id)) { var groups = $app.get_selected_group($app.table_groups); if (groups.length === 0) { - $tp.notify_error('请选择要删除的用户组!'); + $tp.notify_error('请选择要删除的分组!'); return; } diff --git a/server/www/teleport/static/js/asset/host-group-list.js b/server/www/teleport/static/js/asset/host-group-list.js index 232aa06..c1b7639 100644 --- a/server/www/teleport/static/js/asset/host-group-list.js +++ b/server/www/teleport/static/js/asset/host-group-list.js @@ -149,7 +149,7 @@ $app.create_controls = function (cb_stack) { }); } }); - // $app.dom.btn_edit_user.click($app.on_btn_edit_user_click); + $app.dom.btn_lock_group.click(function () { $app.on_btn_lock_group_click(); }); @@ -433,7 +433,7 @@ $app.on_btn_remove_group_click = function (_row_id) { if (group_list.length > 1) _msg_remove = '您确定要移除选定的 ' + group_list.length + '个 分组吗?'; $tp.dlg_confirm(cb_stack, { - msg: '

注意:删除操作不可恢复!!

删除分组将同时删除所有分配给此分组成员的授权!

删除分组不会删除组内的成员账号!

' + _msg_remove + '

', + msg: '

注意:删除操作不可恢复!!

删除分组将同时删除所有分配给此分组成员的授权!

删除分组不会删除组内的成员主机!

' + _msg_remove + '

', fn_yes: _fn_sure }); diff --git a/server/www/teleport/static/js/teleport/controls.js b/server/www/teleport/static/js/teleport/controls.js index 34417f0..84f85d1 100644 --- a/server/www/teleport/static/js/teleport/controls.js +++ b/server/www/teleport/static/js/teleport/controls.js @@ -1645,6 +1645,8 @@ $tp.create_table_header_filter_state = function (tbl, name, states, exclude_ids) _tblf.get_filter = function () { var ret = {}; + if(_tblf.default_value === _tblf.filter_value) + return ret; ret[_tblf.name] = _tblf.filter_value; return ret; }; diff --git a/server/www/teleport/static/js/user/user-group-list.js b/server/www/teleport/static/js/user/user-group-list.js index f54153f..19da6bf 100644 --- a/server/www/teleport/static/js/user/user-group-list.js +++ b/server/www/teleport/static/js/user/user-group-list.js @@ -6,9 +6,8 @@ $app.on_init = function (cb_stack) { btn_create_group: $('#btn-create-group'), chkbox_groups_select_all: $('#table-groups-select-all'), - // btn_edit_user: $('#btn-edit-user'), - // btn_lock_user: $('#btn-lock-user'), - // btn_unlock_user: $('#btn-unlock-user'), + // btn_lock_group: $('#btn-lock-group'), + // btn_unlock_group: $('#btn-unlock-group'), btn_remove_group: $('#btn-remove-group'), chkbox_user_list_select_all: $('#table-user-list-select-all') @@ -75,6 +74,16 @@ $app.create_controls = function (cb_stack) { render: 'members', fields: {id: 'id', member_count: 'member_count', members: 'members'} }, + // { + // title: "状态", + // key: "state", + // sort: true, + // width: 90, + // align: 'center', + // header_render: 'filter_state', + // render: 'group_state', + // fields: {state: 'state'} + // }, { title: '操作', key: 'actions', @@ -83,16 +92,6 @@ $app.create_controls = function (cb_stack) { render: 'make_action_btn', fields: {id: 'id'} } - // { - // title: "状态", - // key: "state", - // sort: true, - // width: 120, - // align: 'center', - // header_render: 'filter_user_state', - // render: 'user_state', - // fields: {state: 'state'} - // } ], // 重载回调函数 @@ -113,13 +112,10 @@ $app.create_controls = function (cb_stack) { name: 'search_group', place_holder: '搜索:用户组名称/描述' }); - // $app.table_groups_role_filter = $tp.create_table_filter_role($app.table_groups, $app.role_list); - // $app.table_groups_user_state_filter = $tp.create_table_filter_user_state($app.table_groups, $app.user_states); - // 从cookie中读取用户分页限制的选择 - var _per_page = Cookies.get($app.page_id('user_group') + '_per_page'); + $tp.create_table_header_filter_state($app.table_groups, 'state', $app.obj_states, [TP_STATE_LOCKED]); $app.table_groups_paging = $tp.create_table_paging($app.table_groups, 'table-groups-paging', { - per_page: _per_page, + per_page: Cookies.get($app.page_id('user_group') + '_per_page'), on_per_page_changed: function (per_page) { Cookies.set($app.page_id('user_group') + '_per_page', per_page, {expires: 365}); } @@ -155,9 +151,13 @@ $app.create_controls = function (cb_stack) { }); } }); - // $app.dom.btn_edit_user.click($app.on_btn_edit_user_click); - // $app.dom.btn_lock_user.click($app.on_btn_lock_user_click); - // $app.dom.btn_unlock_user.click($app.on_btn_unlock_user_click); + + // $app.dom.btn_lock_group.click(function () { + // $app.on_btn_lock_group_click(); + // }); + // $app.dom.btn_unlock_group.click(function () { + // $app.on_btn_unlock_group_click(); + // }); $app.dom.btn_remove_group.click(function(){ $app.on_btn_remove_group_click(); }); @@ -200,19 +200,19 @@ $app.check_groups_all_selected = function () { }; $app.on_table_groups_render_created = function (render) { - render.filter_role = function (header, title, col) { - var _ret = ['
']; - _ret.push('
'); - _ret.push('
' + title + '
'); - - // 表格内嵌过滤器的DOM实体在这时生成 - var filter_ctrl = header._table_ctrl.get_filter_ctrl('role'); - _ret.push(filter_ctrl.render()); - - _ret.push('
'); - - return _ret.join(''); - }; + // render.filter_role = function (header, title, col) { + // var _ret = ['
']; + // _ret.push('
'); + // _ret.push('
' + title + '
'); + // + // // 表格内嵌过滤器的DOM实体在这时生成 + // var filter_ctrl = header._table_ctrl.get_filter_ctrl('role'); + // _ret.push(filter_ctrl.render()); + // + // _ret.push('
'); + // + // return _ret.join(''); + // }; render.filter_group_search = function (header, title, col) { var _ret = ['
']; @@ -228,6 +228,38 @@ $app.on_table_groups_render_created = function (render) { return _ret.join(''); }; + render.filter_state = function (header, title, col) { + var _ret = ['
']; + _ret.push('
'); + _ret.push('
' + title + '
'); + + // 表格内嵌过滤器的DOM实体在这时生成 + var filter_ctrl = header._table_ctrl.get_filter_ctrl('state'); + _ret.push(filter_ctrl.render()); + + _ret.push('
'); + + return _ret.join(''); + }; + + render.group_state = function (row_id, fields) { + var _style, _state; + + for (var i = 0; i < $app.obj_states.length; ++i) { + if ($app.obj_states[i].id === fields.state) { + _style = $app.obj_states[i].style; + _state = $app.obj_states[i].name; + break; + } + } + if (i === $app.obj_states.length) { + _style = 'info'; + _state = ' 未知'; + } + + return '' + _state + '' + }; + render.make_check_box = function (row_id, fields) { return ''; }; @@ -276,8 +308,7 @@ $app.on_table_groups_render_created = function (render) { }; $app.on_table_groups_header_created = function (header) { - $app.dom.btn_table_groups_reset_filter = $('#' + header._table_ctrl.dom_id + ' a[data-reset-filter]'); - $app.dom.btn_table_groups_reset_filter.click(function () { + $('#' + header._table_ctrl.dom_id + ' a[data-reset-filter]').click(function () { CALLBACK_STACK.create() .add(header._table_ctrl.load_data) .add(header._table_ctrl.reset_filters) @@ -286,6 +317,7 @@ $app.on_table_groups_header_created = function (header) { // 表格内嵌过滤器的事件绑定在这时进行(也可以延期到整个表格创建完成时进行) header._table_ctrl.get_filter_ctrl('search_group').on_created(); + header._table_ctrl.get_filter_ctrl('state').on_created(); }; $app.get_selected_group = function (tbl) { @@ -300,6 +332,75 @@ $app.get_selected_group = function (tbl) { return groups; }; + +// $app.on_btn_lock_group_click = function (_row_id) { +// var group_list = []; +// +// if (_.isUndefined(_row_id)) { +// var groups = $app.get_selected_group($app.table_groups); +// if (groups.length === 0) { +// $tp.notify_error('请选择要禁用的分组!'); +// return; +// } +// +// $.each(groups, function (i, g) { +// group_list.push(g.id); +// }); +// } else { +// var _row_data = $app.table_groups.get_row(_row_id); +// group_list.push(_row_data.id); +// } +// +// $tp.ajax_post_json('/group/lock', {gtype: TP_GROUP_USER, glist: group_list}, +// function (ret) { +// if (ret.code === TPE_OK) { +// $app.table_groups.load_data(); +// $tp.notify_success('禁用分组操作成功!'); +// } else { +// $tp.notify_error('禁用分组操作失败:' + tp_error_msg(ret.code, ret.message)); +// } +// }, +// function () { +// $tp.notify_error('网络故障,禁用分组操作失败!'); +// } +// ); +// +// }; +// +// $app.on_btn_unlock_group_click = function (_row_id) { +// var group_list = []; +// +// if (_.isUndefined(_row_id)) { +// var groups = $app.get_selected_group($app.table_groups); +// if (groups.length === 0) { +// $tp.notify_error('请选择要解禁的分组!'); +// return; +// } +// +// $.each(groups, function (i, g) { +// group_list.push(g.id); +// }); +// } else { +// var _row_data = $app.table_groups.get_row(_row_id); +// group_list.push(_row_data.id); +// } +// +// $tp.ajax_post_json('/group/unlock', {gtype: TP_GROUP_USER, glist: group_list}, +// function (ret) { +// if (ret.code === TPE_OK) { +// $app.table_groups.load_data(); +// $tp.notify_success('分组解禁操作成功!'); +// } else { +// $tp.notify_error('分组解禁操作失败:' + tp_error_msg(ret.code, ret.message)); +// } +// }, +// function () { +// $tp.notify_error('网络故障,分组解禁操作失败!'); +// } +// ); +// +// }; +// $app.on_btn_remove_group_click = function (_row_id) { var group_list = []; diff --git a/server/www/teleport/static/js/user/user-list.js b/server/www/teleport/static/js/user/user-list.js index cb07439..91e73b7 100644 --- a/server/www/teleport/static/js/user/user-list.js +++ b/server/www/teleport/static/js/user/user-list.js @@ -21,7 +21,7 @@ $app.on_init = function (cb_stack) { }; cb_stack - // .add($app.test) + // .add($app.test) .add($app.create_controls) .add($app.load_role_list); @@ -41,7 +41,7 @@ $app.create_controls = function (cb_stack) { //------------------------------- // 用户列表表格 //------------------------------- - var table_user_list_options = { + var table_users_options = { dom_id: 'table-user-list', data_source: { type: 'ajax-post', @@ -98,34 +98,34 @@ $app.create_controls = function (cb_stack) { ], // 重载回调函数 - on_header_created: $app.on_table_user_list_header_created, - on_render_created: $app.on_table_user_list_render_created, - on_cell_created: $app.on_table_user_list_cell_created + on_header_created: $app.on_table_users_header_created, + on_render_created: $app.on_table_users_render_created, + on_cell_created: $app.on_table_users_cell_created }; - $app.table_user_list = $tp.create_table(table_user_list_options); + $app.table_users = $tp.create_table(table_users_options); cb_stack - .add($app.table_user_list.load_data) - .add($app.table_user_list.init); + .add($app.table_users.load_data) + .add($app.table_users.init); //------------------------------- // 用户列表相关过滤器 //------------------------------- - $tp.create_table_header_filter_search($app.table_user_list, { + $tp.create_table_header_filter_search($app.table_users, { name: 'search', place_holder: '搜索:用户账号/姓名/邮箱/描述/等等...' }); - $tp.create_table_filter_role($app.table_user_list, $app.role_list); - $tp.create_table_header_filter_state($app.table_user_list, 'state', $app.obj_states); + $tp.create_table_filter_role($app.table_users, $app.role_list); + $tp.create_table_header_filter_state($app.table_users, 'state', $app.obj_states); // 从cookie中读取用户分页限制的选择 - $tp.create_table_paging($app.table_user_list, 'table-user-list-paging', + $tp.create_table_paging($app.table_users, 'table-user-list-paging', { per_page: Cookies.get($app.page_id('user_user') + '_per_page'), on_per_page_changed: function (per_page) { Cookies.set($app.page_id('user_user') + '_per_page', per_page, {expires: 365}); } }); - $tp.create_table_pagination($app.table_user_list, 'table-user-list-pagination'); + $tp.create_table_pagination($app.table_users, 'table-user-list-pagination'); //------------------------------- // 对话框 @@ -144,7 +144,7 @@ $app.create_controls = function (cb_stack) { $app.dlg_edit_user.show_create(); }); $app.dom.btn_refresh_user_list.click(function () { - $app.table_user_list.load_data(); + $app.table_users.load_data(); }); $app.dom.btn_select_file.click($app.on_btn_select_file_click); $app.dom.btn_do_upload.click($app.on_btn_do_upload_click); @@ -155,7 +155,7 @@ $app.create_controls = function (cb_stack) { $app.dom.dlg_import_user.modal({backdrop: 'static'}); }); $app.dom.chkbox_user_list_select_all.click(function () { - var _objects = $('#' + $app.table_user_list.dom_id + ' tbody').find('[data-check-box]'); + var _objects = $('#' + $app.table_users.dom_id + ' tbody').find('[data-check-box]'); if ($(this).is(':checked')) { $.each(_objects, function (i, _obj) { $(_obj).prop('checked', true); @@ -185,7 +185,7 @@ $app.create_controls = function (cb_stack) { cb_stack.exec(); }; -$app.on_table_user_list_cell_created = function (tbl, row_id, col_key, cell_obj) { +$app.on_table_users_cell_created = function (tbl, row_id, col_key, cell_obj) { if (col_key === 'chkbox') { cell_obj.find('[data-check-box]').click(function () { $app.check_user_list_all_selected(); @@ -194,11 +194,18 @@ $app.on_table_user_list_cell_created = function (tbl, row_id, col_key, cell_obj) else if (col_key === 'action') { cell_obj.find('[data-action]').click(function () { - var cmd = $(this).attr('data-action'); - if (cmd === 'edit') { + var user = $app.table_users.get_row(row_id); + var action = $(this).attr('data-action'); + if (action === 'edit') { $app.dlg_edit_user.show_edit(row_id); - } else if (cmd === 'reset-password') { + } else if (action === 'reset-password') { $app.dlg_reset_password.show_edit(row_id); + } else if(action === 'lock') { + $app._lock_users([user.id]); + } else if(action === 'unlock') { + $app._unlock_users([user.id]); + } else if(action === 'remove') { + $app._remove_users([user.id]); } }); } @@ -206,7 +213,7 @@ $app.on_table_user_list_cell_created = function (tbl, row_id, col_key, cell_obj) $app.check_user_list_all_selected = function (cb_stack) { var _all_checked = true; - var _objs = $('#' + $app.table_user_list.dom_id + ' tbody').find('[data-check-box]'); + var _objs = $('#' + $app.table_users.dom_id + ' tbody').find('[data-check-box]'); if (_objs.length === 0) { _all_checked = false; } else { @@ -228,7 +235,7 @@ $app.check_user_list_all_selected = function (cb_stack) { cb_stack.exec(); }; -$app.on_table_user_list_render_created = function (render) { +$app.on_table_users_render_created = function (render) { render.filter_role = function (header, title, col) { var _ret = ['
']; _ret.push('
'); @@ -340,7 +347,7 @@ $app.on_table_user_list_render_created = function (render) { h.push(''); h.push('
  • 重置密码
  • '); h.push(''); - h.push('
  • 删除
  • '); + h.push('
  • 删除
  • '); h.push(''); h.push('
    '); @@ -348,7 +355,7 @@ $app.on_table_user_list_render_created = function (render) { }; }; -$app.on_table_user_list_header_created = function (header) { +$app.on_table_users_header_created = function (header) { $('#' + header._table_ctrl.dom_id + ' a[data-reset-filter]').click(function () { CALLBACK_STACK.create() .add(header._table_ctrl.load_data) @@ -358,11 +365,11 @@ $app.on_table_user_list_header_created = function (header) { // // TODO: 当过滤器不是默认值时,让“重置过滤器按钮”有呼吸效果,避免用户混淆 - 实验性质 // var t1 = function(){ - // $app.dom.btn_table_user_list_reset_filter.fadeTo(1000, 1.0, function(){ - // $app.dom.btn_table_user_list_reset_filter.fadeTo(1000, 0.2, t1); + // $app.dom.btn_table_users_reset_filter.fadeTo(1000, 1.0, function(){ + // $app.dom.btn_table_users_reset_filter.fadeTo(1000, 0.2, t1); // }); // }; - // $app.dom.btn_table_user_list_reset_filter.fadeTo(1000, 0.2, t1); + // $app.dom.btn_table_users_reset_filter.fadeTo(1000, 0.2, t1); // 表格内嵌过滤器的事件绑定在这时进行(也可以延期到整个表格创建完成时进行) header._table_ctrl.get_filter_ctrl('search').on_created(); @@ -454,7 +461,7 @@ $app.on_btn_do_upload_click = function () { .addClass('alert-success') .html(' 用户导入成功:' + ret.message); - $app.table_user_list.load_data(); + $app.table_users.load_data(); } else { var err_msg = [' 用户导入失败:' + ret.message]; if (!_.isUndefined(ret.data)) { @@ -466,7 +473,7 @@ $app.on_btn_do_upload_click = function () { err_msg.push(err_lines.join('
    ')); err_msg.push('
    '); - $app.table_user_list.load_data(); + $app.table_users.load_data(); } $app.dom.upload_file_message @@ -488,10 +495,10 @@ $app.show_user_info = function (row_id) { $app.get_selected_user = function () { var items = []; - var _objs = $('#' + $app.table_user_list.dom_id + ' tbody tr td input[data-check-box]'); + var _objs = $('#' + $app.table_users.dom_id + ' tbody tr td input[data-check-box]'); $.each(_objs, function (i, _obj) { if ($(_obj).is(':checked')) { - var _row_data = $app.table_user_list.get_row(_obj); + var _row_data = $app.table_users.get_row(_obj); items.push(_row_data.id); } }); @@ -507,7 +514,7 @@ $app.on_btn_set_role_click = function () { }; $app.set_selected_to_role = function (role_id, role_name) { - var users = $app.get_selected_user($app.table_user_list); + var users = $app.get_selected_user($app.table_users); if (users.length === 0) { return; } @@ -517,7 +524,7 @@ $app.set_selected_to_role = function (role_id, role_name) { function (ret) { if (ret.code === TPE_OK) { cb_stack.add($app.check_user_list_all_selected); - cb_stack.add($app.table_user_list.load_data); + cb_stack.add($app.table_users.load_data); $tp.notify_success('设置用户角色操作成功!'); } else { $tp.notify_error('设置用户角色操作失败:' + tp_error_msg(ret.code, ret.message)); @@ -540,25 +547,71 @@ $app.set_selected_to_role = function (role_id, role_name) { }; +$app._lock_users = function(users) { + $tp.ajax_post_json('/user/update-users', {action: 'lock', users: users}, + function (ret) { + if (ret.code === TPE_OK) { + CALLBACK_STACK.create() + .add($app.check_user_list_all_selected) + .add($app.table_users.load_data) + .exec(); + $tp.notify_success('禁用用户账号操作成功!'); + } else { + $tp.notify_error('禁用用户账号操作失败:' + tp_error_msg(ret.code, ret.message)); + } + }, + function () { + $tp.notify_error('网络故障,禁用用户账号操作失败!'); + } + ); +}; + $app.on_btn_lock_user_click = function () { -}; - -$app.on_btn_unlock_user_click = function () { -}; - -$app.on_btn_remove_user_click = function () { - var users = $app.get_selected_user($app.table_user_list); + var users = $app.get_selected_user($app.table_users); if (users.length === 0) { - $tp.notify_error('请选择要删除的用户!'); + $tp.notify_error('请选择要禁用的用户!'); return; } + $app._lock_hosts(users); +}; + +$app._unlock_users = function(users) { + $tp.ajax_post_json('/user/update-users', {action: 'unlock', users: users}, + function (ret) { + if (ret.code === TPE_OK) { + CALLBACK_STACK.create() + .add($app.check_user_list_all_selected) + .add($app.table_users.load_data) + .exec(); + $tp.notify_success('解禁用户账号操作成功!'); + } else { + $tp.notify_error('解禁用户账号操作失败:' + tp_error_msg(ret.code, ret.message)); + } + }, + function () { + $tp.notify_error('网络故障,解禁用户账号操作失败!'); + } + ); +}; + +$app.on_btn_unlock_user_click = function () { + var users = $app.get_selected_user($app.table_users); + if (users.length === 0) { + $tp.notify_error('请选择要解禁的用户!'); + return; + } + + $app._unlock_users(users); +}; + +$app._remove_users = function(users) { var _fn_sure = function (cb_stack, cb_args) { - $tp.ajax_post_json('/user/remove-user', {users: users}, + $tp.ajax_post_json('/user/update-users', {action: 'remove', users: users}, function (ret) { if (ret.code === TPE_OK) { cb_stack.add($app.check_user_list_all_selected); - cb_stack.add($app.table_user_list.load_data); + cb_stack.add($app.table_users.load_data); $tp.notify_success('删除用户账号操作成功!'); } else { $tp.notify_error('删除用户账号操作失败:' + tp_error_msg(ret.code, ret.message)); @@ -578,7 +631,16 @@ $app.on_btn_remove_user_click = function () { msg: '

    注意:删除操作不可恢复!!

    删除用户账号将同时将其从所在用户组中移除,并且删除所有分配给此用户的授权!

    如果您希望禁止某个用户登录本系统,可对其进行“禁用”操作!

    您确定要移除所有选定的 ' + users.length + '个 用户账号吗?

    ', fn_yes: _fn_sure }); +}; +$app.on_btn_remove_user_click = function () { + var users = $app.get_selected_user($app.table_users); + if (users.length === 0) { + $tp.notify_error('请选择要删除的用户!'); + return; + } + + $app._remove_users(users); }; $app.create_dlg_edit_user = function () { @@ -687,7 +749,7 @@ $app.create_dlg_edit_user = function () { }; dlg.show_edit = function (row_id) { - var user = $app.table_user_list.get_row(row_id); + var user = $app.table_users.get_row(row_id); console.log(user); dlg.init_fields(user); dlg.dom.dialog.modal({backdrop: 'static'}); @@ -750,7 +812,7 @@ $app.create_dlg_edit_user = function () { function (ret) { if (ret.code === TPE_OK) { $tp.notify_success('用户账号' + action + '成功!'); - $app.table_user_list.load_data(); + $app.table_users.load_data(); dlg.dom.dialog.modal('hide'); } else { $tp.notify_error('用户账号' + action + '失败:' + tp_error_msg(ret.code, ret.message)); @@ -798,7 +860,7 @@ $app.create_dlg_user_info = function () { dlg.row_id = row_id; dlg.need_edit = false; - var _row_data = $app.table_user_list.get_row(dlg.row_id); + var _row_data = $app.table_users.get_row(dlg.row_id); // 表格加载时,是不会读取用户的 desc 字段的,因此可以判断此用户是否已经读取过详细信息了 if (_.isUndefined(_row_data.desc)) { @@ -806,7 +868,7 @@ $app.create_dlg_user_info = function () { $tp.ajax_post_json('/user/get-user/' + _row_data.id, {}, function (ret) { if (ret.code === TPE_OK) { - $app.table_user_list.update_row(dlg.row_id, ret.data); + $app.table_users.update_row(dlg.row_id, ret.data); dlg.show_info(ret.data); } else { $tp.notify_error('无法获取用户详细信息:' + tp_error_msg(ret.code, ret.message)); @@ -919,7 +981,7 @@ $app.create_dlg_reset_password = function () { }; dlg.show_edit = function (row_id) { - var user = $app.table_user_list.get_row(row_id); + var user = $app.table_users.get_row(row_id); dlg.init_fields(user); dlg.dom.dialog.modal({backdrop: 'static'}); }; @@ -934,7 +996,7 @@ $app.create_dlg_reset_password = function () { function (ret) { if (ret.code === TPE_OK) { $tp.notify_success('用户密码重置成功!'); - // $app.table_user_list.load_data(); + // $app.table_users.load_data(); dlg.dom.dialog.modal('hide'); } else { $tp.notify_error('用户密码重置失败:' + tp_error_msg(ret.code, ret.message)); @@ -964,7 +1026,7 @@ $app.create_dlg_reset_password = function () { function (ret) { if (ret.code === TPE_OK) { $tp.notify_success('用户密码重置成功!'); - // $app.table_user_list.load_data(); + // $app.table_users.load_data(); dlg.dom.dialog.modal('hide'); } else { $tp.notify_error('用户密码重置失败:' + tp_error_msg(ret.code, ret.message)); diff --git a/server/www/teleport/view/asset/account-group-list.mako b/server/www/teleport/view/asset/account-group-list.mako index ad38c19..cef05a3 100644 --- a/server/www/teleport/view/asset/account-group-list.mako +++ b/server/www/teleport/view/asset/account-group-list.mako @@ -65,7 +65,10 @@
    - +## + + +
    diff --git a/server/www/teleport/view/user/user-group-list.mako b/server/www/teleport/view/user/user-group-list.mako index cee8979..fbbb963 100644 --- a/server/www/teleport/view/user/user-group-list.mako +++ b/server/www/teleport/view/user/user-group-list.mako @@ -61,7 +61,10 @@
    - +## +## +## +
    @@ -85,6 +88,7 @@

    说明:

    • 可以通过表格标题栏进行搜索或过滤,以便快速定位你需要的信息。标题栏左侧的 可以重置过滤器。
    • +
    • 禁用用户分组并不会影响组内成员用户登录teleport系统,但会影响运维授权策略。
    diff --git a/server/www/teleport/webroot/app/base/controller.py b/server/www/teleport/webroot/app/base/controller.py index 76f7b71..c56e7e0 100644 --- a/server/www/teleport/webroot/app/base/controller.py +++ b/server/www/teleport/webroot/app/base/controller.py @@ -108,15 +108,15 @@ class TPBaseHandler(tornado.web.RequestHandler): self._user = _user def set_session(self, name, value, expire=None): - k = '{}-{}'.format(self._s_id, name) + k = '{}-{}'.format(name, self._s_id) session_manager().set(k, value, expire) def get_session(self, name, _default=None): - k = '{}-{}'.format(self._s_id, name) + k = '{}-{}'.format(name, self._s_id) return session_manager().get(k, _default) def del_session(self, name): - k = '{}-{}'.format(self._s_id, name) + k = '{}-{}'.format(name, self._s_id) return session_manager().set(k, '', -1) def get_current_user(self): diff --git a/server/www/teleport/webroot/app/base/session.py b/server/www/teleport/webroot/app/base/session.py index 97668b7..de66470 100644 --- a/server/www/teleport/webroot/app/base/session.py +++ b/server/www/teleport/webroot/app/base/session.py @@ -88,6 +88,15 @@ class SessionManager(threading.Thread): else: return _default + def get_start_with(self, key_start): + with self._lock: + ret = {} + for k in self._session_dict: + if k.startswith(key_start): + ret[k] = self._session_dict[k] + + return ret + def taken(self, s_id, _default=None): # 从session中取走一个数据(读取并删除) with self._lock: diff --git a/server/www/teleport/webroot/app/controller/__init__.py b/server/www/teleport/webroot/app/controller/__init__.py index 085410b..1b87667 100644 --- a/server/www/teleport/webroot/app/controller/__init__.py +++ b/server/www/teleport/webroot/app/controller/__init__.py @@ -79,8 +79,8 @@ controllers = [ (r'/user/get-user/(.*)', user.DoGetUserInfoHandler), # - [json] 创建/更新用户 (r'/user/update-user', user.DoUpdateUserHandler), - # - [json] 删除用户 - (r'/user/remove-user', user.DoRemoveUserHandler), + # - [json] 禁用/解禁/删除用户 + (r'/user/update-users', user.DoUpdateUsersHandler), # - [json] 获取用户列表 (r'/user/get-users', user.DoGetUsersHandler), # - [json] 重置密码 diff --git a/server/www/teleport/webroot/app/controller/group.py b/server/www/teleport/webroot/app/controller/group.py index 519aa38..b24b0ec 100644 --- a/server/www/teleport/webroot/app/controller/group.py +++ b/server/www/teleport/webroot/app/controller/group.py @@ -48,7 +48,7 @@ class DoLockGroupHandler(TPBaseJsonHandler): except: return self.write_json(TPE_PARAM) - err = group.lock(self, gtype, glist) + err = group.update_groups_state(self, gtype, glist, TP_STATE_DISABLED) self.write_json(err) @@ -69,7 +69,7 @@ class DoUnlockGroupHandler(TPBaseJsonHandler): except: return self.write_json(TPE_PARAM) - err = group.unlock(self, gtype, glist) + err = group.update_groups_state(self, gtype, glist, TP_STATE_NORMAL) self.write_json(err) diff --git a/server/www/teleport/webroot/app/controller/user.py b/server/www/teleport/webroot/app/controller/user.py index 74be02a..ddf9774 100644 --- a/server/www/teleport/webroot/app/controller/user.py +++ b/server/www/teleport/webroot/app/controller/user.py @@ -7,7 +7,7 @@ import csv from app.const import * from app.base.configs import get_cfg -# from app.module import host +from app.base.session import session_manager from app.base import mail from app.model import user from app.model import group @@ -17,18 +17,6 @@ from app.base.logger import * from app.base.controller import TPBaseHandler, TPBaseJsonHandler -# , TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler - -# cfg = get_cfg() - - -# class IndexHandler(TPBaseHandler): -# def get(self): -# ret = self.check_privilege(TP_PRIVILEGE_USER_CREATE | TP_PRIVILEGE_USER_GROUP) -# if ret != TPE_OK: -# return -# self.render('user/index.mako') - class UserListHandler(TPBaseHandler): def get(self): ret = self.check_privilege(TP_PRIVILEGE_USER_CREATE) @@ -185,7 +173,7 @@ class DoImportHandler(TPBaseHandler): 每一行的数据格式: 用户账号,用户姓名,登录认证方式,email地址,Mobile,QQ,WeChat,所属组,描述 在导入时: 0. 以“#”作为行注释。 - 1. 用户账号和email地址是必须填写的,其他均为可选。 + 1. 用户账号是必须填写的,其他均为可选。 2. 一个用户属于多个组,可以用“|”将组分隔,如果某个组并不存在,则会创建这个组。 3. 空行跳过,数据格式不正确的跳过。 """ @@ -498,7 +486,7 @@ class DoResetPasswordHandler(TPBaseJsonHandler): self.write_json(TPE_PARAM) -class DoRemoveUserHandler(TPBaseJsonHandler): +class DoUpdateUsersHandler(TPBaseJsonHandler): def post(self): ret = self.check_privilege(TP_PRIVILEGE_USER_DELETE) if ret != TPE_OK: @@ -513,11 +501,29 @@ class DoRemoveUserHandler(TPBaseJsonHandler): return self.write_json(TPE_JSON_FORMAT) try: + action = args['action'] users = args['users'] except: return self.write_json(TPE_PARAM) - err = user.remove_users(self, users) + if action == 'lock': + err = user.update_users_state(self, users, TP_STATE_DISABLED) + elif action == 'unlock': + err = user.update_users_state(self, users, TP_STATE_NORMAL) + elif action == 'remove': + err = user.remove_users(self, users) + else: + err = TPE_PARAM + + if err != TPE_OK: + return self.write_json(err) + + if action == 'lock' or action == 'remove': + v = session_manager().get_start_with('user-') + for k in v: + if v[k]['v']['id'] in users: + session_manager().taken(k) + self.write_json(err) diff --git a/server/www/teleport/webroot/app/model/account.py b/server/www/teleport/webroot/app/model/account.py index 4449235..aff460b 100644 --- a/server/www/teleport/webroot/app/model/account.py +++ b/server/www/teleport/webroot/app/model/account.py @@ -38,7 +38,7 @@ def get_group_with_member(sql_filter, sql_order, sql_limit): """ # 首先获取要查询的组的信息 sg = SQL(get_db()) - sg.select_from('group', ['id', 'name', 'desc'], alt_name='g') + sg.select_from('group', ['id', 'name', 'state', 'desc'], alt_name='g') _where = list() _where.append('g.type={}'.format(TP_GROUP_ACCOUNT)) @@ -47,6 +47,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit): for k in sql_filter: if k == 'search': _where.append('(g.name LIKE "%{}%" OR g.desc LIKE "%{}%")'.format(sql_filter[k], sql_filter[k])) + elif k == 'state': + _where.append('(g.state={filter})'.format(filter=sql_filter[k])) if len(_where) > 0: sg.where('( {} )'.format(' AND '.join(_where))) @@ -55,6 +57,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit): _sort = False if not sql_order['asc'] else True if 'name' == sql_order['name']: sg.order_by('g.name', _sort) + elif 'state' == sql_order['name']: + sg.order_by('g.state', _sort) else: log.e('unknown order field.\n') return TPE_PARAM, sg.total_count, 0, sg.recorder @@ -266,6 +270,10 @@ def update_account_state(handler, host_id, acc_id, state): sql_list.append(sql) # sync to update the ops-audit table. + sql = 'UPDATE `{}ops_auz` SET state={state} WHERE rtype={rtype} AND rid={rid};' \ + ''.format(db.table_prefix, state=state, rtype=TP_ACCOUNT, rid=acc_id) + sql_list.append(sql) + sql = 'UPDATE `{}ops_map` SET a_state={state} WHERE a_id={acc_id};' \ ''.format(db.table_prefix, state=state, acc_id=acc_id) sql_list.append(sql) diff --git a/server/www/teleport/webroot/app/model/group.py b/server/www/teleport/webroot/app/model/group.py index a4c1bba..71d5747 100644 --- a/server/www/teleport/webroot/app/model/group.py +++ b/server/www/teleport/webroot/app/model/group.py @@ -39,40 +39,41 @@ def create(handler, gtype, name, desc): return TPE_OK, _id -def lock(handler, gtype, glist): +def update_groups_state(handler, gtype, glist, state): if gtype not in TP_GROUP_TYPES: return TPE_PARAM - group_list = [str(i) for i in glist] - - db = get_db() - - # 2. 更新记录 - sql = 'UPDATE `{dbtp}group` SET state={state} WHERE id IN ({gids});' \ - ''.format(dbtp=db.table_prefix, state=TP_STATE_DISABLED, gids=','.join(group_list)) - db_ret = db.exec(sql) - if not db_ret: - return TPE_DATABASE - - return TPE_OK - - -def unlock(handler, gtype, glist): - if gtype not in TP_GROUP_TYPES: + if gtype == TP_GROUP_USER: + gname = 'gu' + elif gtype == TP_GROUP_HOST: + gname = 'gh' + elif gtype == TP_GROUP_ACCOUNT: + gname = 'ga' + else: return TPE_PARAM - group_list = [str(i) for i in glist] + group_list = ','.join([str(i) for i in glist]) db = get_db() + sql_list = [] # 2. 更新记录 - sql = 'UPDATE `{dbtp}group` SET state={state} WHERE id IN ({gids});' \ - ''.format(dbtp=db.table_prefix, state=TP_STATE_NORMAL, gids=','.join(group_list)) - db_ret = db.exec(sql) - if not db_ret: - return TPE_DATABASE + sql = 'UPDATE `{}ops_auz` SET state={state} WHERE rtype={rtype} AND rid={rid};' \ + ''.format(db.table_prefix, state=state, rtype=gtype, rid=group_list) + sql_list.append(sql) - return TPE_OK + sql = 'UPDATE `{}ops_map` SET {gname}_state={state} WHERE {gname}_id IN ({gids});' \ + ''.format(db.table_prefix, state=state, gname=gname, gids=group_list) + sql_list.append(sql) + + sql = 'UPDATE `{dbtp}group` SET state={state} WHERE id IN ({gids});' \ + ''.format(dbtp=db.table_prefix, state=state, gids=group_list) + sql_list.append(sql) + + if db.transaction(sql_list): + return TPE_OK + else: + return TPE_DATABASE def remove(handler, gtype, glist): @@ -166,10 +167,30 @@ def add_members(gtype, gid, members): def remove_members(gtype, gid, members): db = get_db() - _where = 'WHERE (type={gtype} AND gid={gid} AND mid IN ({mid}))'.format(gtype=gtype, gid=gid, mid=','.join([str(uid) for uid in members])) + if gtype == TP_GROUP_USER: + name = 'u' + gname = 'gu' + elif gtype == TP_GROUP_HOST: + name = 'h' + gname = 'gh' + elif gtype == TP_GROUP_ACCOUNT: + name = 'a' + gname = 'ga' + else: + return TPE_PARAM + mids = ','.join([str(uid) for uid in members]) + + sql_list = [] + + _where = 'WHERE (type={gtype} AND gid={gid} AND mid IN ({mid}))'.format(gtype=gtype, gid=gid, mid=mids) sql = 'DELETE FROM `{dbtp}group_map` {where};'.format(dbtp=db.table_prefix, where=_where) - if db.exec(sql): + sql_list.append(sql) + + sql = 'DELETE FROM `{}ops_map` WHERE {gname}_id={gid} AND {name}_id IN ({ids});'.format(db.table_prefix, gname=gname, name=name, gid=gid, ids=mids) + sql_list.append(sql) + + if db.transaction(sql_list): return TPE_OK else: return TPE_DATABASE diff --git a/server/www/teleport/webroot/app/model/host.py b/server/www/teleport/webroot/app/model/host.py index 24444f6..44b0836 100644 --- a/server/www/teleport/webroot/app/model/host.py +++ b/server/www/teleport/webroot/app/model/host.py @@ -160,10 +160,10 @@ def remove_hosts(handler, hosts): # if not db.exec(sql): # return TPE_DATABASE - sql = 'DELETE FROM `{}ops_auz` WHERE rtype={rtype} AND rid IN({rid});'.format(db.table_prefix, rtype=TP_ACCOUNT, rid=','.join(acc_ids)) + sql = 'DELETE FROM `{}ops_auz` WHERE rtype={rtype} AND rid IN ({rid});'.format(db.table_prefix, rtype=TP_ACCOUNT, rid=','.join(acc_ids)) sql_list.append(sql) - sql = 'DELETE FROM `{}ops_map` WHERE a_id IN({});'.format(db.table_prefix, ','.join(acc_ids)) + sql = 'DELETE FROM `{}ops_map` WHERE a_id IN ({});'.format(db.table_prefix, ','.join(acc_ids)) sql_list.append(sql) # step 2. 处理主机 @@ -192,9 +192,9 @@ def remove_hosts(handler, hosts): sql = 'DELETE FROM `{}host` WHERE {};'.format(db.table_prefix, where) sql_list.append(sql) - sql = 'DELETE FROM `{}ops_auz` WHERE rtype={rtype} AND rid IN({rid});'.format(db.table_prefix, rtype=TP_HOST, rid=','.join(host_ids)) + sql = 'DELETE FROM `{}ops_auz` WHERE rtype={rtype} AND rid IN ({rid});'.format(db.table_prefix, rtype=TP_HOST, rid=','.join(host_ids)) sql_list.append(sql) - sql = 'DELETE FROM `{}ops_map` WHERE h_id IN({});'.format(db.table_prefix, ','.join(host_ids)) + sql = 'DELETE FROM `{}ops_map` WHERE h_id IN ({});'.format(db.table_prefix, ','.join(host_ids)) sql_list.append(sql) if not db.transaction(sql_list): @@ -252,7 +252,11 @@ def update_hosts_state(handler, host_ids, state): sql_list.append(sql) # sync to update the ops-audit table. - sql = 'UPDATE `{}ops_map` SET h_state={state} WHERE h_id IN({host_ids});' \ + sql = 'UPDATE `{}ops_auz` SET state={state} WHERE rtype={rtype} AND rid IN ({rid});' \ + ''.format(db.table_prefix, state=state, rtype=TP_ACCOUNT, rid=host_ids) + sql_list.append(sql) + + sql = 'UPDATE `{}ops_map` SET h_state={state} WHERE h_id IN ({host_ids});' \ ''.format(db.table_prefix, state=state, host_ids=host_ids) sql_list.append(sql) @@ -271,7 +275,7 @@ def update_hosts_state(handler, host_ids, state): # sql = 'UPDATE `{}host` SET state={state} WHERE id IN ({host_ids});' \ # ''.format(db.table_prefix, state=TP_STATE_NORMAL, host_ids=host_ids) # sql_list.append(sql) -# sql = 'UPDATE `{}ops_map` SET h_state={state} WHERE h_id IN({host_ids});' \ +# sql = 'UPDATE `{}ops_map` SET h_state={state} WHERE h_id IN ({host_ids});' \ # ''.format(db.table_prefix, state=TP_STATE_NORMAL, host_ids=host_ids) # sql_list.append(sql) # @@ -296,6 +300,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit): for k in sql_filter: if k == 'search': _where.append('(g.name LIKE "%{}%" OR g.desc LIKE "%{}%")'.format(sql_filter[k], sql_filter[k])) + elif k == 'state': + _where.append('(g.state={filter})'.format(filter=sql_filter[k])) if len(_where) > 0: sg.where('( {} )'.format(' AND '.join(_where))) @@ -304,6 +310,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit): _sort = False if not sql_order['asc'] else True if 'name' == sql_order['name']: sg.order_by('g.name', _sort) + elif 'state' == sql_order['name']: + sg.order_by('g.state', _sort) else: log.e('unknown order field.\n') return TPE_PARAM, sg.total_count, sg.recorder diff --git a/server/www/teleport/webroot/app/model/ops.py b/server/www/teleport/webroot/app/model/ops.py index b89cd61..43de6b0 100644 --- a/server/www/teleport/webroot/app/model/ops.py +++ b/server/www/teleport/webroot/app/model/ops.py @@ -155,7 +155,7 @@ def update_policies_state(handler, p_ids, state): sql = 'UPDATE `{}ops_auz` SET state={state} WHERE policy_id IN ({p_ids});'.format(db.table_prefix, state=state, p_ids=p_ids) sql_list.append(sql) - sql = 'UPDATE `{}ops_map` SET p_state={state} WHERE p_id IN({p_ids});'.format(db.table_prefix, state=state, p_ids=p_ids) + sql = 'UPDATE `{}ops_map` SET p_state={state} WHERE p_id IN ({p_ids});'.format(db.table_prefix, state=state, p_ids=p_ids) sql_list.append(sql) if db.transaction(sql_list): @@ -177,7 +177,7 @@ def remove_policies(handler, p_ids): sql = 'DELETE FROM `{}ops_auz` WHERE policy_id IN ({p_ids});'.format(db.table_prefix, p_ids=p_ids) sql_list.append(sql) - sql = 'DELETE FROM `{}ops_map` WHERE p_id IN({p_ids});'.format(db.table_prefix, p_ids=p_ids) + sql = 'DELETE FROM `{}ops_map` WHERE p_id IN ({p_ids});'.format(db.table_prefix, p_ids=p_ids) sql_list.append(sql) if db.transaction(sql_list): diff --git a/server/www/teleport/webroot/app/model/user.py b/server/www/teleport/webroot/app/model/user.py index b5c1452..b5c13e0 100644 --- a/server/www/teleport/webroot/app/model/user.py +++ b/server/www/teleport/webroot/app/model/user.py @@ -260,6 +260,31 @@ def update_login_info(handler, user_id): db_ret = db.exec(sql) +def update_users_state(handler, user_ids, state): + db = get_db() + + user_ids = ','.join([str(i) for i in user_ids]) + + sql_list = [] + + sql = 'UPDATE `{}user` SET state={state} WHERE id IN ({ids});' \ + ''.format(db.table_prefix, state=state, ids=user_ids) + sql_list.append(sql) + + sql = 'UPDATE `{}ops_auz` SET state={state} WHERE rtype={rtype} AND rid IN ({rid});' \ + ''.format(db.table_prefix, state=state, rtype=TP_USER, rid=user_ids) + sql_list.append(sql) + + sql = 'UPDATE `{}ops_map` SET u_state={state} WHERE u_id IN ({ids});' \ + ''.format(db.table_prefix, state=state, ids=user_ids) + sql_list.append(sql) + + if db.transaction(sql_list): + return TPE_OK + else: + return TPE_DATABASE + + def remove_users(handler, users): s = SQL(get_db()) @@ -527,7 +552,7 @@ def get_group_with_member(sql_filter, sql_order, sql_limit): """ # 首先获取要查询的组的信息 sg = SQL(get_db()) - sg.select_from('group', ['id', 'name', 'desc'], alt_name='g') + sg.select_from('group', ['id', 'state', 'name', 'desc'], alt_name='g') _where = list() _where.append('g.type={}'.format(TP_GROUP_USER)) @@ -536,6 +561,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit): for k in sql_filter: if k == 'search': _where.append('(g.name LIKE "%{filter}%" OR g.desc LIKE "%{filter}%")'.format(filter=sql_filter[k])) + elif k == 'state': + _where.append('(g.state={filter})'.format(filter=sql_filter[k])) if len(_where) > 0: sg.where('( {} )'.format(' AND '.join(_where))) @@ -544,6 +571,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit): _sort = False if not sql_order['asc'] else True if 'name' == sql_order['name']: sg.order_by('g.name', _sort) + elif 'state' == sql_order['name']: + sg.order_by('g.state', _sort) else: log.e('unknown order field.\n') return TPE_PARAM, sg.total_count, sg.recorder