clearance_sys / src /crud /students.py
Testys's picture
All changes commit
b7ed26f
"""
CRUD operations for Students.
"""
from sqlalchemy.orm import Session
from fastapi import HTTPException, status
from src import models
def get_student_by_student_id(db: Session, student_id: str) -> models.Student | None:
"""Fetches a student by their unique student ID."""
return db.query(models.Student).filter(models.Student.student_id == student_id).first()
def get_student_by_tag_id(db: Session, tag_id: str) -> models.Student | None:
"""Fetches a student by their RFID tag ID."""
return db.query(models.Student).filter(models.Student.tag_id == tag_id).first()
def get_all_students(db: Session, skip: int = 0, limit: int = 100) -> list[models.Student]:
"""Fetches all students with pagination."""
return db.query(models.Student).offset(skip).limit(limit).all()
def create_student(db: Session, student: models.StudentCreate) -> models.Student:
"""Creates a new student in the database."""
db_student = get_student_by_student_id(db, student.student_id)
if db_student:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail=f"Student with ID '{student.student_id}' already exists."
)
new_student = models.Student(**student.model_dump())
db.add(new_student)
db.commit()
db.refresh(new_student)
return new_student
def update_student_tag_id(db: Session, student_id: str, tag_id: str) -> models.Student:
"""Updates the RFID tag ID for a specific student."""
db_student = get_student_by_student_id(db, student_id)
if not db_student:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Student not found")
existing_tag_user = get_student_by_tag_id(db, tag_id)
if existing_tag_user and existing_tag_user.student_id != student_id:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail=f"Tag ID '{tag_id}' is already assigned to another student."
)
db_student.tag_id = tag_id
db.commit()
db.refresh(db_student)
return db_student
def delete_student(db: Session, student_id: str) -> models.Student:
"""
Deletes a student and all of their associated clearance records.
This function first finds the student, then deletes all related rows in the
'clearance_statuses' table before finally deleting the student record
to maintain database integrity.
"""
student_to_delete = get_student_by_student_id(db, student_id)
if not student_to_delete:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Student with ID '{student_id}' not found."
)
# First, delete all associated clearance statuses for this student.
# This is crucial to prevent foreign key constraint violations.
db.query(models.ClearanceStatus).filter(
models.ClearanceStatus.student_id == student_id
).delete(synchronize_session=False)
# Now, delete the student record itself.
db.delete(student_to_delete)
db.commit()
return student_to_delete