repositories.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. from sqlalchemy import func
  2. from core import db
  3. from core.models import MusicFolder, Track, Tag, TrackTag, SessionTrack, Session, SessionFolder
  4. class Repository:
  5. MODEL_CLS = None
  6. def __init__(self, session=None):
  7. self.session = session if session else db.Session()
  8. def query(self):
  9. return self.session.query(self.MODEL_CLS)
  10. def commit(self):
  11. self.session.commit()
  12. def rollback(self):
  13. self.session.rollback()
  14. def get_by_id(self, id_):
  15. return self.query().filter(self.MODEL_CLS.id == id_).first()
  16. def get_all(self):
  17. return self.query().all()
  18. def get_by(self, field, val):
  19. return self.query().filter(field == val).all()
  20. def exists(self, field, val):
  21. return self.query().filter(field == val).exists()
  22. def create(self, model, commit=False):
  23. self.session.add(model)
  24. if commit:
  25. self.session.commit()
  26. def delete(self, model, commit=False):
  27. self.session.delete(model)
  28. if commit:
  29. self.commit()
  30. # def __del__(self):
  31. # self.session.remove()
  32. class MusicFolderRepository(Repository):
  33. MODEL_CLS = MusicFolder
  34. def __init__(self, *args, **kwargs):
  35. super().__init__(*args, **kwargs)
  36. class TagRepository(Repository):
  37. MODEL_CLS = Tag
  38. def __init__(self, *args, **kwargs):
  39. super().__init__(*args, **kwargs)
  40. def get_by_track_id(self, track_id):
  41. return self.session.query(Tag)\
  42. .join(TrackTag, Tag.id == TrackTag.tag_id)\
  43. .filter(TrackTag.track_id == track_id).\
  44. all()
  45. class TrackRepository(Repository):
  46. MODEL_CLS = Track
  47. def get_all(self):
  48. return self.query().order_by(Track.artist).order_by(Track.album).order_by(Track.track_num).all()
  49. def get_by_hash(self, hash_):
  50. return self.query().filter(hash == hash_).first()
  51. def get_by_tag_id(self, tag_id):
  52. return self.session.query(Track)\
  53. .join(TrackTag, Track.id == TrackTag.track_id)\
  54. .filter(TrackTag.tag_id == tag_id).\
  55. all()
  56. def get_by_tag_ids(self, tag_ids):
  57. return self.session.query(Track)\
  58. .join(TrackTag, Track.id == TrackTag.track_id)\
  59. .filter(TrackTag.tag_id.in_(tag_ids)).\
  60. all()
  61. def get_artists(self):
  62. return self.session.query(Track).group_by(Track.artist).all()
  63. def get_albums_by_artist(self, artist):
  64. return self.session.query(Track).where(Track.artist == artist).group_by(Track.album).all()
  65. def get_by_artist_and_album(self, artist, album):
  66. return self.session.query(Track)\
  67. .where(Track.artist == artist)\
  68. .where(Track.album == album)\
  69. .group_by(Track.album)\
  70. .all()
  71. def add_to_session(self, track_id, session_id):
  72. track_session = SessionTrack()
  73. track_session.track_id = track_id
  74. track_session.session_id = session_id
  75. row = self.session.query(func.max(SessionTrack.order)).filter(SessionTrack.session_id == session_id)
  76. order = (row.scalar() or 0) + 1
  77. track_session.order = order
  78. self.create(track_session)
  79. self.commit()
  80. def get_by_session_id(self, session_id):
  81. return self.session.query(Track) \
  82. .join(SessionTrack, Track.id == SessionTrack.track_id) \
  83. .filter(SessionTrack.session_id == session_id)\
  84. .order_by(SessionTrack.order)\
  85. .all()
  86. class SessionTrackRepository(Repository):
  87. MODEL_CLS = SessionTrack
  88. def get_by_session_id(self, session_id):
  89. return self.session.query(SessionTrack)\
  90. .filter(SessionTrack.session_id == session_id)\
  91. .order_by(SessionTrack.order)\
  92. .all()
  93. class SessionFolderRepository(Repository):
  94. MODEL_CLS = SessionFolder
  95. def __init__(self, *args, **kwargs):
  96. super().__init__(*args, **kwargs)
  97. class SessionRepository(Repository):
  98. MODEL_CLS = Session
  99. def __init__(self, *args, **kwargs):
  100. super().__init__(*args, **kwargs)
  101. def get_all(self):
  102. return self.query().order_by(Session.date.desc()).order_by(Session.created_on.desc()).all()
  103. def get_by_folder_id(self, folder_id):
  104. return self.get_by('folder_id', folder_id)
  105. def get_by_track_id(self, track_id):
  106. return self.session.query(Session)\
  107. .join(SessionTrack, Track.id == SessionTrack.track_id)\
  108. .filter(SessionTrack.track_id == track_id).\
  109. all()