crud.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from sqlmodel import Session, select
  2. from models import Subject, ErrorImage, Evaluation
  3. from datetime import datetime
  4. from typing import List, Optional
  5. def create_subject(session: Session, name: str, color: str = "#6366f1") -> Subject:
  6. existing = session.exec(select(Subject).where(Subject.name == name.strip())).first()
  7. if existing:
  8. return existing
  9. subject = Subject(name=name.strip(), color=color)
  10. session.add(subject)
  11. session.commit()
  12. session.refresh(subject)
  13. return subject
  14. def get_all_subjects(session: Session) -> List[Subject]:
  15. return list(session.exec(select(Subject).order_by(Subject.created_at.asc())).all())
  16. def get_subject(session: Session, subject_id: int) -> Optional[Subject]:
  17. return session.get(Subject, subject_id)
  18. def delete_subject(session: Session, subject_id: int) -> bool:
  19. subject = session.get(Subject, subject_id)
  20. if not subject:
  21. return False
  22. # Delete all images files
  23. from pathlib import Path
  24. upload_dir = Path("static/uploads")
  25. for img in subject.error_images:
  26. p = upload_dir / img.filename
  27. if p.exists():
  28. p.unlink()
  29. session.delete(subject)
  30. session.commit()
  31. return True
  32. def add_error_images(session: Session, subject_id: int, date: str, filenames: List[str], original_names: List[str]):
  33. for fn, on in zip(filenames, original_names):
  34. img = ErrorImage(subject_id=subject_id, date=date, filename=fn, original_name=on)
  35. session.add(img)
  36. session.commit()
  37. def get_subject_images(session: Session, subject_id: int, date: Optional[str] = None) -> List[ErrorImage]:
  38. stmt = select(ErrorImage).where(ErrorImage.subject_id == subject_id)
  39. if date:
  40. stmt = stmt.where(ErrorImage.date == date)
  41. return list(session.exec(stmt.order_by(ErrorImage.upload_time.asc())).all())
  42. def get_dates_for_subject(session: Session, subject_id: int) -> List[str]:
  43. stmt = select(ErrorImage.date).where(ErrorImage.subject_id == subject_id).distinct().order_by(ErrorImage.date.desc())
  44. return list(session.exec(stmt).all())
  45. def get_all_dates(session: Session) -> List[str]:
  46. stmt = select(ErrorImage.date).distinct().order_by(ErrorImage.date.desc())
  47. return list(session.exec(stmt).all())
  48. def add_evaluation(session: Session, subject_id: int, date: str, title: str, content: str, filename: Optional[str]) -> Evaluation:
  49. ev = Evaluation(subject_id=subject_id, date=date, title=title, content=content, filename=filename)
  50. session.add(ev)
  51. session.commit()
  52. session.refresh(ev)
  53. return ev
  54. def get_evaluations(session: Session, subject_id: Optional[int] = None) -> List[Evaluation]:
  55. stmt = select(Evaluation).order_by(Evaluation.date.desc(), Evaluation.upload_time.desc())
  56. if subject_id:
  57. stmt = stmt.where(Evaluation.subject_id == subject_id)
  58. return list(session.exec(stmt).all())
  59. def get_review_data(session: Session) -> dict:
  60. subjects = get_all_subjects(session)
  61. data = {}
  62. for s in subjects:
  63. images = list(session.exec(
  64. select(ErrorImage).where(ErrorImage.subject_id == s.id).order_by(ErrorImage.date.asc(), ErrorImage.upload_time.asc())
  65. ).all())
  66. dates = sorted(set(img.date for img in images))
  67. data[s.id] = {"subject": s, "images": images, "dates": dates}
  68. return data
  69. def delete_image(session: Session, image_id: int):
  70. img = session.get(ErrorImage, image_id)
  71. if img:
  72. from pathlib import Path
  73. path = Path("static/uploads") / img.filename
  74. if path.exists():
  75. path.unlink()
  76. session.delete(img)
  77. session.commit()
  78. return img