diff --git a/picard/cluster.py b/picard/cluster.py index d5ab973ea..27334c483 100644 --- a/picard/cluster.py +++ b/picard/cluster.py @@ -309,7 +309,7 @@ class Cluster(FileList): # If the file is attached to a track we should use the original # metadata for clustering. This is often used by users when moving # mismatched files back from the right pane to the left. - if isinstance(file.parent, Track): + if isinstance(file.parent_item, Track): metadata = file.orig_metadata else: metadata = file.metadata diff --git a/picard/file.py b/picard/file.py index a0074ca1a..628c61975 100644 --- a/picard/file.py +++ b/picard/file.py @@ -168,7 +168,7 @@ class File(MetadataItem): self.error_type = FileErrorType.UNKNOWN self.similarity = 1.0 - self.parent = None + self.parent_item = None self.lookup_task = None @@ -627,36 +627,36 @@ class File(MetadataItem): new_file_path, why) def remove(self, from_parent=True): - if from_parent and self.parent: - log.debug("Removing %r from %r", self, self.parent) - self.parent.remove_file(self) + if from_parent and self.parent_item: + log.debug("Removing %r from %r", self, self.parent_item) + self.parent_item.remove_file(self) self.tagger.acoustidmanager.remove(self) self.state = File.REMOVED def move(self, parent): # To be able to move a file the target must implement add_file(file) - if hasattr(parent, 'add_file') and parent != self.parent: - log.debug("Moving %r from %r to %r", self, self.parent, parent) + if hasattr(parent, 'add_file') and parent != self.parent_item: + log.debug("Moving %r from %r to %r", self, self.parent_item, parent) self.clear_lookup_task() self.tagger._acoustid.stop_analyze(self) new_album = True - if self.parent: - new_album = self.parent.album != parent.album + if self.parent_item: + new_album = self.parent_item.album != parent.album self.clear_pending() - self.parent.remove_file(self, new_album=new_album) - self.parent = parent - self.parent.add_file(self, new_album=new_album) + self.parent_item.remove_file(self, new_album=new_album) + self.parent_item = parent + self.parent_item.add_file(self, new_album=new_album) self.acoustid_update() return True else: return False def _move(self, parent): - if parent != self.parent: - log.debug("Moving %r from %r to %r", self, self.parent, parent) - if self.parent: - self.parent.remove_file(self) - self.parent = parent + if parent != self.parent_item: + log.debug("Moving %r from %r to %r", self, self.parent_item, parent) + if self.parent_item: + self.parent_item.remove_file(self) + self.parent_item = parent self.acoustid_update() def set_acoustid_fingerprint(self, fingerprint, length=None): @@ -675,8 +675,8 @@ class File(MetadataItem): def acoustid_update(self): recording_id = None - if self.parent and self.parent.can_link_fingerprint: - recording_id = self.parent.orig_metadata['musicbrainz_recordingid'] + if self.parent_item and self.parent_item.can_link_fingerprint: + recording_id = self.parent_item.orig_metadata['musicbrainz_recordingid'] if not recording_id: recording_id = self.metadata['musicbrainz_recordingid'] self.tagger.acoustidmanager.update(self, recording_id) diff --git a/picard/script/functions.py b/picard/script/functions.py index 702694883..94bc58d66 100644 --- a/picard/script/functions.py +++ b/picard/script/functions.py @@ -720,8 +720,8 @@ _Since Picard 0.12_""" def func_matchedtracks(parser, *args): # only works in file naming scripts, always returns zero in tagging scripts file = parser.file - if file and file.parent and hasattr(file.parent, 'album') and file.parent.album: - return str(parser.file.parent.album.get_num_matched_tracks()) + if file and file.parent_item and hasattr(file.parent_item, 'album') and file.parent_item.album: + return str(parser.file.parent_item.album.get_num_matched_tracks()) return '0' @@ -734,8 +734,8 @@ Returns true if every track in the album is matched to a single file. def func_is_complete(parser): # only works in file naming scripts, always returns zero in tagging scripts file = parser.file - if (file and file.parent and hasattr(file.parent, 'album') and file.parent.album - and file.parent.album.is_complete()): + if (file and file.parent_item and hasattr(file.parent_item, 'album') and file.parent_item.album + and file.parent_item.album.is_complete()): return '1' return '' diff --git a/picard/tagger.py b/picard/tagger.py index 80c44e121..2d222846e 100644 --- a/picard/tagger.py +++ b/picard/tagger.py @@ -865,11 +865,11 @@ class Tagger(QtWidgets.QApplication): if isinstance(target, Album): self.move_files_to_album([file], album=target) else: - if isinstance(target, File) and target.parent: - target = target.parent + if isinstance(target, File) and target.parent_item: + target = target.parent_item if not file.move(target): # Ensure a file always has a parent so it shows up in UI - if not file.parent: + if not file.parent_item: target = self.unclustered_files file.move(target) # Unsupported target, do not move the file @@ -893,7 +893,7 @@ class Tagger(QtWidgets.QApplication): target = album.get_next_track(target) or album.unmatched_files elif isinstance(target, File): for file in process_events_iter(files): - file.move(target.parent) + file.move(target.parent_item) elif isinstance(target, Album): self.move_files_to_album(files, album=target) elif isinstance(target, ClusterList): diff --git a/picard/ui/coverartbox.py b/picard/ui/coverartbox.py index 13e129598..d9f6c2959 100644 --- a/picard/ui/coverartbox.py +++ b/picard/ui/coverartbox.py @@ -364,7 +364,7 @@ def set_image_append(obj, coverartimage): def iter_file_parents(file): - parent = file.parent + parent = file.parent_item if parent: yield parent if isinstance(parent, Track) and parent.album: diff --git a/picard/ui/infodialog.py b/picard/ui/infodialog.py index adafb5f01..a1a831802 100644 --- a/picard/ui/infodialog.py +++ b/picard/ui/infodialog.py @@ -175,7 +175,7 @@ class InfoDialog(PicardDialog): has_orig_images = hasattr(obj, 'orig_metadata') and obj.orig_metadata.images if has_orig_images and obj.orig_metadata.images != obj.metadata.images: is_track = isinstance(obj, Track) - is_linked_file = isinstance(obj, File) and isinstance(obj.parent, Track) + is_linked_file = isinstance(obj, File) and isinstance(obj.parent_item, Track) is_album_with_files = isinstance(obj, Album) and obj.get_num_total_files() > 0 if is_track or is_linked_file or is_album_with_files: self.orig_images = sorted(obj.orig_metadata.images) diff --git a/picard/ui/itemviews/__init__.py b/picard/ui/itemviews/__init__.py index f2f12d03b..23e21823d 100644 --- a/picard/ui/itemviews/__init__.py +++ b/picard/ui/itemviews/__init__.py @@ -576,7 +576,7 @@ class FileItem(TreeItem): else: icon = FileItem.icon_error tooltip = _("Processing error(s): See the Errors tab in the File Info dialog") - elif isinstance(file.parent, Track): + elif isinstance(file.parent_item, Track): if file.state == File.NORMAL: icon = FileItem.icon_saved tooltip = _("Track saved") diff --git a/picard/ui/mainwindow/__init__.py b/picard/ui/mainwindow/__init__.py index 91b88c39b..b197cddf3 100644 --- a/picard/ui/mainwindow/__init__.py +++ b/picard/ui/mainwindow/__init__.py @@ -1071,7 +1071,7 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry): # unclustered files cluster all unclustered files. files = ( f for f in iter_files_from_objects(self.selected_objects) - if f.parent == self.tagger.unclustered_files + if f.parent_item == self.tagger.unclustered_files ) try: file = next(files) diff --git a/picard/ui/metadatabox.py b/picard/ui/metadatabox.py index 29b480828..6f79dbc10 100644 --- a/picard/ui/metadatabox.py +++ b/picard/ui/metadatabox.py @@ -417,10 +417,10 @@ class MetadataBox(QtWidgets.QTableWidget): track_albums = set() for file in self.files: objects = [file] - if file.parent in self.tracks and len(self.files & set(file.parent.files)) == 1: - objects.append(file.parent) - file_tracks.append(file.parent) - track_albums.add(file.parent.album) + if file.parent_item in self.tracks and len(self.files & set(file.parent_item.files)) == 1: + objects.append(file.parent_item) + file_tracks.append(file.parent_item) + track_albums.add(file.parent_item.album) orig_values = list(file.orig_metadata.getall(tag)) or [""] useorigs.append(partial(self._set_tag_values, tag, orig_values, objects)) for track in set(self.tracks)-set(file_tracks): diff --git a/picard/ui/searchdialog/track.py b/picard/ui/searchdialog/track.py index d10b0b214..241336207 100644 --- a/picard/ui/searchdialog/track.py +++ b/picard/ui/searchdialog/track.py @@ -180,9 +180,9 @@ class TrackSearchDialog(SearchDialog): self.tagger.get_release_group_by_id(releasegroup_id).loaded_albums.add(album_id) if file: # Search is performed for a file. - if isinstance(file.parent, Track): + if isinstance(file.parent_item, Track): # Have to move that file from its existing album to the new one. - album = file.parent.album + album = file.parent_item.album self.tagger.move_file_to_track(file, album_id, recording_id) if album.get_num_total_files() == 0: # Remove album if it has no more files associated @@ -200,9 +200,9 @@ class TrackSearchDialog(SearchDialog): if file: # Search is performed for a file. - if getattr(file.parent, 'album', None): + if getattr(file.parent_item, 'album', None): # Have to move that file from its existing album to NAT. - album = file.parent.album + album = file.parent_item.album self.tagger.move_file_to_nat(file, recording_id, node) if album.get_num_total_files() == 0: self.tagger.remove_album(album) diff --git a/test/test_script.py b/test/test_script.py index a5a6261d7..1a458da73 100644 --- a/test/test_script.py +++ b/test/test_script.py @@ -1350,7 +1350,7 @@ class ScriptParserTest(PicardTestCase): def test_cmd_matchedtracks(self): file = MagicMock() - file.parent.album.get_num_matched_tracks.return_value = 42 + file.parent_item.album.get_num_matched_tracks.return_value = 42 self.assertScriptResultEquals("$matchedtracks()", "42", file=file) self.assertScriptResultEquals("$matchedtracks()", "0") # The following only is possible for backward compatibility, arg is unused @@ -1360,14 +1360,14 @@ class ScriptParserTest(PicardTestCase): file = MagicMock() cluster = Cluster(name="Test") cluster.files.append(file) - file.parent = cluster + file.parent_item = cluster self.assertScriptResultEquals("$matchedtracks()", "0", file=file) def test_cmd_is_complete(self): file = MagicMock() - file.parent.album.is_complete.return_value = True + file.parent_item.album.is_complete.return_value = True self.assertScriptResultEquals("$is_complete()", "1", file=file) - file.parent.album.is_complete.return_value = False + file.parent_item.album.is_complete.return_value = False self.assertScriptResultEquals("$is_complete()", "", file=file) self.assertScriptResultEquals("$is_complete()", "") @@ -1375,7 +1375,7 @@ class ScriptParserTest(PicardTestCase): file = MagicMock() cluster = Cluster(name="Test") cluster.files.append(file) - file.parent = cluster + file.parent_item = cluster self.assertScriptResultEquals("$is_complete()", "", file=file) def test_cmd_is_video(self):