def create_school( *, db: Session = Depends(deps.get_db), school_in: schemas.SchoolCreate, current_admin: models.Admin = Depends( deps.get_current_admin_with_permission("school")), ) -> Any: """ Create new school. """ # Check if the school already exists; raise Exception with error code 409 if it does if crud.school.get_by_name(db, name=school_in.name): raise ConflictException( detail="A school with this name already exists in the system.", ) # Check if a school with this head already exists; raise Exception with error code 409 if it does if crud.school.get_by_head(db, head=school_in.head): raise ConflictException( detail="A school with this head already exists in the system.", ) # Create new school logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is creating School {school_in.__dict__}" ) school = crud.school.create(db, obj_in=school_in) return school
def read_courses( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, _: models.Admin = Depends(deps.get_current_admin_with_permission("course")), ) -> Any: return crud.course.get_multi(db, skip=skip, limit=limit)
def remove_student_from_term( *, db: Session = Depends(deps.get_db), division_id: str, student_id: str, current_admin: models.Admin = Depends( deps.get_current_admin_with_permission("term")), ) -> Any: if division := crud.division.get(db, division_id): if student := crud.student.get(db, student_id): if student in division.students: logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) " f"is deleting Student {student_id} ({student.user.email}) " f"from Division {division_id} ({division.course.name} {division.division_code})" ) division.students.remove(student) try: db.commit() except exc.IntegrityError as e: logging.error(e) db.rollback() raise ConflictException(detail=e.__str__()) except Exception as e: logging.error(e) db.rollback() raise BadRequestException(detail=e.__str__()) return student raise NotFoundException( detail= f"Student with id {student_id} not found in Division with if {division_id}" )
def add_term_students_by_id( *, db: Session = Depends(deps.get_db), term_id: str, user_ids: list[str], _: models.Admin = Depends(deps.get_current_admin_with_permission("term")), ) -> Any: if term := crud.term.get(db, id=term_id): response: dict[str, Any] = defaultdict(lambda: []) errors = defaultdict(lambda: []) for user_id in user_ids: if user := crud.user.get(db, id=user_id): if user.type == "student": if user.school_id == term.year.school_id: if student := crud.student.get(db, id=user_id): if student.term_id != term_id: crud.student.update( db, db_obj=student, obj_in=StudentUpdate(term_id=term_id)) response["success"].append(student.user_id) else: errors["student already in term"].append( user_id) else: errors["no student object"].append(user_id) else: errors["different schools"].append(user_id) else: errors["not a student"].append(user_id)
def read_course_by_id( *, db: Session = Depends(deps.get_db), course_id: str, _: models.Admin = Depends(deps.get_current_admin_with_permission("course")), ) -> Any: if course := crud.course.get(db, id=course_id): return course
def get_timetable_division( *, db: Session = Depends(deps.get_db), _: models.User = Depends(deps.get_current_admin_with_permission("course")), division_id: str, ) -> Any: if division := crud.division.get(db, id=division_id): return generate_timetable(db, [division])
def read_term_students_by_id( *, db: Session = Depends(deps.get_db), term_id: str, _: models.Admin = Depends(deps.get_current_admin_with_permission("term")), ) -> Any: if term := crud.term.get(db, term_id): return term.students
def read_timeslots( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, _: models.Admin = Depends( deps.get_current_admin_with_permission("school")), ) -> Any: return crud.timeslot.get_multi(db, skip=skip, limit=limit)
def read_terms( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, _: models.Admin = Depends(deps.get_current_admin_with_permission("term")), ) -> Any: terms = crud.term.get_multi(db, skip=skip, limit=limit) return terms
def read_lecture_by_id( *, db: Session = Depends(deps.get_db), lecture_id: str, _: models.Admin = Depends(deps.get_current_admin_with_permission("school")), ) -> Any: if lecture := crud.lecture.get(db, id=lecture_id): return lecture
def read_division_by_id( *, db: Session = Depends(deps.get_db), division_id: str, _: models.Admin = Depends( deps.get_current_admin_with_permission("course")), ) -> Any: if division := crud.division.get(db, id=division_id): return division
def read_timeslot_by_id( *, db: Session = Depends(deps.get_db), timeslot_id: str, _: models.Admin = Depends( deps.get_current_admin_with_permission("school")), ) -> Any: if timeslot := crud.timeslot.get(db, id=timeslot_id): return timeslot
def delete_lecture( *, db: Session = Depends(deps.get_db), lecture_id: str, current_admin: models.Admin = Depends(deps.get_current_admin_with_permission("school")), ) -> Any: if lecture := crud.lecture.get(db, id=lecture_id): logging.info(f"Admin {current_admin.user_id} ({current_admin.user.email}) is deleting lecture {lecture.id}") return crud.lecture.remove(db, id=lecture_id)
def update_lecture( *, db: Session = Depends(deps.get_db), lecture_id: str, lecture_in: schemas.LectureUpdate, current_admin: models.Admin = Depends(deps.get_current_admin_with_permission("school")), ) -> Any: if lecture := crud.lecture.get(db, id=lecture_id): logging.info(f"Admin {current_admin.user_id} ({current_admin.user.email}) is updating lecture {lecture.id}") return crud.lecture.update(db, db_obj=lecture, obj_in=lecture_in)
def read_admins( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, _: models.Admin = Depends(deps.get_current_admin_with_permission("admin")), ) -> Any: """ Retrieve admins """ return crud.admin.get_multi(db, skip=skip, limit=limit)
def get_timeslots( *, db: Session = Depends(deps.get_db), school_id: str, _: models.Admin = Depends( deps.get_current_admin_with_permission("school")), ) -> Any: """ Get all timeslots in a school """ return crud.timeslot.get_by_school(db, school_id=school_id)
def get_professors( *, db: Session = Depends(deps.get_db), school_id: str, _: models.Admin = Depends( deps.get_current_admin_with_permission("school")), ) -> Any: """ Get all students belonging to a school. """ return crud.user.get_all_professors_for_school(db, school_id=school_id)
def read_year_by_id( *, db: Session = Depends(deps.get_db), year_id: str, _: models.Admin = Depends(deps.get_current_admin_with_permission("year")), ) -> Any: """ Retrieve years """ if year := crud.year.get(db, year_id): return year
def delete_year( *, db: Session = Depends(deps.get_db), year_id: str, current_admin: models.Admin = Depends(deps.get_current_admin_with_permission("year")), ) -> Any: if year := crud.year.get(db, year_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is deleting Year {year.id} ({year.name})" ) return crud.year.remove(db, id=year_id)
def read_users( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, _: models.Admin = Depends(deps.get_current_admin_with_permission("user")), ) -> Any: """ Retrieve users. """ users = crud.user.get_multi(db, skip=skip, limit=limit) return users
def delete_course( *, db: Session = Depends(deps.get_db), course_id: str, current_admin: models.Admin = Depends(deps.get_current_admin_with_permission("course")), ) -> Any: if course := crud.course.get(db, id=course_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is deleting Course {course.id} ({course.name})" ) return crud.course.remove(db, id=course_id)
def delete_timeslot( *, db: Session = Depends(deps.get_db), timeslot_id: str, current_admin: models.Admin = Depends( deps.get_current_admin_with_permission("school")), ) -> Any: if timeslot := crud.timeslot.get(db, id=timeslot_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is deleting timeslot {timeslot.id} (start - " f"{timeslot.start_time}, end - {timeslot.end_time})") return crud.timeslot.remove(db, id=timeslot_id)
def delete_term( *, db: Session = Depends(deps.get_db), term_id: str, current_admin: models.Admin = Depends( deps.get_current_admin_with_permission("term")), ) -> Any: if term := crud.term.get(db, term_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is deleting Term {term.id} ({term.id})" ) return crud.term.remove(db, id=term_id)
def read_schools( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, _: models.Admin = Depends( deps.get_current_admin_with_permission("school")), ) -> Any: """ Retrieve schools. """ schools = crud.school.get_multi(db, skip=skip, limit=limit) return schools
def delete_school( *, db: Session = Depends(deps.get_db), school_id: str, current_admin: models.Admin = Depends( deps.get_current_admin_with_permission("school")), ) -> Any: if school := crud.school.get(db, school_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is deleting School {school.id} ({school.name})" ) return crud.school.remove(db, id=school_id)
def update_term( *, db: Session = Depends(deps.get_db), term_id: str, term_in: schemas.TermUpdate, current_admin: models.Admin = Depends( deps.get_current_admin_with_permission("term")), ) -> Any: if term := crud.term.get(db, term_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is updating Term {term.id} ({term.name}) to" f" {term_in.__dict__}") return crud.term.update(db, db_obj=term, obj_in=term_in)
def delete_division( *, db: Session = Depends(deps.get_db), division_id: str, current_admin: models.Admin = Depends( deps.get_current_admin_with_permission("course")), ) -> Any: if division := crud.division.get(db, id=division_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is deleting Division {division.id} " f"({division.course.name} - {division.division_code} for Term {division.course.name})" ) return crud.division.remove(db, id=division_id)
def update_course( *, db: Session = Depends(deps.get_db), course_id: str, course_in: schemas.CourseUpdate, current_admin: models.Admin = Depends(deps.get_current_admin_with_permission("course")), ) -> Any: if course := crud.course.get(db, id=course_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is updating Course {course.id}({course.name}) " f"to {course_in.__dict__}" ) return crud.course.update(db, db_obj=course, obj_in=course_in)
def update_year( *, db: Session = Depends(deps.get_db), year_id: str, year_in: schemas.YearUpdate, current_admin: models.Admin = Depends(deps.get_current_admin_with_permission("year")), ) -> Any: if year := crud.year.get(db, year_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is updating Year {year.id} ({year.name}) to" f"{year_in.__dict__}" ) return crud.year.update(db, db_obj=year, obj_in=year_in)
def update_timeslot( *, db: Session = Depends(deps.get_db), timeslot_id: str, timeslot_in: schemas.TimeSlotUpdate, current_admin: models.Admin = Depends( deps.get_current_admin_with_permission("school")), ) -> Any: if timeslot := crud.timeslot.get(db, id=timeslot_id): logging.info( f"Admin {current_admin.user_id} ({current_admin.user.email}) is updating timeslot {timeslot.id} (start - " f"{timeslot.start_time}, end - {timeslot.end_time}) to {timeslot_in.__dict__}" ) return crud.timeslot.update(db, db_obj=timeslot, obj_in=timeslot_in)