db: Give the Media table a custom Filter

We want to filter out Medium playlists with empty names in the sidebar,
and the easiest way to do that is through a custom filter attached to
the Media table.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2023-06-23 11:04:45 -04:00
parent 85c18fb5fe
commit 5ee86a9b5e
2 changed files with 61 additions and 10 deletions

View File

@ -2,8 +2,10 @@
"""A custom Gio.ListModel for managing individual media in an album.""" """A custom Gio.ListModel for managing individual media in an album."""
import sqlite3 import sqlite3
from gi.repository import GObject from gi.repository import GObject
from gi.repository import Gtk
from .. import format from .. import format
from . import playlist from . import playlist
from . import table
from . import tracks from . import tracks
@ -34,12 +36,26 @@ class Medium(playlist.Playlist):
return self.get_album() return self.get_album()
class Filter(table.KeySet):
"""Custom filter to hide media with empty names."""
def do_get_strictness(self) -> Gtk.FilterMatch:
"""Get the strictness of the filter."""
if (res := super().do_get_strictness()) == Gtk.FilterMatch.ALL:
res = Gtk.FilterMatch.SOME
return res
def do_match(self, medium: Medium) -> bool:
"""Check if the Medium matches the filter."""
return len(medium.name) > 0 if super().do_match(medium) else False
class Table(playlist.Table): class Table(playlist.Table):
"""Our Media Table.""" """Our Media Table."""
def __init__(self, sql: GObject.TYPE_PYOBJECT, **kwargs): def __init__(self, sql: GObject.TYPE_PYOBJECT, **kwargs):
"""Initialize the Media Table.""" """Initialize the Media Table."""
super().__init__(sql=sql, autodelete=True, super().__init__(sql=sql, filter=Filter(), autodelete=True,
system_tracks=False, **kwargs) system_tracks=False, **kwargs)
def do_construct(self, **kwargs) -> Medium: def do_construct(self, **kwargs) -> Medium:

View File

@ -4,6 +4,7 @@ import pathlib
import unittest.mock import unittest.mock
import emmental.db import emmental.db
import tests.util import tests.util
from gi.repository import Gtk
class TestMediumObject(tests.util.TestCase): class TestMediumObject(tests.util.TestCase):
@ -46,6 +47,36 @@ class TestMediumObject(tests.util.TestCase):
mock_rename.assert_called_with(self.medium, "New Name") mock_rename.assert_called_with(self.medium, "New Name")
class TestFilter(tests.util.TestCase):
"""Test the medium filter."""
def setUp(self):
"""Set up common variables."""
super().setUp()
self.filter = emmental.db.media.Filter()
def test_init(self):
"""Test that the filter is initialized properly."""
self.assertIsInstance(self.filter, emmental.db.table.KeySet)
def test_strictness(self):
"""Test checking strictness."""
self.filter.keys = None
self.assertEqual(self.filter.get_strictness(), Gtk.FilterMatch.SOME)
self.filter.keys = set()
self.assertEqual(self.filter.get_strictness(), Gtk.FilterMatch.NONE)
self.filter.keys = {1, 2, 3}
self.assertEqual(self.filter.get_strictness(), Gtk.FilterMatch.SOME)
def test_match(self):
"""Test matching a Medium."""
album = self.sql.albums.create("Test Album", "Test Artist", "123")
medium = self.sql.media.create(album, "", number=1)
self.assertFalse(self.filter.match(medium))
medium.name = "abcde"
self.assertTrue(self.filter.match(medium))
class TestMediumsTable(tests.util.TestCase): class TestMediumsTable(tests.util.TestCase):
"""Tests our mediums table.""" """Tests our mediums table."""
@ -61,6 +92,8 @@ class TestMediumsTable(tests.util.TestCase):
def test_init(self): def test_init(self):
"""Test that the medium model is configured corretly.""" """Test that the medium model is configured corretly."""
self.assertIsInstance(self.table, emmental.db.playlist.Table) self.assertIsInstance(self.table, emmental.db.playlist.Table)
self.assertIsInstance(self.table.get_filter(),
emmental.db.media.Filter)
self.assertEqual(len(self.table), 0) self.assertEqual(len(self.table), 0)
self.assertTrue(self.table.autodelete) self.assertTrue(self.table.autodelete)
self.assertFalse(self.table.system_tracks) self.assertFalse(self.table.system_tracks)
@ -172,17 +205,19 @@ class TestMediumsTable(tests.util.TestCase):
self.assertEqual(len(mediums2), 0) self.assertEqual(len(mediums2), 0)
mediums2.load(now=True) mediums2.load(now=True)
self.assertEqual(len(mediums2), 2) self.assertEqual(len(mediums2.store), 2)
self.assertEqual(mediums2.get_item(0).albumid, self.album.albumid) self.assertEqual(mediums2.store.get_item(0).albumid,
self.assertEqual(mediums2.get_item(0).name, "") self.album.albumid)
self.assertEqual(mediums2.get_item(0).number, 1) self.assertEqual(mediums2.store.get_item(0).name, "")
self.assertEqual(mediums2.get_item(0).type, "") self.assertEqual(mediums2.store.get_item(0).number, 1)
self.assertEqual(mediums2.store.get_item(0).type, "")
self.assertEqual(mediums2.get_item(1).albumid, self.album.albumid) self.assertEqual(mediums2.store.get_item(1).albumid,
self.assertEqual(mediums2.get_item(1).name, "Medium 2") self.album.albumid)
self.assertEqual(mediums2.get_item(1).number, 2) self.assertEqual(mediums2.store.get_item(1).name, "Medium 2")
self.assertEqual(mediums2.get_item(1).type, "Digital Media") self.assertEqual(mediums2.store.get_item(1).number, 2)
self.assertEqual(mediums2.store.get_item(1).type, "Digital Media")
def test_lookup(self): def test_lookup(self):
"""Test looking up medium playlists.""" """Test looking up medium playlists."""