emmental/emmental/db/years.py

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