Merge pull request #4663 from katedickey/fix/cascade-flex-deletes

Fix album store method to cascade flex field deletions to items
This commit is contained in:
Adrian Sampson 2023-01-31 08:36:49 -08:00 committed by GitHub
commit e504968e27
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 2 deletions

View file

@ -1355,9 +1355,12 @@ class Album(LibModel):
"""
# Get modified track fields.
track_updates = {}
for key in self.item_keys:
if key in self._dirty:
track_deletes = set()
for key in self._dirty:
if key in self.item_keys:
track_updates[key] = self[key]
elif key not in self:
track_deletes.add(key)
with self._db.transaction():
super().store(fields)
@ -1366,6 +1369,12 @@ class Album(LibModel):
for key, value in track_updates.items():
item[key] = value
item.store()
if track_deletes:
for item in self.items():
for key in track_deletes:
if key in item:
del item[key]
item.store()
def try_sync(self, write, move):
"""Synchronize the album and its items with the database.

View file

@ -134,6 +134,8 @@ Bug fixes:
* :doc:`/plugins/fromfilename`: Fix failed detection of <track> <title>
filename patterns.
:bug:`4561` :bug:`4600`
* Fix issue where deletion of flexible fields on an album doesn't cascade to items
:bug:`4662`
For packagers:

View file

@ -77,6 +77,19 @@ class StoreTest(_common.LibTestCase):
self.i.store()
self.assertTrue('composer' not in self.i._dirty)
def test_store_album_cascades_flex_deletes(self):
album = _common.album()
album.flex1 = "Flex-1"
self.lib.add(album)
item = _common.item()
item.album_id = album.id
item.flex1 = "Flex-1"
self.lib.add(item)
del album.flex1
album.store()
self.assertNotIn('flex1', album)
self.assertNotIn('flex1', album.items()[0])
class AddTest(_common.TestCase):
def setUp(self):