diff options
Diffstat (limited to 'models/artist.py')
-rw-r--r-- | models/artist.py | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/models/artist.py b/models/artist.py new file mode 100644 index 0000000..eaae27e --- /dev/null +++ b/models/artist.py @@ -0,0 +1,115 @@ +from common import utils +from db.db_manager import DbManager + + +class Artist: + def __init__(self, id=None, **kwargs): + if id is not None: + db = DbManager() + for row in db.execute("""SELECT * FROM artist WHERE id = ?""", + (id,)): + setattr(self, "id", id) + setattr(self, "name", row[1]) + setattr(self, "sortname", row[2]) + setattr(self, "musicbrainz_artistid", row[3]) + else: + for (key, value) in kwargs.items(): + setattr(self, key, value) + + def delete(self): + db = DbManager() + + for album in self.albums: + album.delete() + + delete_sql = "DELETE FROM artist WHERE id = ?" + db.execute(delete_sql, (self.id,)) + + delete_track_rel_sql = "DELETE FROM artist_track WHERE artist_id = ?" + db.execute(delete_track_rel_sql, (self.id,)) + + delete_album_rel_sql = "DELETE FROM album_artist WHERE artist_id = ?" + db.execute(delete_album_rel_sql, (self.id,)) + + db.commit() + + return True + + @property + def tracks(self): + from models.track import Track + + if not hasattr(self, "_tracks"): + setattr(self, "_tracks", []) + + db = DbManager() + + for row in db.execute("""SELECT track.* FROM track + INNER JOIN artist_track ON track.id = + artist_track.track_id WHERE artist_id = ? + ORDER BY name ASC""", (self.id,)): + + track = Track(id=row[0], tracknumber=row[1], name=row[2], + grouping=row[3], filename=row[4]) + self._tracks.append(track) + + return self._tracks + + @property + def albums(self): + from models.album import Album + + if not hasattr(self, "_albums"): + setattr(self, "_albums", []) + + db = DbManager() + + for row in db.execute("""SELECT album.* FROM album + INNER JOIN album_artist ON album.id = + album_artist.album_id WHERE artist_id = ? + ORDER BY date ASC""", (self.id,)): + album = Album(id=row[0], name=row[1], date=row[2]) + self._albums.append(album) + + return self._albums + + def save(self): + dirty_attributes = {} + + # check if the internal dict has been modified + for (attr, value) in self.__dict__.items(): + if self.__data[attr] != getattr(self, attr): + dirty_attributes[attr] = value + + if len(dirty_attributes) > 0: + db = DbManager() + + set_clause = utils.update_clause_from_dict(dirty_attributes) + + dirty_attributes[id] = self.id + + sql = " ".join(("UPDATE artist"), set_clause, "WHERE id = :id") + db.execute(sql, dirty_attributes) + db.commit() + + def search(**search_params): + artists = [] + + db = DbManager() + + where_clause = utils.make_where_clause(search_params) + + result = [] + if where_clause: + statement = " ".join(("SELECT * FROM artist", where_clause)) + result = db.execute(statement, search_params) + else: + result = db.execute("SELECT * FROM artist") + + for row in result: + artists.append( + Artist(id=row[0], name=row[1], sortname=row[2], + musicbrainz_artistid=row[3]) + ) + + return artists |