Files
fastapi-admin/docs/features.md
2020-09-21 17:50:02 +08:00

5.1 KiB

Builtin Auth And Permissions Control

You should inherit fastapi_admin.models.AbstractUser,fastapi_admin.models.AbstractPermission,fastapi_admin.models.AbstractRole and add extra fields.

from fastapi_admin.models import AbstractUser,AbstractPermission,AbstractRole

class AdminUser(AbstractUser):
    is_active = fields.BooleanField(default=False, description='Is Active')
    is_superuser = fields.BooleanField(default=False, description='Is Superuser')
    status = fields.IntEnumField(Status, description='User Status')
    created_at = fields.DatetimeField(auto_now_add=True)
    updated_at = fields.DatetimeField(auto_now=True)

class Permission(AbstractPermission):
    """
    must inheritance AbstractPermission
    """


class Role(AbstractRole):
    """
    must inheritance AbstractRole
    """
    users = fields.ManyToManyField("models.AdminUser")


class AdminLog(AbstractAdminLog):
    """
    must inheritance AbstractAdminLog
    """
    users = fields.ManyToManyField("models.AdminUser")

And set permission=True to active it:

await admin_app.init(
    ...
    permission=True,
    site=Site(
        ...
    ),
)

And createsuperuser:

> fastapi-admin -h
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:
  {createsuperuser}

Custom Login

You can write your own login view logic:

await admin_app.init(
    ...
    login_view="examples.routes.login"
)

And must return json like:

{
  "user": {
    "username": "admin",
    "is_superuser": false,
    "avatar": "https://avatars2.githubusercontent.com/u/13377178?s=460&u=d150d522579f41a52a0b3dd8ea997e0161313b6e&v=4"
  },
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoyfQ.HSlcYkOEQewxyPuaqcVwCcw_wkbLB50Ws1-ZxfPoLAQ"
}

Enum Support

When you define a enum field of tortoise-orm,like IntEnumField,you can inherit fastapi_admin.enums.EnumMixin and impl choices() method, FastAPI-Admin will auto read and display and render a select widget in front.

class Status(EnumMixin, IntEnum):
    on = 1
    off = 2

    @classmethod
    def choices(cls):
        return {
            cls.on: 'ON',
            cls.off: 'OFF'
        }

Help Text

FastAPI-Admin will auto read description defined in tortoise-orm model Field and display in front with form help text.

ForeignKeyField Support

If ForeignKeyField not passed in menu.raw_id_fields,FastAPI-Admin will get all related objects and display select in front with Model.__str__.

ManyToManyField Support

FastAPI-Admin will render ManyToManyField with multiple select in form edit with Model.__str__.

JSONField Render

FastAPI-Admin will render JSONField with jsoneditor as beauty interface.

Search Fields

Defined menu.search_fields in menu will render a search form by fields.

Xlsx Export

FastAPI-Admin can export searched data to excel file when define export=True in menu.

Bulk Actions

Current FastAPI-Admin support builtin bulk action delete_all,if you want write your own bulk actions:

  1. pass bulk_actions in Menu,example:
Menu(
    ...
    bulk_actions=[{
        'value': 'delete', # this is fastapi router path param.
        'text': 'delete_all', # this will show in front.
    }]
)
  1. write fastapi route,example:
from fastapi_admin.schemas import BulkIn
from fastapi_admin.factory import app as admin_app

@admin_app.post(
    '/rest/{resource}/bulk/delete' # `delete` is defined in Menu before.
)
async def bulk_delete(
        bulk_in: BulkIn,
        model=Depends(get_model)
):
    await model.filter(pk__in=bulk_in.pk_list).delete()
    return {'success': True}

Default Menus

Default, FastAPI-Admin provide default menus by your models, without doing tedious works.

Table Variant

You can define RowVariant and CellVariants in computed of tortoise-orm, which will effect table rows and cells variant.

class User(AbstractUser):
    last_login = fields.DatetimeField(description="Last Login", default=datetime.datetime.now)
    avatar = fields.CharField(max_length=200, default="")
    intro = fields.TextField(default="")
    created_at = fields.DatetimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.pk}#{self.username}"

    def rowVariant(self) -> str:
        if not self.is_active:
            return "warning"
        return ""

    def cellVariants(self) -> dict:
        if self.is_active:
            return {
                "intro": "info",
            }
        return {}

    class PydanticMeta:
        computed = ("rowVariant", "cellVariants")

Admin log

You can log each admin action like delete,create and update,just set admin_log=True in admin_app.init() and inherit fastapi_admin.models.AbstractAdminLog.

Import from excel

You can enable import by set import_=True in Menu definition, and data format must same as Model fields.