');
@@ -276,6 +310,7 @@ $app.on_table_groups_header_created = function (header) {
// 表格内嵌过滤器的事件绑定在这时进行(也可以延期到整个表格创建完成时进行)
header._table_ctrl.get_filter_ctrl('search_group').on_created();
+ header._table_ctrl.get_filter_ctrl('state').on_created();
};
$app.get_selected_group = function (tbl) {
@@ -290,13 +325,82 @@ $app.get_selected_group = function (tbl) {
return groups;
};
+$app.on_btn_lock_group_click = function (_row_id) {
+ var group_list = [];
+
+ if (_.isUndefined(_row_id)) {
+ var groups = $app.get_selected_group($app.table_groups);
+ if (groups.length === 0) {
+ $tp.notify_error('请选择要禁用的分组!');
+ return;
+ }
+
+ $.each(groups, function (i, g) {
+ group_list.push(g.id);
+ });
+ } else {
+ var _row_data = $app.table_groups.get_row(_row_id);
+ group_list.push(_row_data.id);
+ }
+
+ $tp.ajax_post_json('/group/lock', {gtype: TP_GROUP_ACCOUNT, glist: group_list},
+ function (ret) {
+ if (ret.code === TPE_OK) {
+ $app.table_groups.load_data();
+ $tp.notify_success('禁用分组操作成功!');
+ } else {
+ $tp.notify_error('禁用分组操作失败:' + tp_error_msg(ret.code, ret.message));
+ }
+ },
+ function () {
+ $tp.notify_error('网络故障,禁用分组操作失败!');
+ }
+ );
+
+};
+
+$app.on_btn_unlock_group_click = function (_row_id) {
+ var group_list = [];
+
+ if (_.isUndefined(_row_id)) {
+ var groups = $app.get_selected_group($app.table_groups);
+ if (groups.length === 0) {
+ $tp.notify_error('请选择要解禁的分组!');
+ return;
+ }
+
+ $.each(groups, function (i, g) {
+ group_list.push(g.id);
+ });
+ } else {
+ var _row_data = $app.table_groups.get_row(_row_id);
+ group_list.push(_row_data.id);
+ }
+
+ $tp.ajax_post_json('/group/unlock', {gtype: TP_GROUP_ACCOUNT, glist: group_list},
+ function (ret) {
+ if (ret.code === TPE_OK) {
+ $app.table_groups.load_data();
+ $tp.notify_success('分组解禁操作成功!');
+ } else {
+ $tp.notify_error('分组解禁操作失败:' + tp_error_msg(ret.code, ret.message));
+ }
+ },
+ function () {
+ $tp.notify_error('网络故障,分组解禁操作失败!');
+ }
+ );
+
+};
+
+
$app.on_btn_remove_group_click = function (_row_id) {
var group_list = [];
if (_.isUndefined(_row_id)) {
var groups = $app.get_selected_group($app.table_groups);
if (groups.length === 0) {
- $tp.notify_error('请选择要删除的用户组!');
+ $tp.notify_error('请选择要删除的分组!');
return;
}
diff --git a/server/www/teleport/static/js/asset/host-group-list.js b/server/www/teleport/static/js/asset/host-group-list.js
index 232aa06..c1b7639 100644
--- a/server/www/teleport/static/js/asset/host-group-list.js
+++ b/server/www/teleport/static/js/asset/host-group-list.js
@@ -149,7 +149,7 @@ $app.create_controls = function (cb_stack) {
});
}
});
- // $app.dom.btn_edit_user.click($app.on_btn_edit_user_click);
+
$app.dom.btn_lock_group.click(function () {
$app.on_btn_lock_group_click();
});
@@ -433,7 +433,7 @@ $app.on_btn_remove_group_click = function (_row_id) {
if (group_list.length > 1)
_msg_remove = '您确定要移除选定的
',
fn_yes: _fn_sure
});
diff --git a/server/www/teleport/static/js/teleport/controls.js b/server/www/teleport/static/js/teleport/controls.js
index 34417f0..84f85d1 100644
--- a/server/www/teleport/static/js/teleport/controls.js
+++ b/server/www/teleport/static/js/teleport/controls.js
@@ -1645,6 +1645,8 @@ $tp.create_table_header_filter_state = function (tbl, name, states, exclude_ids)
_tblf.get_filter = function () {
var ret = {};
+ if(_tblf.default_value === _tblf.filter_value)
+ return ret;
ret[_tblf.name] = _tblf.filter_value;
return ret;
};
diff --git a/server/www/teleport/static/js/user/user-group-list.js b/server/www/teleport/static/js/user/user-group-list.js
index f54153f..19da6bf 100644
--- a/server/www/teleport/static/js/user/user-group-list.js
+++ b/server/www/teleport/static/js/user/user-group-list.js
@@ -6,9 +6,8 @@ $app.on_init = function (cb_stack) {
btn_create_group: $('#btn-create-group'),
chkbox_groups_select_all: $('#table-groups-select-all'),
- // btn_edit_user: $('#btn-edit-user'),
- // btn_lock_user: $('#btn-lock-user'),
- // btn_unlock_user: $('#btn-unlock-user'),
+ // btn_lock_group: $('#btn-lock-group'),
+ // btn_unlock_group: $('#btn-unlock-group'),
btn_remove_group: $('#btn-remove-group'),
chkbox_user_list_select_all: $('#table-user-list-select-all')
@@ -75,6 +74,16 @@ $app.create_controls = function (cb_stack) {
render: 'members',
fields: {id: 'id', member_count: 'member_count', members: 'members'}
},
+ // {
+ // title: "状态",
+ // key: "state",
+ // sort: true,
+ // width: 90,
+ // align: 'center',
+ // header_render: 'filter_state',
+ // render: 'group_state',
+ // fields: {state: 'state'}
+ // },
{
title: '操作',
key: 'actions',
@@ -83,16 +92,6 @@ $app.create_controls = function (cb_stack) {
render: 'make_action_btn',
fields: {id: 'id'}
}
- // {
- // title: "状态",
- // key: "state",
- // sort: true,
- // width: 120,
- // align: 'center',
- // header_render: 'filter_user_state',
- // render: 'user_state',
- // fields: {state: 'state'}
- // }
],
// 重载回调函数
@@ -113,13 +112,10 @@ $app.create_controls = function (cb_stack) {
name: 'search_group',
place_holder: '搜索:用户组名称/描述'
});
- // $app.table_groups_role_filter = $tp.create_table_filter_role($app.table_groups, $app.role_list);
- // $app.table_groups_user_state_filter = $tp.create_table_filter_user_state($app.table_groups, $app.user_states);
- // 从cookie中读取用户分页限制的选择
- var _per_page = Cookies.get($app.page_id('user_group') + '_per_page');
+ $tp.create_table_header_filter_state($app.table_groups, 'state', $app.obj_states, [TP_STATE_LOCKED]);
$app.table_groups_paging = $tp.create_table_paging($app.table_groups, 'table-groups-paging',
{
- per_page: _per_page,
+ per_page: Cookies.get($app.page_id('user_group') + '_per_page'),
on_per_page_changed: function (per_page) {
Cookies.set($app.page_id('user_group') + '_per_page', per_page, {expires: 365});
}
@@ -155,9 +151,13 @@ $app.create_controls = function (cb_stack) {
});
}
});
- // $app.dom.btn_edit_user.click($app.on_btn_edit_user_click);
- // $app.dom.btn_lock_user.click($app.on_btn_lock_user_click);
- // $app.dom.btn_unlock_user.click($app.on_btn_unlock_user_click);
+
+ // $app.dom.btn_lock_group.click(function () {
+ // $app.on_btn_lock_group_click();
+ // });
+ // $app.dom.btn_unlock_group.click(function () {
+ // $app.on_btn_unlock_group_click();
+ // });
$app.dom.btn_remove_group.click(function(){
$app.on_btn_remove_group_click();
});
@@ -200,19 +200,19 @@ $app.check_groups_all_selected = function () {
};
$app.on_table_groups_render_created = function (render) {
- render.filter_role = function (header, title, col) {
- var _ret = ['
');
-
- return _ret.join('');
- };
+ // render.filter_role = function (header, title, col) {
+ // var _ret = ['
');
+ //
+ // return _ret.join('');
+ // };
render.filter_group_search = function (header, title, col) {
var _ret = ['
'];
@@ -228,6 +228,38 @@ $app.on_table_groups_render_created = function (render) {
return _ret.join('');
};
+ render.filter_state = function (header, title, col) {
+ var _ret = ['
'];
+ _ret.push('
');
+ _ret.push('
' + title + '
');
+
+ // 表格内嵌过滤器的DOM实体在这时生成
+ var filter_ctrl = header._table_ctrl.get_filter_ctrl('state');
+ _ret.push(filter_ctrl.render());
+
+ _ret.push('
');
+
+ return _ret.join('');
+ };
+
+ render.group_state = function (row_id, fields) {
+ var _style, _state;
+
+ for (var i = 0; i < $app.obj_states.length; ++i) {
+ if ($app.obj_states[i].id === fields.state) {
+ _style = $app.obj_states[i].style;
+ _state = $app.obj_states[i].name;
+ break;
+ }
+ }
+ if (i === $app.obj_states.length) {
+ _style = 'info';
+ _state = '
未知';
+ }
+
+ return '
' + _state + ''
+ };
+
render.make_check_box = function (row_id, fields) {
return '
';
};
@@ -276,8 +308,7 @@ $app.on_table_groups_render_created = function (render) {
};
$app.on_table_groups_header_created = function (header) {
- $app.dom.btn_table_groups_reset_filter = $('#' + header._table_ctrl.dom_id + ' a[data-reset-filter]');
- $app.dom.btn_table_groups_reset_filter.click(function () {
+ $('#' + header._table_ctrl.dom_id + ' a[data-reset-filter]').click(function () {
CALLBACK_STACK.create()
.add(header._table_ctrl.load_data)
.add(header._table_ctrl.reset_filters)
@@ -286,6 +317,7 @@ $app.on_table_groups_header_created = function (header) {
// 表格内嵌过滤器的事件绑定在这时进行(也可以延期到整个表格创建完成时进行)
header._table_ctrl.get_filter_ctrl('search_group').on_created();
+ header._table_ctrl.get_filter_ctrl('state').on_created();
};
$app.get_selected_group = function (tbl) {
@@ -300,6 +332,75 @@ $app.get_selected_group = function (tbl) {
return groups;
};
+
+// $app.on_btn_lock_group_click = function (_row_id) {
+// var group_list = [];
+//
+// if (_.isUndefined(_row_id)) {
+// var groups = $app.get_selected_group($app.table_groups);
+// if (groups.length === 0) {
+// $tp.notify_error('请选择要禁用的分组!');
+// return;
+// }
+//
+// $.each(groups, function (i, g) {
+// group_list.push(g.id);
+// });
+// } else {
+// var _row_data = $app.table_groups.get_row(_row_id);
+// group_list.push(_row_data.id);
+// }
+//
+// $tp.ajax_post_json('/group/lock', {gtype: TP_GROUP_USER, glist: group_list},
+// function (ret) {
+// if (ret.code === TPE_OK) {
+// $app.table_groups.load_data();
+// $tp.notify_success('禁用分组操作成功!');
+// } else {
+// $tp.notify_error('禁用分组操作失败:' + tp_error_msg(ret.code, ret.message));
+// }
+// },
+// function () {
+// $tp.notify_error('网络故障,禁用分组操作失败!');
+// }
+// );
+//
+// };
+//
+// $app.on_btn_unlock_group_click = function (_row_id) {
+// var group_list = [];
+//
+// if (_.isUndefined(_row_id)) {
+// var groups = $app.get_selected_group($app.table_groups);
+// if (groups.length === 0) {
+// $tp.notify_error('请选择要解禁的分组!');
+// return;
+// }
+//
+// $.each(groups, function (i, g) {
+// group_list.push(g.id);
+// });
+// } else {
+// var _row_data = $app.table_groups.get_row(_row_id);
+// group_list.push(_row_data.id);
+// }
+//
+// $tp.ajax_post_json('/group/unlock', {gtype: TP_GROUP_USER, glist: group_list},
+// function (ret) {
+// if (ret.code === TPE_OK) {
+// $app.table_groups.load_data();
+// $tp.notify_success('分组解禁操作成功!');
+// } else {
+// $tp.notify_error('分组解禁操作失败:' + tp_error_msg(ret.code, ret.message));
+// }
+// },
+// function () {
+// $tp.notify_error('网络故障,分组解禁操作失败!');
+// }
+// );
+//
+// };
+//
$app.on_btn_remove_group_click = function (_row_id) {
var group_list = [];
diff --git a/server/www/teleport/static/js/user/user-list.js b/server/www/teleport/static/js/user/user-list.js
index cb07439..91e73b7 100644
--- a/server/www/teleport/static/js/user/user-list.js
+++ b/server/www/teleport/static/js/user/user-list.js
@@ -21,7 +21,7 @@ $app.on_init = function (cb_stack) {
};
cb_stack
- // .add($app.test)
+ // .add($app.test)
.add($app.create_controls)
.add($app.load_role_list);
@@ -41,7 +41,7 @@ $app.create_controls = function (cb_stack) {
//-------------------------------
// 用户列表表格
//-------------------------------
- var table_user_list_options = {
+ var table_users_options = {
dom_id: 'table-user-list',
data_source: {
type: 'ajax-post',
@@ -98,34 +98,34 @@ $app.create_controls = function (cb_stack) {
],
// 重载回调函数
- on_header_created: $app.on_table_user_list_header_created,
- on_render_created: $app.on_table_user_list_render_created,
- on_cell_created: $app.on_table_user_list_cell_created
+ on_header_created: $app.on_table_users_header_created,
+ on_render_created: $app.on_table_users_render_created,
+ on_cell_created: $app.on_table_users_cell_created
};
- $app.table_user_list = $tp.create_table(table_user_list_options);
+ $app.table_users = $tp.create_table(table_users_options);
cb_stack
- .add($app.table_user_list.load_data)
- .add($app.table_user_list.init);
+ .add($app.table_users.load_data)
+ .add($app.table_users.init);
//-------------------------------
// 用户列表相关过滤器
//-------------------------------
- $tp.create_table_header_filter_search($app.table_user_list, {
+ $tp.create_table_header_filter_search($app.table_users, {
name: 'search',
place_holder: '搜索:用户账号/姓名/邮箱/描述/等等...'
});
- $tp.create_table_filter_role($app.table_user_list, $app.role_list);
- $tp.create_table_header_filter_state($app.table_user_list, 'state', $app.obj_states);
+ $tp.create_table_filter_role($app.table_users, $app.role_list);
+ $tp.create_table_header_filter_state($app.table_users, 'state', $app.obj_states);
// 从cookie中读取用户分页限制的选择
- $tp.create_table_paging($app.table_user_list, 'table-user-list-paging',
+ $tp.create_table_paging($app.table_users, 'table-user-list-paging',
{
per_page: Cookies.get($app.page_id('user_user') + '_per_page'),
on_per_page_changed: function (per_page) {
Cookies.set($app.page_id('user_user') + '_per_page', per_page, {expires: 365});
}
});
- $tp.create_table_pagination($app.table_user_list, 'table-user-list-pagination');
+ $tp.create_table_pagination($app.table_users, 'table-user-list-pagination');
//-------------------------------
// 对话框
@@ -144,7 +144,7 @@ $app.create_controls = function (cb_stack) {
$app.dlg_edit_user.show_create();
});
$app.dom.btn_refresh_user_list.click(function () {
- $app.table_user_list.load_data();
+ $app.table_users.load_data();
});
$app.dom.btn_select_file.click($app.on_btn_select_file_click);
$app.dom.btn_do_upload.click($app.on_btn_do_upload_click);
@@ -155,7 +155,7 @@ $app.create_controls = function (cb_stack) {
$app.dom.dlg_import_user.modal({backdrop: 'static'});
});
$app.dom.chkbox_user_list_select_all.click(function () {
- var _objects = $('#' + $app.table_user_list.dom_id + ' tbody').find('[data-check-box]');
+ var _objects = $('#' + $app.table_users.dom_id + ' tbody').find('[data-check-box]');
if ($(this).is(':checked')) {
$.each(_objects, function (i, _obj) {
$(_obj).prop('checked', true);
@@ -185,7 +185,7 @@ $app.create_controls = function (cb_stack) {
cb_stack.exec();
};
-$app.on_table_user_list_cell_created = function (tbl, row_id, col_key, cell_obj) {
+$app.on_table_users_cell_created = function (tbl, row_id, col_key, cell_obj) {
if (col_key === 'chkbox') {
cell_obj.find('[data-check-box]').click(function () {
$app.check_user_list_all_selected();
@@ -194,11 +194,18 @@ $app.on_table_user_list_cell_created = function (tbl, row_id, col_key, cell_obj)
else if (col_key === 'action') {
cell_obj.find('[data-action]').click(function () {
- var cmd = $(this).attr('data-action');
- if (cmd === 'edit') {
+ var user = $app.table_users.get_row(row_id);
+ var action = $(this).attr('data-action');
+ if (action === 'edit') {
$app.dlg_edit_user.show_edit(row_id);
- } else if (cmd === 'reset-password') {
+ } else if (action === 'reset-password') {
$app.dlg_reset_password.show_edit(row_id);
+ } else if(action === 'lock') {
+ $app._lock_users([user.id]);
+ } else if(action === 'unlock') {
+ $app._unlock_users([user.id]);
+ } else if(action === 'remove') {
+ $app._remove_users([user.id]);
}
});
}
@@ -206,7 +213,7 @@ $app.on_table_user_list_cell_created = function (tbl, row_id, col_key, cell_obj)
$app.check_user_list_all_selected = function (cb_stack) {
var _all_checked = true;
- var _objs = $('#' + $app.table_user_list.dom_id + ' tbody').find('[data-check-box]');
+ var _objs = $('#' + $app.table_users.dom_id + ' tbody').find('[data-check-box]');
if (_objs.length === 0) {
_all_checked = false;
} else {
@@ -228,7 +235,7 @@ $app.check_user_list_all_selected = function (cb_stack) {
cb_stack.exec();
};
-$app.on_table_user_list_render_created = function (render) {
+$app.on_table_users_render_created = function (render) {
render.filter_role = function (header, title, col) {
var _ret = ['
'];
_ret.push('
');
@@ -340,7 +347,7 @@ $app.on_table_user_list_render_created = function (render) {
h.push('
');
h.push('
重置密码');
h.push('
');
- h.push('
删除');
+ h.push('
删除');
h.push('');
h.push('
');
@@ -348,7 +355,7 @@ $app.on_table_user_list_render_created = function (render) {
};
};
-$app.on_table_user_list_header_created = function (header) {
+$app.on_table_users_header_created = function (header) {
$('#' + header._table_ctrl.dom_id + ' a[data-reset-filter]').click(function () {
CALLBACK_STACK.create()
.add(header._table_ctrl.load_data)
@@ -358,11 +365,11 @@ $app.on_table_user_list_header_created = function (header) {
// // TODO: 当过滤器不是默认值时,让“重置过滤器按钮”有呼吸效果,避免用户混淆 - 实验性质
// var t1 = function(){
- // $app.dom.btn_table_user_list_reset_filter.fadeTo(1000, 1.0, function(){
- // $app.dom.btn_table_user_list_reset_filter.fadeTo(1000, 0.2, t1);
+ // $app.dom.btn_table_users_reset_filter.fadeTo(1000, 1.0, function(){
+ // $app.dom.btn_table_users_reset_filter.fadeTo(1000, 0.2, t1);
// });
// };
- // $app.dom.btn_table_user_list_reset_filter.fadeTo(1000, 0.2, t1);
+ // $app.dom.btn_table_users_reset_filter.fadeTo(1000, 0.2, t1);
// 表格内嵌过滤器的事件绑定在这时进行(也可以延期到整个表格创建完成时进行)
header._table_ctrl.get_filter_ctrl('search').on_created();
@@ -454,7 +461,7 @@ $app.on_btn_do_upload_click = function () {
.addClass('alert-success')
.html('
用户导入成功:' + ret.message);
- $app.table_user_list.load_data();
+ $app.table_users.load_data();
} else {
var err_msg = ['
用户导入失败:' + ret.message];
if (!_.isUndefined(ret.data)) {
@@ -466,7 +473,7 @@ $app.on_btn_do_upload_click = function () {
err_msg.push(err_lines.join('
'));
err_msg.push('
');
- $app.table_user_list.load_data();
+ $app.table_users.load_data();
}
$app.dom.upload_file_message
@@ -488,10 +495,10 @@ $app.show_user_info = function (row_id) {
$app.get_selected_user = function () {
var items = [];
- var _objs = $('#' + $app.table_user_list.dom_id + ' tbody tr td input[data-check-box]');
+ var _objs = $('#' + $app.table_users.dom_id + ' tbody tr td input[data-check-box]');
$.each(_objs, function (i, _obj) {
if ($(_obj).is(':checked')) {
- var _row_data = $app.table_user_list.get_row(_obj);
+ var _row_data = $app.table_users.get_row(_obj);
items.push(_row_data.id);
}
});
@@ -507,7 +514,7 @@ $app.on_btn_set_role_click = function () {
};
$app.set_selected_to_role = function (role_id, role_name) {
- var users = $app.get_selected_user($app.table_user_list);
+ var users = $app.get_selected_user($app.table_users);
if (users.length === 0) {
return;
}
@@ -517,7 +524,7 @@ $app.set_selected_to_role = function (role_id, role_name) {
function (ret) {
if (ret.code === TPE_OK) {
cb_stack.add($app.check_user_list_all_selected);
- cb_stack.add($app.table_user_list.load_data);
+ cb_stack.add($app.table_users.load_data);
$tp.notify_success('设置用户角色操作成功!');
} else {
$tp.notify_error('设置用户角色操作失败:' + tp_error_msg(ret.code, ret.message));
@@ -540,25 +547,71 @@ $app.set_selected_to_role = function (role_id, role_name) {
};
+$app._lock_users = function(users) {
+ $tp.ajax_post_json('/user/update-users', {action: 'lock', users: users},
+ function (ret) {
+ if (ret.code === TPE_OK) {
+ CALLBACK_STACK.create()
+ .add($app.check_user_list_all_selected)
+ .add($app.table_users.load_data)
+ .exec();
+ $tp.notify_success('禁用用户账号操作成功!');
+ } else {
+ $tp.notify_error('禁用用户账号操作失败:' + tp_error_msg(ret.code, ret.message));
+ }
+ },
+ function () {
+ $tp.notify_error('网络故障,禁用用户账号操作失败!');
+ }
+ );
+};
+
$app.on_btn_lock_user_click = function () {
-};
-
-$app.on_btn_unlock_user_click = function () {
-};
-
-$app.on_btn_remove_user_click = function () {
- var users = $app.get_selected_user($app.table_user_list);
+ var users = $app.get_selected_user($app.table_users);
if (users.length === 0) {
- $tp.notify_error('请选择要删除的用户!');
+ $tp.notify_error('请选择要禁用的用户!');
return;
}
+ $app._lock_hosts(users);
+};
+
+$app._unlock_users = function(users) {
+ $tp.ajax_post_json('/user/update-users', {action: 'unlock', users: users},
+ function (ret) {
+ if (ret.code === TPE_OK) {
+ CALLBACK_STACK.create()
+ .add($app.check_user_list_all_selected)
+ .add($app.table_users.load_data)
+ .exec();
+ $tp.notify_success('解禁用户账号操作成功!');
+ } else {
+ $tp.notify_error('解禁用户账号操作失败:' + tp_error_msg(ret.code, ret.message));
+ }
+ },
+ function () {
+ $tp.notify_error('网络故障,解禁用户账号操作失败!');
+ }
+ );
+};
+
+$app.on_btn_unlock_user_click = function () {
+ var users = $app.get_selected_user($app.table_users);
+ if (users.length === 0) {
+ $tp.notify_error('请选择要解禁的用户!');
+ return;
+ }
+
+ $app._unlock_users(users);
+};
+
+$app._remove_users = function(users) {
var _fn_sure = function (cb_stack, cb_args) {
- $tp.ajax_post_json('/user/remove-user', {users: users},
+ $tp.ajax_post_json('/user/update-users', {action: 'remove', users: users},
function (ret) {
if (ret.code === TPE_OK) {
cb_stack.add($app.check_user_list_all_selected);
- cb_stack.add($app.table_user_list.load_data);
+ cb_stack.add($app.table_users.load_data);
$tp.notify_success('删除用户账号操作成功!');
} else {
$tp.notify_error('删除用户账号操作失败:' + tp_error_msg(ret.code, ret.message));
@@ -578,7 +631,16 @@ $app.on_btn_remove_user_click = function () {
msg: '
注意:删除操作不可恢复!!
删除用户账号将同时将其从所在用户组中移除,并且删除所有分配给此用户的授权!
如果您希望禁止某个用户登录本系统,可对其进行“禁用”操作!
您确定要移除所有选定的 ' + users.length + '个 用户账号吗?
',
fn_yes: _fn_sure
});
+};
+$app.on_btn_remove_user_click = function () {
+ var users = $app.get_selected_user($app.table_users);
+ if (users.length === 0) {
+ $tp.notify_error('请选择要删除的用户!');
+ return;
+ }
+
+ $app._remove_users(users);
};
$app.create_dlg_edit_user = function () {
@@ -687,7 +749,7 @@ $app.create_dlg_edit_user = function () {
};
dlg.show_edit = function (row_id) {
- var user = $app.table_user_list.get_row(row_id);
+ var user = $app.table_users.get_row(row_id);
console.log(user);
dlg.init_fields(user);
dlg.dom.dialog.modal({backdrop: 'static'});
@@ -750,7 +812,7 @@ $app.create_dlg_edit_user = function () {
function (ret) {
if (ret.code === TPE_OK) {
$tp.notify_success('用户账号' + action + '成功!');
- $app.table_user_list.load_data();
+ $app.table_users.load_data();
dlg.dom.dialog.modal('hide');
} else {
$tp.notify_error('用户账号' + action + '失败:' + tp_error_msg(ret.code, ret.message));
@@ -798,7 +860,7 @@ $app.create_dlg_user_info = function () {
dlg.row_id = row_id;
dlg.need_edit = false;
- var _row_data = $app.table_user_list.get_row(dlg.row_id);
+ var _row_data = $app.table_users.get_row(dlg.row_id);
// 表格加载时,是不会读取用户的 desc 字段的,因此可以判断此用户是否已经读取过详细信息了
if (_.isUndefined(_row_data.desc)) {
@@ -806,7 +868,7 @@ $app.create_dlg_user_info = function () {
$tp.ajax_post_json('/user/get-user/' + _row_data.id, {},
function (ret) {
if (ret.code === TPE_OK) {
- $app.table_user_list.update_row(dlg.row_id, ret.data);
+ $app.table_users.update_row(dlg.row_id, ret.data);
dlg.show_info(ret.data);
} else {
$tp.notify_error('无法获取用户详细信息:' + tp_error_msg(ret.code, ret.message));
@@ -919,7 +981,7 @@ $app.create_dlg_reset_password = function () {
};
dlg.show_edit = function (row_id) {
- var user = $app.table_user_list.get_row(row_id);
+ var user = $app.table_users.get_row(row_id);
dlg.init_fields(user);
dlg.dom.dialog.modal({backdrop: 'static'});
};
@@ -934,7 +996,7 @@ $app.create_dlg_reset_password = function () {
function (ret) {
if (ret.code === TPE_OK) {
$tp.notify_success('用户密码重置成功!');
- // $app.table_user_list.load_data();
+ // $app.table_users.load_data();
dlg.dom.dialog.modal('hide');
} else {
$tp.notify_error('用户密码重置失败:' + tp_error_msg(ret.code, ret.message));
@@ -964,7 +1026,7 @@ $app.create_dlg_reset_password = function () {
function (ret) {
if (ret.code === TPE_OK) {
$tp.notify_success('用户密码重置成功!');
- // $app.table_user_list.load_data();
+ // $app.table_users.load_data();
dlg.dom.dialog.modal('hide');
} else {
$tp.notify_error('用户密码重置失败:' + tp_error_msg(ret.code, ret.message));
diff --git a/server/www/teleport/view/asset/account-group-list.mako b/server/www/teleport/view/asset/account-group-list.mako
index ad38c19..cef05a3 100644
--- a/server/www/teleport/view/asset/account-group-list.mako
+++ b/server/www/teleport/view/asset/account-group-list.mako
@@ -65,7 +65,10 @@
-
+##
+
+
+
diff --git a/server/www/teleport/view/user/user-group-list.mako b/server/www/teleport/view/user/user-group-list.mako
index cee8979..fbbb963 100644
--- a/server/www/teleport/view/user/user-group-list.mako
+++ b/server/www/teleport/view/user/user-group-list.mako
@@ -61,7 +61,10 @@
-
+##
+##
+##
+
@@ -85,6 +88,7 @@
说明:
- 可以通过表格标题栏进行搜索或过滤,以便快速定位你需要的信息。标题栏左侧的 可以重置过滤器。
+ - 禁用用户分组并不会影响组内成员用户登录teleport系统,但会影响运维授权策略。
diff --git a/server/www/teleport/webroot/app/base/controller.py b/server/www/teleport/webroot/app/base/controller.py
index 76f7b71..c56e7e0 100644
--- a/server/www/teleport/webroot/app/base/controller.py
+++ b/server/www/teleport/webroot/app/base/controller.py
@@ -108,15 +108,15 @@ class TPBaseHandler(tornado.web.RequestHandler):
self._user = _user
def set_session(self, name, value, expire=None):
- k = '{}-{}'.format(self._s_id, name)
+ k = '{}-{}'.format(name, self._s_id)
session_manager().set(k, value, expire)
def get_session(self, name, _default=None):
- k = '{}-{}'.format(self._s_id, name)
+ k = '{}-{}'.format(name, self._s_id)
return session_manager().get(k, _default)
def del_session(self, name):
- k = '{}-{}'.format(self._s_id, name)
+ k = '{}-{}'.format(name, self._s_id)
return session_manager().set(k, '', -1)
def get_current_user(self):
diff --git a/server/www/teleport/webroot/app/base/session.py b/server/www/teleport/webroot/app/base/session.py
index 97668b7..de66470 100644
--- a/server/www/teleport/webroot/app/base/session.py
+++ b/server/www/teleport/webroot/app/base/session.py
@@ -88,6 +88,15 @@ class SessionManager(threading.Thread):
else:
return _default
+ def get_start_with(self, key_start):
+ with self._lock:
+ ret = {}
+ for k in self._session_dict:
+ if k.startswith(key_start):
+ ret[k] = self._session_dict[k]
+
+ return ret
+
def taken(self, s_id, _default=None):
# 从session中取走一个数据(读取并删除)
with self._lock:
diff --git a/server/www/teleport/webroot/app/controller/__init__.py b/server/www/teleport/webroot/app/controller/__init__.py
index 085410b..1b87667 100644
--- a/server/www/teleport/webroot/app/controller/__init__.py
+++ b/server/www/teleport/webroot/app/controller/__init__.py
@@ -79,8 +79,8 @@ controllers = [
(r'/user/get-user/(.*)', user.DoGetUserInfoHandler),
# - [json] 创建/更新用户
(r'/user/update-user', user.DoUpdateUserHandler),
- # - [json] 删除用户
- (r'/user/remove-user', user.DoRemoveUserHandler),
+ # - [json] 禁用/解禁/删除用户
+ (r'/user/update-users', user.DoUpdateUsersHandler),
# - [json] 获取用户列表
(r'/user/get-users', user.DoGetUsersHandler),
# - [json] 重置密码
diff --git a/server/www/teleport/webroot/app/controller/group.py b/server/www/teleport/webroot/app/controller/group.py
index 519aa38..b24b0ec 100644
--- a/server/www/teleport/webroot/app/controller/group.py
+++ b/server/www/teleport/webroot/app/controller/group.py
@@ -48,7 +48,7 @@ class DoLockGroupHandler(TPBaseJsonHandler):
except:
return self.write_json(TPE_PARAM)
- err = group.lock(self, gtype, glist)
+ err = group.update_groups_state(self, gtype, glist, TP_STATE_DISABLED)
self.write_json(err)
@@ -69,7 +69,7 @@ class DoUnlockGroupHandler(TPBaseJsonHandler):
except:
return self.write_json(TPE_PARAM)
- err = group.unlock(self, gtype, glist)
+ err = group.update_groups_state(self, gtype, glist, TP_STATE_NORMAL)
self.write_json(err)
diff --git a/server/www/teleport/webroot/app/controller/user.py b/server/www/teleport/webroot/app/controller/user.py
index 74be02a..ddf9774 100644
--- a/server/www/teleport/webroot/app/controller/user.py
+++ b/server/www/teleport/webroot/app/controller/user.py
@@ -7,7 +7,7 @@ import csv
from app.const import *
from app.base.configs import get_cfg
-# from app.module import host
+from app.base.session import session_manager
from app.base import mail
from app.model import user
from app.model import group
@@ -17,18 +17,6 @@ from app.base.logger import *
from app.base.controller import TPBaseHandler, TPBaseJsonHandler
-# , TPBaseAdminAuthHandler, TPBaseAdminAuthJsonHandler
-
-# cfg = get_cfg()
-
-
-# class IndexHandler(TPBaseHandler):
-# def get(self):
-# ret = self.check_privilege(TP_PRIVILEGE_USER_CREATE | TP_PRIVILEGE_USER_GROUP)
-# if ret != TPE_OK:
-# return
-# self.render('user/index.mako')
-
class UserListHandler(TPBaseHandler):
def get(self):
ret = self.check_privilege(TP_PRIVILEGE_USER_CREATE)
@@ -185,7 +173,7 @@ class DoImportHandler(TPBaseHandler):
每一行的数据格式: 用户账号,用户姓名,登录认证方式,email地址,Mobile,QQ,WeChat,所属组,描述
在导入时:
0. 以“#”作为行注释。
- 1. 用户账号和email地址是必须填写的,其他均为可选。
+ 1. 用户账号是必须填写的,其他均为可选。
2. 一个用户属于多个组,可以用“|”将组分隔,如果某个组并不存在,则会创建这个组。
3. 空行跳过,数据格式不正确的跳过。
"""
@@ -498,7 +486,7 @@ class DoResetPasswordHandler(TPBaseJsonHandler):
self.write_json(TPE_PARAM)
-class DoRemoveUserHandler(TPBaseJsonHandler):
+class DoUpdateUsersHandler(TPBaseJsonHandler):
def post(self):
ret = self.check_privilege(TP_PRIVILEGE_USER_DELETE)
if ret != TPE_OK:
@@ -513,11 +501,29 @@ class DoRemoveUserHandler(TPBaseJsonHandler):
return self.write_json(TPE_JSON_FORMAT)
try:
+ action = args['action']
users = args['users']
except:
return self.write_json(TPE_PARAM)
- err = user.remove_users(self, users)
+ if action == 'lock':
+ err = user.update_users_state(self, users, TP_STATE_DISABLED)
+ elif action == 'unlock':
+ err = user.update_users_state(self, users, TP_STATE_NORMAL)
+ elif action == 'remove':
+ err = user.remove_users(self, users)
+ else:
+ err = TPE_PARAM
+
+ if err != TPE_OK:
+ return self.write_json(err)
+
+ if action == 'lock' or action == 'remove':
+ v = session_manager().get_start_with('user-')
+ for k in v:
+ if v[k]['v']['id'] in users:
+ session_manager().taken(k)
+
self.write_json(err)
diff --git a/server/www/teleport/webroot/app/model/account.py b/server/www/teleport/webroot/app/model/account.py
index 4449235..aff460b 100644
--- a/server/www/teleport/webroot/app/model/account.py
+++ b/server/www/teleport/webroot/app/model/account.py
@@ -38,7 +38,7 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
"""
# 首先获取要查询的组的信息
sg = SQL(get_db())
- sg.select_from('group', ['id', 'name', 'desc'], alt_name='g')
+ sg.select_from('group', ['id', 'name', 'state', 'desc'], alt_name='g')
_where = list()
_where.append('g.type={}'.format(TP_GROUP_ACCOUNT))
@@ -47,6 +47,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
for k in sql_filter:
if k == 'search':
_where.append('(g.name LIKE "%{}%" OR g.desc LIKE "%{}%")'.format(sql_filter[k], sql_filter[k]))
+ elif k == 'state':
+ _where.append('(g.state={filter})'.format(filter=sql_filter[k]))
if len(_where) > 0:
sg.where('( {} )'.format(' AND '.join(_where)))
@@ -55,6 +57,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
_sort = False if not sql_order['asc'] else True
if 'name' == sql_order['name']:
sg.order_by('g.name', _sort)
+ elif 'state' == sql_order['name']:
+ sg.order_by('g.state', _sort)
else:
log.e('unknown order field.\n')
return TPE_PARAM, sg.total_count, 0, sg.recorder
@@ -266,6 +270,10 @@ def update_account_state(handler, host_id, acc_id, state):
sql_list.append(sql)
# sync to update the ops-audit table.
+ sql = 'UPDATE `{}ops_auz` SET state={state} WHERE rtype={rtype} AND rid={rid};' \
+ ''.format(db.table_prefix, state=state, rtype=TP_ACCOUNT, rid=acc_id)
+ sql_list.append(sql)
+
sql = 'UPDATE `{}ops_map` SET a_state={state} WHERE a_id={acc_id};' \
''.format(db.table_prefix, state=state, acc_id=acc_id)
sql_list.append(sql)
diff --git a/server/www/teleport/webroot/app/model/group.py b/server/www/teleport/webroot/app/model/group.py
index a4c1bba..71d5747 100644
--- a/server/www/teleport/webroot/app/model/group.py
+++ b/server/www/teleport/webroot/app/model/group.py
@@ -39,40 +39,41 @@ def create(handler, gtype, name, desc):
return TPE_OK, _id
-def lock(handler, gtype, glist):
+def update_groups_state(handler, gtype, glist, state):
if gtype not in TP_GROUP_TYPES:
return TPE_PARAM
- group_list = [str(i) for i in glist]
-
- db = get_db()
-
- # 2. 更新记录
- sql = 'UPDATE `{dbtp}group` SET state={state} WHERE id IN ({gids});' \
- ''.format(dbtp=db.table_prefix, state=TP_STATE_DISABLED, gids=','.join(group_list))
- db_ret = db.exec(sql)
- if not db_ret:
- return TPE_DATABASE
-
- return TPE_OK
-
-
-def unlock(handler, gtype, glist):
- if gtype not in TP_GROUP_TYPES:
+ if gtype == TP_GROUP_USER:
+ gname = 'gu'
+ elif gtype == TP_GROUP_HOST:
+ gname = 'gh'
+ elif gtype == TP_GROUP_ACCOUNT:
+ gname = 'ga'
+ else:
return TPE_PARAM
- group_list = [str(i) for i in glist]
+ group_list = ','.join([str(i) for i in glist])
db = get_db()
+ sql_list = []
# 2. 更新记录
- sql = 'UPDATE `{dbtp}group` SET state={state} WHERE id IN ({gids});' \
- ''.format(dbtp=db.table_prefix, state=TP_STATE_NORMAL, gids=','.join(group_list))
- db_ret = db.exec(sql)
- if not db_ret:
- return TPE_DATABASE
+ sql = 'UPDATE `{}ops_auz` SET state={state} WHERE rtype={rtype} AND rid={rid};' \
+ ''.format(db.table_prefix, state=state, rtype=gtype, rid=group_list)
+ sql_list.append(sql)
- return TPE_OK
+ sql = 'UPDATE `{}ops_map` SET {gname}_state={state} WHERE {gname}_id IN ({gids});' \
+ ''.format(db.table_prefix, state=state, gname=gname, gids=group_list)
+ sql_list.append(sql)
+
+ sql = 'UPDATE `{dbtp}group` SET state={state} WHERE id IN ({gids});' \
+ ''.format(dbtp=db.table_prefix, state=state, gids=group_list)
+ sql_list.append(sql)
+
+ if db.transaction(sql_list):
+ return TPE_OK
+ else:
+ return TPE_DATABASE
def remove(handler, gtype, glist):
@@ -166,10 +167,30 @@ def add_members(gtype, gid, members):
def remove_members(gtype, gid, members):
db = get_db()
- _where = 'WHERE (type={gtype} AND gid={gid} AND mid IN ({mid}))'.format(gtype=gtype, gid=gid, mid=','.join([str(uid) for uid in members]))
+ if gtype == TP_GROUP_USER:
+ name = 'u'
+ gname = 'gu'
+ elif gtype == TP_GROUP_HOST:
+ name = 'h'
+ gname = 'gh'
+ elif gtype == TP_GROUP_ACCOUNT:
+ name = 'a'
+ gname = 'ga'
+ else:
+ return TPE_PARAM
+ mids = ','.join([str(uid) for uid in members])
+
+ sql_list = []
+
+ _where = 'WHERE (type={gtype} AND gid={gid} AND mid IN ({mid}))'.format(gtype=gtype, gid=gid, mid=mids)
sql = 'DELETE FROM `{dbtp}group_map` {where};'.format(dbtp=db.table_prefix, where=_where)
- if db.exec(sql):
+ sql_list.append(sql)
+
+ sql = 'DELETE FROM `{}ops_map` WHERE {gname}_id={gid} AND {name}_id IN ({ids});'.format(db.table_prefix, gname=gname, name=name, gid=gid, ids=mids)
+ sql_list.append(sql)
+
+ if db.transaction(sql_list):
return TPE_OK
else:
return TPE_DATABASE
diff --git a/server/www/teleport/webroot/app/model/host.py b/server/www/teleport/webroot/app/model/host.py
index 24444f6..44b0836 100644
--- a/server/www/teleport/webroot/app/model/host.py
+++ b/server/www/teleport/webroot/app/model/host.py
@@ -160,10 +160,10 @@ def remove_hosts(handler, hosts):
# if not db.exec(sql):
# return TPE_DATABASE
- sql = 'DELETE FROM `{}ops_auz` WHERE rtype={rtype} AND rid IN({rid});'.format(db.table_prefix, rtype=TP_ACCOUNT, rid=','.join(acc_ids))
+ sql = 'DELETE FROM `{}ops_auz` WHERE rtype={rtype} AND rid IN ({rid});'.format(db.table_prefix, rtype=TP_ACCOUNT, rid=','.join(acc_ids))
sql_list.append(sql)
- sql = 'DELETE FROM `{}ops_map` WHERE a_id IN({});'.format(db.table_prefix, ','.join(acc_ids))
+ sql = 'DELETE FROM `{}ops_map` WHERE a_id IN ({});'.format(db.table_prefix, ','.join(acc_ids))
sql_list.append(sql)
# step 2. 处理主机
@@ -192,9 +192,9 @@ def remove_hosts(handler, hosts):
sql = 'DELETE FROM `{}host` WHERE {};'.format(db.table_prefix, where)
sql_list.append(sql)
- sql = 'DELETE FROM `{}ops_auz` WHERE rtype={rtype} AND rid IN({rid});'.format(db.table_prefix, rtype=TP_HOST, rid=','.join(host_ids))
+ sql = 'DELETE FROM `{}ops_auz` WHERE rtype={rtype} AND rid IN ({rid});'.format(db.table_prefix, rtype=TP_HOST, rid=','.join(host_ids))
sql_list.append(sql)
- sql = 'DELETE FROM `{}ops_map` WHERE h_id IN({});'.format(db.table_prefix, ','.join(host_ids))
+ sql = 'DELETE FROM `{}ops_map` WHERE h_id IN ({});'.format(db.table_prefix, ','.join(host_ids))
sql_list.append(sql)
if not db.transaction(sql_list):
@@ -252,7 +252,11 @@ def update_hosts_state(handler, host_ids, state):
sql_list.append(sql)
# sync to update the ops-audit table.
- sql = 'UPDATE `{}ops_map` SET h_state={state} WHERE h_id IN({host_ids});' \
+ sql = 'UPDATE `{}ops_auz` SET state={state} WHERE rtype={rtype} AND rid IN ({rid});' \
+ ''.format(db.table_prefix, state=state, rtype=TP_ACCOUNT, rid=host_ids)
+ sql_list.append(sql)
+
+ sql = 'UPDATE `{}ops_map` SET h_state={state} WHERE h_id IN ({host_ids});' \
''.format(db.table_prefix, state=state, host_ids=host_ids)
sql_list.append(sql)
@@ -271,7 +275,7 @@ def update_hosts_state(handler, host_ids, state):
# sql = 'UPDATE `{}host` SET state={state} WHERE id IN ({host_ids});' \
# ''.format(db.table_prefix, state=TP_STATE_NORMAL, host_ids=host_ids)
# sql_list.append(sql)
-# sql = 'UPDATE `{}ops_map` SET h_state={state} WHERE h_id IN({host_ids});' \
+# sql = 'UPDATE `{}ops_map` SET h_state={state} WHERE h_id IN ({host_ids});' \
# ''.format(db.table_prefix, state=TP_STATE_NORMAL, host_ids=host_ids)
# sql_list.append(sql)
#
@@ -296,6 +300,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
for k in sql_filter:
if k == 'search':
_where.append('(g.name LIKE "%{}%" OR g.desc LIKE "%{}%")'.format(sql_filter[k], sql_filter[k]))
+ elif k == 'state':
+ _where.append('(g.state={filter})'.format(filter=sql_filter[k]))
if len(_where) > 0:
sg.where('( {} )'.format(' AND '.join(_where)))
@@ -304,6 +310,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
_sort = False if not sql_order['asc'] else True
if 'name' == sql_order['name']:
sg.order_by('g.name', _sort)
+ elif 'state' == sql_order['name']:
+ sg.order_by('g.state', _sort)
else:
log.e('unknown order field.\n')
return TPE_PARAM, sg.total_count, sg.recorder
diff --git a/server/www/teleport/webroot/app/model/ops.py b/server/www/teleport/webroot/app/model/ops.py
index b89cd61..43de6b0 100644
--- a/server/www/teleport/webroot/app/model/ops.py
+++ b/server/www/teleport/webroot/app/model/ops.py
@@ -155,7 +155,7 @@ def update_policies_state(handler, p_ids, state):
sql = 'UPDATE `{}ops_auz` SET state={state} WHERE policy_id IN ({p_ids});'.format(db.table_prefix, state=state, p_ids=p_ids)
sql_list.append(sql)
- sql = 'UPDATE `{}ops_map` SET p_state={state} WHERE p_id IN({p_ids});'.format(db.table_prefix, state=state, p_ids=p_ids)
+ sql = 'UPDATE `{}ops_map` SET p_state={state} WHERE p_id IN ({p_ids});'.format(db.table_prefix, state=state, p_ids=p_ids)
sql_list.append(sql)
if db.transaction(sql_list):
@@ -177,7 +177,7 @@ def remove_policies(handler, p_ids):
sql = 'DELETE FROM `{}ops_auz` WHERE policy_id IN ({p_ids});'.format(db.table_prefix, p_ids=p_ids)
sql_list.append(sql)
- sql = 'DELETE FROM `{}ops_map` WHERE p_id IN({p_ids});'.format(db.table_prefix, p_ids=p_ids)
+ sql = 'DELETE FROM `{}ops_map` WHERE p_id IN ({p_ids});'.format(db.table_prefix, p_ids=p_ids)
sql_list.append(sql)
if db.transaction(sql_list):
diff --git a/server/www/teleport/webroot/app/model/user.py b/server/www/teleport/webroot/app/model/user.py
index b5c1452..b5c13e0 100644
--- a/server/www/teleport/webroot/app/model/user.py
+++ b/server/www/teleport/webroot/app/model/user.py
@@ -260,6 +260,31 @@ def update_login_info(handler, user_id):
db_ret = db.exec(sql)
+def update_users_state(handler, user_ids, state):
+ db = get_db()
+
+ user_ids = ','.join([str(i) for i in user_ids])
+
+ sql_list = []
+
+ sql = 'UPDATE `{}user` SET state={state} WHERE id IN ({ids});' \
+ ''.format(db.table_prefix, state=state, ids=user_ids)
+ sql_list.append(sql)
+
+ sql = 'UPDATE `{}ops_auz` SET state={state} WHERE rtype={rtype} AND rid IN ({rid});' \
+ ''.format(db.table_prefix, state=state, rtype=TP_USER, rid=user_ids)
+ sql_list.append(sql)
+
+ sql = 'UPDATE `{}ops_map` SET u_state={state} WHERE u_id IN ({ids});' \
+ ''.format(db.table_prefix, state=state, ids=user_ids)
+ sql_list.append(sql)
+
+ if db.transaction(sql_list):
+ return TPE_OK
+ else:
+ return TPE_DATABASE
+
+
def remove_users(handler, users):
s = SQL(get_db())
@@ -527,7 +552,7 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
"""
# 首先获取要查询的组的信息
sg = SQL(get_db())
- sg.select_from('group', ['id', 'name', 'desc'], alt_name='g')
+ sg.select_from('group', ['id', 'state', 'name', 'desc'], alt_name='g')
_where = list()
_where.append('g.type={}'.format(TP_GROUP_USER))
@@ -536,6 +561,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
for k in sql_filter:
if k == 'search':
_where.append('(g.name LIKE "%{filter}%" OR g.desc LIKE "%{filter}%")'.format(filter=sql_filter[k]))
+ elif k == 'state':
+ _where.append('(g.state={filter})'.format(filter=sql_filter[k]))
if len(_where) > 0:
sg.where('( {} )'.format(' AND '.join(_where)))
@@ -544,6 +571,8 @@ def get_group_with_member(sql_filter, sql_order, sql_limit):
_sort = False if not sql_order['asc'] else True
if 'name' == sql_order['name']:
sg.order_by('g.name', _sort)
+ elif 'state' == sql_order['name']:
+ sg.order_by('g.state', _sort)
else:
log.e('unknown order field.\n')
return TPE_PARAM, sg.total_count, sg.recorder