Files
2022-07-25 18:25:04 +08:00

80 lines
2.5 KiB
Python

from typing import Dict, List, Optional, Type
import redis.asyncio as redis
from fastapi import FastAPI
from pydantic import HttpUrl
from starlette.middleware.base import BaseHTTPMiddleware
from tortoise import Model
from fastapi_admin import i18n
from . import middlewares, template
from .providers import Provider
from .resources import Dropdown
from .resources import Model as ModelResource
from .resources import Resource
from .routes import router
class FastAPIAdmin(FastAPI):
logo_url: str
login_logo_url: str
admin_path: str
resources: List[Type[Resource]] = []
model_resources: Dict[Type[Model], Type[Resource]] = {}
redis: redis.Redis
language_switch: bool = True
favicon_url: Optional[HttpUrl] = None
async def configure(
self,
redis: redis.Redis,
logo_url: str = None,
default_locale: str = "en_US",
language_switch: bool = True,
admin_path: str = "/admin",
template_folders: Optional[List[str]] = None,
providers: Optional[List[Provider]] = None,
favicon_url: Optional[HttpUrl] = None,
):
self.redis = redis
i18n.set_locale(default_locale)
self.admin_path = admin_path
self.language_switch = language_switch
self.logo_url = logo_url
self.favicon_url = favicon_url
if template_folders:
template.add_template_folder(*template_folders)
await self._register_providers(providers)
async def _register_providers(self, providers: Optional[List[Provider]] = None):
for p in providers or []:
await p.register(self)
def register_resources(self, *resource: Type[Resource]):
for r in resource:
self.register(r)
def _set_model_resource(self, resource: Type[Resource]):
if issubclass(resource, ModelResource):
self.model_resources[resource.model] = resource
elif issubclass(resource, Dropdown):
for r in resource.resources:
self._set_model_resource(r)
def register(self, resource: Type[Resource]):
self._set_model_resource(resource)
self.resources.append(resource)
def get_model_resource(self, model: Type[Model]):
r = self.model_resources.get(model)
return r() if r else None
app = FastAPIAdmin(
title="FastAdmin",
description="A fast admin dashboard based on fastapi and tortoise-orm with tabler ui.",
)
app.add_middleware(BaseHTTPMiddleware, dispatch=middlewares.language_processor)
app.include_router(router)