integrated pagination with tortoise

This commit is contained in:
Simone Robutti 2022-12-02 17:34:58 +01:00
parent 34f8374082
commit 0f8ed8d8b3
6 changed files with 15 additions and 21 deletions

View File

@ -1,10 +0,0 @@
from typing import List
from fastapi_pagination import paginate
from tortoise import Model
async def transform_and_paginate(model, model_list: List[Model]):
return paginate(
[await model.to_pydantic().from_tortoise_orm(x) for x in model_list]
)

View File

@ -1,12 +1,10 @@
from fastapi_pagination import Page
from fastapi_pagination.ext.tortoise import paginate
from mobilizon_reshare.models.event import Event
from mobilizon_reshare.storage.query.read import get_all_events
from mobilizon_reshare.web import transform_and_paginate
def register_endpoints(app):
@app.get("/events", status_code=200, response_model=Page[Event.to_pydantic()])
async def get_events():
all_events = await get_all_events()
return await transform_and_paginate(Event, all_events)
return await paginate(Event, prefetch_related=True)

View File

@ -30,10 +30,15 @@ def register_endpoints(app):
register_publication_endpoints(app)
def init_endpoints(app):
register_endpoints(app)
add_pagination(app)
@app.on_event("startup")
async def init_app(init_logging=True):
check_database()
await init_db(init_logging=init_logging)
register_endpoints(app)
add_pagination(app)
init_endpoints(app)
return app

View File

@ -1,7 +1,7 @@
from fastapi_pagination import Page
from fastapi_pagination.ext.tortoise import paginate
from mobilizon_reshare.models.publication import Publication
from mobilizon_reshare.web import transform_and_paginate
def register_endpoints(app):
@ -9,4 +9,4 @@ def register_endpoints(app):
"/publications", status_code=200, response_model=Page[Publication.to_pydantic()]
)
async def get_publications():
return await transform_and_paginate(Publication, await Publication.all())
return await paginate(Publication, prefetch_related=True)

View File

@ -3,7 +3,7 @@ import urllib3
from httpx import AsyncClient
from mobilizon_reshare.storage import db
from mobilizon_reshare.web.backend.main import app, register_endpoints
from mobilizon_reshare.web.backend.main import app, init_endpoints
@pytest.fixture(scope="session")
@ -13,7 +13,8 @@ def anyio_backend():
@pytest.fixture()
async def client():
register_endpoints(app)
init_endpoints(app)
async with AsyncClient(app=app, base_url="http://test") as client:
yield client

View File

@ -14,4 +14,4 @@ async def test_events(client: AsyncClient, event_model_generator):
response = await client.get("/events")
assert response.status_code == 200
expected = await Event.to_pydantic().from_tortoise_orm(event)
assert response.json()[0] == json.loads(expected.json())
assert response.json()["items"][0] == json.loads(expected.json())