Skip to content

Commit

Permalink
Code cleaning after major dependencies updates
Browse files Browse the repository at this point in the history
Signed-off-by: Johannes Ott <[email protected]>

Make prediction page to default page and remove dashboard

Signed-off-by: Johannes Ott <[email protected]>

Small codestyle

Signed-off-by: Johannes Ott <[email protected]>

Remove unused imports

Signed-off-by: Johannes Ott <[email protected]>

Fix deprecated styling things in ui after upgrading to 15.X

Signed-off-by: Johannes Ott <[email protected]>

Refactor AuthGuard to functional Guard

CanActivate Interface is deprecated from Angular 15

Signed-off-by: Johannes Ott <[email protected]>

Cleanup Sonarlint findings in UI

Signed-off-by: Johannes Ott <[email protected]>

Cleanup python code

Signed-off-by: Johannes Ott <[email protected]>
  • Loading branch information
DerOetzi committed Apr 29, 2023
1 parent 2506f63 commit c46aca8
Show file tree
Hide file tree
Showing 55 changed files with 931 additions and 1,036 deletions.
10 changes: 5 additions & 5 deletions core/learninghouse/__init__.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
from typing import Optional

from fastapi import __version__ as fastapi_version
from jose import __version__ as jose_version
from loguru import __version__ as loguru_version
from numpy.version import version as np_version
from pandas import __version__ as pd_version
from passlib import __version__ as passlib_version
from pydantic.version import VERSION as pydantic_version
from sklearn import __version__ as skl_version
from uvicorn import __version__ as uvicorn_version
from jose import __version__ as jose_version
from passlib import __version__ as passlib_version
from loguru import __version__ as loguru_version

from learninghouse.models import LearningHouseVersions

from ._version import get_versions

__version__ = get_versions()['version']
__version__ = get_versions()["version"]
del get_versions

versions = LearningHouseVersions(
Expand All @@ -27,5 +27,5 @@
pandas=pd_version,
jose=jose_version,
passlib=passlib_version,
loguru=loguru_version
loguru=loguru_version,
)
2 changes: 1 addition & 1 deletion core/learninghouse/__main__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from learninghouse.service import run

if __name__ == '__main__':
if __name__ == "__main__":
run()
34 changes: 15 additions & 19 deletions core/learninghouse/api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,45 +1,41 @@
from fastapi import APIRouter, Depends

from learninghouse import versions
from learninghouse.api import brain, configuration, auth
from learninghouse.api import auth, brain, configuration
from learninghouse.api.errors import LearningHouseSecurityException
from learninghouse.core.settings import service_settings
from learninghouse.models import LearningHouseVersions
from learninghouse.services.auth import auth_service

api = APIRouter(
prefix='/api',
prefix="/api",
responses={
LearningHouseSecurityException.STATUS_CODE:
LearningHouseSecurityException.api_description()
})
LearningHouseSecurityException.STATUS_CODE: LearningHouseSecurityException.api_description()
},
)

api.include_router(brain.router)
api.include_router(configuration.router)

api.include_router(auth.router)


@api.get('/mode',
response_model=str,
tags=['service'])
@api.get("/mode", response_model=str, tags=["service"])
def get_mode():
mode = service_settings().environment
if auth_service().is_initial_admin_password:
mode = 'initial'
mode = "initial"

return mode


@api.get('/versions',
response_model=LearningHouseVersions,
summary='Get versions',
description='Get versions of the service and the used libraries',
tags=['service'],
responses={
200: {
'description': 'Successfully retrieved versions'
}
})
@api.get(
"/versions",
response_model=LearningHouseVersions,
summary="Get versions",
description="Get versions of the service and the used libraries",
tags=["service"],
responses={200: {"description": "Successfully retrieved versions"}},
)
def get_versions():
return versions
70 changes: 38 additions & 32 deletions core/learninghouse/api/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,76 +3,82 @@
from fastapi import APIRouter, Depends, Path

