add xlsx export

This commit is contained in:
long2ice
2020-04-10 23:30:57 +08:00
parent c04b7d7d9d
commit 3cdfdd2b36
14 changed files with 274 additions and 199 deletions

View File

@@ -1,9 +1,10 @@
from fastapi import Depends
from . import login, other, index
from . import login, site, index, other
from ..depends import jwt_required
from ..factory import app
app.include_router(login.router)
app.include_router(other.router, dependencies=[Depends(jwt_required)])
app.include_router(other.router)
app.include_router(site.router, dependencies=[Depends(jwt_required)])
app.include_router(index.router, dependencies=[Depends(jwt_required)])

View File

@@ -1,21 +1,43 @@
from fastapi import APIRouter
import io
from ..factory import app
import xlsxwriter
from fastapi import APIRouter, Depends
from starlette.responses import StreamingResponse, FileResponse
from tortoise.contrib.pydantic import pydantic_model_creator
from fastapi_admin.depends import QueryItem, get_model, get_query
from fastapi_admin.factory import app
router = APIRouter()
@router.get(
'/home',
'/{resource}/export'
)
async def home():
return {
'title': "Welcome to REST ADMIN"
}
async def export(
resource: str,
query: QueryItem = Depends(get_query),
model=Depends(get_model)
):
qs = model.all()
if query.where:
qs = qs.filter(**query.where)
resource = await app.get_resource(resource)
result = await qs
creator = pydantic_model_creator(model, include=resource.resource_fields.keys(), exclude=model._meta.m2m_fields)
data = map(lambda x: creator.from_orm(x).dict(), result)
output = io.BytesIO()
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet()
for row, item in enumerate(data):
col = 0
for k, v in item.items():
if row == 0:
worksheet.write(row, col, k)
worksheet.write(row + 1, col, v)
col += 1
@router.get(
'/site',
)
async def site():
return app.site.dict(by_alias=True, exclude_unset=True)
workbook.close()
output.seek(0)
return StreamingResponse(output)

View File

@@ -0,0 +1,21 @@
from fastapi import APIRouter
from ..factory import app
router = APIRouter()
@router.get(
'/home',
)
async def home():
return {
'title': "Welcome to REST ADMIN"
}
@router.get(
'/site',
)
async def site():
return app.site.dict(by_alias=True, exclude_unset=True)