Repository navigation
Expand file tree
/
Copy pathapp.py
More file actions
79 lines (66 loc) · 2.51 KB
/
Copy pathapp.py
File metadata and controls
79 lines (66 loc) · 2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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)