from learninghouse.api.errors.auth import InvalidPassword
from learninghouse.models.auth import (APIKey, APIKeyInfo, APIKeyRequest,
LoginRequest, PasswordRequest, Token,
UserRole)
from learninghouse.models.auth import (
APIKey,
APIKeyInfo,
APIKeyRequest,
LoginRequest,
PasswordRequest,
Token,
UserRole,
)
from learninghouse.services.auth import auth_service

auth = auth_service()

router = APIRouter(
prefix='/auth',
tags=['auth']
)
router = APIRouter(prefix="/auth", tags=["auth"])


@router.post('/token',
response_model=Token,
responses={
200: {
'description': 'Successfully retrieve token'
},
InvalidPassword.STATUS_CODE: InvalidPassword.api_description()
})
@router.post(
"/token",
response_model=Token,
responses={
200: {"description": "Successfully retrieve token"},
InvalidPassword.STATUS_CODE: InvalidPassword.api_description(),
},
)
async def post_token(request: LoginRequest):
return auth.create_token(request.password)


@router.put('/token',
response_model=Token)
@router.put("/token", response_model=Token)
async def put_token(refresh_token_jti: str = Depends(auth.protect_refresh)):
return auth.refresh_token(refresh_token_jti)


@router.delete('/token',
response_model=bool)
@router.delete("/token", response_model=bool)
async def delete_token(refresh_token_jti: Union[str, None] = Depends(auth.get_refresh)):
return auth.revoke_refresh_token(refresh_token_jti)


router_protected = APIRouter(
dependencies=[Depends(auth.protect_admin)]
)
router_protected = APIRouter(dependencies=[Depends(auth.protect_admin)])


@router_protected.delete('/tokens', response_model=bool)
@router_protected.delete("/tokens", response_model=bool)
async def delete_tokens():
return auth.revoke_all_refresh_tokens()


@router_protected.put('/password', response_model=bool)
@router_protected.put("/password", response_model=bool)
async def update_password(request: PasswordRequest, _=Depends(auth.protect_admin)):
return auth.update_password(request.old_password, request.new_password)


if not auth.is_initial_admin_password:
@router_protected.get('/apikeys', response_model=List[APIKeyInfo])

@router_protected.get("/apikeys", response_model=List[APIKeyInfo])
async def list_api_keys():
return auth.list_api_keys()

@router_protected.post('/apikey', response_model=APIKey)
@router_protected.post("/apikey", response_model=APIKey)
async def create_apikey(request: APIKeyRequest):
return auth.create_apikey(request)

@router_protected.delete('/apikey/{description}', response_model=str)
async def delete_apikey(description: str = Path(min_length=3,
max_length=15,
regex=r'^[A-Za-z]\w{1,13}[A-Za-z0-9]$',
example='app_as_user')):
@router_protected.delete("/apikey/{description}", response_model=str)
async def delete_apikey(
description: str = Path(
min_length=3,
max_length=15,
regex=r"^[A-Za-z]\w{1,13}[A-Za-z0-9]$",
example="app_as_user",
)
):
return auth.delete_apikey(description)


router.include_router(router_protected)


@router.get('/role', response_model=UserRole)
@router.get("/role", response_model=UserRole)
def role(user_role: UserRole = Depends(auth.protect_user)):
return user_role
120 changes: 60 additions & 60 deletions core/learninghouse/api/brain.py
Original file line number Diff line number Diff line change
@@ -1,88 +1,88 @@
from fastapi import APIRouter, Depends

from learninghouse.api.errors.brain import (BrainNoConfiguration,
BrainNotActual, BrainNotEnoughData,
BrainNotTrained)
from learninghouse.models.brain import (BrainInfo, BrainPredictionRequest,
BrainPredictionResult,
BrainTrainingRequest)
from learninghouse.services.brain import Brain, BrainService
from learninghouse.api.errors.brain import (
BrainNoConfiguration,
BrainNotActual,
BrainNotEnoughData,
BrainNotTrained,
)
from learninghouse.models.brain import (
BrainInfo,
BrainPredictionRequest,
BrainPredictionResult,
BrainTrainingRequest,
)
from learninghouse.services.auth import auth_service
from learninghouse.services.brain import Brain, BrainService

