From c8f6aff996cb111c0d4ef969dd11670dfdeeb558 Mon Sep 17 00:00:00 2001 From: swve Date: Mon, 1 Apr 2024 12:20:29 +0200 Subject: [PATCH] chore: adapt to SQLModel 16 & SQLAlchemy 2.x --- apps/api/src/db/trails.py | 3 +- apps/api/src/routers/auth.py | 2 +- apps/api/src/routers/dev.py | 2 +- apps/api/src/routers/users.py | 2 +- apps/api/src/security/auth.py | 2 +- apps/api/src/security/rbac/rbac.py | 4 +- apps/api/src/services/ai/ai.py | 12 +++--- .../block_types/imageBlock/imageBlock.py | 6 +-- .../blocks/block_types/pdfBlock/pdfBlock.py | 6 +-- .../block_types/videoBlock/videoBlock.py | 6 +-- .../services/courses/activities/activities.py | 10 ++--- .../src/services/courses/activities/pdf.py | 2 +- .../src/services/courses/activities/video.py | 8 ++-- apps/api/src/services/courses/chapters.py | 12 +++--- apps/api/src/services/courses/collections.py | 12 +++--- apps/api/src/services/courses/courses.py | 40 +++++++++---------- apps/api/src/services/install/install.py | 20 +++++----- apps/api/src/services/orgs/orgs.py | 22 +++++----- apps/api/src/services/orgs/users.py | 8 ++-- apps/api/src/services/roles/roles.py | 8 ++-- apps/api/src/services/trail/trail.py | 12 +++--- apps/api/src/services/users/password_reset.py | 4 +- apps/api/src/services/users/usergroups.py | 14 +++---- apps/api/src/services/users/users.py | 26 ++++++------ 24 files changed, 120 insertions(+), 123 deletions(-) diff --git a/apps/api/src/db/trails.py b/apps/api/src/db/trails.py index 950388d6..da6238c0 100644 --- a/apps/api/src/db/trails.py +++ b/apps/api/src/db/trails.py @@ -20,8 +20,7 @@ class Trail(TrailBase, table=True): class TrailCreate(TrailBase): pass - -# trick because Lists are not supported in SQLModel (runs: list[TrailRun] ) +# TODO: This is a hacky way to get around the list[TrailRun] issue, find a better way to do this class TrailRead(BaseModel): id: Optional[int] = Field(default=None, primary_key=True) trail_uuid: Optional[str] diff --git a/apps/api/src/routers/auth.py b/apps/api/src/routers/auth.py index fd6e87e9..535ebe74 100644 --- a/apps/api/src/routers/auth.py +++ b/apps/api/src/routers/auth.py @@ -65,7 +65,7 @@ async def login( expires=int(timedelta(hours=8).total_seconds()), ) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) result = { "user": user, diff --git a/apps/api/src/routers/dev.py b/apps/api/src/routers/dev.py index e5d11d23..79698abe 100644 --- a/apps/api/src/routers/dev.py +++ b/apps/api/src/routers/dev.py @@ -8,7 +8,7 @@ router = APIRouter() @router.get("/config") async def config(): config = get_learnhouse_config() - return config.dict() + return config.model_dump() diff --git a/apps/api/src/routers/users.py b/apps/api/src/routers/users.py index e226f6b6..5dc621f3 100644 --- a/apps/api/src/routers/users.py +++ b/apps/api/src/routers/users.py @@ -42,7 +42,7 @@ async def api_get_current_user(current_user: User = Depends(get_current_user)): """ Get current user """ - return current_user.dict() + return current_user.model_dump() @router.get("/session") diff --git a/apps/api/src/security/auth.py b/apps/api/src/security/auth.py index f90bf9d6..dc9c6fd7 100644 --- a/apps/api/src/security/auth.py +++ b/apps/api/src/security/auth.py @@ -96,7 +96,7 @@ async def get_current_user( user = await security_get_user(request, db_session, email=token_data.username) # type: ignore # treated as an email if user is None: raise credentials_exception - return PublicUser(**user.dict()) + return PublicUser(**user.model_dump()) else: return AnonymousUser() diff --git a/apps/api/src/security/rbac/rbac.py b/apps/api/src/security/rbac/rbac.py index 4ce18736..2e92ff09 100644 --- a/apps/api/src/security/rbac/rbac.py +++ b/apps/api/src/security/rbac/rbac.py @@ -103,7 +103,7 @@ async def authorization_verify_based_on_roles( # Find in roles list if there is a role that matches users action for this type of element for role in user_roles_in_organization_and_standard_roles: - role = Role.from_orm(role) + role = Role.model_validate(role) if role.rights: rights = role.rights if rights[element_type][f"action_{action}"] is True: @@ -135,7 +135,7 @@ async def authorization_verify_based_on_org_admin_status( # Find in roles list if there is a role that matches users action for this type of element for role in user_roles_in_organization_and_standard_roles: - role = Role.from_orm(role) + role = Role.model_validate(role) if role.id == 1 or role.id == 2: return True else: diff --git a/apps/api/src/services/ai/ai.py b/apps/api/src/services/ai/ai.py index 5b8cc7b7..8afc7f51 100644 --- a/apps/api/src/services/ai/ai.py +++ b/apps/api/src/services/ai/ai.py @@ -37,7 +37,7 @@ def ai_start_activity_chat_session( ) activity = db_session.exec(statement).first() - activity = ActivityRead.from_orm(activity) + activity = ActivityRead.model_validate(activity) # Get the Course statement = ( @@ -46,7 +46,7 @@ def ai_start_activity_chat_session( .where(Activity.activity_uuid == chat_session_object.activity_uuid) ) course = db_session.exec(statement).first() - course = CourseRead.from_orm(course) + course = CourseRead.model_validate(course) # Get the Organization statement = select(Organization).where(Organization.id == course.org_id) @@ -85,7 +85,7 @@ def ai_start_activity_chat_session( result = db_session.exec(statement) org_config = result.first() - org_config = OrganizationConfig.from_orm(org_config) + org_config = OrganizationConfig.model_validate(org_config) embeddings = org_config.config["AIConfig"]["embeddings"] ai_model = org_config.config["AIConfig"]["ai_model"] @@ -131,7 +131,7 @@ def ai_send_activity_chat_message( ) activity = db_session.exec(statement).first() - activity = ActivityRead.from_orm(activity) + activity = ActivityRead.model_validate(activity) # Get the Course statement = ( @@ -140,7 +140,7 @@ def ai_send_activity_chat_message( .where(Activity.activity_uuid == chat_session_object.activity_uuid) ) course = db_session.exec(statement).first() - course = CourseRead.from_orm(course) + course = CourseRead.model_validate(course) # Get the Organization statement = select(Organization).where(Organization.id == course.org_id) @@ -176,7 +176,7 @@ def ai_send_activity_chat_message( result = db_session.exec(statement) org_config = result.first() - org_config = OrganizationConfig.from_orm(org_config) + org_config = OrganizationConfig.model_validate(org_config) embeddings = org_config.config["AIConfig"]["embeddings"] ai_model = org_config.config["AIConfig"]["ai_model"] diff --git a/apps/api/src/services/blocks/block_types/imageBlock/imageBlock.py b/apps/api/src/services/blocks/block_types/imageBlock/imageBlock.py index 8e5ce688..34ceab64 100644 --- a/apps/api/src/services/blocks/block_types/imageBlock/imageBlock.py +++ b/apps/api/src/services/blocks/block_types/imageBlock/imageBlock.py @@ -54,7 +54,7 @@ async def create_image_block( block = Block( activity_id=activity.id if activity.id else 0, block_type=BlockTypeEnum.BLOCK_IMAGE, - content=block_data.dict(), + content=block_data.model_dump(), org_id=org.id if org.id else 0, course_id=course.id if course.id else 0, block_uuid=block_uuid, @@ -67,7 +67,7 @@ async def create_image_block( db_session.commit() db_session.refresh(block) - block = BlockRead.from_orm(block) + block = BlockRead.model_validate(block) return block @@ -80,7 +80,7 @@ async def get_image_block( if block: - block = BlockRead.from_orm(block) + block = BlockRead.model_validate(block) return block else: diff --git a/apps/api/src/services/blocks/block_types/pdfBlock/pdfBlock.py b/apps/api/src/services/blocks/block_types/pdfBlock/pdfBlock.py index 48c06a20..1d60a33b 100644 --- a/apps/api/src/services/blocks/block_types/pdfBlock/pdfBlock.py +++ b/apps/api/src/services/blocks/block_types/pdfBlock/pdfBlock.py @@ -55,7 +55,7 @@ async def create_pdf_block( block = Block( activity_id=activity.id if activity.id else 0, block_type=BlockTypeEnum.BLOCK_DOCUMENT_PDF, - content=block_data.dict(), + content=block_data.model_dump(), org_id=org.id if org.id else 0, course_id=course.id if course.id else 0, block_uuid=block_uuid, @@ -68,7 +68,7 @@ async def create_pdf_block( db_session.commit() db_session.refresh(block) - block = BlockRead.from_orm(block) + block = BlockRead.model_validate(block) return block @@ -84,6 +84,6 @@ async def get_pdf_block( status_code=status.HTTP_404_NOT_FOUND, detail="Video file does not exist" ) - block = BlockRead.from_orm(block) + block = BlockRead.model_validate(block) return block diff --git a/apps/api/src/services/blocks/block_types/videoBlock/videoBlock.py b/apps/api/src/services/blocks/block_types/videoBlock/videoBlock.py index ab6735d7..da3d91f8 100644 --- a/apps/api/src/services/blocks/block_types/videoBlock/videoBlock.py +++ b/apps/api/src/services/blocks/block_types/videoBlock/videoBlock.py @@ -55,7 +55,7 @@ async def create_video_block( block = Block( activity_id=activity.id if activity.id else 0, block_type=BlockTypeEnum.BLOCK_VIDEO, - content=block_data.dict(), + content=block_data.model_dump(), org_id=org.id if org.id else 0, course_id=course.id if course.id else 0, block_uuid=block_uuid, @@ -68,7 +68,7 @@ async def create_video_block( db_session.commit() db_session.refresh(block) - block = BlockRead.from_orm(block) + block = BlockRead.model_validate(block) return block @@ -84,6 +84,6 @@ async def get_video_block( status_code=status.HTTP_404_NOT_FOUND, detail="Video file does not exist" ) - block = BlockRead.from_orm(block) + block = BlockRead.model_validate(block) return block diff --git a/apps/api/src/services/courses/activities/activities.py b/apps/api/src/services/courses/activities/activities.py index 3b970818..e976f8c3 100644 --- a/apps/api/src/services/courses/activities/activities.py +++ b/apps/api/src/services/courses/activities/activities.py @@ -41,7 +41,7 @@ async def create_activity( await rbac_check(request, chapter.chapter_uuid, current_user, "create", db_session) # Create Activity - activity = Activity(**activity_object.dict()) + activity = Activity(**activity_object.model_dump()) activity.activity_uuid = str(f"activity_{uuid4()}") activity.creation_date = str(datetime.now()) @@ -81,7 +81,7 @@ async def create_activity( db_session.commit() db_session.refresh(activity_chapter) - return ActivityRead.from_orm(activity) + return ActivityRead.model_validate(activity) async def get_activity( @@ -112,7 +112,7 @@ async def get_activity( # RBAC check await rbac_check(request, course.course_uuid, current_user, "read", db_session) - activity = ActivityRead.from_orm(activity) + activity = ActivityRead.model_validate(activity) return activity @@ -147,7 +147,7 @@ async def update_activity( db_session.commit() db_session.refresh(activity) - activity = ActivityRead.from_orm(activity) + activity = ActivityRead.model_validate(activity) return activity @@ -216,7 +216,7 @@ async def get_activities( # RBAC check await rbac_check(request, "activity_x", current_user, "read", db_session) - activities = [ActivityRead.from_orm(activity) for activity in activities] + activities = [ActivityRead.model_validate(activity) for activity in activities] return activities diff --git a/apps/api/src/services/courses/activities/pdf.py b/apps/api/src/services/courses/activities/pdf.py index 0fbbe5aa..bb97da54 100644 --- a/apps/api/src/services/courses/activities/pdf.py +++ b/apps/api/src/services/courses/activities/pdf.py @@ -135,7 +135,7 @@ async def create_documentpdf_activity( db_session.commit() db_session.refresh(activity_chapter) - return ActivityRead.from_orm(activity) + return ActivityRead.model_validate(activity) ## 🔒 RBAC Utils ## diff --git a/apps/api/src/services/courses/activities/video.py b/apps/api/src/services/courses/activities/video.py index 5070814c..629a76c7 100644 --- a/apps/api/src/services/courses/activities/video.py +++ b/apps/api/src/services/courses/activities/video.py @@ -105,7 +105,7 @@ async def create_video_activity( ) # create activity - activity = Activity.from_orm(activity_object) + activity = Activity.model_validate(activity_object) db_session.add(activity) db_session.commit() db_session.refresh(activity) @@ -136,7 +136,7 @@ async def create_video_activity( db_session.commit() db_session.refresh(chapter_activity_object) - return ActivityRead.from_orm(activity) + return ActivityRead.model_validate(activity) class ExternalVideo(BaseModel): @@ -200,7 +200,7 @@ async def create_external_video_activity( ) # create activity - activity = Activity.from_orm(activity_object) + activity = Activity.model_validate(activity_object) db_session.add(activity) db_session.commit() db_session.refresh(activity) @@ -220,7 +220,7 @@ async def create_external_video_activity( db_session.add(chapter_activity_object) db_session.commit() - return ActivityRead.from_orm(activity) + return ActivityRead.model_validate(activity) async def rbac_check( diff --git a/apps/api/src/services/courses/chapters.py b/apps/api/src/services/courses/chapters.py index 31b3d7ef..ee8ce1b5 100644 --- a/apps/api/src/services/courses/chapters.py +++ b/apps/api/src/services/courses/chapters.py @@ -34,7 +34,7 @@ async def create_chapter( current_user: PublicUser | AnonymousUser, db_session: Session, ) -> ChapterRead: - chapter = Chapter.from_orm(chapter_object) + chapter = Chapter.model_validate(chapter_object) # Get COurse statement = select(Course).where(Course.id == chapter_object.course_id) @@ -68,7 +68,7 @@ async def create_chapter( db_session.commit() db_session.refresh(chapter) - chapter = ChapterRead(**chapter.dict(), activities=[]) + chapter = ChapterRead(**chapter.model_dump(), activities=[]) # Check if COurseChapter link exists @@ -135,8 +135,8 @@ async def get_chapter( activities = db_session.exec(statement).all() chapter = ChapterRead( - **chapter.dict(), - activities=[ActivityRead(**activity.dict()) for activity in activities], + **chapter.model_dump(), + activities=[ActivityRead(**activity.model_dump()) for activity in activities], ) return chapter @@ -231,7 +231,7 @@ async def get_course_chapters( ) chapters = db_session.exec(statement).all() - chapters = [ChapterRead(**chapter.dict(), activities=[]) for chapter in chapters] + chapters = [ChapterRead(**chapter.model_dump(), activities=[]) for chapter in chapters] # RBAC check await rbac_check(request, course.course_uuid, current_user, "read", db_session) # type: ignore @@ -255,7 +255,7 @@ async def get_course_chapters( activity = db_session.exec(statement).first() if activity: - chapter.activities.append(ActivityRead(**activity.dict())) + chapter.activities.append(ActivityRead(**activity.model_dump())) return chapters diff --git a/apps/api/src/services/courses/collections.py b/apps/api/src/services/courses/collections.py index 51999804..83f976a7 100644 --- a/apps/api/src/services/courses/collections.py +++ b/apps/api/src/services/courses/collections.py @@ -64,7 +64,7 @@ async def get_collection( courses = db_session.exec(statement).all() - collection = CollectionRead(**collection.dict(), courses=courses) + collection = CollectionRead(**collection.model_dump(), courses=courses) return collection @@ -75,7 +75,7 @@ async def create_collection( current_user: PublicUser, db_session: Session, ) -> CollectionRead: - collection = Collection.from_orm(collection_object) + collection = Collection.model_validate(collection_object) # RBAC check await rbac_check(request, "collection_x", current_user, "create", db_session) @@ -115,9 +115,9 @@ async def create_collection( ) courses = db_session.exec(statement).all() - collection = CollectionRead(**collection.dict(), courses=courses) + collection = CollectionRead(**collection.model_dump(), courses=courses) - return CollectionRead.from_orm(collection) + return CollectionRead.model_validate(collection) async def update_collection( @@ -189,7 +189,7 @@ async def update_collection( courses = db_session.exec(statement).all() - collection = CollectionRead(**collection.dict(), courses=courses) + collection = CollectionRead(**collection.model_dump(), courses=courses) return collection @@ -270,7 +270,7 @@ async def get_collections( courses = db_session.exec(statement).all() - collection = CollectionRead(**collection.dict(), courses=courses) + collection = CollectionRead(**collection.model_dump(), courses=courses) collections_with_courses.append(collection) return collections_with_courses diff --git a/apps/api/src/services/courses/courses.py b/apps/api/src/services/courses/courses.py index 3e2458ea..1721c01d 100644 --- a/apps/api/src/services/courses/courses.py +++ b/apps/api/src/services/courses/courses.py @@ -5,7 +5,6 @@ from sqlmodel import Session, select from src.db.usergroup_resources import UserGroupResource from src.db.usergroup_user import UserGroupUser from src.db.organizations import Organization -from src.db.trails import TrailRead from src.services.trail.trail import get_user_trail_with_orgid from src.db.resource_authors import ResourceAuthor, ResourceAuthorshipEnum from src.db.users import PublicUser, AnonymousUser, User, UserRead @@ -53,9 +52,9 @@ async def get_course( authors = db_session.exec(authors_statement).all() # convert from User to UserRead - authors = [UserRead.from_orm(author) for author in authors] + authors = [UserRead.model_validate(author) for author in authors] - course = CourseRead(**course.dict(), authors=authors) + course = CourseRead(**course.model_dump(), authors=authors) return course @@ -90,9 +89,9 @@ async def get_course_meta( authors = db_session.exec(authors_statement).all() # convert from User to UserRead - authors = [UserRead.from_orm(author) for author in authors] + authors = [UserRead.model_validate(author) for author in authors] - course = CourseRead(**course.dict(), authors=authors) + course = CourseRead(**course.model_dump(), authors=authors) # Get course chapters chapters = await get_course_chapters(request, course.id, db_session, current_user) @@ -106,10 +105,9 @@ async def get_course_meta( trail = await get_user_trail_with_orgid( request, current_user, course.org_id, db_session ) - trail = TrailRead.from_orm(trail) return FullCourseReadWithTrail( - **course.dict(), + **course.model_dump(), chapters=chapters, trail=trail if trail else None, ) @@ -123,7 +121,7 @@ async def create_course( db_session: Session, thumbnail_file: UploadFile | None = None, ): - course = Course.from_orm(course_object) + course = Course.model_validate(course_object) # RBAC check await rbac_check(request, "course_x", current_user, "create", db_session) @@ -178,11 +176,11 @@ async def create_course( authors = db_session.exec(authors_statement).all() # convert from User to UserRead - authors = [UserRead.from_orm(author) for author in authors] + authors = [UserRead.model_validate(author) for author in authors] - course = CourseRead(**course.dict(), authors=authors) + course = CourseRead(**course.model_dump(), authors=authors) - return CourseRead.from_orm(course) + return CourseRead.model_validate(course) async def update_course_thumbnail( @@ -242,9 +240,9 @@ async def update_course_thumbnail( authors = db_session.exec(authors_statement).all() # convert from User to UserRead - authors = [UserRead.from_orm(author) for author in authors] + authors = [UserRead.model_validate(author) for author in authors] - course = CourseRead(**course.dict(), authors=authors) + course = CourseRead(**course.model_dump(), authors=authors) return course @@ -289,9 +287,9 @@ async def update_course( authors = db_session.exec(authors_statement).all() # convert from User to UserRead - authors = [UserRead.from_orm(author) for author in authors] + authors = [UserRead.model_validate(author) for author in authors] - course = CourseRead(**course.dict(), authors=authors) + course = CourseRead(**course.model_dump(), authors=authors) return course @@ -351,9 +349,7 @@ async def get_courses_orgslug( statement_usergroup = ( select(Course) .join(Organization) - .join( - UserGroupResource, UserGroupResource.resource_uuid == Course.course_uuid - ) + .join(UserGroupResource, UserGroupResource.resource_uuid == Course.course_uuid) .join( UserGroupUser, UserGroupUser.usergroup_id == UserGroupResource.usergroup_id ) @@ -365,10 +361,12 @@ async def get_courses_orgslug( statement_public, statement_author, statement_usergroup ).subquery() - courses = db_session.execute(select([statement_complete])).all() + # TODO: migrate this to exec + courses = db_session.execute(select(statement_complete)).all() # TODO: I have no idea why this is necessary, but it is - courses = [CourseRead(**dict(course._mapping), authors=[]) for course in courses] + courses = [CourseRead(**course._asdict(), authors=[]) for course in courses] + # for every course, get the authors for course in courses: @@ -380,7 +378,7 @@ async def get_courses_orgslug( authors = db_session.exec(authors_statement).all() # convert from User to UserRead - authors = [UserRead.from_orm(author) for author in authors] + authors = [UserRead.model_validate(author) for author in authors] course.authors = authors diff --git a/apps/api/src/services/install/install.py b/apps/api/src/services/install/install.py index 5c17cc88..cd200e4e 100644 --- a/apps/api/src/services/install/install.py +++ b/apps/api/src/services/install/install.py @@ -25,7 +25,7 @@ async def isInstallModeEnabled(): async def create_install_instance(request: Request, data: dict, db_session: Session): - install = Install.from_orm(data) + install = Install.model_validate(data) # complete install instance install.install_uuid = str(f"install_{uuid4()}") @@ -41,7 +41,7 @@ async def create_install_instance(request: Request, data: dict, db_session: Sess # refresh install instance db_session.refresh(install) - install = InstallRead.from_orm(install) + install = InstallRead.model_validate(install) return install @@ -56,7 +56,7 @@ async def get_latest_install_instance(request: Request, db_session: Session): detail="No install instance found", ) - install = InstallRead.from_orm(install) + install = InstallRead.model_validate(install) return install @@ -82,7 +82,7 @@ async def update_install_instance( # refresh install instance db_session.refresh(install) - install = InstallRead.from_orm(install) + install = InstallRead.model_validate(install) return install @@ -279,9 +279,9 @@ async def install_default_elements(db_session: Session): ) # Serialize rights to JSON - role_global_admin.rights = role_global_admin.rights.dict() # type: ignore - role_global_maintainer.rights = role_global_maintainer.rights.dict() # type: ignore - role_global_user.rights = role_global_user.rights.dict() # type: ignore + role_global_admin.rights = role_global_admin.rights.model_dump() # type: ignore + role_global_maintainer.rights = role_global_maintainer.rights.model_dump() # type: ignore + role_global_user.rights = role_global_user.rights.model_dump() # type: ignore # Insert roles in DB db_session.add(role_global_admin) @@ -301,7 +301,7 @@ async def install_default_elements(db_session: Session): async def install_create_organization( org_object: OrganizationCreate, db_session: Session ): - org = Organization.from_orm(org_object) + org = Organization.model_validate(org_object) # Complete the org object org.org_uuid = f"org_{uuid4()}" @@ -318,7 +318,7 @@ async def install_create_organization( async def install_create_organization_user( user_object: UserCreate, org_slug: str, db_session: Session ): - user = User.from_orm(user_object) + user = User.model_validate(user_object) # Complete the user object user.user_uuid = f"user_{uuid4()}" @@ -390,6 +390,6 @@ async def install_create_organization_user( db_session.commit() db_session.refresh(user_organization) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) return user diff --git a/apps/api/src/services/orgs/orgs.py b/apps/api/src/services/orgs/orgs.py index 262adb93..9cda7a2c 100644 --- a/apps/api/src/services/orgs/orgs.py +++ b/apps/api/src/services/orgs/orgs.py @@ -59,9 +59,9 @@ async def get_organization( if org_config is None: logging.error(f"Organization {org_id} has no config") - config = OrganizationConfig.from_orm(org_config) if org_config else {} + config = OrganizationConfig.model_validate(org_config) if org_config else {} - org = OrganizationRead(**org.dict(), config=config) + org = OrganizationRead(**org.model_dump(), config=config) return org @@ -95,9 +95,9 @@ async def get_organization_by_slug( if org_config is None: logging.error(f"Organization {org_slug} has no config") - config = OrganizationConfig.from_orm(org_config) if org_config else {} + config = OrganizationConfig.model_validate(org_config) if org_config else {} - org = OrganizationRead(**org.dict(), config=config) + org = OrganizationRead(**org.model_dump(), config=config) return org @@ -119,7 +119,7 @@ async def create_org( detail="Organization already exists", ) - org = Organization.from_orm(org_object) + org = Organization.model_validate(org_object) if isinstance(current_user, AnonymousUser): raise HTTPException( @@ -203,9 +203,9 @@ async def create_org( if org_config is None: logging.error(f"Organization {org.id} has no config") - config = OrganizationConfig.from_orm(org_config) + config = OrganizationConfig.model_validate(org_config) - org = OrganizationRead(**org.dict(), config=config) + org = OrganizationRead(**org.model_dump(), config=config) return org @@ -229,7 +229,7 @@ async def create_org_with_config( detail="Organization already exists", ) - org = Organization.from_orm(org_object) + org = Organization.model_validate(org_object) if isinstance(current_user, AnonymousUser): raise HTTPException( @@ -284,9 +284,9 @@ async def create_org_with_config( if org_config is None: logging.error(f"Organization {org.id} has no config") - config = OrganizationConfig.from_orm(org_config) + config = OrganizationConfig.model_validate(org_config) - org = OrganizationRead(**org.dict(), config=config) + org = OrganizationRead(**org.model_dump(), config=config) return org @@ -336,7 +336,7 @@ async def update_org( db_session.commit() db_session.refresh(org) - org = OrganizationRead.from_orm(org) + org = OrganizationRead.model_validate(org) return org diff --git a/apps/api/src/services/orgs/users.py b/apps/api/src/services/orgs/users.py index 207508a8..8cb0c4d6 100644 --- a/apps/api/src/services/orgs/users.py +++ b/apps/api/src/services/orgs/users.py @@ -84,8 +84,8 @@ async def get_organization_users( # skip this user continue - user = UserRead.from_orm(user) - role = RoleRead.from_orm(role) + user = UserRead.model_validate(user) + role = RoleRead.model_validate(role) org_user = OrganizationUser( user=user, @@ -293,8 +293,8 @@ async def invite_batch_users( # skip this user continue - org = OrganizationRead.from_orm(org) - user = UserRead.from_orm(user) + org = OrganizationRead.model_validate(org) + user = UserRead.model_validate(user) isEmailSent = send_invite_email( org, diff --git a/apps/api/src/services/roles/roles.py b/apps/api/src/services/roles/roles.py index 84c03b00..c5939c2c 100644 --- a/apps/api/src/services/roles/roles.py +++ b/apps/api/src/services/roles/roles.py @@ -17,7 +17,7 @@ async def create_role( role_object: RoleCreate, current_user: PublicUser, ): - role = Role.from_orm(role_object) + role = Role.model_validate(role_object) # RBAC check await rbac_check(request, current_user, "create", "role_xxx", db_session) @@ -31,7 +31,7 @@ async def create_role( db_session.commit() db_session.refresh(role) - role = RoleRead(**role.dict()) + role = RoleRead(**role.model_dump()) return role @@ -53,7 +53,7 @@ async def read_role( # RBAC check await rbac_check(request, current_user, "read", role.role_uuid, db_session) - role = RoleRead(**role.dict()) + role = RoleRead(**role.model_dump()) return role @@ -93,7 +93,7 @@ async def update_role( db_session.commit() db_session.refresh(role) - role = RoleRead(**role.dict()) + role = RoleRead(**role.model_dump()) return role diff --git a/apps/api/src/services/trail/trail.py b/apps/api/src/services/trail/trail.py index e3485b9d..6dd5c15b 100644 --- a/apps/api/src/services/trail/trail.py +++ b/apps/api/src/services/trail/trail.py @@ -28,7 +28,7 @@ async def create_user_trail( detail="Trail already exists", ) - trail = Trail.from_orm(trail_object) + trail = Trail.model_validate(trail_object) trail.creation_date = str(datetime.now()) trail.update_date = str(datetime.now()) @@ -91,7 +91,7 @@ async def get_user_trails( trail_step.data = dict(course=course) trail_read = TrailRead( - **trail.dict(), + **trail.model_dump(), runs=trail_runs, ) @@ -176,7 +176,7 @@ async def get_user_trail_with_orgid( trail_step.data = dict(course=course) trail_read = TrailRead( - **trail.dict(), + **trail.model_dump(), runs=trail_runs, ) @@ -276,7 +276,7 @@ async def add_activity_to_trail( trail_step.data = dict(course=course) trail_read = TrailRead( - **trail.dict(), + **trail.model_dump(), runs=trail_runs, ) @@ -357,7 +357,7 @@ async def add_course_to_trail( trail_step.data = dict(course=course) trail_read = TrailRead( - **trail.dict(), + **trail.model_dump(), runs=trail_runs, ) @@ -426,7 +426,7 @@ async def remove_course_from_trail( trail_step.data = dict(course=course) trail_read = TrailRead( - **trail.dict(), + **trail.model_dump(), runs=trail_runs, ) diff --git a/apps/api/src/services/users/password_reset.py b/apps/api/src/services/users/password_reset.py index 16b15e5a..092d50cc 100644 --- a/apps/api/src/services/users/password_reset.py +++ b/apps/api/src/services/users/password_reset.py @@ -93,9 +93,9 @@ async def send_reset_password_code( ex=ttl, ) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) - org = OrganizationRead.from_orm(org) + org = OrganizationRead.model_validate(org) # Send reset code via email isEmailSent = send_password_reset_email( diff --git a/apps/api/src/services/users/usergroups.py b/apps/api/src/services/users/usergroups.py index 1ad62e4b..84b5de96 100644 --- a/apps/api/src/services/users/usergroups.py +++ b/apps/api/src/services/users/usergroups.py @@ -22,7 +22,7 @@ async def create_usergroup( usergroup_create: UserGroupCreate, ) -> UserGroupRead: - usergroup = UserGroup.from_orm(usergroup_create) + usergroup = UserGroup.model_validate(usergroup_create) # RBAC check await rbac_check( @@ -53,7 +53,7 @@ async def create_usergroup( db_session.commit() db_session.refresh(usergroup) - usergroup = UserGroupRead.from_orm(usergroup) + usergroup = UserGroupRead.model_validate(usergroup) return usergroup @@ -83,7 +83,7 @@ async def read_usergroup_by_id( db_session=db_session, ) - usergroup = UserGroupRead.from_orm(usergroup) + usergroup = UserGroupRead.model_validate(usergroup) return usergroup @@ -125,7 +125,7 @@ async def get_users_linked_to_usergroup( user = db_session.exec(statement).first() users.append(user) - users = [UserRead.from_orm(user) for user in users] + users = [UserRead.model_validate(user) for user in users] return users @@ -149,7 +149,7 @@ async def read_usergroups_by_org_id( db_session=db_session, ) - usergroups = [UserGroupRead.from_orm(usergroup) for usergroup in usergroups] + usergroups = [UserGroupRead.model_validate(usergroup) for usergroup in usergroups] return usergroups @@ -184,7 +184,7 @@ async def get_usergroups_by_resource( usergroup = db_session.exec(statement).first() usergroups.append(usergroup) - usergroups = [UserGroupRead.from_orm(usergroup) for usergroup in usergroups] + usergroups = [UserGroupRead.model_validate(usergroup) for usergroup in usergroups] return usergroups @@ -223,7 +223,7 @@ async def update_usergroup_by_id( db_session.commit() db_session.refresh(usergroup) - usergroup = UserGroupRead.from_orm(usergroup) + usergroup = UserGroupRead.model_validate(usergroup) return usergroup diff --git a/apps/api/src/services/users/users.py b/apps/api/src/services/users/users.py index 70d6ddc4..f96c94b6 100644 --- a/apps/api/src/services/users/users.py +++ b/apps/api/src/services/users/users.py @@ -37,7 +37,7 @@ async def create_user( user_object: UserCreate, org_id: int, ): - user = User.from_orm(user_object) + user = User.model_validate(user_object) # RBAC check await rbac_check(request, current_user, "create", "user_x", db_session) @@ -104,7 +104,7 @@ async def create_user( db_session.commit() db_session.refresh(user_organization) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) # Send Account creation email send_account_creation_email( @@ -157,7 +157,7 @@ async def create_user_without_org( current_user: PublicUser | AnonymousUser, user_object: UserCreate, ): - user = User.from_orm(user_object) + user = User.model_validate(user_object) # RBAC check await rbac_check(request, current_user, "create", "user_x", db_session) @@ -201,7 +201,7 @@ async def create_user_without_org( db_session.commit() db_session.refresh(user) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) # Send Account creation email send_account_creation_email( @@ -270,7 +270,7 @@ async def update_user( db_session.commit() db_session.refresh(user) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) return user @@ -315,7 +315,7 @@ async def update_user_avatar( db_session.commit() db_session.refresh(user) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) return user @@ -354,7 +354,7 @@ async def update_user_password( db_session.commit() db_session.refresh(user) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) return user @@ -378,7 +378,7 @@ async def read_user_by_id( # RBAC check await rbac_check(request, current_user, "read", user.user_uuid, db_session) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) return user @@ -402,7 +402,7 @@ async def read_user_by_uuid( # RBAC check await rbac_check(request, current_user, "read", user.user_uuid, db_session) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) return user @@ -422,7 +422,7 @@ async def get_user_session( detail="User does not exist", ) - user = UserRead.from_orm(user) + user = UserRead.model_validate(user) # Get roles and orgs statement = ( @@ -445,8 +445,8 @@ async def get_user_session( roles.append( UserRoleWithOrg( - role=RoleRead.from_orm(role), - org=OrganizationRead.from_orm(org), + role=RoleRead.model_validate(role), + org=OrganizationRead.model_validate(org), ) ) @@ -531,7 +531,7 @@ async def security_get_user(request: Request, db_session: Session, email: str) - detail="User with Email does not exist", ) - user = User(**user.dict()) + user = User(**user.model_dump()) return user