crud.py 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 add_error_text(session: Session, subject_id: int, date: str, question: str, answer: str):
  38. img = ErrorImage(subject_id=subject_id, date=date, question=question.strip(), answer=answer.strip())
  39. session.add(img)
  40. session.commit()
  41. session.refresh(img)
  42. return img
  43. def get_subject_images(session: Session, subject_id: int, date: Optional[str] = None) -> List[ErrorImage]:
  44. stmt = select(ErrorImage).where(ErrorImage.subject_id == subject_id)
  45. if date:
  46. stmt = stmt.where(ErrorImage.date == date)
  47. return list(session.exec(stmt.order_by(ErrorImage.upload_time.asc())).all())
  48. def get_dates_for_subject(session: Session, subject_id: int) -> List[str]:
  49. stmt = select(ErrorImage.date).where(ErrorImage.subject_id == subject_id).distinct().order_by(ErrorImage.date.desc())
  50. return list(session.exec(stmt).all())
  51. def get_all_dates(session: Session) -> List[str]:
  52. stmt = select(ErrorImage.date).distinct().order_by(ErrorImage.date.desc())
  53. return list(session.exec(stmt).all())
  54. def add_evaluation(session: Session, subject_id: int, date: str, title: str, content: str, filename: Optional[str]) -> Evaluation:
  55. ev = Evaluation(subject_id=subject_id, date=date, title=title, content=content, filename=filename)
  56. session.add(ev)
  57. session.commit()
  58. session.refresh(ev)
  59. return ev
  60. def get_evaluations(session: Session, subject_id: Optional[int] = None) -> List[Evaluation]:
  61. stmt = select(Evaluation).order_by(Evaluation.date.desc(), Evaluation.upload_time.desc())
  62. if subject_id:
  63. stmt = stmt.where(Evaluation.subject_id == subject_id)
  64. return list(session.exec(stmt).all())
  65. def get_review_data(session: Session) -> dict:
  66. subjects = get_all_subjects(session)
  67. data = {}
  68. for s in subjects:
  69. images = list(session.exec(
  70. select(ErrorImage).where(ErrorImage.subject_id == s.id).order_by(ErrorImage.date.asc(), ErrorImage.upload_time.asc())
  71. ).all())
  72. dates = sorted(set(img.date for img in images))
  73. data[s.id] = {"subject": s, "images": images, "dates": dates}
  74. return data
  75. def delete_image(session: Session, image_id: int):
  76. img = session.get(ErrorImage, image_id)
  77. if img:
  78. from pathlib import Path
  79. path = Path("static/uploads") / img.filename
  80. if path.exists():
  81. path.unlink()
  82. session.delete(img)
  83. session.commit()
  84. return img