diff --git a/.gitignore b/.gitignore index 0c6d187..6063baa 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ venv/ Session.vim *.flac *.mp3 +StudioPlaylist.png diff --git a/app/model.py b/app/model.py index c5e544a..87c3ff4 100644 --- a/app/model.py +++ b/app/model.py @@ -11,8 +11,7 @@ from sqlalchemy import ( Float, ForeignKey, Integer, - String, - Table + String ) from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.orm import relationship, sessionmaker @@ -69,46 +68,66 @@ class Settings(Base): session.commit() -playlist_tracks = Table( - 'playlistracks', +class PlaylistTracks(Base): + __tablename__ = 'playlisttracks' Base.metadata, - Column('playlist_id', Integer, ForeignKey('playlists.id')), - Column('track_id', Integer, ForeignKey('tracks.id')) -) + id = Column(Integer, primary_key=True, autoincrement=True) + playlist_id = Column(Integer, ForeignKey('playlists.id'), primary_key=True) + track_id = Column(Integer, ForeignKey('tracks.id'), primary_key=True) + sort = Column(Integer, nullable=False) + tracks = relationship("Tracks", back_populates="playlists") + playlists = relationship("Playlists", back_populates="tracks") class Playlists(Base): """ Usage: - In [3]: pl = session.query(Playlists).filter(Playlists.id == 1).one() + pl = session.query(Playlists).filter(Playlists.id == 1).one() - In [4]: pl - Out[4]: + pl + - In [5]: tr = session.query(Tracks).filter(Tracks.id == 3837).one() + pl.tracks + [<__main__.PlaylistTracks at 0x7fcd20181c18>, + <__main__.PlaylistTracks at 0x7fcd20181c88>, + <__main__.PlaylistTracks at 0x7fcd20181be0>, + <__main__.PlaylistTracks at 0x7fcd20181c50>] - In [6]: tr - Out[6]: ] + tr = session.query(Tracks).filter(Tracks.id == 676).one() - In [9]: pl.tracks - Out[9]: [ + + glue.track_id = tr.id + + pl.tracks.append(glue) + + session.commit() + + [a.tracks for a in pl.tracks] + [") @@ -123,7 +142,7 @@ class Playlists(Base): self.tracks.append(track) def get_tracks(self): - return self.tracks + return [a.tracks for a in self.tracks] class Tracks(Base): @@ -139,10 +158,7 @@ class Tracks(Base): path = Column(String(2048), index=False, nullable=False) mtime = Column(Float, index=True) lastplayed = Column(DateTime, index=True, default=None) - playlists = relationship( - "Playlists", - secondary=playlist_tracks, - back_populates="tracks") + playlists = relationship("PlaylistTracks", back_populates="tracks") playdates_id = Column(Integer, ForeignKey('playdates.id')) playdates = relationship("Playdates", back_populates="tracks") diff --git a/migrations/versions/9bf80ba3635f_add_id_to_playlist_association_table.py b/migrations/versions/9bf80ba3635f_add_id_to_playlist_association_table.py new file mode 100644 index 0000000..878855f --- /dev/null +++ b/migrations/versions/9bf80ba3635f_add_id_to_playlist_association_table.py @@ -0,0 +1,34 @@ +"""Add id to playlist association table + +Revision ID: 9bf80ba3635f +Revises: f071129cbd93 +Create Date: 2021-03-28 12:16:14.631579 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9bf80ba3635f' +down_revision = 'f071129cbd93' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + conn.execute( + "ALTER TABLE playlistracks ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST" + ) + conn.execute("RENAME TABLE playlistracks TO playlisttracks") + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + conn.execute("ALTER TABLE playlistracks DROP id") + conn.execute("RENAME TABLE playlisttracks TO playlistracks") + # ### end Alembic commands ### diff --git a/migrations/versions/f071129cbd93_add_sort_to_playlist_association_table.py b/migrations/versions/f071129cbd93_add_sort_to_playlist_association_table.py new file mode 100644 index 0000000..b7736ff --- /dev/null +++ b/migrations/versions/f071129cbd93_add_sort_to_playlist_association_table.py @@ -0,0 +1,28 @@ +"""Add sort to playlist association table + +Revision ID: f071129cbd93 +Revises: f07b96a5e60f +Create Date: 2021-03-28 11:19:31.944110 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'f071129cbd93' +down_revision = 'f07b96a5e60f' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('playlistracks', sa.Column('sort', sa.Integer(), nullable=False)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('playlistracks', 'sort') + # ### end Alembic commands ###