From fc63176642e246d3dd3065f391dfa366d3e557fe Mon Sep 17 00:00:00 2001 From: lvrossem Date: Mon, 27 Mar 2023 23:19:59 +0200 Subject: [PATCH] Enough for today --- .gitignore | 2 +- src/crud.py | 15 +++++++------- src/enums.py | 20 ++++++++++++++++++ src/main.py | 4 ++-- src/models.py | 6 +++--- src/schemas.py | 38 ----------------------------------- src/schemas/courseprogress.py | 12 +++++++++++ src/schemas/highscores.py | 17 ++++++++++++++++ src/schemas/users.py | 18 +++++++++++++++++ 9 files changed, 80 insertions(+), 52 deletions(-) delete mode 100644 src/schemas.py create mode 100644 src/schemas/courseprogress.py create mode 100644 src/schemas/highscores.py create mode 100644 src/schemas/users.py diff --git a/.gitignore b/.gitignore index 804f5ce..30fbb48 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ venv/* venv -src/__pycache__* \ No newline at end of file +*__pycache__* \ No newline at end of file diff --git a/src/crud.py b/src/crud.py index 77c25aa..ae879e3 100644 --- a/src/crud.py +++ b/src/crud.py @@ -1,23 +1,22 @@ from sqlalchemy.orm import Session from models import User, HighScore, CourseProgress -from . import models, schemas - +import schemas, models def get_user(db: Session, user_id: int): - return db.query(models.User).filter(models.User.id == user_id).first() + return db.query(models.User).filter(models.User.user_id == user_id).first() def get_user_by_username(db: Session, username: str): - return db.query(User).filter(User.email == email).first() + return db.query(User).filter(models.User.username == username).first() -def get_users(db: Session, skip: int = 0, limit: int = 100): - return db.query(User).all() +def get_users(db: Session): + return db.query(models.User).all() -def create_user(db: Session, username: str, hashed_password: str): - db_user = models.User(username=username, hashed_password=hashed_password) +def create_user(db: Session, user: schemas.users.UserCreate): + db_user = models.User(username=user.username, hashed_password=user.hashed_password) db.add(db_user) db.commit() db.refresh(db_user) diff --git a/src/enums.py b/src/enums.py index b9e9f43..01e323e 100644 --- a/src/enums.py +++ b/src/enums.py @@ -1,4 +1,24 @@ from fastapi_utils.enums import StrEnum +from sqlalchemy.types import TypeDecorator, Enum + + +class StrEnumType(TypeDecorator): + impl = Enum + + def __init__(self, enum_class, **kw): + self.enum_class = enum_class + super().__init__(enum_class, **kw) + + def process_bind_param(self, value, dialect): + if value is None: + return None + return value.value + + def process_result_value(self, value, dialect): + if value is None: + return None + return self.enum_class(value) + class MinigameEnum(StrEnum): SpellingBee = 'SpellingBee' diff --git a/src/main.py b/src/main.py index 813da20..0df2cce 100644 --- a/src/main.py +++ b/src/main.py @@ -2,7 +2,7 @@ from fastapi import Depends, FastAPI, HTTPException from sqlalchemy.orm import Session from models import Base from database import SessionLocal, engine -from schemas import UserCreate +from schemas.users import UserCreate, User import crud app = FastAPI() @@ -17,7 +17,7 @@ def get_db(): db.close() -@app.post("/users/", response_model=schemas.User) +@app.post("/users/", response_model=User) def create_user(user: UserCreate, db: Session = Depends(get_db)): db_user = crud.get_user_by_email(db, email=user.email) if db_user: diff --git a/src/models.py b/src/models.py index 522af50..ffc5f60 100644 --- a/src/models.py +++ b/src/models.py @@ -2,7 +2,7 @@ from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Float from sqlalchemy.orm import relationship from enum import Enum -from enums import MinigameEnum, CourseEnum +from enums import MinigameEnum, CourseEnum, StrEnumType from database import Base @@ -22,7 +22,7 @@ class HighScore(Base): high_score_id = Column(Integer, primary_key=True, index=True) score_value = Column(Float, nullable=False) - minigame = Column(Enum(MinigameEnum), nullable=False) + minigame = Column(StrEnumType(MinigameEnum), nullable=False) owner = Column(Integer, ForeignKey("users.user_id")) @@ -31,6 +31,6 @@ class CourseProgress(Base): course_progress_id = Column(Integer, primary_key=True, index=True) progress_value = Column(Float, nullable=False) - course = Column(Enum(CourseEnum), nullable=False) + course = Column(StrEnumType(CourseEnum), nullable=False) owner = Column(Integer, ForeignKey("users.user_id")) diff --git a/src/schemas.py b/src/schemas.py deleted file mode 100644 index 0f084f2..0000000 --- a/src/schemas.py +++ /dev/null @@ -1,38 +0,0 @@ -from pydantic import BaseModel -from enums import MinigameEnum, CourseEnum - -class User(BaseModel): - user_id: int - username: str - hashed_password: str - - high_scores: list[HighScore] = [] - course_progresses: list[CourseProgress] = [] - - class Config: - orm_mode = True - - -class UserCreate(BaseModel): - username: str - password: str - - -class HighScore(BaseModel): - high_score_id: int - score_value: float - minigame: MinigameEnum - owner: User - - class Config: - orm_mode = True - - -class CourseProgress(BaseModel): - course_progress_id: int - progress_value: float - course: CourseEnum - owner: User - - class Config: - orm_mode = True \ No newline at end of file diff --git a/src/schemas/courseprogress.py b/src/schemas/courseprogress.py new file mode 100644 index 0000000..8f42a4a --- /dev/null +++ b/src/schemas/courseprogress.py @@ -0,0 +1,12 @@ +from pydantic import BaseModel +from enums import CourseEnum + + +class CourseProgress(BaseModel): + course_progress_id: int + progress_value: float + course: CourseEnum + owner: int + + class Config: + orm_mode = True diff --git a/src/schemas/highscores.py b/src/schemas/highscores.py new file mode 100644 index 0000000..3cf35af --- /dev/null +++ b/src/schemas/highscores.py @@ -0,0 +1,17 @@ +from pydantic import BaseModel +from src.enums import MinigameEnum + + +class HighScore(BaseModel): + high_score_id: int + score_value: float + minigame: MinigameEnum + owner_id: "User" + + class Config: + orm_mode = True + + +# It's ugly, but I have no choice +from users import User +HighScore.update_forward_refs() \ No newline at end of file diff --git a/src/schemas/users.py b/src/schemas/users.py new file mode 100644 index 0000000..7ae799b --- /dev/null +++ b/src/schemas/users.py @@ -0,0 +1,18 @@ +from pydantic import BaseModel + + +class User(BaseModel): + user_id: int + username: str + hashed_password: str + + high_scores: list[int] = [] + course_progresses: list[int] = [] + + class Config: + orm_mode = True + + +class UserCreate(BaseModel): + username: str + password: str