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

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'),
// 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 = ['<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) {
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;
};
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) {
var ret = [];
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('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;
}

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.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 = '您确定要移除选定的 <strong>' + group_list.length + '个</strong> 分组吗?';
$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
});

View File

@ -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;
};

View File

@ -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 = ['<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('role');
_ret.push(filter_ctrl.render());
_ret.push('</div></div>');
return _ret.join('');
};
// render.filter_role = 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('role');
// _ret.push(filter_ctrl.render());
//
// _ret.push('</div></div>');
//
// return _ret.join('');
// };
render.filter_group_search = function (header, title, col) {
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('');
};
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) {
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.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 = [];

View File

@ -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 = ['<div class="tp-table-filter tp-table-filter-' + col.cell_align + '">'];
_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><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><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('</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 () {
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('<i class="fa fa-check-square-o fa-fw"></i> 用户导入成功:' + ret.message);
$app.table_user_list.load_data();
$app.table_users.load_data();
} else {
var err_msg = ['<i class="fa fa-times-circle-o fa-fw"></i> 用户导入失败:' + ret.message];
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('</div>');
$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: '<div class="alert alert-danger"><p><strong>注意:删除操作不可恢复!!</strong></p><p>删除用户账号将同时将其从所在用户组中移除,并且删除所有分配给此用户的授权!</p></div><p>如果您希望禁止某个用户登录本系统,可对其进行“禁用”操作!</p><p>您确定要移除所有选定的 <strong>' + users.length + '个</strong> 用户账号吗?</p>',
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));

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 group-actions">
<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 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 group-actions">
<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 class="table-extend-cell table-item-counter">
@ -85,6 +88,7 @@
<p>说明:</p>
<ul class="help-list">
<li>可以通过表格标题栏进行搜索或过滤,以便快速定位你需要的信息。标题栏左侧的 <i class="fa fa-rotate-left fa-fw"></i> 可以重置过滤器。</li>
<li>禁用用户分组并不会影响组内成员用户登录teleport系统但会影响运维授权策略。</li>
</ul>
</div>
</div>

View File

@ -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):

View File

@ -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:

View File

@ -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] 重置密码

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

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_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):

View File

@ -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