feat: various improvements

wip: frontend

feat: enable cascade on foreign keys

wip1

wip2

fix chapters issues

wip4
This commit is contained in:
swve 2023-11-29 22:29:48 +01:00
parent 2bf80030d7
commit 187f75e583
71 changed files with 879 additions and 568 deletions

View file

@ -6,7 +6,7 @@ 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
from src.db.users import PublicUser, AnonymousUser, User, UserRead
from src.db.courses import (
Course,
CourseCreate,
@ -26,11 +26,11 @@ from datetime import datetime
async def get_course(
request: Request,
course_id: str,
course_uuid: str,
current_user: PublicUser | AnonymousUser,
db_session: Session,
):
statement = select(Course).where(Course.id == course_id)
statement = select(Course).where(Course.course_uuid == course_uuid)
course = db_session.exec(statement).first()
if not course:
@ -42,21 +42,32 @@ async def get_course(
# RBAC check
await rbac_check(request, course.course_uuid, current_user, "read", db_session)
course = CourseRead.from_orm(course)
# Get course authors
authors_statement = (
select(User)
.join(ResourceAuthor)
.where(ResourceAuthor.resource_uuid == course.course_uuid)
)
authors = db_session.exec(authors_statement).all()
# convert from User to UserRead
authors = [UserRead.from_orm(author) for author in authors]
course = CourseRead(**course.dict(), authors=authors)
return course
async def get_course_meta(
request: Request,
course_id: int,
course_uuid: str,
current_user: PublicUser | AnonymousUser,
db_session: Session,
) -> FullCourseReadWithTrail:
# Avoid circular import
from src.services.courses.chapters import get_course_chapters
course_statement = select(Course).where(Course.id == course_id)
course_statement = select(Course).where(Course.course_uuid == course_uuid)
course = db_session.exec(course_statement).first()
if not course:
@ -65,12 +76,21 @@ async def get_course_meta(
detail="Course not found",
)
print('cd',course.course_uuid)
# RBAC check
await rbac_check(request, course.course_uuid, current_user, "read", db_session)
course = CourseRead.from_orm(course)
# Get course authors
authors_statement = (
select(User)
.join(ResourceAuthor)
.where(ResourceAuthor.resource_uuid == course.course_uuid)
)
authors = db_session.exec(authors_statement).all()
# convert from User to UserRead
authors = [UserRead.from_orm(author) for author in authors]
course = CourseRead(**course.dict(), authors=authors)
# Get course chapters
chapters = await get_course_chapters(request, course.id, db_session, current_user)
@ -85,12 +105,13 @@ async def get_course_meta(
return FullCourseReadWithTrail(
**course.dict(),
chapters=chapters,
trail=trail,
trail=trail if trail else None,
)
async def create_course(
request: Request,
org_id: int,
course_object: CourseCreate,
current_user: PublicUser | AnonymousUser,
db_session: Session,
@ -111,9 +132,9 @@ async def create_course(
if thumbnail_file and thumbnail_file.filename:
name_in_disk = f"{course.course_uuid}_thumbnail_{uuid4()}.{thumbnail_file.filename.split('.')[-1]}"
await upload_thumbnail(
thumbnail_file, name_in_disk, course_object.org_id, course.course_uuid
thumbnail_file, name_in_disk, org_id, course.course_uuid
)
course_object.thumbnail = name_in_disk
course_object.thumbnail_image = name_in_disk
# Insert course
db_session.add(course)
@ -134,17 +155,30 @@ async def create_course(
db_session.commit()
db_session.refresh(resource_author)
# Get course authors
authors_statement = (
select(User)
.join(ResourceAuthor)
.where(ResourceAuthor.resource_uuid == course.course_uuid)
)
authors = db_session.exec(authors_statement).all()
# convert from User to UserRead
authors = [UserRead.from_orm(author) for author in authors]
course = CourseRead(**course.dict(), authors=authors)
return CourseRead.from_orm(course)
async def update_course_thumbnail(
request: Request,
course_id: str,
course_uuid: str,
current_user: PublicUser | AnonymousUser,
db_session: Session,
thumbnail_file: UploadFile | None = None,
):
statement = select(Course).where(Course.id == course_id)
statement = select(Course).where(Course.course_uuid == course_uuid)
course = db_session.exec(statement).first()
name_in_disk = None
@ -160,9 +194,7 @@ async def update_course_thumbnail(
# Upload thumbnail
if thumbnail_file and thumbnail_file.filename:
name_in_disk = (
f"{course_id}_thumbnail_{uuid4()}.{thumbnail_file.filename.split('.')[-1]}"
)
name_in_disk = f"{course_uuid}_thumbnail_{uuid4()}.{thumbnail_file.filename.split('.')[-1]}"
await upload_thumbnail(
thumbnail_file, name_in_disk, course.org_id, course.course_uuid
)
@ -183,7 +215,20 @@ async def update_course_thumbnail(
db_session.commit()
db_session.refresh(course)
course = CourseRead.from_orm(course)
# Get course authors
authors_statement = (
select(User)
.join(ResourceAuthor)
.where(ResourceAuthor.resource_uuid == course.course_uuid)
)
authors = db_session.exec(authors_statement).all()
# convert from User to UserRead
authors = [UserRead.from_orm(author) for author in authors]
course = CourseRead(**course.dict(), authors=authors)
return course
@ -191,11 +236,11 @@ async def update_course_thumbnail(
async def update_course(
request: Request,
course_object: CourseUpdate,
course_id: int,
course_uuid: str,
current_user: PublicUser | AnonymousUser,
db_session: Session,
):
statement = select(Course).where(Course.id == course_id)
statement = select(Course).where(Course.course_uuid == course_uuid)
course = db_session.exec(statement).first()
if not course:
@ -219,18 +264,29 @@ async def update_course(
db_session.commit()
db_session.refresh(course)
course = CourseRead.from_orm(course)
# Get course authors
authors_statement = (
select(User)
.join(ResourceAuthor)
.where(ResourceAuthor.resource_uuid == course.course_uuid)
)
authors = db_session.exec(authors_statement).all()
# convert from User to UserRead
authors = [UserRead.from_orm(author) for author in authors]
course = CourseRead(**course.dict(), authors=authors)
return course
async def delete_course(
request: Request,
course_id: str,
course_uuid: str,
current_user: PublicUser | AnonymousUser,
db_session: Session,
):
statement = select(Course).where(Course.id == course_id)
statement = select(Course).where(Course.course_uuid == course_uuid)
course = db_session.exec(statement).first()
if not course:
@ -275,7 +331,21 @@ async def get_courses_orgslug(
courses = db_session.exec(statement)
courses = [CourseRead.from_orm(course) for course in courses]
courses = [CourseRead(**course.dict(),authors=[]) for course in courses]
# for every course, get the authors
for course in courses:
authors_statement = (
select(User)
.join(ResourceAuthor)
.where(ResourceAuthor.resource_uuid == course.course_uuid)
)
authors = db_session.exec(authors_statement).all()
# convert from User to UserRead
authors = [UserRead.from_orm(author) for author in authors]
course.authors = authors
return courses