Auto register permission

This commit is contained in:
long2ice
2020-08-14 16:16:34 +08:00
parent ae339347d6
commit 866b87141c
7 changed files with 39 additions and 48 deletions

View File

@@ -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.

View File

@@ -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"
)

View File

@@ -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(

View File

@@ -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"

View File

@@ -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(

View File

@@ -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

View File

@@ -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"]