实现了主机组、账号组的禁用/解禁对运维授权策略的影响。实现了用户组中删除用户对运维策略的影响。

pull/105/head
Apex Liu 2017-11-01 18:31:28 +08:00
parent 6d284776f1
commit 6fb4055ead
17 changed files with 526 additions and 169 deletions

View File

@ -7,8 +7,8 @@ $app.on_init = function (cb_stack) {
chkbox_groups_select_all: $('#table-groups-select-all'), chkbox_groups_select_all: $('#table-groups-select-all'),
// btn_edit_user: $('#btn-edit-user'), // btn_edit_user: $('#btn-edit-user'),
// btn_lock_user: $('#btn-lock-user'), btn_lock_group: $('#btn-lock-group'),
// btn_unlock_user: $('#btn-unlock-user'), btn_unlock_group: $('#btn-unlock-group'),
btn_remove_group: $('#btn-remove-group'), btn_remove_group: $('#btn-remove-group'),
chkbox_user_list_select_all: $('#table-user-list-select-all') chkbox_user_list_select_all: $('#table-user-list-select-all')
@ -75,6 +75,16 @@ $app.create_controls = function (cb_stack) {
render: 'members', render: 'members',
fields: {id: 'id', member_count: 'member_count', members: '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: '操作', title: '操作',
key: 'actions', key: 'actions',
@ -83,16 +93,6 @@ $app.create_controls = function (cb_stack) {
render: 'make_action_btn', render: 'make_action_btn',
fields: {id: 'id'} 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', name: 'search_group',
place_holder: '搜索:账号组名称/描述' place_holder: '搜索:账号组名称/描述'
}); });
// $app.table_groups_role_filter = $tp.create_table_filter_role($app.table_groups, $app.role_list); $tp.create_table_header_filter_state($app.table_groups, 'state', $app.obj_states, [TP_STATE_LOCKED]);
// $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');
$app.table_groups_paging = $tp.create_table_paging($app.table_groups, 'table-groups-paging', $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) { on_per_page_changed: function (per_page) {
Cookies.set($app.page_id('acc_group_list') + '_per_page', per_page, {expires: 365}); 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_lock_group.click(function(){
// $app.dom.btn_unlock_user.click($app.on_btn_unlock_user_click); $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.dom.btn_remove_group.click(function(){
$app.on_btn_remove_group_click(); $app.on_btn_remove_group_click();
}); });
@ -214,6 +216,20 @@ $app.on_table_groups_render_created = function (render) {
return _ret.join(''); return _ret.join('');
}; };
render.filter_state = function (header, title, col) {
var _ret = ['<div class="tp-table-filter tp-table-filter-' + col.cell_align + '">'];
_ret.push('<div class="tp-table-filter-inner">');
_ret.push('<div class="search-title">' + title + '</div>');
// 表格内嵌过滤器的DOM实体在这时生成
var filter_ctrl = header._table_ctrl.get_filter_ctrl('state');
_ret.push(filter_ctrl.render());
_ret.push('</div></div>');
return _ret.join('');
};
render.make_check_box = function (row_id, fields) { render.make_check_box = function (row_id, fields) {
return '<span><input type="checkbox" data-check-box="' + fields.id + '" data-row-id="' + row_id + '"></span>'; return '<span><input type="checkbox" data-check-box="' + fields.id + '" data-row-id="' + row_id + '"></span>';
}; };
@ -255,6 +271,24 @@ $app.on_table_groups_render_created = function (render) {
return '' + fields.member_count; 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 = '<i class="fa fa-question-circle"></i> 未知';
}
return '<span class="label label-sm label-' + _style + '">' + _state + '</span>'
};
render.make_action_btn = function (row_id, fields) { render.make_action_btn = function (row_id, fields) {
var ret = []; var ret = [];
ret.push('<div class="btn-group btn-group-sm" role="group">'); ret.push('<div class="btn-group btn-group-sm" role="group">');
@ -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('search_group').on_created();
header._table_ctrl.get_filter_ctrl('state').on_created();
}; };
$app.get_selected_group = function (tbl) { $app.get_selected_group = function (tbl) {
@ -290,13 +325,82 @@ $app.get_selected_group = function (tbl) {
return groups; 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) { $app.on_btn_remove_group_click = function (_row_id) {
var group_list = []; var group_list = [];
if (_.isUndefined(_row_id)) { if (_.isUndefined(_row_id)) {
var groups = $app.get_selected_group($app.table_groups); var groups = $app.get_selected_group($app.table_groups);
if (groups.length === 0) { if (groups.length === 0) {
$tp.notify_error('请选择要删除的用户组!'); $tp.notify_error('请选择要删除的组!');
return; return;
} }

View File

@ -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.dom.btn_lock_group.click(function () {
$app.on_btn_lock_group_click(); $app.on_btn_lock_group_click();
}); });
@ -433,7 +433,7 @@ $app.on_btn_remove_group_click = function (_row_id) {
if (group_list.length > 1) if (group_list.length > 1)
_msg_remove = '您确定要移除选定的 <strong>' + group_list.length + '个</strong> 分组吗?'; _msg_remove = '您确定要移除选定的 <strong>' + group_list.length + '个</strong> 分组吗?';
$tp.dlg_confirm(cb_stack, { $tp.dlg_confirm(cb_stack, {
msg: '<div class="alert alert-danger"><p><strong>注意:删除操作不可恢复!!</strong></p><p>删除分组将同时删除所有分配给此分组成员的授权!</p></div><div class="alert alert-info">删除分组不会删除组内的成员账号</div><p>' + _msg_remove + '</p>', msg: '<div class="alert alert-danger"><p><strong>注意:删除操作不可恢复!!</strong></p><p>删除分组将同时删除所有分配给此分组成员的授权!</p></div><div class="alert alert-info">删除分组不会删除组内的成员主机</div><p>' + _msg_remove + '</p>',
fn_yes: _fn_sure fn_yes: _fn_sure
}); });

View File

@ -1645,6 +1645,8 @@ $tp.create_table_header_filter_state = function (tbl, name, states, exclude_ids)
_tblf.get_filter = function () { _tblf.get_filter = function () {
var ret = {}; var ret = {};
if(_tblf.default_value === _tblf.filter_value)
return ret;
ret[_tblf.name] = _tblf.filter_value; ret[_tblf.name] = _tblf.filter_value;
return ret; return ret;
}; };

View File

@ -6,9 +6,8 @@ $app.on_init = function (cb_stack) {
btn_create_group: $('#btn-create-group'), btn_create_group: $('#btn-create-group'),
chkbox_groups_select_all: $('#table-groups-select-all'), chkbox_groups_select_all: $('#table-groups-select-all'),
// btn_edit_user: $('#btn-edit-user'), // btn_lock_group: $('#btn-lock-group'),
// btn_lock_user: $('#btn-lock-user'), // btn_unlock_group: $('#btn-unlock-group'),
// btn_unlock_user: $('#btn-unlock-user'),
btn_remove_group: $('#btn-remove-group'), btn_remove_group: $('#btn-remove-group'),
chkbox_user_list_select_all: $('#table-user-list-select-all') chkbox_user_list_select_all: $('#table-user-list-select-all')
@ -75,6 +74,16 @@ $app.create_controls = function (cb_stack) {
render: 'members', render: 'members',
fields: {id: 'id', member_count: 'member_count', members: '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: '操作', title: '操作',
key: 'actions', key: 'actions',
@ -83,16 +92,6 @@ $app.create_controls = function (cb_stack) {
render: 'make_action_btn', render: 'make_action_btn',
fields: {id: 'id'} 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', name: 'search_group',
place_holder: '搜索:用户组名称/描述' place_holder: '搜索:用户组名称/描述'
}); });
// $app.table_groups_role_filter = $tp.create_table_filter_role($app.table_groups, $app.role_list); $tp.create_table_header_filter_state($app.table_groups, 'state', $app.obj_states, [TP_STATE_LOCKED]);
// $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');
$app.table_groups_paging = $tp.create_table_paging($app.table_groups, 'table-groups-paging', $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) { on_per_page_changed: function (per_page) {
Cookies.set($app.page_id('user_group') + '_per_page', per_page, {expires: 365}); 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_lock_group.click(function () {
// $app.dom.btn_unlock_user.click($app.on_btn_unlock_user_click); // $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.dom.btn_remove_group.click(function(){
$app.on_btn_remove_group_click(); $app.on_btn_remove_group_click();
}); });
@ -200,19 +200,19 @@ $app.check_groups_all_selected = function () {
}; };
$app.on_table_groups_render_created = function (render) { $app.on_table_groups_render_created = function (render) {
render.filter_role = function (header, title, col) { // render.filter_role = function (header, title, col) {
var _ret = ['<div class="tp-table-filter tp-table-filter-' + col.cell_align + '">']; // var _ret = ['<div class="tp-table-filter tp-table-filter-' + col.cell_align + '">'];
_ret.push('<div class="tp-table-filter-inner">'); // _ret.push('<div class="tp-table-filter-inner">');
_ret.push('<div class="search-title">' + title + '</div>'); // _ret.push('<div class="search-title">' + title + '</div>');
//
// 表格内嵌过滤器的DOM实体在这时生成 // // 表格内嵌过滤器的DOM实体在这时生成
var filter_ctrl = header._table_ctrl.get_filter_ctrl('role'); // var filter_ctrl = header._table_ctrl.get_filter_ctrl('role');
_ret.push(filter_ctrl.render()); // _ret.push(filter_ctrl.render());
//
_ret.push('</div></div>'); // _ret.push('</div></div>');
//
return _ret.join(''); // return _ret.join('');
}; // };
render.filter_group_search = function (header, title, col) { render.filter_group_search = function (header, title, col) {
var _ret = ['<div class="tp-table-filter tp-table-filter-input">']; var _ret = ['<div class="tp-table-filter tp-table-filter-input">'];
@ -228,6 +228,38 @@ $app.on_table_groups_render_created = function (render) {
return _ret.join(''); return _ret.join('');
}; };
render.filter_state = function (header, title, col) {
var _ret = ['<div class="tp-table-filter tp-table-filter-' + col.cell_align + '">'];
_ret.push('<div class="tp-table-filter-inner">');
_ret.push('<div class="search-title">' + title + '</div>');
// 表格内嵌过滤器的DOM实体在这时生成
var filter_ctrl = header._table_ctrl.get_filter_ctrl('state');
_ret.push(filter_ctrl.render());
_ret.push('</div></div>');
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 = '<i class="fa fa-question-circle"></i> 未知';
}
return '<span class="label label-sm label-' + _style + '">' + _state + '</span>'
};
render.make_check_box = function (row_id, fields) { render.make_check_box = function (row_id, fields) {
return '<span><input type="checkbox" data-check-box="' + fields.id + '" data-row-id="' + row_id + '"></span>'; return '<span><input type="checkbox" data-check-box="' + fields.id + '" data-row-id="' + row_id + '"></span>';
}; };
@ -276,8 +308,7 @@ $app.on_table_groups_render_created = function (render) {
}; };
$app.on_table_groups_header_created = function (header) { $app.on_table_groups_header_created = function (header) {
$app.dom.btn_table_groups_reset_filter = $('#' + header._table_ctrl.dom_id + ' a[data-reset-filter]'); $('#' + header._table_ctrl.dom_id + ' a[data-reset-filter]').click(function () {
$app.dom.btn_table_groups_reset_filter.click(function () {
CALLBACK_STACK.create() CALLBACK_STACK.create()
.add(header._table_ctrl.load_data) .add(header._table_ctrl.load_data)
.add(header._table_ctrl.reset_filters) .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('search_group').on_created();
header._table_ctrl.get_filter_ctrl('state').on_created();
}; };
$app.get_selected_group = function (tbl) { $app.get_selected_group = function (tbl) {
@ -300,6 +332,75 @@ $app.get_selected_group = function (tbl) {
return groups; 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) { $app.on_btn_remove_group_click = function (_row_id) {
var group_list = []; var group_list = [];

View File

@ -21,7 +21,7 @@ $app.on_init = function (cb_stack) {
}; };
cb_stack cb_stack
// .add($app.test) // .add($app.test)
.add($app.create_controls) .add($app.create_controls)
.add($app.load_role_list); .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', dom_id: 'table-user-list',
data_source: { data_source: {
type: 'ajax-post', type: 'ajax-post',
@ -98,34 +98,34 @@ $app.create_controls = function (cb_stack) {
], ],
// 重载回调函数 // 重载回调函数
on_header_created: $app.on_table_user_list_header_created, on_header_created: $app.on_table_users_header_created,
on_render_created: $app.on_table_user_list_render_created, on_render_created: $app.on_table_users_render_created,
on_cell_created: $app.on_table_user_list_cell_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 cb_stack
.add($app.table_user_list.load_data) .add($app.table_users.load_data)
.add($app.table_user_list.init); .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', name: 'search',
place_holder: '搜索:用户账号/姓名/邮箱/描述/等等...' place_holder: '搜索:用户账号/姓名/邮箱/描述/等等...'
}); });
$tp.create_table_filter_role($app.table_user_list, $app.role_list); $tp.create_table_filter_role($app.table_users, $app.role_list);
$tp.create_table_header_filter_state($app.table_user_list, 'state', $app.obj_states); $tp.create_table_header_filter_state($app.table_users, 'state', $app.obj_states);
// 从cookie中读取用户分页限制的选择 // 从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'), per_page: Cookies.get($app.page_id('user_user') + '_per_page'),
on_per_page_changed: function (per_page) { on_per_page_changed: function (per_page) {
Cookies.set($app.page_id('user_user') + '_per_page', per_page, {expires: 365}); 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.dlg_edit_user.show_create();
}); });
$app.dom.btn_refresh_user_list.click(function () { $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_select_file.click($app.on_btn_select_file_click);
$app.dom.btn_do_upload.click($app.on_btn_do_upload_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.dlg_import_user.modal({backdrop: 'static'});
}); });
$app.dom.chkbox_user_list_select_all.click(function () { $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')) { if ($(this).is(':checked')) {
$.each(_objects, function (i, _obj) { $.each(_objects, function (i, _obj) {
$(_obj).prop('checked', true); $(_obj).prop('checked', true);
@ -185,7 +185,7 @@ $app.create_controls = function (cb_stack) {
cb_stack.exec(); 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') { if (col_key === 'chkbox') {
cell_obj.find('[data-check-box]').click(function () { cell_obj.find('[data-check-box]').click(function () {
$app.check_user_list_all_selected(); $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') { else if (col_key === 'action') {
cell_obj.find('[data-action]').click(function () { cell_obj.find('[data-action]').click(function () {
var cmd = $(this).attr('data-action'); var user = $app.table_users.get_row(row_id);
if (cmd === 'edit') { var action = $(this).attr('data-action');
if (action === 'edit') {
$app.dlg_edit_user.show_edit(row_id); $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); $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) { $app.check_user_list_all_selected = function (cb_stack) {
var _all_checked = true; 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) { if (_objs.length === 0) {
_all_checked = false; _all_checked = false;
} else { } else {
@ -228,7 +235,7 @@ $app.check_user_list_all_selected = function (cb_stack) {
cb_stack.exec(); 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) { render.filter_role = function (header, title, col) {
var _ret = ['<div class="tp-table-filter tp-table-filter-' + col.cell_align + '">']; var _ret = ['<div class="tp-table-filter tp-table-filter-' + col.cell_align + '">'];
_ret.push('<div class="tp-table-filter-inner">'); _ret.push('<div class="tp-table-filter-inner">');
@ -340,7 +347,7 @@ $app.on_table_user_list_render_created = function (render) {
h.push('<li role="separator" class="divider"></li>'); h.push('<li role="separator" class="divider"></li>');
h.push('<li><a href="javascript:;" data-action="reset-password"><i class="fa fa-street-view fa-fw"></i> 重置密码</a></li>'); h.push('<li><a href="javascript:;" data-action="reset-password"><i class="fa fa-street-view fa-fw"></i> 重置密码</a></li>');
h.push('<li role="separator" class="divider"></li>'); h.push('<li role="separator" class="divider"></li>');
h.push('<li><a href="javascript:;" data-action="delete"><i class="fa fa-times-circle fa-fw"></i> 删除</a></li>'); h.push('<li><a href="javascript:;" data-action="remove"><i class="fa fa-times-circle fa-fw"></i> 删除</a></li>');
h.push('</ul>'); h.push('</ul>');
h.push('</div>'); h.push('</div>');
@ -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 () { $('#' + header._table_ctrl.dom_id + ' a[data-reset-filter]').click(function () {
CALLBACK_STACK.create() CALLBACK_STACK.create()
.add(header._table_ctrl.load_data) .add(header._table_ctrl.load_data)
@ -358,11 +365,11 @@ $app.on_table_user_list_header_created = function (header) {
// // TODO: 当过滤器不是默认值时,让“重置过滤器按钮”有呼吸效果,避免用户混淆 - 实验性质 // // TODO: 当过滤器不是默认值时,让“重置过滤器按钮”有呼吸效果,避免用户混淆 - 实验性质
// var t1 = function(){ // var t1 = function(){
// $app.dom.btn_table_user_list_reset_filter.fadeTo(1000, 1.0, function(){ // $app.dom.btn_table_users_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, 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(); header._table_ctrl.get_filter_ctrl('search').on_created();
@ -454,7 +461,7 @@ $app.on_btn_do_upload_click = function () {
.addClass('alert-success') .addClass('alert-success')
.html('<i class="fa fa-check-square-o fa-fw"></i> 用户导入成功:' + ret.message); .html('<i class="fa fa-check-square-o fa-fw"></i> 用户导入成功:' + ret.message);
$app.table_user_list.load_data(); $app.table_users.load_data();
} else { } else {
var err_msg = ['<i class="fa fa-times-circle-o fa-fw"></i> 用户导入失败:' + ret.message]; var err_msg = ['<i class="fa fa-times-circle-o fa-fw"></i> 用户导入失败:' + ret.message];
if (!_.isUndefined(ret.data)) { if (!_.isUndefined(ret.data)) {
@ -466,7 +473,7 @@ $app.on_btn_do_upload_click = function () {
err_msg.push(err_lines.join('<br/>')); err_msg.push(err_lines.join('<br/>'));
err_msg.push('</div>'); err_msg.push('</div>');
$app.table_user_list.load_data(); $app.table_users.load_data();
} }
$app.dom.upload_file_message $app.dom.upload_file_message
@ -488,10 +495,10 @@ $app.show_user_info = function (row_id) {
$app.get_selected_user = function () { $app.get_selected_user = function () {
var items = []; 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) { $.each(_objs, function (i, _obj) {
if ($(_obj).is(':checked')) { 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); 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) { $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) { if (users.length === 0) {
return; return;
} }
@ -517,7 +524,7 @@ $app.set_selected_to_role = function (role_id, role_name) {
function (ret) { function (ret) {
if (ret.code === TPE_OK) { if (ret.code === TPE_OK) {
cb_stack.add($app.check_user_list_all_selected); 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('设置用户角色操作成功!'); $tp.notify_success('设置用户角色操作成功!');
} else { } else {
$tp.notify_error('设置用户角色操作失败:' + tp_error_msg(ret.code, ret.message)); $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_lock_user_click = function () {
}; var users = $app.get_selected_user($app.table_users);
$app.on_btn_unlock_user_click = function () {
};
$app.on_btn_remove_user_click = function () {
var users = $app.get_selected_user($app.table_user_list);
if (users.length === 0) { if (users.length === 0) {
$tp.notify_error('请选择要删除的用户!'); $tp.notify_error('请选择要禁用的用户!');
return; 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) { 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) { function (ret) {
if (ret.code === TPE_OK) { if (ret.code === TPE_OK) {
cb_stack.add($app.check_user_list_all_selected); 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('删除用户账号操作成功!'); $tp.notify_success('删除用户账号操作成功!');
} else { } else {
$tp.notify_error('删除用户账号操作失败:' + tp_error_msg(ret.code, ret.message)); $tp.notify_error('删除用户账号操作失败:' + tp_error_msg(ret.code, ret.message));
@ -578,7 +631,16 @@ $app.on_btn_remove_user_click = function () {
msg: '<div class="alert alert-danger"><p><strong>注意:删除操作不可恢复!!</strong></p><p>删除用户账号将同时将其从所在用户组中移除,并且删除所有分配给此用户的授权!</p></div><p>如果您希望禁止某个用户登录本系统,可对其进行“禁用”操作!</p><p>您确定要移除所有选定的 <strong>' + users.length + '个</strong> 用户账号吗?</p>', msg: '<div class="alert alert-danger"><p><strong>注意:删除操作不可恢复!!</strong></p><p>删除用户账号将同时将其从所在用户组中移除,并且删除所有分配给此用户的授权!</p></div><p>如果您希望禁止某个用户登录本系统,可对其进行“禁用”操作!</p><p>您确定要移除所有选定的 <strong>' + users.length + '个</strong> 用户账号吗?</p>',
fn_yes: _fn_sure 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 () { $app.create_dlg_edit_user = function () {
@ -687,7 +749,7 @@ $app.create_dlg_edit_user = function () {
}; };
dlg.show_edit = function (row_id) { 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); console.log(user);
dlg.init_fields(user); dlg.init_fields(user);
dlg.dom.dialog.modal({backdrop: 'static'}); dlg.dom.dialog.modal({backdrop: 'static'});
@ -750,7 +812,7 @@ $app.create_dlg_edit_user = function () {
function (ret) { function (ret) {
if (ret.code === TPE_OK) { if (ret.code === TPE_OK) {
$tp.notify_success('用户账号' + action + '成功!'); $tp.notify_success('用户账号' + action + '成功!');
$app.table_user_list.load_data(); $app.table_users.load_data();
dlg.dom.dialog.modal('hide'); dlg.dom.dialog.modal('hide');
} else { } else {
$tp.notify_error('用户账号' + action + '失败:' + tp_error_msg(ret.code, ret.message)); $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.row_id = row_id;
dlg.need_edit = false; 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 字段的,因此可以判断此用户是否已经读取过详细信息了 // 表格加载时,是不会读取用户的 desc 字段的,因此可以判断此用户是否已经读取过详细信息了
if (_.isUndefined(_row_data.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, {}, $tp.ajax_post_json('/user/get-user/' + _row_data.id, {},
function (ret) { function (ret) {
if (ret.code === TPE_OK) { 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); dlg.show_info(ret.data);
} else { } else {
$tp.notify_error('无法获取用户详细信息:' + tp_error_msg(ret.code, ret.message)); $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) { 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.init_fields(user);
dlg.dom.dialog.modal({backdrop: 'static'}); dlg.dom.dialog.modal({backdrop: 'static'});
}; };
@ -934,7 +996,7 @@ $app.create_dlg_reset_password = function () {
function (ret) { function (ret) {
if (ret.code === TPE_OK) { if (ret.code === TPE_OK) {
$tp.notify_success('用户密码重置成功!'); $tp.notify_success('用户密码重置成功!');
// $app.table_user_list.load_data(); // $app.table_users.load_data();
dlg.dom.dialog.modal('hide'); dlg.dom.dialog.modal('hide');
} else { } else {
$tp.notify_error('用户密码重置失败:' + tp_error_msg(ret.code, ret.message)); $tp.notify_error('用户密码重置失败:' + tp_error_msg(ret.code, ret.message));
@ -964,7 +1026,7 @@ $app.create_dlg_reset_password = function () {
function (ret) { function (ret) {
if (ret.code === TPE_OK) { if (ret.code === TPE_OK) {
$tp.notify_success('用户密码重置成功!'); $tp.notify_success('用户密码重置成功!');
// $app.table_user_list.load_data(); // $app.table_users.load_data();
dlg.dom.dialog.modal('hide'); dlg.dom.dialog.modal('hide');
} else { } else {
$tp.notify_error('用户密码重置失败:' + tp_error_msg(ret.code, ret.message)); $tp.notify_error('用户密码重置失败:' + tp_error_msg(ret.code, ret.message));

View File

@ -65,7 +65,10 @@
<div class="table-extend-cell checkbox-select-all"><input id="table-groups-select-all" type="checkbox"/></div> <div class="table-extend-cell checkbox-select-all"><input id="table-groups-select-all" type="checkbox"/></div>
<div class="table-extend-cell group-actions"> <div class="table-extend-cell group-actions">
<div class="btn-group" role="group"> <div class="btn-group" role="group">
<button id="btn-remove-group" type="button" class="btn btn-danger"><i class="fa fa-times-circle fa-fw"></i> 批量删除</button> ## <button id="btn-remove-group" type="button" class="btn btn-danger"><i class="fa fa-times-circle fa-fw"></i> 批量删除</button>
<button id="btn-lock-group" type="button" class="btn btn-default"><i class="fa fa-lock fa-fw"></i> 禁用</button>
<button id="btn-unlock-group" type="button" class="btn btn-default"><i class="fa fa-unlock fa-fw"></i> 解禁</button>
<button id="btn-remove-group" type="button" class="btn btn-default"><i class="fa fa-times-circle fa-fw"></i> 删除</button>
</div> </div>
</div> </div>
<div class="table-extend-cell table-item-counter"> <div class="table-extend-cell table-item-counter">

View File

@ -61,7 +61,10 @@
<div class="table-extend-cell checkbox-select-all"><input id="table-groups-select-all" type="checkbox"/></div> <div class="table-extend-cell checkbox-select-all"><input id="table-groups-select-all" type="checkbox"/></div>
<div class="table-extend-cell group-actions"> <div class="table-extend-cell group-actions">
<div class="btn-group" role="group"> <div class="btn-group" role="group">
<button id="btn-remove-group" type="button" class="btn btn-danger"><i class="fa fa-times-circle fa-fw"></i> 批量删除</button> ## <button id="btn-remove-group" type="button" class="btn btn-danger"><i class="fa fa-times-circle fa-fw"></i> 批量删除</button>
## <button id="btn-lock-group" type="button" class="btn btn-default"><i class="fa fa-lock fa-fw"></i> 禁用</button>
## <button id="btn-unlock-group" type="button" class="btn btn-default"><i class="fa fa-unlock fa-fw"></i> 解禁</button>
<button id="btn-remove-group" type="button" class="btn btn-default"><i class="fa fa-times-circle fa-fw"></i> 删除</button>
</div> </div>
</div> </div>
<div class="table-extend-cell table-item-counter"> <div class="table-extend-cell table-item-counter">
@ -85,6 +88,7 @@
<p>说明:</p> <p>说明:</p>
<ul class="help-list"> <ul class="help-list">
<li>可以通过表格标题栏进行搜索或过滤,以便快速定位你需要的信息。标题栏左侧的 <i class="fa fa-rotate-left fa-fw"></i> 可以重置过滤器。</li> <li>可以通过表格标题栏进行搜索或过滤,以便快速定位你需要的信息。标题栏左侧的 <i class="fa fa-rotate-left fa-fw"></i> 可以重置过滤器。</li>
<li>禁用用户分组并不会影响组内成员用户登录teleport系统但会影响运维授权策略。</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -108,15 +108,15 @@ class TPBaseHandler(tornado.web.RequestHandler):
self._user = _user self._user = _user
def set_session(self, name, value, expire=None): 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) session_manager().set(k, value, expire)
def get_session(self, name, _default=None): 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) return session_manager().get(k, _default)
def del_session(self, name): def del_session(self, name):
k = '{}-{}'.format(self._s_id, name) k = '{}-{}'.format(name, self._s_id)
return session_manager().set(k, '', -1) return session_manager().set(k, '', -1)
def get_current_user(self): def get_current_user(self):

View File

@ -88,6 +88,15 @@ class SessionManager(threading.Thread):
else: else:
return _default 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): def taken(self, s_id, _default=None):
# 从session中取走一个数据读取并删除 # 从session中取走一个数据读取并删除
with self._lock: with self._lock:

View File

@ -79,8 +79,8 @@ controllers = [
(r'/user/get-user/(.*)', user.DoGetUserInfoHandler), (r'/user/get-user/(.*)', user.DoGetUserInfoHandler),
# - [json] 创建/更新用户 # - [json] 创建/更新用户
(r'/user/update-user', user.DoUpdateUserHandler), (r'/user/update-user', user.DoUpdateUserHandler),
# - [json] 删除用户 # - [json] 禁用/解禁/删除用户
(r'/user/remove-user', user.DoRemoveUserHandler), (r'/user/update-users', user.DoUpdateUsersHandler),
# - [json] 获取用户列表 # - [json] 获取用户列表
(r'/user/get-users', user.DoGetUsersHandler), (r'/user/get-users', user.DoGetUsersHandler),
# - [json] 重置密码 # - [json] 重置密码

View File

@ -48,7 +48,7 @@ class DoLockGroupHandler(TPBaseJsonHandler):
except: except:
return self.write_json(TPE_PARAM) 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) self.write_json(err)
@ -69,7 +69,7 @@ class DoUnlockGroupHandler(TPBaseJsonHandler):
except: except:
return self.write_json(TPE_PARAM) 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) self.write_json(err)

View File

@ -7,7 +7,7 @@ import csv
from app.const import * from app.const import *
from app.base.configs import get_cfg 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.base import mail
from app.model import user from app.model import user
from app.model import group from app.model import group
@ -17,18 +17,6 @@ from app.base.logger import *
from app.base.controller import TPBaseHandler, TPBaseJsonHandler 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): class UserListHandler(TPBaseHandler):
def get(self): def get(self):
ret = self.check_privilege(TP_PRIVILEGE_USER_CREATE) ret = self.check_privilege(TP_PRIVILEGE_USER_CREATE)
@ -185,7 +173,7 @@ class DoImportHandler(TPBaseHandler):
每一行的数据格式 用户账号,用户姓名,登录认证方式,email地址,Mobile,QQ,WeChat,所属组,描述 每一行的数据格式 用户账号,用户姓名,登录认证方式,email地址,Mobile,QQ,WeChat,所属组,描述
在导入时 在导入时
0. #”作为行注释。 0. #”作为行注释。
1. 用户账号和email地址是必须填写的其他均为可选 1. 用户账号是必须填写的其他均为可选
2. 一个用户属于多个组可以用|将组分隔如果某个组并不存在则会创建这个组 2. 一个用户属于多个组可以用|将组分隔如果某个组并不存在则会创建这个组
3. 空行跳过数据格式不正确的跳过 3. 空行跳过数据格式不正确的跳过
""" """
@ -498,7 +486,7 @@ class DoResetPasswordHandler(TPBaseJsonHandler):
self.write_json(TPE_PARAM) self.write_json(TPE_PARAM)
class DoRemoveUserHandler(TPBaseJsonHandler): class DoUpdateUsersHandler(TPBaseJsonHandler):
def post(self): def post(self):
ret = self.check_privilege(TP_PRIVILEGE_USER_DELETE) ret = self.check_privilege(TP_PRIVILEGE_USER_DELETE)
if ret != TPE_OK: if ret != TPE_OK:
@ -513,11 +501,29 @@ class DoRemoveUserHandler(TPBaseJsonHandler):
return self.write_json(TPE_JSON_FORMAT) return self.write_json(TPE_JSON_FORMAT)
try: try:
action = args['action']
users = args['users'] users = args['users']
except: except:
return self.write_json(TPE_PARAM) 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) self.write_json(err)

View File

@ -38,7 +38,7 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
""" """
# 首先获取要查询的组的信息 # 首先获取要查询的组的信息
sg = SQL(get_db()) 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 = list()
_where.append('g.type={}'.format(TP_GROUP_ACCOUNT)) _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: for k in sql_filter:
if k == 'search': if k == 'search':
_where.append('(g.name LIKE "%{}%" OR g.desc LIKE "%{}%")'.format(sql_filter[k], sql_filter[k])) _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: if len(_where) > 0:
sg.where('( {} )'.format(' AND '.join(_where))) 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 _sort = False if not sql_order['asc'] else True
if 'name' == sql_order['name']: if 'name' == sql_order['name']:
sg.order_by('g.name', _sort) sg.order_by('g.name', _sort)
elif 'state' == sql_order['name']:
sg.order_by('g.state', _sort)
else: else:
log.e('unknown order field.\n') log.e('unknown order field.\n')
return TPE_PARAM, sg.total_count, 0, sg.recorder 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) sql_list.append(sql)
# sync to update the ops-audit table. # 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};' \ sql = 'UPDATE `{}ops_map` SET a_state={state} WHERE a_id={acc_id};' \
''.format(db.table_prefix, state=state, acc_id=acc_id) ''.format(db.table_prefix, state=state, acc_id=acc_id)
sql_list.append(sql) sql_list.append(sql)

View File

@ -39,40 +39,41 @@ def create(handler, gtype, name, desc):
return TPE_OK, _id return TPE_OK, _id
def lock(handler, gtype, glist): def update_groups_state(handler, gtype, glist, state):
if gtype not in TP_GROUP_TYPES: if gtype not in TP_GROUP_TYPES:
return TPE_PARAM return TPE_PARAM
group_list = [str(i) for i in glist] if gtype == TP_GROUP_USER:
gname = 'gu'
db = get_db() elif gtype == TP_GROUP_HOST:
gname = 'gh'
# 2. 更新记录 elif gtype == TP_GROUP_ACCOUNT:
sql = 'UPDATE `{dbtp}group` SET state={state} WHERE id IN ({gids});' \ gname = 'ga'
''.format(dbtp=db.table_prefix, state=TP_STATE_DISABLED, gids=','.join(group_list)) else:
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:
return TPE_PARAM return TPE_PARAM
group_list = [str(i) for i in glist] group_list = ','.join([str(i) for i in glist])
db = get_db() db = get_db()
sql_list = []
# 2. 更新记录 # 2. 更新记录
sql = 'UPDATE `{dbtp}group` SET state={state} WHERE id IN ({gids});' \ sql = 'UPDATE `{}ops_auz` SET state={state} WHERE rtype={rtype} AND rid={rid};' \
''.format(dbtp=db.table_prefix, state=TP_STATE_NORMAL, gids=','.join(group_list)) ''.format(db.table_prefix, state=state, rtype=gtype, rid=group_list)
db_ret = db.exec(sql) sql_list.append(sql)
if not db_ret:
return TPE_DATABASE
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): def remove(handler, gtype, glist):
@ -166,10 +167,30 @@ def add_members(gtype, gid, members):
def remove_members(gtype, gid, members): def remove_members(gtype, gid, members):
db = get_db() 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) 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 return TPE_OK
else: else:
return TPE_DATABASE return TPE_DATABASE

View File

@ -160,10 +160,10 @@ def remove_hosts(handler, hosts):
# if not db.exec(sql): # if not db.exec(sql):
# return TPE_DATABASE # 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_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) sql_list.append(sql)
# step 2. 处理主机 # step 2. 处理主机
@ -192,9 +192,9 @@ def remove_hosts(handler, hosts):
sql = 'DELETE FROM `{}host` WHERE {};'.format(db.table_prefix, where) sql = 'DELETE FROM `{}host` WHERE {};'.format(db.table_prefix, where)
sql_list.append(sql) 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_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) sql_list.append(sql)
if not db.transaction(sql_list): if not db.transaction(sql_list):
@ -252,7 +252,11 @@ def update_hosts_state(handler, host_ids, state):
sql_list.append(sql) sql_list.append(sql)
# sync to update the ops-audit table. # 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) ''.format(db.table_prefix, state=state, host_ids=host_ids)
sql_list.append(sql) 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});' \ # sql = 'UPDATE `{}host` SET state={state} WHERE id IN ({host_ids});' \
# ''.format(db.table_prefix, state=TP_STATE_NORMAL, host_ids=host_ids) # ''.format(db.table_prefix, state=TP_STATE_NORMAL, host_ids=host_ids)
# sql_list.append(sql) # 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) # ''.format(db.table_prefix, state=TP_STATE_NORMAL, host_ids=host_ids)
# sql_list.append(sql) # sql_list.append(sql)
# #
@ -296,6 +300,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
for k in sql_filter: for k in sql_filter:
if k == 'search': if k == 'search':
_where.append('(g.name LIKE "%{}%" OR g.desc LIKE "%{}%")'.format(sql_filter[k], sql_filter[k])) _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: if len(_where) > 0:
sg.where('( {} )'.format(' AND '.join(_where))) 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 _sort = False if not sql_order['asc'] else True
if 'name' == sql_order['name']: if 'name' == sql_order['name']:
sg.order_by('g.name', _sort) sg.order_by('g.name', _sort)
elif 'state' == sql_order['name']:
sg.order_by('g.state', _sort)
else: else:
log.e('unknown order field.\n') log.e('unknown order field.\n')
return TPE_PARAM, sg.total_count, sg.recorder return TPE_PARAM, sg.total_count, sg.recorder

View File

@ -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 = '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_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) sql_list.append(sql)
if db.transaction(sql_list): 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 = 'DELETE FROM `{}ops_auz` WHERE policy_id IN ({p_ids});'.format(db.table_prefix, p_ids=p_ids)
sql_list.append(sql) 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) sql_list.append(sql)
if db.transaction(sql_list): if db.transaction(sql_list):

View File

@ -260,6 +260,31 @@ def update_login_info(handler, user_id):
db_ret = db.exec(sql) 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): def remove_users(handler, users):
s = SQL(get_db()) s = SQL(get_db())
@ -527,7 +552,7 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
""" """
# 首先获取要查询的组的信息 # 首先获取要查询的组的信息
sg = SQL(get_db()) 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 = list()
_where.append('g.type={}'.format(TP_GROUP_USER)) _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: for k in sql_filter:
if k == 'search': if k == 'search':
_where.append('(g.name LIKE "%{filter}%" OR g.desc LIKE "%{filter}%")'.format(filter=sql_filter[k])) _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: if len(_where) > 0:
sg.where('( {} )'.format(' AND '.join(_where))) 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 _sort = False if not sql_order['asc'] else True
if 'name' == sql_order['name']: if 'name' == sql_order['name']:
sg.order_by('g.name', _sort) sg.order_by('g.name', _sort)
elif 'state' == sql_order['name']:
sg.order_by('g.state', _sort)
else: else:
log.e('unknown order field.\n') log.e('unknown order field.\n')
return TPE_PARAM, sg.total_count, sg.recorder return TPE_PARAM, sg.total_count, sg.recorder