83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
# 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
|