Fix custom plugin downloaders
Change get_as_dataframe call signature
This commit is contained in:
parent
08c53cf894
commit
52e1d2135b
9 changed files with 156 additions and 105 deletions
|
@ -9,11 +9,13 @@ from sqlalchemy.orm import selectinload, joinedload
|
|||
|
||||
from gisaf.database import pandas_query, fastapi_db_session as db_session
|
||||
from gisaf.models.geo_models_base import GeoModel, PlottableModel
|
||||
from gisaf.models.info import Downloader
|
||||
from gisaf.security import (
|
||||
Token, authenticate_user, get_current_active_user, create_access_token,
|
||||
)
|
||||
from gisaf.models.authentication import (User, UserRead, Role, RoleRead)
|
||||
from gisaf.registry import registry, NotInRegistry
|
||||
from gisaf.plugins import DownloadResponse, manager as plugin_manager
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -47,7 +49,8 @@ async def download_csv(
|
|||
if custom_getter:
|
||||
df = await custom_getter(model_id)
|
||||
else:
|
||||
df = await values_model.get_as_dataframe(model_id=model_id, with_only_columns=[value])
|
||||
item = await db_session.get(model, model_id)
|
||||
df = await values_model.get_as_dataframe(item=item, with_only_columns=[value])
|
||||
if len(df) == 0:
|
||||
raise HTTPException(status.HTTP_204_NO_CONTENT)
|
||||
if resample and resample != '0':
|
||||
|
@ -75,3 +78,49 @@ async def download_csv(
|
|||
'Content-Disposition': f"attachment; filename={filename}"
|
||||
})
|
||||
return response
|
||||
|
||||
|
||||
@api.get('/plugin/{name}/{store}/{id}')
|
||||
async def execute_action(
|
||||
name: str,
|
||||
store: str,
|
||||
id: int,
|
||||
db_session: db_session,
|
||||
user: Annotated[UserRead, Depends(get_current_active_user)]
|
||||
):
|
||||
"""
|
||||
Download the result of an action
|
||||
"""
|
||||
## TODO: implement permissions for actions
|
||||
#await check_permission(info.context['request'], 'action')
|
||||
try:
|
||||
store_record = registry.stores.loc[store]
|
||||
model: type[GeoModel] = store_record.model
|
||||
values_model = registry.values_for_model[model][0]
|
||||
except KeyError:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
|
||||
item = await db_session.get(model, id)
|
||||
dls: list[Downloader] = [dl for dl in plugin_manager.downloaders_stores[store]
|
||||
if dl.name == name]
|
||||
if len(dls) == 0:
|
||||
raise HTTPException(status.HTTP_501_NOT_IMPLEMENTED,
|
||||
detail=f'No downloader {name} for {store}')
|
||||
elif len(dls) > 1:
|
||||
raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=f'Too many downloaders ({len(dls)}) {name} for {store}')
|
||||
downloader = dls[0]
|
||||
result: DownloadResponse
|
||||
try:
|
||||
result = await downloader._plugin.execute(model, item)
|
||||
except Exception as err:
|
||||
logging.exception(err)
|
||||
raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=f'Error in action: {err.args[0]}'
|
||||
)
|
||||
return StreamingResponse(
|
||||
iter([result.content]),
|
||||
headers = {
|
||||
'Content-Disposition': f'attachment; filename="{result.file_name}"'
|
||||
},
|
||||
media_type=result.content_type,
|
||||
)
|
|
@ -178,11 +178,14 @@ async def get_model_list(
|
|||
return resp
|
||||
|
||||
@api.get('/{store_name}/values/{value}')
|
||||
async def get_model_values(store_name: str, value: str,
|
||||
response: Response,
|
||||
where: str,
|
||||
resample: str | None = None,
|
||||
):
|
||||
async def get_model_values(
|
||||
db_session: db_session,
|
||||
store_name: str,
|
||||
value: str,
|
||||
response: Response,
|
||||
where: str,
|
||||
resample: str | None = None,
|
||||
):
|
||||
"""
|
||||
Get values
|
||||
"""
|
||||
|
@ -202,7 +205,8 @@ async def get_model_values(store_name: str, value: str,
|
|||
if getter:
|
||||
df = await getter(model_id)
|
||||
else:
|
||||
df = await values_model.get_as_dataframe(model_id=model_id,
|
||||
item = await db_session.get(model, model_id)
|
||||
df = await values_model.get_as_dataframe(item=item,
|
||||
with_only_columns=[value])
|
||||
|
||||
if len(df) == 0:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue