10
10
from fastapi_amis_admin .crud .schema import BaseApiOut
11
11
from fastapi_amis_admin .models import Field
12
12
from fastapi_amis_admin .utils .pydantic import ModelField
13
+ from fastapi_amis_admin .utils .translation import i18n as _
13
14
from pydantic import BaseModel
14
15
from starlette .requests import Request
15
16
from starlette .responses import RedirectResponse
@@ -39,7 +40,7 @@ def get_admin_select_permission_rows(admin: PageSchemaAdmin) -> List[Dict[str, A
39
40
for perm in admin .select_permissions :
40
41
rows .append (
41
42
{
42
- "label" : "Data only-" + perm .label , # 仅限数据
43
+ "label" : _ ( "Data only" ) + " -" + perm .label , # 仅限数据
43
44
"rol" : f"{ admin .unique_id } #page:select:{ perm .name } #page:select" ,
44
45
"reverse" : perm .reverse ,
45
46
}
@@ -69,7 +70,7 @@ def get_admin_field_permission_rows(admin: PageSchemaAdmin, action: str) -> List
69
70
return []
70
71
rows .append (
71
72
{
72
- "label" : "All" , # 全部
73
+ "label" : _ ( "All" ) , # 全部
73
74
"rol" : f"{ admin .unique_id } #page:{ action } :*#page:{ action } " ,
74
75
}
75
76
)
@@ -93,7 +94,7 @@ def __init__(self, admin, **kwargs):
93
94
elif self .admin .model .__table__ .name == User .__tablename__ :
94
95
self ._subject = "u"
95
96
else :
96
- raise Exception ("Main model not supported yet" ) # 暂不支持的主体模型
97
+ raise Exception (_ ( "Subject model not supported yet") ) # 暂不支持的主体模型
97
98
98
99
async def get_subject_by_id (self , item_id : str ) -> str :
99
100
# 从数据库获取用户选择的数据列表
@@ -117,23 +118,23 @@ class UpdateSubRolesAction(BaseSubAction):
117
118
action = ActionType .Dialog (
118
119
name = "update_subject_roles" ,
119
120
icon = "fa fa-check" ,
120
- tooltip = "Set up roles" , # 设置角色
121
+ tooltip = _ ( "Set up roles" ) , # 设置角色
121
122
dialog = amis .Dialog (),
122
123
level = LevelEnum .warning ,
123
124
)
124
125
125
126
class schema (BaseModel ):
126
127
role_keys : str = Field (
127
128
"" ,
128
- title = "role list" , # 角色列表
129
+ title = _ ( "role list" ) , # 角色列表
129
130
amis_form_item = amis .Transfer (
130
131
selectMode = "table" ,
131
132
resultListModeFollowSelect = True ,
132
133
columns = [
133
134
# {"name": "key", "label": "角色标识"},
134
- {"name" : "name" , "label" : "Role Name" }, # 角色名称
135
- {"name" : "desc" , "label" : "Role description" }, # 角色描述
136
- {"name" : "role_names" , "label" : "sub-role" }, # 子角色
135
+ {"name" : "name" , "label" : _ ( "Role Name" ) }, # 角色名称
136
+ {"name" : "desc" , "label" : _ ( "Role description" ) }, # 角色描述
137
+ {"name" : "role_names" , "label" : _ ( "sub-role" ) }, # 子角色
137
138
],
138
139
source = "" ,
139
140
valueField = "key" ,
@@ -158,18 +159,18 @@ async def get_init_data(self, request: Request, **kwargs) -> BaseApiOut[Any]:
158
159
return BaseApiOut (data = self .schema ())
159
160
subject = await self .get_subject_by_id (item_id )
160
161
if not subject :
161
- return BaseApiOut (status = 0 , msg = "Models not supported yet" ) # 暂不支持的模型
162
+ return BaseApiOut (status = 0 , msg = _ ( "Models not supported yet" ) ) # 暂不支持的模型
162
163
role_keys = await self .site .auth .enforcer .get_roles_for_user (subject )
163
164
return BaseApiOut (data = self .schema (role_keys = "," .join (role_keys ).replace ("r:" , "" )))
164
165
165
166
async def handle (self , request : Request , item_id : List [str ], data : schema , ** kwargs ):
166
167
"""更新角色Casbin权限"""
167
168
subject = await self .get_subject_by_id (item_id [0 ])
168
169
if not subject :
169
- return BaseApiOut (status = 0 , msg = "Models not supported yet" ) # 暂不支持的模型
170
+ return BaseApiOut (status = 0 , msg = _ ( "Models not supported yet" ) ) # 暂不支持的模型
170
171
identity = await self .site .auth .get_current_user_identity (request ) or SystemUserEnum .GUEST
171
172
if subject == "u:" + identity :
172
- return BaseApiOut (status = 0 , msg = "Cannot modify own permissions" ) # 不能修改自己的权限
173
+ return BaseApiOut (status = 0 , msg = _ ( "Cannot modify own permissions" ) ) # 不能修改自己的权限
173
174
enforcer : AsyncEnforcer = self .site .auth .enforcer
174
175
role_keys = [f"r:{ role } " for role in data .role_keys .split ("," ) if role ]
175
176
if role_keys and identity not in [SystemUserEnum .ROOT , SystemUserEnum .ADMIN ]:
@@ -190,7 +191,7 @@ class BaseSubPermAction(BaseSubAction):
190
191
action = ActionType .Dialog (
191
192
name = "view_subject_permissions" ,
192
193
icon = "fa fa-check" ,
193
- tooltip = "View permissions" , # 查看权限
194
+ tooltip = _ ( "View permissions" ) , # 查看权限
194
195
dialog = amis .Dialog (),
195
196
level = LevelEnum .warning ,
196
197
)
@@ -199,7 +200,7 @@ class BaseSubPermAction(BaseSubAction):
199
200
class schema (BaseModel ):
200
201
permissions : str = Field (
201
202
"" ,
202
- title = "Permission list" , # 权限列表
203
+ title = _ ( "Permission list" ) , # 权限列表
203
204
amis_form_item = amis .InputTree (
204
205
multiple = True ,
205
206
source = "" ,
@@ -236,7 +237,7 @@ class ViewSubPagePermAction(BaseSubPermAction):
236
237
action = ActionType .Dialog (
237
238
name = "view_subject_page_permissions" ,
238
239
icon = "fa fa-check" ,
239
- tooltip = "View page permissions" , # 查看页面权限
240
+ tooltip = _ ( "View page permissions" ) , # 查看页面权限
240
241
dialog = amis .Dialog (actions = []),
241
242
level = LevelEnum .warning ,
242
243
)
@@ -254,14 +255,13 @@ async def get_init_data(self, request: Request, **kwargs) -> BaseApiOut[Any]:
254
255
return BaseApiOut (data = self .schema ())
255
256
subject = await self .get_subject_by_id (item_id )
256
257
if not subject :
257
- return BaseApiOut (status = 0 , msg = "Models not supported yet" ) # 暂不支持的模型
258
- permissions = await get_subject_page_permissions (self .site .auth .enforcer , subject = subject ,
259
- implicit = self ._implicit )
258
+ return BaseApiOut (status = 0 , msg = _ ("Models not supported yet" )) # 暂不支持的模型
259
+ permissions = await get_subject_page_permissions (self .site .auth .enforcer , subject = subject , implicit = self ._implicit )
260
260
permissions = [perm .replace ("#allow" , "" ) for perm in permissions if perm .endswith ("#allow" )]
261
261
return BaseApiOut (data = self .schema (permissions = "," .join (permissions )))
262
262
263
263
async def handle (self , request : Request , item_id : List [str ], data : BaseModel , ** kwargs ):
264
- return BaseApiOut (status = 1 , msg = "Please update settings through [Setting Permissions]!" ) # 请通过的【设置权限】更新设置!
264
+ return BaseApiOut (status = 1 , msg = _ ( "Please update settings through [Setting Permissions]!" ) ) # 请通过的【设置权限】更新设置!
265
265
266
266
267
267
class UpdateSubDataPermAction (BaseSubPermAction ):
@@ -272,18 +272,18 @@ class UpdateSubDataPermAction(BaseSubPermAction):
272
272
action = ActionType .Dialog (
273
273
name = "update_subject_data_permissions" ,
274
274
icon = "fa fa-gavel" ,
275
- tooltip = "Update data permissions" , # 更新数据权限
276
- dialog = amis .Dialog (actions = [amis .Action (actionType = "submit" , label = "Submit" , close = False , primary = True )]), # 保存
275
+ tooltip = _ ( "Update data permissions" ) , # 更新数据权限
276
+ dialog = amis .Dialog (actions = [amis .Action (actionType = "submit" , label = _ ( "Save" ) , close = False , primary = True )]), # 保存
277
277
level = LevelEnum .warning ,
278
278
)
279
279
280
280
# 创建动作表单数据模型
281
281
class schema (BaseSubPermAction .schema ):
282
282
effect_matrix : list = Field (
283
283
[],
284
- title = "Current permissions" , # 当前权限
284
+ title = _ ( "Current permissions" ) , # 当前权限
285
285
amis_form_item = amis .MatrixCheckboxes (
286
- rowLabel = "Permission name" , # 权限名称
286
+ rowLabel = _ ( "Permission name" ) , # 权限名称
287
287
multiple = False ,
288
288
singleSelectMode = "row" ,
289
289
source = "" ,
@@ -292,9 +292,9 @@ class schema(BaseSubPermAction.schema):
292
292
)
293
293
policy_matrix : list = Field (
294
294
[],
295
- title = "Rights Profile" , # 权限配置
295
+ title = _ ( "Rights Profile" ) , # 权限配置
296
296
amis_form_item = amis .MatrixCheckboxes (
297
- rowLabel = "Name" , # 名称
297
+ rowLabel = _ ( "Name" ) , # 名称
298
298
multiple = False ,
299
299
singleSelectMode = "row" ,
300
300
yCheckAll = True ,
@@ -327,22 +327,22 @@ async def _get_admin_action_options(request: Request, item_id: str):
327
327
328
328
@self .router .get ("/get_admin_action_perm_options" , response_model = BaseApiOut )
329
329
async def get_admin_action_perm_options (
330
- request : Request ,
331
- permission : str = "" ,
332
- item_id : str = "" ,
333
- type : str = "policy" ,
330
+ request : Request ,
331
+ permission : str = "" ,
332
+ item_id : str = "" ,
333
+ type : str = "policy" ,
334
334
):
335
335
columns = [
336
336
{
337
- "label" : "default" , # 默认
337
+ "label" : _ ( "default" ) , # 默认
338
338
"col" : "default" ,
339
339
},
340
340
{
341
- "label" : "allow" , # 是
341
+ "label" : _ ( "allow" ) , # 是
342
342
"col" : "allow" ,
343
343
},
344
344
{
345
- "label" : "deny" , # 否
345
+ "label" : _ ( "deny" ) , # 否
346
346
"col" : "deny" ,
347
347
},
348
348
]
@@ -356,7 +356,7 @@ async def get_admin_action_perm_options(
356
356
)
357
357
if not permission :
358
358
return out
359
- unique_id , action , * _ = permission_decode (permission )
359
+ unique_id , action , * a = permission_decode (permission )
360
360
admin , parent = self .site .get_page_schema_child (unique_id )
361
361
if not admin :
362
362
return out
@@ -393,7 +393,7 @@ async def handle(self, request: Request, item_id: List[str], data: BaseModel, **
393
393
subject = await self .get_subject_by_id (item_id [0 ])
394
394
identity = await self .site .auth .get_current_user_identity (request ) or SystemUserEnum .GUEST
395
395
if subject == "u:" + identity :
396
- return BaseApiOut (status = 0 , msg = "Cannot modify own permissions" ) # 不能修改自己的权限
396
+ return BaseApiOut (status = 0 , msg = _ ( "Cannot modify own permissions" ) ) # 不能修改自己的权限
397
397
msg = await update_subject_data_permissions (
398
398
self .site .auth .enforcer ,
399
399
subject = subject ,
@@ -411,7 +411,7 @@ class UpdateSubPagePermsAction(ViewSubPagePermAction):
411
411
action = ActionType .Dialog (
412
412
name = "update_subject_page_permissions" ,
413
413
icon = "fa fa-gavel" ,
414
- tooltip = "Update page permissions" , # 更新页面权限
414
+ tooltip = _ ( "Update page permissions" ) , # 更新页面权限
415
415
dialog = amis .Dialog (),
416
416
level = LevelEnum .warning ,
417
417
)
@@ -420,10 +420,10 @@ async def handle(self, request: Request, item_id: List[str], data: BaseModel, **
420
420
"""更新角色Casbin权限"""
421
421
subject = await self .get_subject_by_id (item_id [0 ])
422
422
if not subject :
423
- return BaseApiOut (status = 0 , msg = "Models not supported yet" ) # 暂不支持的模型
423
+ return BaseApiOut (status = 0 , msg = _ ( "Models not supported yet" ) ) # 暂不支持的模型
424
424
identity = await self .site .auth .get_current_user_identity (request ) or SystemUserEnum .GUEST
425
425
if subject == "u:" + identity :
426
- return BaseApiOut (status = 0 , msg = "Cannot modify own permissions" ) # 不能修改自己的权限
426
+ return BaseApiOut (status = 0 , msg = _ ( "Cannot modify own permissions" ) ) # 不能修改自己的权限
427
427
# 权限列表
428
428
permissions = [perm for perm in data .permissions .split ("," ) if perm and perm .endswith ("#page" )] # 分割权限列表,去除空值
429
429
enforcer : AsyncEnforcer = self .site .auth .enforcer
@@ -440,20 +440,20 @@ class CopyUserAuthLinkAction(ModelAction):
440
440
action = amis .ActionType .Dialog (
441
441
name = "copy_user_auth_link" ,
442
442
icon = "fa fa-link" ,
443
- tooltip = "User login-free link" , # 用户免登录链接
443
+ tooltip = _ ( "User login-free link" ) , # 用户免登录链接
444
444
level = amis .LevelEnum .danger ,
445
445
dialog = amis .Dialog (
446
446
size = amis .SizeEnum .md ,
447
- title = "User login-free link" , # 用户免登录链接
447
+ title = _ ( "User login-free link" ) , # 用户免登录链接
448
448
),
449
449
)
450
450
form_init = True
451
451
form = amis .Form (static = True , disabled = True ) # type: ignore # 禁用表单
452
452
453
453
class schema (UsernameMixin , PkMixin ):
454
454
auth_url : str = Field (
455
- title = "Authorization link" , # 授权链接
456
- description = "Copy the link to your browser and open it without logging in" , # 复制链接到浏览器打开即可免登录
455
+ title = _ ( "Authorization link" ) , # 授权链接
456
+ description = _ ( "Copy the link to your browser and open it without logging in" ) , # 复制链接到浏览器打开即可免登录
457
457
amis_form_item = amis .Static (
458
458
copyable = True ,
459
459
),
@@ -471,9 +471,8 @@ async def get_init_data(self, request: Request, **kwargs) -> BaseApiOut[Any]:
471
471
}
472
472
token = await auth .backend .token_store .write_token (token_data )
473
473
return BaseApiOut (
474
- msg = "Successful operation" , # 操作成功
475
- data = {** token_data ,
476
- "auth_url" : f"{ str (request .base_url )[:- 1 ]} { self .site .router_path } /login_by_token?token={ token } " },
474
+ msg = _ ("Successful operation" ), # 操作成功
475
+ data = {** token_data , "auth_url" : f"{ str (request .base_url )[:- 1 ]} { self .site .router_path } /login_by_token?token={ token } " },
477
476
)
478
477
479
478
def register_router (self ):
0 commit comments