emmental/emmental/db/genres.py

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)