auth = auth_service()

router = APIRouter(
prefix='/brain',
tags=['brain']
)
router = APIRouter(prefix="/brain", tags=["brain"])

router_usage = APIRouter(
dependencies=[Depends(auth.protect_user)]
)
router_usage = APIRouter(dependencies=[Depends(auth.protect_user)])

router_training = APIRouter(
dependencies=[Depends(auth.protect_trainer)]
)
router_training = APIRouter(dependencies=[Depends(auth.protect_trainer)])


@router_usage.get('/{name}/info',
response_model=BrainInfo,
summary='Retrieve information',
description='Retrieve all information of a trained brain.',
responses={
200: {
'description': 'Information of the trained brain'
},
BrainNotTrained.STATUS_CODE: BrainNotTrained.api_description()
})
@router_usage.get(
"/{name}/info",
response_model=BrainInfo,
summary="Retrieve information",
description="Retrieve all information of a trained brain.",
responses={
200: {"description": "Information of the trained brain"},
BrainNotTrained.STATUS_CODE: BrainNotTrained.api_description(),
},
)
async def info_get(name: str):
brain_config = Brain.load_trained(name)
return brain_config.info


@router_training.post('/{name}/training',
response_model=BrainInfo,
summary='Train the brain again',
description='After version updates train the brain with existing data.',
responses={
200: {
'description': 'Information of the trained brain'
},
BrainNotEnoughData.STATUS_CODE: BrainNotEnoughData.api_description(),
BrainNoConfiguration.STATUS_CODE: BrainNoConfiguration.api_description()
})
@router_training.post(
"/{name}/training",
response_model=BrainInfo,
summary="Train the brain again",
description="After version updates train the brain with existing data.",
responses={
200: {"description": "Information of the trained brain"},
BrainNotEnoughData.STATUS_CODE: BrainNotEnoughData.api_description(),
BrainNoConfiguration.STATUS_CODE: BrainNoConfiguration.api_description(),
},
)
async def training_post(name: str):
return BrainService.request(name)


@router_training.put('/{name}/training',
response_model=BrainInfo,
summary='Train the brain with new data',
description='Train the brain with additional data.',
responses={
200: {
'description': 'Information of the trained brain'
},
BrainNotEnoughData.STATUS_CODE: BrainNotEnoughData.api_description(),
BrainNoConfiguration.STATUS_CODE: BrainNoConfiguration.api_description()
})
@router_training.put(
"/{name}/training",
response_model=BrainInfo,
summary="Train the brain with new data",
description="Train the brain with additional data.",
responses={
200: {"description": "Information of the trained brain"},
BrainNotEnoughData.STATUS_CODE: BrainNotEnoughData.api_description(),
BrainNoConfiguration.STATUS_CODE: BrainNoConfiguration.api_description(),
},
)
async def training_put(name: str, request_data: BrainTrainingRequest):
return BrainService.request(name, request_data.dict())


@router_usage.post('/{name}/prediction',
response_model=BrainPredictionResult,
summary='Prediction',
description='Predict a new dataset with given brain.',
responses={
200: {
'description': 'Prediction result'
},
BrainNotActual.STATUS_CODE: BrainNotActual.api_description(),
BrainNotTrained.STATUS_CODE: BrainNotTrained.api_description()
})
@router_usage.post(
"/{name}/prediction",
response_model=BrainPredictionResult,
summary="Prediction",
description="Predict a new dataset with given brain.",
responses={
200: {"description": "Prediction result"},
BrainNotActual.STATUS_CODE: BrainNotActual.api_description(),
BrainNotTrained.STATUS_CODE: BrainNotTrained.api_description(),
},
)
async def prediction_post(name: str, request_data: BrainPredictionRequest):
return BrainService.prediction(name, request_data.dict())


router.include_router(router_usage)
router.include_router(router_training)
Loading

0 comments on commit c46aca8

Please sign in to comment.