mirror of
https://github.com/fastapi-admin/fastapi-admin.git
synced 2026-03-13 10:32:25 +08:00
Auto register permission
This commit is contained in:
@@ -5,6 +5,10 @@ ChangeLog
|
||||
0.2
|
||||
===
|
||||
|
||||
0.3.1
|
||||
-----
|
||||
- Auto register permission.
|
||||
|
||||
0.3.0
|
||||
-----
|
||||
- Search_fields not required.
|
||||
@@ -38,4 +42,4 @@ ChangeLog
|
||||
0.2.5
|
||||
-----
|
||||
- Now there has builtin menus.
|
||||
- Fix field type.
|
||||
- Fix field type.
|
||||
|
||||
13
README.md
13
README.md
@@ -90,7 +90,7 @@ fast_app.mount('/admin', admin_app)
|
||||
|
||||
@fast_app.on_event('startup')
|
||||
async def startup():
|
||||
admin_app.init(
|
||||
await admin_app.init(
|
||||
admin_secret="test",
|
||||
permission=True,
|
||||
site=Site(
|
||||
@@ -136,7 +136,7 @@ class Role(AbstractRole):
|
||||
And set `permission=True` to active it:
|
||||
|
||||
```python
|
||||
admin_app.init(
|
||||
await admin_app.init(
|
||||
...
|
||||
permission=True,
|
||||
site=Site(
|
||||
@@ -145,19 +145,20 @@ admin_app.init(
|
||||
)
|
||||
```
|
||||
|
||||
And register permissions and createsuperuser:
|
||||
And createsuperuser:
|
||||
|
||||
```shell
|
||||
> fastapi-admin -h
|
||||
usage: fastapi-admin [-h] -c CONFIG {register_permissions,createsuperuser} ...
|
||||
usage: fastapi-admin [-h] -c CONFIG [--version] {createsuperuser} ...
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-c CONFIG, --config CONFIG
|
||||
Tortoise-orm config dict import path,like settings.TORTOISE_ORM.
|
||||
--version, -V show the version
|
||||
|
||||
subcommands:
|
||||
{register_permissions,createsuperuser}
|
||||
{createsuperuser}
|
||||
```
|
||||
|
||||
### Custom Login
|
||||
@@ -165,7 +166,7 @@ subcommands:
|
||||
You can write your own login view logic:
|
||||
|
||||
```python
|
||||
admin_app.init(
|
||||
await admin_app.init(
|
||||
...
|
||||
login_view="examples.routes.login"
|
||||
)
|
||||
|
||||
@@ -28,14 +28,14 @@ async def test_bulk(bulk_in: BulkIn, model=Depends(get_model)):
|
||||
return ret.dict()
|
||||
|
||||
|
||||
@admin_app.get("/home",)
|
||||
@admin_app.get("/home", )
|
||||
async def home():
|
||||
return {"html": templates.get_template("home.html").render()}
|
||||
|
||||
|
||||
def create_app():
|
||||
fast_app = FastAPI(debug=False)
|
||||
register_tortoise(fast_app, config=TORTOISE_ORM, generate_schemas=True)
|
||||
register_tortoise(fast_app, config=TORTOISE_ORM)
|
||||
fast_app.mount("/admin", admin_app)
|
||||
|
||||
fast_app.add_middleware(
|
||||
@@ -54,7 +54,7 @@ app = create_app()
|
||||
|
||||
@app.on_event("startup")
|
||||
async def start_up():
|
||||
admin_app.init( # nosec
|
||||
await admin_app.init( # nosec
|
||||
admin_secret="test",
|
||||
permission=True,
|
||||
site=Site(
|
||||
|
||||
@@ -5,4 +5,4 @@ def version():
|
||||
# with open("pyproject.toml") as f:
|
||||
# ret = re.findall(r'version = "(\d+\.\d+\.\d+)"', f.read())
|
||||
# return ret[0]
|
||||
return "0.3.0"
|
||||
return "0.3.1"
|
||||
|
||||
@@ -5,9 +5,8 @@ from colorama import Fore, init
|
||||
from prompt_toolkit import PromptSession
|
||||
from tortoise import Tortoise, run_async
|
||||
|
||||
from fastapi_admin import enums, version
|
||||
from fastapi_admin.common import get_all_models, import_obj, pwd_context
|
||||
from fastapi_admin.models import AbstractPermission
|
||||
from fastapi_admin import version
|
||||
from fastapi_admin.common import import_obj, pwd_context
|
||||
|
||||
init(autoreset=True)
|
||||
|
||||
@@ -30,30 +29,6 @@ async def init_tortoise(args):
|
||||
await Tortoise.init(config=import_obj(args.config))
|
||||
|
||||
|
||||
async def register_permissions(args):
|
||||
await init_tortoise(args)
|
||||
await Tortoise.generate_schemas()
|
||||
permission_model = None
|
||||
for model_name, model in get_all_models():
|
||||
if issubclass(model, AbstractPermission):
|
||||
permission_model = model
|
||||
break
|
||||
if not permission_model:
|
||||
Logger.error("No Permission Model Founded.")
|
||||
return
|
||||
if args.clean:
|
||||
await permission_model.all().delete()
|
||||
Logger.waring("Cleaned all permissions success.")
|
||||
|
||||
for model, _ in get_all_models():
|
||||
for action in enums.PermissionAction:
|
||||
label = f"{enums.PermissionAction.choices().get(action)} {model}"
|
||||
defaults = dict(label=label, model=model, action=action,)
|
||||
_, created = await permission_model.get_or_create(**defaults,)
|
||||
if created:
|
||||
Logger.success(f"Create permission {label} success.")
|
||||
|
||||
|
||||
async def createsuperuser(args):
|
||||
await init_tortoise(args)
|
||||
|
||||
@@ -92,11 +67,6 @@ def cli():
|
||||
version=f"fastapi-admin version, {version()}",
|
||||
help="show the version",
|
||||
)
|
||||
parser_register_permissions = subparsers.add_parser("register_permissions")
|
||||
parser_register_permissions.add_argument(
|
||||
"--clean", required=False, action="store_true", help="Clean up old permissions then renew."
|
||||
)
|
||||
parser_register_permissions.set_defaults(func=register_permissions)
|
||||
|
||||
parser_createsuperuser = subparsers.add_parser("createsuperuser")
|
||||
parser_createsuperuser.add_argument(
|
||||
|
||||
@@ -5,6 +5,7 @@ from fastapi import FastAPI, HTTPException
|
||||
from starlette.status import HTTP_403_FORBIDDEN
|
||||
from tortoise import Model
|
||||
|
||||
from . import enums
|
||||
from .common import get_all_models, import_obj, pwd_context
|
||||
from .exceptions import exception_handler
|
||||
from .models import AbstractPermission, AbstractRole, AbstractUser
|
||||
@@ -127,7 +128,7 @@ class AdminApp(FastAPI):
|
||||
menus += permission_menus
|
||||
return menus
|
||||
|
||||
def init(
|
||||
async def init(
|
||||
self,
|
||||
site: Site,
|
||||
admin_secret: str,
|
||||
@@ -137,10 +138,8 @@ class AdminApp(FastAPI):
|
||||
"""
|
||||
init admin site
|
||||
:param login_view:
|
||||
:param tortoise_app:
|
||||
:param permission: active builtin permission
|
||||
:param site:
|
||||
:param user_model: admin user model path,like admin.models.user
|
||||
:param admin_secret: admin jwt secret.
|
||||
:return:
|
||||
"""
|
||||
@@ -154,12 +153,29 @@ class AdminApp(FastAPI):
|
||||
self._inited = True
|
||||
if not site.menus:
|
||||
site.menus = self._build_default_menus(permission)
|
||||
if permission:
|
||||
await self._register_permissions()
|
||||
self._get_model_menu_mapping(site.menus)
|
||||
if login_view:
|
||||
self.add_api_route("/login", import_obj(login_view), methods=["POST"])
|
||||
else:
|
||||
self.add_api_route("/login", login, methods=["POST"])
|
||||
|
||||
async def _register_permissions(self):
|
||||
permission_model = None
|
||||
for model_name, model in get_all_models():
|
||||
if issubclass(model, AbstractPermission):
|
||||
permission_model = model
|
||||
break
|
||||
if not permission_model:
|
||||
raise Exception("No Permission Model Founded.")
|
||||
|
||||
for model, _ in get_all_models():
|
||||
for action in enums.PermissionAction:
|
||||
label = f"{enums.PermissionAction.choices().get(action)} {model}"
|
||||
defaults = dict(label=label, model=model, action=action,)
|
||||
await permission_model.get_or_create(**defaults,)
|
||||
|
||||
def _exclude_field(self, resource: str, field: str):
|
||||
"""
|
||||
exclude field by menu include and exclude
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "fastapi-admin"
|
||||
version = "0.3.0"
|
||||
version = "0.3.1"
|
||||
description = "Fast Admin Dashboard based on fastapi and tortoise-orm and rest-admin."
|
||||
authors = ["long2ice <long2ice@gmail.com>"]
|
||||
license = "Apache-2.0"
|
||||
@@ -47,4 +47,4 @@ build-backend = "poetry.masonry.api"
|
||||
fastapi-admin = "fastapi_admin.cli:main"
|
||||
|
||||
[tool.poetry.extras]
|
||||
uvloop = ["uvloop"]
|
||||
uvloop = ["uvloop"]
|
||||
|
||||
Reference in New Issue
Block a user