repositories.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 TrackTagRepository(Repository):
  46. MODEL_CLS = TrackTag
  47. class TrackRepository(Repository):
  48. MODEL_CLS = Track
  49. def get_all(self):
  50. return self.query().order_by(Track.artist).order_by(Track.album).order_by(Track.track_num).all()
  51. def get_by_hash(self, hash_):
  52. return self.query().filter(Track.hash == hash_).first()
  53. def get_by_tag_id(self, tag_id):
  54. return self.session.query(Track)\
  55. .join(TrackTag, Track.id == TrackTag.track_id)\
  56. .filter(TrackTag.tag_id == tag_id).\
  57. all()
  58. def get_by_tag_ids(self, tag_ids):
  59. return self.session.query(Track)\
  60. .join(TrackTag, Track.id == TrackTag.track_id)\
  61. .filter(TrackTag.tag_id.in_(tag_ids)).\
  62. all()
  63. def get_artists(self):
  64. return self.session.query(Track).group_by(Track.artist).all()
  65. def get_albums_by_artist(self, artist):
  66. return self.session.query(Track).filter(Track.artist == artist).group_by(Track.album).all()
  67. def get_by_artist_and_album(self, artist, album):
  68. return self.session.query(Track)\
  69. .filter(Track.artist == artist)\
  70. .filter(Track.album == album)\
  71. .group_by(Track.album)\
  72. .all()
  73. def add_to_session(self, track_id, session_id):
  74. track_session = SessionTrack()
  75. track_session.track_id = track_id
  76. track_session.session_id = session_id
  77. row = self.session.query(func.max(SessionTrack.order)).filter(SessionTrack.session_id == session_id)
  78. order = (row.scalar() or 0) + 1
  79. track_session.order = order
  80. self.create(track_session)
  81. self.commit()
  82. def get_by_session_id(self, session_id):
  83. return self.session.query(Track) \
  84. .join(SessionTrack, Track.id == SessionTrack.track_id) \
  85. .filter(SessionTrack.session_id == session_id)\
  86. .order_by(SessionTrack.order)\
  87. .all()
  88. class SessionTrackRepository(Repository):
  89. MODEL_CLS = SessionTrack
  90. def get_by_session_id(self, session_id):
  91. return self.session.query(SessionTrack)\
  92. .filter(SessionTrack.session_id == session_id)\
  93. .order_by(SessionTrack.order)\
  94. .all()
  95. class SessionFolderRepository(Repository):
  96. MODEL_CLS = SessionFolder
  97. def __init__(self, *args, **kwargs):
  98. super().__init__(*args, **kwargs)
  99. class SessionRepository(Repository):
  100. MODEL_CLS = Session
  101. def __init__(self, *args, **kwargs):
  102. super().__init__(*args, **kwargs)
  103. def get_all(self):
  104. return self.query().order_by(Session.date.desc()).order_by(Session.created_on.desc()).all()
  105. def get_by_folder_id(self, folder_id):
  106. return self.get_by('folder_id', folder_id)
  107. def get_by_track_id(self, track_id):
  108. return self.session.query(Session)\
  109. .join(SessionTrack, Track.id == SessionTrack.track_id)\
  110. .filter(SessionTrack.track_id == track_id).\
  111. all()