Fix custom plugin downloaders

Change get_as_dataframe call signature
This commit is contained in:
phil 2024-04-06 13:11:38 +05:30
parent 08c53cf894
commit 52e1d2135b
9 changed files with 156 additions and 105 deletions

View file

@ -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,
)

View file

@ -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: