Fix/update baskets:

- get_file
- import
- Basket importers must return BasketImportResult
Add API points
Fix utils delete_df and upsert_df, also making them async friendly
Auth: add helper functions to UserRead
This commit is contained in:
phil 2024-04-09 16:16:04 +05:30
parent 52e1d2135b
commit d2ae5e4d7b
9 changed files with 323 additions and 182 deletions

View file

@ -1,9 +1,11 @@
import logging
from fastapi import Depends, APIRouter, HTTPException, status, responses
from fastapi import (Depends, APIRouter, HTTPException, status, responses,
UploadFile)
from fastapi.responses import FileResponse
from gisaf.models.admin import AdminBasket, BasketNameOnly
from gisaf.models.authentication import User
from gisaf.models.admin import AdminBasket, BasketImportResult, BasketNameOnly
from gisaf.models.authentication import User, UserRead
from gisaf.security import get_current_active_user
from gisaf.admin import manager
@ -40,3 +42,55 @@ async def get_basket(
## TODO: Fix projects
# projects=getattr(basket, 'projects', None)
)
@api.post('/basket/upload/{name}')
async def upload_basket_file(
name: str,
file: UploadFile,
user: UserRead = Depends(get_current_active_user),
):
try:
basket = manager.baskets[name]
except KeyError:
raise HTTPException(status.HTTP_404_NOT_FOUND, f'No basket named {name}')
fileItem = await basket.add_files(file, user)
return fileItem
@api.get('/basket/download/{name}/{file_id}/{file_name}')
async def download_basket_file(
name: str,
file_id: int,
file_name: str,
user: User = Depends(get_current_active_user),
) -> FileResponse:
try:
basket = manager.baskets[name]
except KeyError:
raise HTTPException(status.HTTP_404_NOT_FOUND, f'No basket named {name}')
if basket.role:
if not user.has_role(basket.role):
raise HTTPException(status.HTTP_401_UNAUTHORIZED)
file_record = await basket.get_file(file_id)
if file_record is None:
raise HTTPException(status.HTTP_404_NOT_FOUND, f'No import file id {file_id}')
return FileResponse(file_record.path)
@api.get('/basket/import/{basket}/{file_id}')
async def import_basket_file(
basket: str,
file_id: int,
dryRun: bool = False,
user: User = Depends(get_current_active_user),
) -> BasketImportResult:
if not (user and user.has_role('reviewer')):
raise HTTPException(status.HTTP_401_UNAUTHORIZED)
basket_ = manager.baskets[basket]
file_import = await basket_.get_file(file_id)
if file_import is None:
raise HTTPException(status.HTTP_404_NOT_FOUND, f'No import file id {file_id}')
try:
result = await basket_.import_file(file_import, dryRun)
## FIXME: shouldn't it be AdminImportError?
except ImportError as err:
raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR, err)
return result