From 963da0b5d0b88fe1793f5f157cd3f14266de82e2 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sat, 8 Mar 2025 21:30:37 +0000 Subject: [PATCH] No db calls when servicing data() except for caching --- app/models.py | 8 ++++---- app/music_manager.py | 6 ++++++ app/playlistmodel.py | 41 ++++++++++++++++++++++------------------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/app/models.py b/app/models.py index 66f8c73..cec667d 100644 --- a/app/models.py +++ b/app/models.py @@ -109,7 +109,7 @@ class NoteColours(dbtables.NoteColoursTable): @staticmethod def get_colour( session: Session, text: str, foreground: bool = False - ) -> Optional[str]: + ) -> str: """ Parse text and return background (foreground if foreground==True) colour string if matched, else None @@ -117,7 +117,7 @@ class NoteColours(dbtables.NoteColoursTable): """ if not text: - return None + return "" match = False for rec in NoteColours.get_all(session): @@ -138,10 +138,10 @@ class NoteColours(dbtables.NoteColoursTable): if match: if foreground: - return rec.foreground + return rec.foreground or "" else: return rec.colour - return None + return "" def invalidate_cache(self) -> None: """Invalidate dogpile cache""" diff --git a/app/music_manager.py b/app/music_manager.py index 565f0dc..9ae6147 100644 --- a/app/music_manager.py +++ b/app/music_manager.py @@ -439,6 +439,12 @@ class RowAndTrack: self.row_number = playlist_row.row_number self.track_id = playlist_row.track_id + # Playlist display data + self.row_fg: Optional[str] = None + self.row_bg: Optional[str] = None + self.note_fg: Optional[str] = None + self.note_bg: Optional[str] = None + # Collect track data if there's a track if playlist_row.track_id: self.artist = playlist_row.track.artist diff --git a/app/playlistmodel.py b/app/playlistmodel.py index 4663275..04205a5 100644 --- a/app/playlistmodel.py +++ b/app/playlistmodel.py @@ -70,8 +70,11 @@ class PlaylistModel(QAbstractTableModel): database. """ - def __init__(self, playlist_id: int, is_template: bool,) -> None: - + def __init__( + self, + playlist_id: int, + is_template: bool, + ) -> None: super().__init__() log.debug("PlaylistModel.__init__()") @@ -182,12 +185,13 @@ class PlaylistModel(QAbstractTableModel): # Header row if self.is_header_row(row): # Check for specific header colouring - with db.Session() as session: - note_background = NoteColours.get_colour(session, rat.note) - if note_background: - return QBrush(QColor(note_background)) - else: - return QBrush(QColor(Config.COLOUR_NOTES_PLAYLIST)) + if rat.row_bg is None: + with db.Session() as session: + rat.row_bg = NoteColours.get_colour(session, rat.note) + if rat.row_bg: + return QBrush(QColor(rat.row_bg)) + else: + return QBrush(QColor(Config.COLOUR_NOTES_PLAYLIST)) # Unreadable track file if file_is_unreadable(rat.path): return QBrush(QColor(Config.COLOUR_UNREADABLE)) @@ -219,10 +223,11 @@ class PlaylistModel(QAbstractTableModel): return QBrush(QColor(Config.COLOUR_BITRATE_OK)) if column == Col.NOTE.value: if rat.note: - with db.Session() as session: - note_background = NoteColours.get_colour(session, rat.note) - if note_background: - return QBrush(QColor(note_background)) + if rat.note_bg is None: + with db.Session() as session: + rat.note_bg = NoteColours.get_colour(session, rat.note) + if rat.note_bg: + return QBrush(QColor(rat.note_bg)) return QBrush() @@ -1575,13 +1580,11 @@ class PlaylistModel(QAbstractTableModel): if not track_id: return "" playdates = Playdates.last_playdates(session, track_id) - return ( - "
".join( - [ - a.lastplayed.strftime(Config.LAST_PLAYED_TOOLTIP_DATE_FORMAT) - for a in playdates - ] - ) + return "
".join( + [ + a.lastplayed.strftime(Config.LAST_PLAYED_TOOLTIP_DATE_FORMAT) + for a in playdates + ] ) def update_or_insert(self, track_id: int, row_number: int) -> None: