Skip to content

Commit 140a745

Browse files
committed
perf: 优化初始化排除权限字段方式
1 parent f883248 commit 140a745

File tree

4 files changed

+38
-44
lines changed

4 files changed

+38
-44
lines changed

fastapi_user_auth/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "0.6.1a1"
1+
__version__ = "0.6.1a3"
22
__url__ = "https://github.com/amisadmin/fastapi_user_auth"
33

44
import gettext

fastapi_user_auth/admin/admin.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
ReadOnlyModelAdmin,
5555
SoftDeleteModelAdmin,
5656
)
57-
from fastapi_user_auth.mixins.schemas import PermFieldsExclude
57+
from fastapi_user_auth.mixins.schemas import FieldPermEnum
5858

5959

6060
def attach_page_head(page: Page) -> Page:
@@ -287,16 +287,18 @@ class UserAdmin(AuthFieldModelAdmin, AuthSelectModelAdmin, SoftDeleteModelAdmin,
287287
UserRoleNameLabel,
288288
User.create_time,
289289
]
290-
perm_fields_exclude = PermFieldsExclude(
291-
all=[
290+
perm_fields_exclude = {
291+
FieldPermEnum.ALL: [
292292
"id",
293293
"username",
294294
"nickname",
295295
"avatar",
296296
"is_active",
297297
"create_time",
298+
"update_time",
299+
"delete_time",
298300
],
299-
)
301+
}
300302

301303
async def get_select(self, request: Request) -> Select:
302304
sel = await super().get_select(request)

fastapi_user_auth/mixins/admin.py

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import asyncio
22
from datetime import datetime
33
from functools import cached_property
4-
from typing import Any, Dict, List, Optional, Set, Union
4+
from typing import Any, Dict, List, Optional, Sequence, Set, Union
55

66
from fastapi_amis_admin import admin
77
from fastapi_amis_admin.admin import AdminAction, AdminApp
@@ -16,7 +16,7 @@
1616

1717
from fastapi_user_auth.admin.utils import get_schema_fields_name_label
1818
from fastapi_user_auth.auth.schemas import SystemUserEnum
19-
from fastapi_user_auth.mixins.schemas import PermFieldsExclude, SelectPerm
19+
from fastapi_user_auth.mixins.schemas import FieldPermEnum, SelectPerm
2020

2121

2222
class ReadOnlyModelAdmin(admin.ModelAdmin):
@@ -101,41 +101,31 @@ class BaseAuthFieldModelAdmin(admin.ModelAdmin):
101101
#todo 初步实现,未优化
102102
"""
103103

104-
perm_fields_exclude: PermFieldsExclude = PermFieldsExclude()
104+
perm_fields_exclude: Dict[int, Sequence[str]] = None
105105
"""exclude指定的字段,不进行权限验证."""
106106

107107
def __init__(self, app: "AdminApp"):
108108
super().__init__(app)
109109

110110
def get_permission_fields(self, action: str) -> Dict[str, str]:
111111
"""获取权限字段"""
112-
all_exclude = self.perm_fields_exclude.all or []
113-
if action == "list":
114-
list_exclude = self.perm_fields_exclude.list or []
115-
return get_schema_fields_name_label(
116-
self.schema_list, prefix="列表展示-", exclude_required=True, exclude=[*all_exclude, *list_exclude]
117-
)
118-
elif action == "filter":
119-
filter_exclude = self.perm_fields_exclude.filter or []
120-
return get_schema_fields_name_label(
121-
self.schema_filter, prefix="列表筛选-", exclude_required=True, exclude=[*all_exclude, *filter_exclude]
122-
)
123-
elif action == "create":
124-
create_exclude = self.perm_fields_exclude.create or []
125-
return get_schema_fields_name_label(
126-
self.schema_create, prefix="新增-", exclude_required=True, exclude=[*all_exclude, *create_exclude]
127-
)
128-
elif action == "read":
129-
read_exclude = self.perm_fields_exclude.read or []
130-
return get_schema_fields_name_label(
131-
self.schema_read, prefix="查看-", exclude_required=True, exclude=[*all_exclude, *read_exclude]
132-
)
133-
elif action == "update":
134-
update_exclude = self.perm_fields_exclude.update or []
135-
return get_schema_fields_name_label(
136-
self.schema_update, prefix="更新-", exclude_required=True, exclude=[*all_exclude, *update_exclude]
137-
)
138-
return {}
112+
if not self.perm_fields_exclude:
113+
return {}
114+
info = {
115+
"list": (self.schema_list, "列表展示-", FieldPermEnum.LIST),
116+
"filter": (self.schema_filter, "列表筛选-", FieldPermEnum.FILTER),
117+
"create": (self.schema_create, "新增-", FieldPermEnum.CREATE),
118+
"read": (self.schema_read, "查看-", FieldPermEnum.READ),
119+
"update": (self.schema_update, "更新-", FieldPermEnum.UPDATE),
120+
}
121+
if action not in info:
122+
return {}
123+
schema, prefix, perm = info[action]
124+
exlude = set()
125+
for k, fileds in self.perm_fields_exclude.items():
126+
if (k & perm) == perm:
127+
exlude.update(set(fileds))
128+
return get_schema_fields_name_label(schema, prefix=prefix, exclude_required=True, exclude=exlude)
139129

140130
@cached_property
141131
def create_permission_fields(self) -> Dict[str, str]:

fastapi_user_auth/mixins/schemas.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
from dataclasses import dataclass
22
from datetime import datetime, timedelta
3-
from typing import Awaitable, Callable, List, Optional, Sequence, Union
3+
from enum import Enum
4+
from typing import Awaitable, Callable, List, Union
45

56
from fastapi_amis_admin.admin import ModelAdmin
67
from sqlalchemy.sql import Select
78
from starlette.requests import Request
89

910

10-
@dataclass
11-
class PermFieldsExclude:
12-
all: Optional[Sequence[str]] = None
13-
list: Optional[Sequence[str]] = None
14-
filter: Optional[Sequence[str]] = None
15-
create: Optional[Sequence[str]] = None
16-
read: Optional[Sequence[str]] = None
17-
update: Optional[Sequence[str]] = None
11+
class FieldPermEnum(int, Enum):
12+
LIST = 1 << 0
13+
FILTER = 1 << 1
14+
CREATE = 1 << 2
15+
READ = 1 << 3
16+
UPDATE = 1 << 4
17+
ALL = LIST | FILTER | CREATE | READ | UPDATE
18+
VIEW = LIST | FILTER | READ
19+
EDIT = CREATE | UPDATE
1820

1921

2022
SelectPermCallable = Callable[[ModelAdmin, Request, Select], Union[Select, Awaitable[Select]]]

0 commit comments

Comments
 (0)