64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
# Copyright 2022 (c) Anna Schumaker
|
|
"""A custom Gio.ListModel for genres."""
|
|
import sqlite3
|
|
from gi.repository import GObject
|
|
from .. import format
|
|
from . import playlist
|
|
|
|
|
|
class Genre(playlist.Playlist):
|
|
"""Our custom Genre object representing a single genre."""
|
|
|
|
genreid = GObject.Property(type=int)
|
|
|
|
@property
|
|
def primary_key(self) -> int:
|
|
"""Get this Gener's primary key."""
|
|
return self.genreid
|
|
|
|
|
|
class Table(playlist.Table):
|
|
"""Our Genre Table."""
|
|
|
|
def __init__(self, sql: GObject.TYPE_PYOBJECT, **kwargs):
|
|
"""Initialize the Genres Table."""
|
|
super().__init__(sql=sql, autodelete=True, **kwargs)
|
|
|
|
def do_construct(self, **kwargs) -> Genre:
|
|
"""Construct a new Genre."""
|
|
return Genre(**kwargs)
|
|
|
|
def do_get_sort_key(self, genre: Genre) -> tuple[tuple[str], int]:
|
|
"""Get a sort key for the Genre."""
|
|
return (format.sort_key(genre.name), genre.genreid)
|
|
|
|
def do_sql_delete(self, genre: Genre) -> sqlite3.Cursor:
|
|
"""Delete a genre."""
|
|
return self.sql("DELETE FROM genres WHERE genreid=?", genre.genreid)
|
|
|
|
def do_sql_glob(self, glob: str) -> sqlite3.Cursor:
|
|
"""Search for genres matching the search text."""
|
|
return self.sql("""SELECT genreid FROM genres
|
|
WHERE CASEFOLD(name) GLOB ?""", glob)
|
|
|
|
def do_sql_insert(self, name: str) -> sqlite3.Cursor | None:
|
|
"""Create a new genre."""
|
|
if cur := self.sql("INSERT INTO genres (name) VALUES (?)", name):
|
|
return self.sql("SELECT * FROM genres_view WHERE genreid=?",
|
|
cur.lastrowid)
|
|
|
|
def do_sql_select_all(self) -> sqlite3.Cursor:
|
|
"""Load genres from the database."""
|
|
return self.sql("SELECT * FROM genres_view")
|
|
|
|
def do_sql_select_one(self, name: str) -> sqlite3.Cursor:
|
|
"""Look up a genre by name."""
|
|
return self.sql("SELECT genreid FROM genres WHERE CASEFOLD(name)=?",
|
|
name.casefold())
|
|
|
|
def do_sql_update(self, genre: playlist.Playlist,
|
|
column: str, newval) -> sqlite3.Cursor:
|
|
"""Update a genre."""
|
|
return self.sql(f"UPDATE genres SET {column}=? WHERE genreid=?",
|
|
newval, genre.genreid)
|