# Copyright 2022 (c) Anna Schumaker. """A custom Gio.ListModel for managing individual years.""" import sqlite3 from gi.repository import GObject from . import playlist from . import tracks class Year(playlist.Playlist): """Our custom Year object.""" year = GObject.Property(type=int) @property def primary_key(self) -> int: """Get this year's primary key.""" return self.year @GObject.Property(type=playlist.Playlist) def parent(self) -> playlist.Playlist | None: """Get this Year's parent playlist.""" return self.table.sql.decades.lookup(self.year) class Table(playlist.Table): """Our Year Table.""" def __init__(self, sql: GObject.TYPE_PYOBJECT, **kwargs): """Initialize the Years table.""" super().__init__(sql=sql, autodelete=True, system_tracks=False, **kwargs) def do_add_track(self, year: Year, track: tracks.Track) -> bool: """Verify adding a Track to the Year playlist.""" return track.year == year.year def do_construct(self, **kwargs) -> Year: """Construct a new Year playlist.""" return Year(**kwargs) def do_get_sort_key(self, year: Year) -> tuple: """Get the sort key for a specific year.""" return year.year def do_remove_track(self, year: Year, track: tracks.Track) -> bool: """Verify removing a Track from the Year playlist.""" return True def do_sql_delete(self, year: Year) -> sqlite3.Cursor: """Delete a year.""" if year.parent is not None: year.parent.remove_year(year) return self.sql("DELETE FROM years WHERE year=?", year.year) def do_sql_glob(self, glob: str) -> sqlite3.Cursor: """Search for years matching the search text.""" return self.sql("SELECT year FROM years_view WHERE name GLOB ?", glob) def do_sql_insert(self, year: int) -> sqlite3.Cursor | None: """Create a new Year playlist.""" if self.sql("INSERT INTO years (year) VALUES (?)", year): return self.sql("SELECT * FROM years_view WHERE year=?", year) def do_sql_select_all(self) -> sqlite3.Cursor: """Load Years from the database.""" return self.sql("SELECT * FROM years_view") def do_sql_select_one(self, year: int) -> sqlite3.Cursor: """Look up a year.""" return self.sql("SELECT year FROM years WHERE year=?", year) def do_sql_select_trackids(self, year: Year) -> sqlite3.Cursor: """Load a Year's Tracks from the database.""" return self.sql("""SELECT trackid FROM year_tracks_view WHERE year=?""", year.year) def create(self, *args, **kwargs) -> Year | None: """Create a new Year playlist.""" if (year := super().create(*args, **kwargs)) is not None: if year.parent is not None: year.parent.add_year(year) return year