Skip to content

Commit ed703b5

Browse files
authored
Merge pull request #38 from Mkadir/master
Update with english
2 parents 900a975 + beaffef commit ed703b5

File tree

12 files changed

+970
-257
lines changed

12 files changed

+970
-257
lines changed

README.md

Lines changed: 114 additions & 140 deletions
Large diffs are not rendered by default.

README.zh.md

Lines changed: 420 additions & 0 deletions
Large diffs are not rendered by default.

fastapi_user_auth/admin/actions.py

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from fastapi_amis_admin.crud.schema import BaseApiOut
1111
from fastapi_amis_admin.models import Field
1212
from fastapi_amis_admin.utils.pydantic import ModelField
13+
from fastapi_amis_admin.utils.translation import i18n as _
1314
from pydantic import BaseModel
1415
from starlette.requests import Request
1516
from starlette.responses import RedirectResponse
@@ -39,7 +40,7 @@ def get_admin_select_permission_rows(admin: PageSchemaAdmin) -> List[Dict[str, A
3940
for perm in admin.select_permissions:
4041
rows.append(
4142
{
42-
"label": "仅限数据-" + perm.label,
43+
"label": _("Data only") + "-" + perm.label, # 仅限数据
4344
"rol": f"{admin.unique_id}#page:select:{perm.name}#page:select",
4445
"reverse": perm.reverse,
4546
}
@@ -69,7 +70,7 @@ def get_admin_field_permission_rows(admin: PageSchemaAdmin, action: str) -> List
6970
return []
7071
rows.append(
7172
{
72-
"label": "全部",
73+
"label": _("All"), # 全部
7374
"rol": f"{admin.unique_id}#page:{action}:*#page:{action}",
7475
}
7576
)
@@ -93,7 +94,7 @@ def __init__(self, admin, **kwargs):
9394
elif self.admin.model.__table__.name == User.__tablename__:
9495
self._subject = "u"
9596
else:
96-
raise Exception("暂不支持的主体模型")
97+
raise Exception(_("Subject model not supported yet")) # 暂不支持的主体模型
9798

9899
async def get_subject_by_id(self, item_id: str) -> str:
99100
# 从数据库获取用户选择的数据列表
@@ -117,23 +118,23 @@ class UpdateSubRolesAction(BaseSubAction):
117118
action = ActionType.Dialog(
118119
name="update_subject_roles",
119120
icon="fa fa-check",
120-
tooltip="设置角色",
121+
tooltip=_("Set up roles"), # 设置角色
121122
dialog=amis.Dialog(),
122123
level=LevelEnum.warning,
123124
)
124125

125126
class schema(BaseModel):
126127
role_keys: str = Field(
127128
"",
128-
title="角色列表",
129+
title=_("role list"), # 角色列表
129130
amis_form_item=amis.Transfer(
130131
selectMode="table",
131132
resultListModeFollowSelect=True,
132133
columns=[
133134
# {"name": "key", "label": "角色标识"},
134-
{"name": "name", "label": "角色名称"},
135-
{"name": "desc", "label": "角色描述"},
136-
{"name": "role_names", "label": "子角色"},
135+
{"name": "name", "label": _("Role Name")}, # 角色名称
136+
{"name": "desc", "label": _("Role description")}, # 角色描述
137+
{"name": "role_names", "label": _("sub-role")}, # 子角色
137138
],
138139
source="",
139140
valueField="key",
@@ -158,18 +159,18 @@ async def get_init_data(self, request: Request, **kwargs) -> BaseApiOut[Any]:
158159
return BaseApiOut(data=self.schema())
159160
subject = await self.get_subject_by_id(item_id)
160161
if not subject:
161-
return BaseApiOut(status=0, msg="暂不支持的模型")
162+
return BaseApiOut(status=0, msg=_("Models not supported yet")) # 暂不支持的模型
162163
role_keys = await self.site.auth.enforcer.get_roles_for_user(subject)
163164
return BaseApiOut(data=self.schema(role_keys=",".join(role_keys).replace("r:", "")))
164165

165166
async def handle(self, request: Request, item_id: List[str], data: schema, **kwargs):
166167
"""更新角色Casbin权限"""
167168
subject = await self.get_subject_by_id(item_id[0])
168169
if not subject:
169-
return BaseApiOut(status=0, msg="暂不支持的模型")
170+
return BaseApiOut(status=0, msg=_("Models not supported yet")) # 暂不支持的模型
170171
identity = await self.site.auth.get_current_user_identity(request) or SystemUserEnum.GUEST
171172
if subject == "u:" + identity:
172-
return BaseApiOut(status=0, msg="不能修改自己的权限")
173+
return BaseApiOut(status=0, msg=_("Cannot modify own permissions")) # 不能修改自己的权限
173174
enforcer: AsyncEnforcer = self.site.auth.enforcer
174175
role_keys = [f"r:{role}" for role in data.role_keys.split(",") if role]
175176
if role_keys and identity not in [SystemUserEnum.ROOT, SystemUserEnum.ADMIN]:
@@ -190,7 +191,7 @@ class BaseSubPermAction(BaseSubAction):
190191
action = ActionType.Dialog(
191192
name="view_subject_permissions",
192193
icon="fa fa-check",
193-
tooltip="查看权限",
194+
tooltip=_("View permissions"), # 查看权限
194195
dialog=amis.Dialog(),
195196
level=LevelEnum.warning,
196197
)
@@ -199,7 +200,7 @@ class BaseSubPermAction(BaseSubAction):
199200
class schema(BaseModel):
200201
permissions: str = Field(
201202
"",
202-
title="权限列表",
203+
title=_("Permission list"), # 权限列表
203204
amis_form_item=amis.InputTree(
204205
multiple=True,
205206
source="",
@@ -236,7 +237,7 @@ class ViewSubPagePermAction(BaseSubPermAction):
236237
action = ActionType.Dialog(
237238
name="view_subject_page_permissions",
238239
icon="fa fa-check",
239-
tooltip="查看页面权限",
240+
tooltip=_("View page permissions"), # 查看页面权限
240241
dialog=amis.Dialog(actions=[]),
241242
level=LevelEnum.warning,
242243
)
@@ -254,13 +255,13 @@ async def get_init_data(self, request: Request, **kwargs) -> BaseApiOut[Any]:
254255
return BaseApiOut(data=self.schema())
255256
subject = await self.get_subject_by_id(item_id)
256257
if not subject:
257-
return BaseApiOut(status=0, msg="暂不支持的模型")
258+
return BaseApiOut(status=0, msg=_("Models not supported yet")) # 暂不支持的模型
258259
permissions = await get_subject_page_permissions(self.site.auth.enforcer, subject=subject, implicit=self._implicit)
259260
permissions = [perm.replace("#allow", "") for perm in permissions if perm.endswith("#allow")]
260261
return BaseApiOut(data=self.schema(permissions=",".join(permissions)))
261262

262263
async def handle(self, request: Request, item_id: List[str], data: BaseModel, **kwargs):
263-
return BaseApiOut(status=1, msg="请通过的【设置权限】更新设置!")
264+
return BaseApiOut(status=1, msg=_("Please update settings through [Setting Permissions]!")) # 请通过的【设置权限】更新设置!
264265

265266

266267
class UpdateSubDataPermAction(BaseSubPermAction):
@@ -271,18 +272,18 @@ class UpdateSubDataPermAction(BaseSubPermAction):
271272
action = ActionType.Dialog(
272273
name="update_subject_data_permissions",
273274
icon="fa fa-gavel",
274-
tooltip="更新数据权限",
275-
dialog=amis.Dialog(actions=[amis.Action(actionType="submit", label="保存", close=False, primary=True)]),
275+
tooltip=_("Update data permissions"), # 更新数据权限
276+
dialog=amis.Dialog(actions=[amis.Action(actionType="submit", label=_("Save"), close=False, primary=True)]), # 保存
276277
level=LevelEnum.warning,
277278
)
278279

279280
# 创建动作表单数据模型
280281
class schema(BaseSubPermAction.schema):
281282
effect_matrix: list = Field(
282283
[],
283-
title="当前权限",
284+
title=_("Current permissions"), # 当前权限
284285
amis_form_item=amis.MatrixCheckboxes(
285-
rowLabel="权限名称",
286+
rowLabel=_("Permission name"), # 权限名称
286287
multiple=False,
287288
singleSelectMode="row",
288289
source="",
@@ -291,9 +292,9 @@ class schema(BaseSubPermAction.schema):
291292
)
292293
policy_matrix: list = Field(
293294
[],
294-
title="权限配置",
295+
title=_("Rights Profile"), # 权限配置
295296
amis_form_item=amis.MatrixCheckboxes(
296-
rowLabel="名称",
297+
rowLabel=_("Name"), # 名称
297298
multiple=False,
298299
singleSelectMode="row",
299300
yCheckAll=True,
@@ -333,15 +334,15 @@ async def get_admin_action_perm_options(
333334
):
334335
columns = [
335336
{
336-
"label": "默认",
337+
"label": _("default"), # 默认
337338
"col": "default",
338339
},
339340
{
340-
"label": "是",
341+
"label": _("allow"), # 是
341342
"col": "allow",
342343
},
343344
{
344-
"label": "否",
345+
"label": _("deny"), # 否
345346
"col": "deny",
346347
},
347348
]
@@ -355,7 +356,7 @@ async def get_admin_action_perm_options(
355356
)
356357
if not permission:
357358
return out
358-
unique_id, action, *_ = permission_decode(permission)
359+
unique_id, action, *a = permission_decode(permission)
359360
admin, parent = self.site.get_page_schema_child(unique_id)
360361
if not admin:
361362
return out
@@ -392,7 +393,7 @@ async def handle(self, request: Request, item_id: List[str], data: BaseModel, **
392393
subject = await self.get_subject_by_id(item_id[0])
393394
identity = await self.site.auth.get_current_user_identity(request) or SystemUserEnum.GUEST
394395
if subject == "u:" + identity:
395-
return BaseApiOut(status=0, msg="不能修改自己的权限")
396+
return BaseApiOut(status=0, msg=_("Cannot modify own permissions")) # 不能修改自己的权限
396397
msg = await update_subject_data_permissions(
397398
self.site.auth.enforcer,
398399
subject=subject,
@@ -410,7 +411,7 @@ class UpdateSubPagePermsAction(ViewSubPagePermAction):
410411
action = ActionType.Dialog(
411412
name="update_subject_page_permissions",
412413
icon="fa fa-gavel",
413-
tooltip="更新页面权限",
414+
tooltip=_("Update page permissions"), # 更新页面权限
414415
dialog=amis.Dialog(),
415416
level=LevelEnum.warning,
416417
)
@@ -419,10 +420,10 @@ async def handle(self, request: Request, item_id: List[str], data: BaseModel, **
419420
"""更新角色Casbin权限"""
420421
subject = await self.get_subject_by_id(item_id[0])
421422
if not subject:
422-
return BaseApiOut(status=0, msg="暂不支持的模型")
423+
return BaseApiOut(status=0, msg=_("Models not supported yet")) # 暂不支持的模型
423424
identity = await self.site.auth.get_current_user_identity(request) or SystemUserEnum.GUEST
424425
if subject == "u:" + identity:
425-
return BaseApiOut(status=0, msg="不能修改自己的权限")
426+
return BaseApiOut(status=0, msg=_("Cannot modify own permissions")) # 不能修改自己的权限
426427
# 权限列表
427428
permissions = [perm for perm in data.permissions.split(",") if perm and perm.endswith("#page")] # 分割权限列表,去除空值
428429
enforcer: AsyncEnforcer = self.site.auth.enforcer
@@ -439,20 +440,20 @@ class CopyUserAuthLinkAction(ModelAction):
439440
action = amis.ActionType.Dialog(
440441
name="copy_user_auth_link",
441442
icon="fa fa-link",
442-
tooltip="用户免登录链接",
443+
tooltip=_("User login-free link"), # 用户免登录链接
443444
level=amis.LevelEnum.danger,
444445
dialog=amis.Dialog(
445446
size=amis.SizeEnum.md,
446-
title="用户免登录链接",
447+
title=_("User login-free link"), # 用户免登录链接
447448
),
448449
)
449450
form_init = True
450451
form = amis.Form(static=True, disabled=True) # type: ignore # 禁用表单
451452

452453
class schema(UsernameMixin, PkMixin):
453454
auth_url: str = Field(
454-
title="授权链接",
455-
description="复制链接到浏览器打开即可免登录",
455+
title=_("Authorization link"), # 授权链接
456+
description=_("Copy the link to your browser and open it without logging in"), # 复制链接到浏览器打开即可免登录
456457
amis_form_item=amis.Static(
457458
copyable=True,
458459
),
@@ -470,7 +471,7 @@ async def get_init_data(self, request: Request, **kwargs) -> BaseApiOut[Any]:
470471
}
471472
token = await auth.backend.token_store.write_token(token_data)
472473
return BaseApiOut(
473-
msg="操作成功",
474+
msg=_("Successful operation"), # 操作成功
474475
data={**token_data, "auth_url": f"{str(request.base_url)[:-1]}{self.site.router_path}/login_by_token?token={token}"},
475476
)
476477

fastapi_user_auth/admin/admin.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -271,15 +271,20 @@ class UserAdmin(AuthFieldModelAdmin, AuthSelectModelAdmin, SoftDeleteModelAdmin,
271271
lambda admin: UpdateSubPagePermsAction(
272272
admin=admin,
273273
name="update_subject_page_permissions",
274-
tooltip="更新用户页面权限",
274+
tooltip=_("Update user page permissions"), # 更新用户页面权限
275275
),
276276
lambda admin: UpdateSubDataPermAction(
277277
admin=admin,
278278
name="update_subject_data_permissions",
279-
tooltip="更新用户数据权限",
279+
tooltip=_("Update user data permissions"), # 更新用户数据权限
280280
),
281281
lambda admin: UpdateSubRolesAction(
282-
admin=admin, name="update_subject_roles", tooltip="更新用户角色", icon="fa fa-user", flags="item"
282+
admin=admin,
283+
name="update_subject_roles",
284+
tooltip=_("Update user role"),
285+
icon="fa fa-user",
286+
flags="item"
287+
# 更新用户角色
283288
),
284289
lambda admin: CopyUserAuthLinkAction(admin),
285290
]
@@ -328,15 +333,20 @@ class RoleAdmin(AutoTimeModelAdmin, FootableModelAdmin):
328333
lambda admin: UpdateSubPagePermsAction(
329334
admin=admin,
330335
name="update_subject_page_permissions",
331-
tooltip="更新角色页面权限",
336+
tooltip=_("Update role page permissions"), # 更新角色页面权限
332337
),
333338
lambda admin: UpdateSubDataPermAction(
334339
admin=admin,
335340
name="update_subject_data_permissions",
336-
tooltip="更新角色数据权限",
341+
tooltip=_("Update role data permissions"), # 更新角色数据权限
337342
),
338343
lambda admin: UpdateSubRolesAction(
339-
admin=admin, name="update_subject_roles", tooltip="更新子角色", icon="fa fa-user", flags="item"
344+
admin=admin,
345+
name="update_subject_roles",
346+
tooltip=_("Update sub-roles"),
347+
icon="fa fa-user",
348+
flags="item"
349+
# 更新子角色
340350
),
341351
]
342352

@@ -364,7 +374,7 @@ class CasbinRuleAdmin(ReadOnlyModelAdmin):
364374
admin=admin,
365375
action=ActionType.Ajax(
366376
id="refresh",
367-
label="刷新权限",
377+
label=_("Refresh permissions"), # 刷新权限
368378
icon="fa fa-refresh",
369379
level=LevelEnum.success,
370380
api=f"GET:{admin.router_path}/load_policy",
@@ -390,14 +400,14 @@ def register_router(self):
390400
async def _load_policy():
391401
await self.load_policy()
392402
get_admin_action_options.cache_clear() # 清除系统菜单缓存
393-
return BaseApiOut(data="刷新成功")
403+
return BaseApiOut(data=_("Refresh successful")) # 刷新成功
394404

395405
return super().register_router()
396406

397407

398408
class LoginHistoryAdmin(ReadOnlyModelAdmin):
399409
unique_id = "Auth>LoginHistoryAdmin"
400-
page_schema = PageSchema(label="登录历史", icon="fa fa-history")
410+
page_schema = PageSchema(label=_("Login history"), icon="fa fa-history") # 登录历史
401411
model = LoginHistory
402412
search_fields = [LoginHistory.login_name, LoginHistory.ip, LoginHistory.login_status, LoginHistory.user_agent]
403413
list_display = [

fastapi_user_auth/admin/utils.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from casbin import AsyncEnforcer
66
from fastapi_amis_admin.admin import FormAdmin, ModelAdmin, PageSchemaAdmin
77
from fastapi_amis_admin.admin.admin import AdminGroup, BaseActionAdmin, BaseAdminSite
8+
from fastapi_amis_admin.utils.translation import i18n as _
89

910
from fastapi_user_auth.auth.schemas import SystemUserEnum
1011
from fastapi_user_auth.utils.casbin import permission_encode, permission_enforce
@@ -28,10 +29,16 @@ def get_admin_action_options(
2829
if isinstance(admin, BaseActionAdmin):
2930
item["children"] = []
3031
if isinstance(admin, ModelAdmin):
31-
item["children"].append({"label": "查看列表", "value": permission_encode(admin.unique_id, "page:list", "page")})
32-
item["children"].append({"label": "筛选列表", "value": permission_encode(admin.unique_id, "page:filter", "page")})
32+
item["children"].append(
33+
{"label": _("View list"), "value": permission_encode(admin.unique_id, "page:list", "page")}
34+
) # 查看列表
35+
item["children"].append(
36+
{"label": _("Filter list"), "value": permission_encode(admin.unique_id, "page:filter", "page")}
37+
) # 筛选列表
3338
elif isinstance(admin, FormAdmin) and "submit" not in admin.registered_admin_actions:
34-
item["children"].append({"label": "提交", "value": permission_encode(admin.unique_id, "page:submit", "page")})
39+
item["children"].append(
40+
{"label": _("submit"), "value": permission_encode(admin.unique_id, "page:submit", "page")}
41+
) # 提交
3542
for admin_action in admin.registered_admin_actions.values():
3643
# todo admin_action 下可能有多个action,需要遍历
3744
item["children"].append(

fastapi_user_auth/auth/auth.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -303,15 +303,15 @@ async def request_login(self, request: Request, response: Response, username: st
303303
login_name=username,
304304
ip=request.client.host,
305305
user_agent=request.headers.get("user-agent"),
306-
login_status="登录成功",
306+
login_status=_("Login successful"), # 登录成功
307307
forwarded_for=forwarded_for,
308308
)
309309
self.db.add(history)
310310
if not user:
311-
history.login_status = "密码错误"
311+
history.login_status = _("Wrong password") # 密码错误
312312
return BaseApiOut(status=-1, msg=_("Incorrect username or password!"))
313313
if not user.is_active:
314-
history.login_status = "用户未激活"
314+
history.login_status = _("User is not activated") # 用户未激活
315315
return BaseApiOut(status=-2, msg=_("Inactive user status!"))
316316
request.scope["user"] = user
317317
token_info = UserLoginOut.parse_obj(request.user)

0 commit comments

Comments
 (0)