77from itertools import groupby
88from operator import itemgetter
99
10- from flask import jsonify
11- from lin .core import get_ep_infos , route_meta
12- from lin .exception import Success
10+ from flask import jsonify , request
11+ from lin import db
12+ from lin .core import get_ep_infos , route_meta , manager , find_user , find_auth_module
13+ from lin .db import get_total_nums
14+ from lin .enums import UserSuper , UserActive
15+ from lin .exception import Success , NotFound , ParameterException , Forbidden
1316from lin .jwt import admin_required
1417from lin .log import Logger
1518from lin .redprint import Redprint
1619
17- from app .dao .auth import AuthDAO
18- from app .dao .group import GroupDAO
19- from app .dao .user import UserDAO
20+ from app .libs .utils import paginate
2021from app .validators .forms import NewGroup , DispatchAuth , DispatchAuths , RemoveAuths , UpdateGroup , ResetPasswordForm , \
2122 UpdateUserInfoForm
2223
@@ -34,7 +35,31 @@ def authority():
3435@route_meta (auth = '查询所有用户' , module = '管理员' , mount = False )
3536@admin_required
3637def get_admin_users ():
37- user_and_group , total_nums = UserDAO ().get_all ()
38+ start , count = paginate ()
39+ group_id = request .args .get ('group_id' )
40+ condition = {
41+ 'super' : UserSuper .COMMON .value ,
42+ 'group_id' : group_id
43+ } if group_id else {
44+ 'super' : UserSuper .COMMON .value
45+ }
46+
47+ users = db .session .query (
48+ manager .user_model , manager .group_model .name
49+ ).filter_by (soft = True , ** condition ).join (
50+ manager .group_model ,
51+ manager .user_model .group_id == manager .group_model .id
52+ ).offset (start ).limit (count ).all ()
53+
54+ user_and_group = []
55+ for user , group_name in users :
56+ setattr (user , 'group_name' , group_name )
57+ user ._fields .append ('group_name' )
58+ user .hide ('update_time' , 'delete_time' )
59+ user_and_group .append (user )
60+ # 有分组的时候就加入分组条件
61+ # total_nums = get_total_nums(manager.user_model, is_soft=True, super=UserSuper.COMMON.value)
62+ total_nums = get_total_nums (manager .user_model , is_soft = True , ** condition )
3863 return jsonify ({
3964 "collection" : user_and_group ,
4065 'total_nums' : total_nums
@@ -46,7 +71,13 @@ def get_admin_users():
4671@admin_required
4772def change_user_password (uid ):
4873 form = ResetPasswordForm ().validate_for_api ()
49- UserDAO ().reset_user_password (uid , form .new_password .data )
74+
75+ user = find_user (id = uid )
76+ if user is None :
77+ raise NotFound (msg = '用户不存在' )
78+ with db .auto_commit ():
79+ user .reset_password (form .new_password .data )
80+
5081 return Success (msg = '密码修改成功' )
5182
5283
@@ -55,7 +86,12 @@ def change_user_password(uid):
5586@Logger (template = '管理员删除了一个用户' ) # 记录日志
5687@admin_required
5788def delete_user (uid ):
58- UserDAO ().remove_user (uid )
89+ user = manager .user_model .get (id = uid )
90+ if user is None :
91+ raise NotFound (msg = '用户不存在' )
92+ # user.delete(commit=True)
93+ # 此处我们使用硬删除,一般情况下,推荐使用软删除即,上一行注释的代码
94+ user .hard_delete (commit = True )
5995 return Success (msg = '操作成功' )
6096
6197
@@ -64,34 +100,60 @@ def delete_user(uid):
64100@admin_required
65101def update_user (uid ):
66102 form = UpdateUserInfoForm ().validate_for_api ()
67- UserDAO ().update (uid , form )
103+
104+ user = manager .user_model .get (id = uid )
105+ if user is None :
106+ raise NotFound (msg = '用户不存在' )
107+ if user .email != form .email .data :
108+ exists = manager .user_model .get (email = form .email .data )
109+ if exists :
110+ raise ParameterException (msg = '邮箱已被注册,请重新输入邮箱' )
111+ with db .auto_commit ():
112+ user .email = form .email .data
113+ user .group_id = form .group_id .data
68114 return Success (msg = '操作成功' )
69115
70116
71117@admin_api .route ('/disable/<int:uid>' , methods = ['PUT' ])
72118@route_meta (auth = '禁用用户' , module = '管理员' , mount = False )
73119@admin_required
74120def trans2disable (uid ):
75- UserDAO (). change_status (uid , 'active' )
121+ _change_status (uid , 'active' )
76122 return Success (msg = '操作成功' )
77123
78124
79125@admin_api .route ('/active/<int:uid>' , methods = ['PUT' ])
80126@route_meta (auth = '激活用户' , module = '管理员' , mount = False )
81127@admin_required
82128def trans2active (uid ):
83- UserDAO (). change_status (uid , 'disable' )
129+ _change_status (uid , 'disable' )
84130 return Success (msg = '操作成功' )
85131
86132
87133@admin_api .route ('/groups' , methods = ['GET' ])
88134@route_meta (auth = '查询所有权限组及其权限' , module = '管理员' , mount = False )
89135@admin_required
90136def get_admin_groups ():
91- groups_info , total_nums = GroupDAO ().get_groups_info ()
137+ start , count = paginate ()
138+ groups = manager .group_model .query .filter ().offset (
139+ start ).limit (count ).all ()
140+ if groups is None :
141+ raise NotFound (msg = '不存在任何权限组' )
142+
143+ for group in groups :
144+ auths = db .session .query (
145+ manager .auth_model .auth , manager .auth_model .module
146+ ).filter_by (soft = False , group_id = group .id ).all ()
147+
148+ auths = [{'auth' : auth [0 ], 'module' : auth [1 ]} for auth in auths ]
149+ res = _split_modules (auths )
150+ setattr (group , 'auths' , res )
151+ group ._fields .append ('auths' )
152+
153+ total_nums = get_total_nums (manager .group_model )
92154
93155 return jsonify ({
94- "collection" : groups_info ,
156+ "collection" : groups ,
95157 'total_nums' : total_nums
96158 })
97159
@@ -100,15 +162,26 @@ def get_admin_groups():
100162@route_meta (auth = '查询所有权限组' , module = '管理员' , mount = False )
101163@admin_required
102164def get_all_group ():
103- groups = GroupDAO ().get_all ()
165+ groups = manager .group_model .get (one = False )
166+ if groups is None :
167+ raise NotFound (msg = '不存在任何权限组' )
104168 return jsonify (groups )
105169
106170
107171@admin_api .route ('/group/<int:gid>' , methods = ['GET' ])
108172@route_meta (auth = '查询一个权限组及其权限' , module = '管理员' , mount = False )
109173@admin_required
110174def get_group (gid ):
111- group = GroupDAO ().get_single_info (gid )
175+ group = manager .group_model .get (id = gid , one = True , soft = False )
176+ if group is None :
177+ raise NotFound (msg = '分组不存在' )
178+ auths = db .session .query (
179+ manager .auth_model .auth , manager .auth_model .module
180+ ).filter_by (soft = False , group_id = group .id ).all ()
181+ auths = [{'auth' : auth [0 ], 'module' : auth [1 ]} for auth in auths ]
182+ res = _split_modules (auths )
183+ setattr (group , 'auths' , res )
184+ group ._fields .append ('auths' )
112185 return jsonify (group )
113186
114187
@@ -118,7 +191,18 @@ def get_group(gid):
118191@admin_required
119192def create_group ():
120193 form = NewGroup ().validate_for_api ()
121- GroupDAO ().new_group (form )
194+ exists = manager .group_model .get (name = form .name .data )
195+ if exists :
196+ raise Forbidden (msg = '分组已存在,不可创建同名分组' )
197+ with db .auto_commit ():
198+ group = manager .group_model .create (name = form .name .data , info = form .info .data )
199+ db .session .flush ()
200+
201+ for auth in form .auths .data :
202+ meta = find_auth_module (auth )
203+ if meta :
204+ manager .auth_model .create (auth = meta .auth , module = meta .module , group_id = group .id )
205+
122206 return Success (msg = '新建分组成功' )
123207
124208
@@ -127,7 +211,10 @@ def create_group():
127211@admin_required
128212def update_group (gid ):
129213 form = UpdateGroup ().validate_for_api ()
130- GroupDAO ().update_group (gid , form )
214+ exists = manager .group_model .get (id = gid )
215+ if not exists :
216+ raise NotFound (msg = '分组不存在,更新失败' )
217+ exists .update (name = form .name .data , info = form .info .data , commit = True )
131218 return Success (msg = '更新分组成功' )
132219
133220
@@ -136,7 +223,14 @@ def update_group(gid):
136223@Logger (template = '管理员删除一个权限组' ) # 记录日志
137224@admin_required
138225def delete_group (gid ):
139- GroupDAO ().remove_group (gid )
226+ exist = manager .group_model .get (id = gid )
227+ if not exist :
228+ raise NotFound (msg = '分组不存在,删除失败' )
229+ if manager .user_model .get (group_id = gid ):
230+ raise Forbidden (msg = '分组下存在用户,不可删除' )
231+ # 删除group拥有的权限
232+ manager .auth_model .query .filter (manager .auth_model .group_id == gid ).delete ()
233+ exist .delete (commit = True )
140234 return Success (msg = '删除分组成功' )
141235
142236
@@ -145,7 +239,16 @@ def delete_group(gid):
145239@admin_required
146240def dispatch_auth ():
147241 form = DispatchAuth ().validate_for_api ()
148- AuthDAO ().patch_one (form )
242+ one = manager .auth_model .get (group_id = form .group_id .data , auth = form .auth .data )
243+ if one :
244+ raise Forbidden (msg = '已有权限,不可重复添加' )
245+ meta = find_auth_module (form .auth .data )
246+ manager .auth_model .create (
247+ group_id = form .group_id .data ,
248+ auth = meta .auth ,
249+ module = meta .module ,
250+ commit = True
251+ )
149252 return Success (msg = '添加权限成功' )
150253
151254
@@ -154,7 +257,16 @@ def dispatch_auth():
154257@admin_required
155258def dispatch_auths ():
156259 form = DispatchAuths ().validate_for_api ()
157- AuthDAO ().patch_all (form )
260+ with db .auto_commit ():
261+ for auth in form .auths .data :
262+ one = manager .auth_model .get (group_id = form .group_id .data , auth = auth )
263+ if not one :
264+ meta = find_auth_module (auth )
265+ manager .auth_model .create (
266+ group_id = form .group_id .data ,
267+ auth = meta .auth ,
268+ module = meta .module
269+ )
158270 return Success (msg = '添加权限成功' )
159271
160272
@@ -163,7 +275,13 @@ def dispatch_auths():
163275@admin_required
164276def remove_auths ():
165277 form = RemoveAuths ().validate_for_api ()
166- AuthDAO ().remove_auths (form )
278+
279+ with db .auto_commit ():
280+ db .session .query (manager .auth_model ).filter (
281+ manager .auth_model .auth .in_ (form .auths .data ),
282+ manager .auth_model .group_id == form .group_id .data
283+ ).delete (synchronize_session = False )
284+
167285 return Success (msg = '删除权限成功' )
168286
169287
@@ -175,6 +293,27 @@ def _split_modules(auths):
175293 res .append ({key : list (group )})
176294 return res
177295
296+
297+ def _change_status (uid , active_or_disable = 'active' ):
298+ user = manager .user_model .get (id = uid )
299+ if user is None :
300+ raise NotFound (msg = '用户不存在' )
301+
302+ active_or_not = UserActive .NOT_ACTIVE .value \
303+ if active_or_disable == 'active' \
304+ else UserActive .ACTIVE .value
305+
306+ if active_or_disable == 'active' :
307+ if not user .is_active :
308+ raise Forbidden (msg = '当前用户已处于禁止状态' )
309+
310+ elif active_or_disable == 'disable' :
311+ if user .is_active :
312+ raise Forbidden (msg = '当前用户已处于激活状态' )
313+
314+ with db .auto_commit ():
315+ user .active = active_or_not
316+
178317# --------------------------------------------------
179318# --------------------Abandon-----------------------
180319# --------------------------------------------------
0 commit comments