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:
parent
52e1d2135b
commit
d2ae5e4d7b
9 changed files with 323 additions and 182 deletions
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue