Skip to content
Snippets Groups Projects
Commit 7a1c670e authored by Tim Repke's avatar Tim Repke
Browse files

drop sqlmodel and switch to sqlalchemy 2

parent 52b1396e
No related branches found
No related tags found
No related merge requests found
......@@ -3,7 +3,7 @@ SERVER__PORT=8081
SERVER__CORS_ORIGINS='["http://localhost:8080", "http://localhost:8081","http://localhost", "http://0.0.0.0:8081","http://0.0.0.0", "http://127.0.0.1:8081","http://127.0.0.1"]'
SERVER__HEADER_CORS=true
DB__HOST="nacsos_postgres"
DB__HOST="localhost"
DB__PORT=5432
DB__USER="root"
DB__PASSWORD="root"
......
fastapi==0.75.1
fastapi==0.77.1
hypercorn==0.13.2
toml==0.10.2
email-validator==1.1.3
......
......@@ -9,6 +9,7 @@ from .util.middlewares import TimingMiddleware
from .util.config import settings
from .util.logging import get_logger
from .api import router as api_router
from nacsos_data.db import DatabaseEngine
import mimetypes
......@@ -38,3 +39,14 @@ logger.debug('Setup routers')
app.include_router(api_router, prefix='/api')
app.mount('/', StaticFiles(directory=settings.SERVER.STATIC_FILES, html=True), name='static')
db_engine = DatabaseEngine(host=settings.DB.HOST,
port=settings.DB.PORT,
user=settings.DB.USER,
password=settings.DB.PASSWORD,
database=settings.DB.DATABASE)
# @app.on_event("startup")
# def on_startup():
# db_engine.startup()
from fastapi import APIRouter
from server.util.logging import get_logger
from nacsos_data.models.users import User
from nacsos_data.schemas.users import UserModel
from server.data.users import get_users
logger = get_logger('nacsos.api.route.admin.users')
router = APIRouter()
@router.get('/', response_model=list[User])
async def get_all_users() -> list[User]:
@router.get('/', response_model=list[UserModel])
async def get_all_users() -> list[UserModel]:
return get_users()
from fastapi import APIRouter
from nacsos_data.models.annotations import AnnotationTask, AnnotationTaskLabel, AnnotationTaskLabelChoice
from nacsos_data.schemas.annotations import AnnotationTaskModel, AnnotationTaskLabel, AnnotationTaskLabelChoice
router = APIRouter()
@router.get('/task_definition/{task_id}', response_model=AnnotationTask)
async def get_task_definition(task_id: int) -> AnnotationTask:
@router.get('/task_definition/{task_id}', response_model=AnnotationTaskModel)
async def get_task_definition(task_id: int) -> AnnotationTaskModel:
"""
This endpoint returns the detailed definition of an annotation task.
......@@ -13,43 +13,46 @@ async def get_task_definition(task_id: int) -> AnnotationTask:
:return: a single annotation task
"""
ATLC = AnnotationTaskLabelChoice
return AnnotationTask(id=task_id, project_id=1, name='Test Task', description='This is a test.',
labels=[
AnnotationTaskLabel(name='Relevance', key='rel', kind='bool'),
AnnotationTaskLabel(name='Claims', key='claim', kind='single', max_repeat=2, choices=[
ATLC(name='Global Warming is not Happening', value=0,
child=AnnotationTaskLabel(
name='Sub-claims',
key='sub-gw', kind='single',
choices=[ATLC(name='Ice isn\'t melting', value=0),
ATLC(name='Heading to ice age', value=1),
ATLC(name='Weather is cold', value=2),
ATLC(name='Hiatus is warming', value=3)]
)),
ATLC(name='Human GG are not causing global warming', value=1,
child=AnnotationTaskLabel(
name='Sub-claims',
key='sub-gg', kind='single',
choices=[ATLC(name='It\'s natural cycles', value=0),
ATLC(name='Non-GHG forcings', value=1),
ATLC(name='No evidence for GH effect', value=2),
ATLC(name='CO2 not rising', value=3)]
))
])
])
return AnnotationTaskModel(
id=task_id, project_id=1, name='Test Task', description='This is a test.',
labels=[
AnnotationTaskLabel(name='Relevance', key='rel', kind='bool'),
AnnotationTaskLabel(name='Claims', key='claim', kind='single', max_repeat=2,
choices=[
ATLC(name='Global Warming is not Happening', value=0,
child=AnnotationTaskLabel(
name='Sub-claims',
key='sub-gw', kind='single',
choices=[ATLC(name='Ice isn\'t melting', value=0),
ATLC(name='Heading to ice age', value=1),
ATLC(name='Weather is cold', value=2),
ATLC(name='Hiatus is warming', value=3)]
)),
ATLC(name='Human GG are not causing global warming', value=1,
child=AnnotationTaskLabel(
name='Sub-claims',
key='sub-gg', kind='single',
choices=[ATLC(name='It\'s natural cycles', value=0),
ATLC(name='Non-GHG forcings', value=1),
ATLC(name='No evidence for GH effect', value=2),
ATLC(name='CO2 not rising', value=3)]
))
])
])
@router.get('/project_tasks/{project_id}', response_model=list[AnnotationTask])
async def get_task_definitions_for_project(project_id: int) -> list[AnnotationTask]:
@router.get('/project_tasks/{project_id}', response_model=list[AnnotationTaskModel])
async def get_task_definitions_for_project(project_id: int) -> list[AnnotationTaskModel]:
"""
This endpoint returns the detailed definitions of all annotation tasks associated with a project.
:param project_id: database id of the project
:return: list of annotation tasks
"""
return [AnnotationTask(id=2, project_id=project_id, name='Annotation Task 1', description='This is a test (1).',
labels=[AnnotationTaskLabel(name='Relevance', key='rel', kind='bool')]),
AnnotationTask(id=3, project_id=project_id, name='Annotation Task 2', description='This is a test (2).',
labels=[AnnotationTaskLabel(name='Relevance', key='rel', kind='bool')]),
AnnotationTask(id=4, project_id=project_id, name='Annotation Task 3', description='This is a test (3).',
labels=[AnnotationTaskLabel(name='Relevance', key='rel', kind='bool')])]
return [
AnnotationTaskModel(id=2, project_id=project_id, name='Annotation Task 1', description='This is a test (1).',
labels=[AnnotationTaskLabel(name='Relevance', key='rel', kind='bool')]),
AnnotationTaskModel(id=3, project_id=project_id, name='Annotation Task 2', description='This is a test (2).',
labels=[AnnotationTaskLabel(name='Relevance', key='rel', kind='bool')]),
AnnotationTaskModel(id=4, project_id=project_id, name='Annotation Task 3', description='This is a test (3).',
labels=[AnnotationTaskLabel(name='Relevance', key='rel', kind='bool')])]
......@@ -4,7 +4,7 @@ from datetime import timedelta
from fastapi import APIRouter, Body, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
from nacsos_data.models.users import User
from nacsos_data.schemas.users import UserModel
from server.util.security import Token, authenticate_user, get_current_active_user, create_access_token
from server.util.config import settings
......@@ -32,8 +32,8 @@ async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(
return {"access_token": access_token, "token_type": "bearer"}
@router.get("/me", response_model=User)
async def read_users_me(current_user: User = Depends(get_current_active_user)):
@router.get("/me", response_model=UserModel)
async def read_users_me(current_user: UserModel = Depends(get_current_active_user)):
return current_user
# @router.post("/login/access-token", response_model=Token)
......
from typing import Optional
from nacsos_data.models.users import User
from nacsos_data.schemas.users import UserModel, UserInDBModel
from server.util.config import settings
fake_user_db = {
'user1': User(id=1, username='user1', full_name='User One', email='user1@addr.net',
password='$2b$12$wxfjv2pPPX69nP0g2n0omO8txGVcUKkeKIFN6mChN6dtXKT.wXDXG', # 1234
is_active=True, is_superuser=True),
'user2': User(id=2, username='user2', full_name='User Two', email='user2@addr.net', password='1234',
is_active=False, is_superuser=True),
'user3': User(id=3, username='user3', full_name='User Three', email='user3@addr.net', password='1234',
is_active=False, is_superuser=False),
'user4': User(id=4, username='user4', full_name='User Four', email='user4@addr.net', password='1234',
is_active=True, is_superuser=False),
'user1': UserInDBModel(id='b0949d0ee3e147c39a5da2cbbdc2ea23', username='user1',
full_name='User One', email='user1@addr.net',
password='$2b$12$wxfjv2pPPX69nP0g2n0omO8txGVcUKkeKIFN6mChN6dtXKT.wXDXG', # 1234
is_active=True, is_superuser=True),
'user2': UserInDBModel(id='a385234054fd410b8de63db6caa0855a', username='user2',
full_name='User Two', email='user2@addr.net',
password='$2b$12$wxfjv2pPPX69nP0g2n0omO8txGVcUKkeKIFN6mChN6dtXKT.wXDXG', # 1234
is_active=False, is_superuser=True),
'user3': UserInDBModel(id='acbd3dab9f3841dea871e001c15e97f3', username='user3',
full_name='User Three', email='user3@addr.net',
password='$2b$12$wxfjv2pPPX69nP0g2n0omO8txGVcUKkeKIFN6mChN6dtXKT.wXDXG', # 1234
is_active=False, is_superuser=False),
'user4': UserInDBModel(id='b918d7614e0a4fb2886c8f6a741ae106', username='user4',
full_name='User Four', email='user4@addr.net',
password='$2b$12$wxfjv2pPPX69nP0g2n0omO8txGVcUKkeKIFN6mChN6dtXKT.wXDXG', # 1234
is_active=True, is_superuser=False),
}
def get_user(uid: Optional[int] = None, username: Optional[str] = None) -> Optional[User]:
def get_user(uid: Optional[int] = None, username: Optional[str] = None) -> Optional[UserModel]:
# TODO db: Session = Depends(get_db)
if username is not None and username in fake_user_db:
......@@ -26,5 +33,5 @@ def get_user(uid: Optional[int] = None, username: Optional[str] = None) -> Optio
return None
def get_users() -> list[User]:
def get_users() -> list[UserModel]:
return list(fake_user_db.values())
......@@ -5,7 +5,7 @@ from jose import JWTError, jwt
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from passlib.context import CryptContext
from nacsos_data.models.users import User
from nacsos_data.schemas.users import UserModel
from server.data.users import get_user
from server.util.config import settings
......@@ -13,6 +13,7 @@ from server.util.logging import get_logger
logger = get_logger('nacsos.util.security')
class Token(BaseModel):
access_token: str
token_type: str
......@@ -34,11 +35,11 @@ def get_password_hash(password):
return pwd_context.hash(password)
def authenticate_user(username: str, password: str):
def authenticate_user(username: str, plain_password: str):
user = get_user(username=username)
if not user:
return False
if not verify_password(password, user.password):
if not verify_password(plain_password, user.password):
return False
return user
......@@ -74,33 +75,15 @@ async def get_current_user(token: str = Depends(oauth2_scheme)):
return user
async def get_current_active_user(current_user: User = Depends(get_current_user)) -> User:
async def get_current_active_user(current_user: UserModel = Depends(get_current_user)) -> UserModel:
if not current_user.is_active:
raise HTTPException(status_code=400, detail="Inactive user")
return current_user
def get_current_active_superuser(current_user: User = Depends(get_current_user)) -> User:
def get_current_active_superuser(current_user: UserModel = Depends(get_current_user)) -> UserModel:
if not current_user.is_superuser:
raise HTTPException(
status_code=400, detail="The user doesn't have enough privileges"
)
return current_user
# def get_current_user(
# db: Session = Depends(get_db), token: str = Depends(reusable_oauth2)
# ) -> models.User:
# try:
# payload = jwt.decode(
# token, settings.SERVER.SECRET_KEY, algorithms=[security.ALGORITHM]
# )
# token_data = schemas.TokenPayload(**payload)
# except (jwt.JWTError, ValidationError):
# raise HTTPException(
# status_code=status.HTTP_403_FORBIDDEN,
# detail="Could not validate credentials",
# )
# user = crud.user.get(db, id=token_data.sub)
# if not user:
# raise HTTPException(status_code=404, detail="User not found")
# return user
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment