diff --git a/src/scheduling/fallback.py b/src/scheduling/fallback.py index bcf669f4cd9bd3c0b052428e65210cdde531d8ff..6a6133aa6c62e1b745776d5910d780bdab2088ad 100644 --- a/src/scheduling/fallback.py +++ b/src/scheduling/fallback.py @@ -138,8 +138,7 @@ class FallbackManager: if fallback_type != self.state.get("previous_fallback_type"): timeslot = self.state["timeslot"] if timeslot: - with DB.Session() as session: - session.merge(timeslot) + DB.session.merge(timeslot) self.engine.event_dispatcher.on_fallback_active(timeslot, fallback_type) diff --git a/src/scheduling/models.py b/src/scheduling/models.py index b014727c9a7a84a58959e0d682989bb2b5c584bf..be82741d1f0fb07d1d2e61f5aeec4ec9062207ea 100644 --- a/src/scheduling/models.py +++ b/src/scheduling/models.py @@ -17,7 +17,6 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -import contextlib import sys import time import logging @@ -25,7 +24,6 @@ import datetime import sqlalchemy as sa -import sqlalchemy from sqlalchemy import BigInteger, Boolean, Column, DateTime, Integer, String, ForeignKey, ColumnDefault from sqlalchemy.orm import scoped_session from sqlalchemy.orm import sessionmaker @@ -42,40 +40,14 @@ config = AuraConfig() engine = sa.create_engine(config.get_database_uri()) Base = declarative_base() Base.metadata.bind = engine -__sqlalchemy_version = tuple(int(item) for item in sqlalchemy.__version__.split(".")[:2]) - class DB(): session_factory = sessionmaker(bind=engine) Session = scoped_session(session_factory) + session = Session() Model = Base -# Monkey-patch the above DB.Session generator for SQLAlchemy before v1.4. -# Such older versions of SQLAlchemy do not support contexts. -if __sqlalchemy_version < (1, 4): - @contextlib.contextmanager - def get_session_context(): - """ provide a context for a session - - This context is the same as the one provided by a "scoped_session" in SQLAlchemy v1.4 or - later. - - see https://docs.sqlalchemy.org/en/13/orm/session_basics.html#when-do-i-construct-a-session-when-do-i-commit-it-and-when-do-i-close-it - """ - session = scoped_session(DB.session_factory) - - # Commented out because of https://gitlab.servus.at/aura/engine/-/issues/90 - # try: - # yield session - # finally: - # session.close() - - yield session - - - DB.Session = get_session_context - class AuraDatabaseModel(): """ @@ -97,32 +69,29 @@ class AuraDatabaseModel(): """ Store to the database """ - with DB.Session() as session: - if add: - session.add(self) - else: - session.merge(self) - if commit: - session.commit() + if add: + DB.session.add(self) + else: + DB.session.merge(self) + if commit: + DB.session.commit() def delete(self, commit=False): """ Delete from the database """ - with DB.Session() as session: - session.delete(self) - if commit: - session.commit() + DB.session.delete(self) + if commit: + DB.session.commit() def refresh(self): """ Refreshes the correct record """ - with DB.Session() as session: - session.expire(self) - session.refresh(self) + DB.session.expire(self) + DB.session.refresh(self) def _asdict(self): @@ -163,8 +132,7 @@ class AuraDatabaseModel(): """ Base.metadata.drop_all() Base.metadata.create_all() - with DB.Session() as session: - session.commit() + DB.session.commit() if systemexit: sys.exit(0) @@ -197,27 +165,27 @@ class Timeslot(DB.Model, AuraDatabaseModel): playlist = relationship("Playlist", primaryjoin="and_(Timeslot.timeslot_start==Playlist.timeslot_start, \ Timeslot.playlist_id==Playlist.playlist_id, Timeslot.show_name==Playlist.show_name)", - uselist=False, back_populates="timeslot", lazy='subquery') + uselist=False, back_populates="timeslot") default_schedule_playlist = relationship("Playlist", primaryjoin="and_(Timeslot.timeslot_start==Playlist.timeslot_start, \ Timeslot.default_schedule_playlist_id==Playlist.playlist_id, Timeslot.show_name==Playlist.show_name)", - uselist=False, back_populates="timeslot", lazy='subquery') + uselist=False, back_populates="timeslot") default_show_playlist = relationship("Playlist", primaryjoin="and_(Timeslot.timeslot_start==Playlist.timeslot_start, \ Timeslot.default_show_playlist_id==Playlist.playlist_id, Timeslot.show_name==Playlist.show_name)", - uselist=False, back_populates="timeslot", lazy='subquery') + uselist=False, back_populates="timeslot") schedule_fallback = relationship("Playlist", primaryjoin="and_(Timeslot.timeslot_start==Playlist.timeslot_start, \ Timeslot.schedule_fallback_id==Playlist.playlist_id, Timeslot.show_name==Playlist.show_name)", - uselist=False, back_populates="timeslot", lazy='subquery') + uselist=False, back_populates="timeslot") show_fallback = relationship("Playlist", primaryjoin="and_(Timeslot.timeslot_start==Playlist.timeslot_start, \ Timeslot.show_fallback_id==Playlist.playlist_id, Timeslot.show_name==Playlist.show_name)", - uselist=False, back_populates="timeslot", lazy='subquery') + uselist=False, back_populates="timeslot") station_fallback = relationship("Playlist", primaryjoin="and_(Timeslot.timeslot_start==Playlist.timeslot_start, \ Timeslot.station_fallback_id==Playlist.playlist_id, Timeslot.show_name==Playlist.show_name)", - uselist=False, back_populates="timeslot", lazy='subquery') + uselist=False, back_populates="timeslot") playlist_id = Column(Integer) default_schedule_playlist_id = Column(Integer) @@ -255,12 +223,7 @@ class Timeslot(DB.Model, AuraDatabaseModel): Args: date_time (datetime): date and time when the timeslot starts """ - with DB.Session() as session: - return ( - session.query(Timeslot) - .filter(Timeslot.timeslot_start == date_time) - .first() - ) + return DB.session.query(Timeslot).filter(Timeslot.timeslot_start == date_time).first() @staticmethod @@ -275,13 +238,10 @@ class Timeslot(DB.Model, AuraDatabaseModel): Returns: ([Timeslot]): List of timeslots """ - with DB.Session() as session: - return ( - session.query(Timeslot) - .filter(Timeslot.timeslot_start >= date_from) - .order_by(Timeslot.timeslot_start) - .all() - ) + timeslots = DB.session.query(Timeslot).\ + filter(Timeslot.timeslot_start >= date_from).\ + order_by(Timeslot.timeslot_start).all() + return timeslots def set_active_entry(self, entry): @@ -381,8 +341,8 @@ class Playlist(DB.Model, AuraDatabaseModel): timeslot_start = Column(DateTime, ForeignKey("timeslot.timeslot_start")) # Relationships - timeslot = relationship("Timeslot", uselist=False, back_populates="playlist", lazy='subquery') - entries = relationship("PlaylistEntry", back_populates="playlist", lazy='subquery') + timeslot = relationship("Timeslot", uselist=False, back_populates="playlist") + entries = relationship("PlaylistEntry", back_populates="playlist") # Data playlist_id = Column(Integer, autoincrement=False) @@ -395,8 +355,7 @@ class Playlist(DB.Model, AuraDatabaseModel): # """ # Fetches all entries # """ - # with DB.Session() as session: - # all_entries = session.query(Playlist).filter(Playlist.fallback_type == 0).all() + # all_entries = DB.session.query(Playlist).filter(Playlist.fallback_type == 0).all() # cnt = 0 # for entry in all_entries: @@ -422,12 +381,7 @@ class Playlist(DB.Model, AuraDatabaseModel): Exception: In case there a inconsistent database state, such es multiple playlists for given date/time. """ playlist = None - with DB.Session() as session: - playlists = ( - session.query(Playlist) - .filter(Playlist.timeslot_start == start_date) - .all() - ) + playlists = DB.session.query(Playlist).filter(Playlist.timeslot_start == start_date).all() for p in playlists: if p.playlist_id == playlist_id: @@ -447,13 +401,7 @@ class Playlist(DB.Model, AuraDatabaseModel): Returns: (Array<Playlist>): An array holding the playlists """ - with DB.Session() as session: - return ( - session.query(Playlist) - .filter(Playlist.playlist_id == playlist_id) - .order_by(Playlist.timeslot_start) - .all() - ) + return DB.session.query(Playlist).filter(Playlist.playlist_id == playlist_id).order_by(Playlist.timeslot_start).all() @staticmethod @@ -461,11 +409,10 @@ class Playlist(DB.Model, AuraDatabaseModel): """ Checks if the given is empty """ - with DB.Session() as session: - try: - return not session.query(Playlist).one_or_none() - except sa.orm.exc.MultipleResultsFound: - return False + try: + return not DB.session.query(Playlist).one_or_none() + except sa.orm.exc.MultipleResultsFound: + return False @hybrid_property @@ -540,8 +487,8 @@ class PlaylistEntry(DB.Model, AuraDatabaseModel): artificial_playlist_id = Column(Integer, ForeignKey("playlist.artificial_id")) # Relationships - playlist = relationship("Playlist", uselist=False, back_populates="entries", lazy='subquery') - meta_data = relationship("PlaylistEntryMetaData", uselist=False, back_populates="entry", lazy='subquery') + playlist = relationship("Playlist", uselist=False, back_populates="entries") + meta_data = relationship("PlaylistEntryMetaData", uselist=False, back_populates="entry") # Data entry_num = Column(Integer) @@ -562,37 +509,26 @@ class PlaylistEntry(DB.Model, AuraDatabaseModel): """ Selects one entry identified by `playlist_id` and `entry_num`. """ - with DB.Session() as session: - return ( - session.query(PlaylistEntry) - .filter(PlaylistEntry.entry_num == entry_num) - .filter(PlaylistEntry.artificial_playlist_id == artificial_playlist_id) - .first() - ) + return DB.session.query(PlaylistEntry).filter(PlaylistEntry.artificial_playlist_id == artificial_playlist_id, PlaylistEntry.entry_num == entry_num).first() @staticmethod def delete_entry(artificial_playlist_id, entry_num): """ Deletes the playlist entry and associated metadata. """ - with DB.Session() as session: - entry = PlaylistEntry.select_playlistentry_for_playlist(artificial_playlist_id, entry_num) - metadata = PlaylistEntryMetaData.select_metadata_for_entry(entry.artificial_id) - metadata.delete() - entry.delete() - session.commit() + entry = PlaylistEntry.select_playlistentry_for_playlist(artificial_playlist_id, entry_num) + metadata = PlaylistEntryMetaData.select_metadata_for_entry(entry.artificial_id) + metadata.delete() + entry.delete() + DB.session.commit() @staticmethod def count_entries(artificial_playlist_id): """ Returns the count of all entries. """ - with DB.Session() as session: - return ( - session.query(PlaylistEntry) - .filter(PlaylistEntry.artificial_playlist_id == artificial_playlist_id) - .count() - ) + result = DB.session.query(PlaylistEntry).filter(PlaylistEntry.artificial_playlist_id == artificial_playlist_id).count() + return result @hybrid_property def entry_end(self): @@ -688,7 +624,7 @@ class PlaylistEntryMetaData(DB.Model, AuraDatabaseModel): artificial_entry_id = Column(Integer, ForeignKey("playlist_entry.artificial_id")) # Relationships - entry = relationship("PlaylistEntry", uselist=False, back_populates="meta_data", lazy='subquery') + entry = relationship("PlaylistEntry", uselist=False, back_populates="meta_data") # Data artist = Column(String(256)) @@ -697,13 +633,7 @@ class PlaylistEntryMetaData(DB.Model, AuraDatabaseModel): @staticmethod def select_metadata_for_entry(artificial_playlistentry_id): - with DB.Session() as session: - return ( - session.query(PlaylistEntryMetaData) - .filter(PlaylistEntryMetaData.artificial_entry_id == artificial_playlistentry_id) - .first() - ) - + return DB.session.query(PlaylistEntryMetaData).filter(PlaylistEntryMetaData.artificial_entry_id == artificial_playlistentry_id).first() -Base.metadata.create_all(engine) \ No newline at end of file +Base.metadata.create_all(engine)