11from sqladmin import ModelView
2+ from sqlalchemy import func , select
3+ from sqlalchemy .sql .expression import Select
4+ from starlette .requests import Request
25
36from auth_backend .models .db import Group , Scope , User
47from auth_backend .routes .user import patch_user_groups
710class ScopeAdmin (ModelView , model = Scope ):
811 name = "Scope"
912 name_plural = "Scopes"
10- column_list = ["id" , "name" , "comment" , "is_deleted" ]
13+ column_list = ["id" , "name" , "comment" ]
1114 column_details_list = [
1215 "id" ,
1316 "name" ,
@@ -18,16 +21,34 @@ class ScopeAdmin(ModelView, model=Scope):
1821 "is_deleted" ,
1922 ]
2023 column_searchable_list = ["id" , "name" ]
21- column_sortable_list = ["id" , "name" , "is_deleted" ]
24+ column_sortable_list = ["id" , "name" ]
2225 column_default_sort = [("id" , False )]
2326 form_excluded_columns = ["create_ts" , "update_ts" , "groups" , "user_sessions" , "is_deleted" ]
2427 can_create = False # I don't know how to use UnionAuth there to get user_id that is required
2528
29+ def list_query (self , request : Request ) -> Select :
30+ return select (Scope ).where (Scope .is_deleted == False )
31+
32+ def count_query (self , request : Request ) -> Select :
33+ return select (func .count (Scope .id )).where (Scope .is_deleted == False )
34+
35+ async def update_model (self , request , pk , data ):
36+ with self .session_maker (expire_on_commit = False ) as session :
37+ scope_data = {k : v for k , v in data .items () if v is not None }
38+ obj = Scope .update (int (pk ), ** scope_data , session = session )
39+ session .commit ()
40+ return obj
41+
42+ async def delete_model (self , request , pk ):
43+ with self .session_maker (expire_on_commit = False ) as session :
44+ Scope .delete (session = session , id = int (pk ))
45+ session .commit ()
46+
2647
2748class GroupAdmin (ModelView , model = Group ):
2849 name = "Group"
2950 name_plural = "Groups"
30- column_list = ["id" , "name" , "scopes" , "users" , "parent_id" , "is_deleted" ]
51+ column_list = ["id" , "name" , "scopes" , "users" , "parent_id" ]
3152 column_details_list = [
3253 "id" ,
3354 "name" ,
@@ -43,6 +64,12 @@ class GroupAdmin(ModelView, model=Group):
4364 column_default_sort = [("id" , False )]
4465 form_excluded_columns = ["create_ts" , "update_ts" , "is_deleted" ]
4566
67+ def list_query (self , request : Request ) -> Select :
68+ return select (Group ).where (Group .is_deleted == False )
69+
70+ def count_query (self , request : Request ) -> Select :
71+ return select (func .count (Group .id )).where (Group .is_deleted == False )
72+
4673
4774class UserAdmin (ModelView , model = User ):
4875 name = "User"
@@ -62,7 +89,14 @@ class UserAdmin(ModelView, model=User):
6289 "scopes" : lambda m , a : ", " .join (s .name for s in (m .scopes or set ())),
6390 }
6491
65- async def on_model_change (self , data : dict , model : User , is_created : bool , request ) -> None :
92+ def list_query (self , request : Request ) -> Select :
93+ return select (User ).where (User .is_deleted == False )
94+
95+ def count_query (self , request : Request ) -> Select :
96+ return select (func .count (User .id )).where (User .is_deleted == False )
97+
98+ async def update_model (self , request , pk , data ):
6699 group_ids = [int (group ) for group in (data .pop ("groups" ) or [])]
67100 with self .session_maker (expire_on_commit = False ) as session :
68- patch_user_groups (model .id , group_ids , session )
101+ patch_user_groups (int (pk ), group_ids , session )
102+ return User .get (int (pk ), session = session )
0 commit comments