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."""
import sqlite3
from gi.repository import GObject
from gi.repository import Gtk
from .. import format
from . import playlist
from . import table
from . import tracks
@ -34,12 +36,26 @@ class Medium(playlist.Playlist):
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):
"""Our Media Table."""
def __init__(self, sql: GObject.TYPE_PYOBJECT, **kwargs):
"""Initialize the Media Table."""
super().__init__(sql=sql, autodelete=True,
super().__init__(sql=sql, filter=Filter(), autodelete=True,
system_tracks=False, **kwargs)
def do_construct(self, **kwargs) -> Medium:

View File

@ -4,6 +4,7 @@ import pathlib
import unittest.mock
import emmental.db
import tests.util
from gi.repository import Gtk
class TestMediumObject(tests.util.TestCase):
@ -46,6 +47,36 @@ class TestMediumObject(tests.util.TestCase):
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):
"""Tests our mediums table."""
@ -61,6 +92,8 @@ class TestMediumsTable(tests.util.TestCase):
def test_init(self):
"""Test that the medium model is configured corretly."""
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.assertTrue(self.table.autodelete)
self.assertFalse(self.table.system_tracks)
@ -172,17 +205,19 @@ class TestMediumsTable(tests.util.TestCase):
self.assertEqual(len(mediums2), 0)
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.get_item(0).name, "")
self.assertEqual(mediums2.get_item(0).number, 1)
self.assertEqual(mediums2.get_item(0).type, "")
self.assertEqual(mediums2.store.get_item(0).albumid,
self.album.albumid)
self.assertEqual(mediums2.store.get_item(0).name, "")
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.get_item(1).name, "Medium 2")
self.assertEqual(mediums2.get_item(1).number, 2)
self.assertEqual(mediums2.get_item(1).type, "Digital Media")
self.assertEqual(mediums2.store.get_item(1).albumid,
self.album.albumid)
self.assertEqual(mediums2.store.get_item(1).name, "Medium 2")
self.assertEqual(mediums2.store.get_item(1).number, 2)
self.assertEqual(mediums2.store.get_item(1).type, "Digital Media")
def test_lookup(self):
"""Test looking up medium playlists."""