From fafe262adcc97d510a6e0624a3e59a7c3b8ef015 Mon Sep 17 00:00:00 2001 From: Philip Ridout Date: Sat, 27 Oct 2012 10:06:33 +0100 Subject: [PATCH 1/5] Fixes bug1065423 "Missing image in service causes traceback when opening" Fixes bug1065420 ""missing files" dialog opens more then once when more files are missing" --- openlp/core/ui/servicemanager.py | 97 +++++++++++++++++++------------- 1 file changed, 57 insertions(+), 40 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index a3d9692f5..0307f1fc2 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -349,6 +349,16 @@ class ServiceManager(QtGui.QWidget): """ return self._modified + def get_frame_file_path(self, item, frame): + """ + Getter to get service item file path. + """ + if item[u'service_item'].is_image(): + path_from = frame[u'path'] + else: + path_from = os.path.join(frame[u'path'], frame[u'title']) + return path_from + def setFileName(self, fileName): """ Setter for service file. @@ -483,59 +493,66 @@ class ServiceManager(QtGui.QWidget): path) service = [] write_list = [] + missing_list = [] audio_files = [] total_size = 0 Receiver.send_message(u'cursor_busy') # Number of items + 1 to zip it self.mainwindow.displayProgressBar(len(self.serviceItems) + 1) + # Get list of missing files, and list of files to write for item in self.serviceItems: - self.mainwindow.incrementProgressBar() - service_item = item[u'service_item'].get_service_repr() - # Get all the audio files, and ready them for embedding in the - # service file. - if service_item[u'header'][u'background_audio']: - for i, filename in \ - enumerate(service_item[u'header'][u'background_audio']): - new_file = os.path.join(u'audio', - item[u'service_item']._uuid, filename) - audio_files.append((filename, new_file)) - service_item[u'header'][u'background_audio'][i] = new_file - # Add the service item to the service. - service.append({u'serviceitem': service_item}) if not item[u'service_item'].uses_file(): continue - skipMissing = False for frame in item[u'service_item'].get_frames(): - if item[u'service_item'].is_image(): - path_from = frame[u'path'] - else: - path_from = os.path.join(frame[u'path'], frame[u'title']) - # Only write a file once - if path_from in write_list: + path_from = self.get_frame_file_path(item, frame) + if path_from in write_list or path_from in missing_list: continue if not os.path.exists(path_from): - if not skipMissing: - Receiver.send_message(u'cursor_normal') - title = unicode(translate('OpenLP.ServiceManager', - 'Service File Missing')) - message = unicode(translate('OpenLP.ServiceManager', - 'File missing from service\n\n %s \n\n' - 'Continue saving?')) % path_from - answer = QtGui.QMessageBox.critical(self, title, - message, - QtGui.QMessageBox.StandardButtons( - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No | - QtGui.QMessageBox.YesToAll)) - if answer == QtGui.QMessageBox.No: - self.mainwindow.finishedProgressBar() - return False - if answer == QtGui.QMessageBox.YesToAll: - skipMissing = True - Receiver.send_message(u'cursor_busy') + missing_list.append(path_from) else: - file_size = os.path.getsize(path_from) write_list.append(path_from) - total_size += file_size + if missing_list: + Receiver.send_message(u'cursor_normal') + title = unicode(translate('OpenLP.ServiceManager', + 'Service File(s) Missing')) + message = unicode(translate('OpenLP.ServiceManager', + 'The following file(s) in the service are missing:\n\t%s\n\n' + 'These files will be removed if you continue to save.') + ) % "\n\t".join(missing_list) + answer = QtGui.QMessageBox.critical(self, title, + message, + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)) + if answer == QtGui.QMessageBox.Cancel: + self.mainwindow.finishedProgressBar() + return False + Receiver.send_message(u'cursor_busy') + # Check if item contains a missing file. + for item in list(self.serviceItems): + self.mainwindow.incrementProgressBar() + if item[u'service_item'].uses_file(): + for frame in item[u'service_item'].get_frames(): + path_from = self.get_frame_file_path(item, frame) + if path_from in missing_list: + item[u'service_item']._raw_frames.remove(frame) + if not item[u'service_item']._raw_frames: + self.serviceItems.remove(item) + else: + service_item = item[u'service_item'].get_service_repr() + if service_item[u'header'][u'background_audio']: + for i, filename in\ + enumerate(service_item[u'header'][u'background_audio']): + new_file = os.path.join(u'audio', + item[u'service_item']._uuid, filename) + audio_files.append((filename, new_file)) + service_item[u'header'][u'background_audio'][i] = \ + new_file + # Add the service item to the service. + service.append({u'serviceitem': service_item}) + self.repaintServiceList(-1, -1) + for file in write_list: + file_size = os.path.getsize(file) + total_size += file_size log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % total_size) service_content = cPickle.dumps(service) From 713f742a3abb0e2bd35d5626a96ceaeb3b06595d Mon Sep 17 00:00:00 2001 From: Philip Ridout Date: Tue, 30 Oct 2012 18:36:39 +0000 Subject: [PATCH 2/5] fixed indentation. --- openlp/core/ui/servicemanager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 0307f1fc2..e073966cf 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -540,8 +540,8 @@ class ServiceManager(QtGui.QWidget): else: service_item = item[u'service_item'].get_service_repr() if service_item[u'header'][u'background_audio']: - for i, filename in\ - enumerate(service_item[u'header'][u'background_audio']): + for i, filename in enumerate( + service_item[u'header'][u'background_audio']): new_file = os.path.join(u'audio', item[u'service_item']._uuid, filename) audio_files.append((filename, new_file)) From d35d4f4f79f14b348c3bd4a6a4de72592c67a353 Mon Sep 17 00:00:00 2001 From: Philip Ridout Date: Wed, 31 Oct 2012 21:04:29 +0000 Subject: [PATCH 3/5] Added some methods to serviceitem.py so as not to expose "inner workings of ServiceItem" and modified get_frame_path method. (Which required a modification to slidecontroller.py & messagelistener.py) --- openlp/core/lib/serviceitem.py | 23 +++++++++++++++---- openlp/core/ui/servicemanager.py | 19 ++++----------- openlp/core/ui/slidecontroller.py | 2 +- .../presentations/lib/messagelistener.py | 2 +- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index a5b9c524b..dbb69c5b4 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -451,14 +451,27 @@ class ServiceItem(object): except IndexError: return u'' - def get_frame_path(self, row=0): + def get_frame_path(self, row=0, frame=None): """ Returns the path of the raw frame """ - try: - return self._raw_frames[row][u'path'] - except IndexError: - return u'' + if not frame: + try: + frame = self._raw_frames[row] + except IndexError: + return u'' + if self.is_image(): + path_from = frame[u'path'] + else: + path_from = os.path.join(frame[u'path'], frame[u'title']) + return path_from + + def remove_frame(self, frame): + """ + Remove the soecified frame from the item + """ + if frame in self._raw_frames: + self._raw_frames.remove(frame) def get_media_time(self): """ diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index e073966cf..0f51f1416 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -349,16 +349,6 @@ class ServiceManager(QtGui.QWidget): """ return self._modified - def get_frame_file_path(self, item, frame): - """ - Getter to get service item file path. - """ - if item[u'service_item'].is_image(): - path_from = frame[u'path'] - else: - path_from = os.path.join(frame[u'path'], frame[u'title']) - return path_from - def setFileName(self, fileName): """ Setter for service file. @@ -504,7 +494,7 @@ class ServiceManager(QtGui.QWidget): if not item[u'service_item'].uses_file(): continue for frame in item[u'service_item'].get_frames(): - path_from = self.get_frame_file_path(item, frame) + path_from = item[u'service_item'].get_frame_path(frame=frame) if path_from in write_list or path_from in missing_list: continue if not os.path.exists(path_from): @@ -532,10 +522,11 @@ class ServiceManager(QtGui.QWidget): self.mainwindow.incrementProgressBar() if item[u'service_item'].uses_file(): for frame in item[u'service_item'].get_frames(): - path_from = self.get_frame_file_path(item, frame) + path_from = item[u'service_item'].get_frame_path( + frame=frame) if path_from in missing_list: - item[u'service_item']._raw_frames.remove(frame) - if not item[u'service_item']._raw_frames: + item[u'service_item'].remove_frame(frame) + if not item[u'service_item'].get_frames(): self.serviceItems.remove(item) else: service_item = item[u'service_item'].get_service_repr() diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 0f0f15a3d..6b3de080d 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1350,7 +1350,7 @@ class SlideController(Controller): Respond to the arrival of a media service item """ log.debug(u'SlideController onMediaStart') - file = os.path.join(item.get_frame_path(), item.get_frame_title()) + file = item.get_frame_path() self.mediaController.video(self, file, False, False, self.hideMode()) if not self.isLive or self.mediaController.withLivePreview: self.previewDisplay.show() diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 7cc12c7f9..3f4b03a4a 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -329,7 +329,7 @@ class MessageListener(object): item = message[0] log.debug(u'Startup called with message %s' % message) hide_mode = message[2] - file = os.path.join(item.get_frame_path(), item.get_frame_title()) + file = item.get_frame_path() self.handler = item.title if self.handler == self.mediaitem.Automatic: self.handler = self.mediaitem.findControllerByType(file) From 443ad478c1c308d59d6d6d9c945bc9fd44f7f855 Mon Sep 17 00:00:00 2001 From: Philip Ridout Date: Fri, 2 Nov 2012 18:54:42 +0000 Subject: [PATCH 4/5] Added validate function to serviceitem --- openlp/core/lib/serviceitem.py | 17 +++++++++++++++++ openlp/core/ui/servicemanager.py | 9 ++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index dbb69c5b4..7fb4607f9 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -508,3 +508,20 @@ class ServiceItem(object): self._new_item() self.render() + def remove_invalid_frames(self, invalid_paths=None): + """ + Remove invalid frames, such as ones where the file no longer exists. + """ + if self.uses_file(): + for frame in self.get_frames(): + if self.get_frame_path(frame=frame) in invalid_paths: + self.remove_frame(frame) + + def validate(self): + """ + Validates this service item + """ + if not self._raw_frames: + self.is_valid = False + return self.is_valid + diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 0f51f1416..4f75ad3e5 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -520,13 +520,8 @@ class ServiceManager(QtGui.QWidget): # Check if item contains a missing file. for item in list(self.serviceItems): self.mainwindow.incrementProgressBar() - if item[u'service_item'].uses_file(): - for frame in item[u'service_item'].get_frames(): - path_from = item[u'service_item'].get_frame_path( - frame=frame) - if path_from in missing_list: - item[u'service_item'].remove_frame(frame) - if not item[u'service_item'].get_frames(): + item[u'service_item'].remove_invalid_frames(missing_list) + if not item[u'service_item'].validate(): self.serviceItems.remove(item) else: service_item = item[u'service_item'].get_service_repr() From 0bc2e5b71ef6fc1925dea5cd3a6251ca04cc4c0b Mon Sep 17 00:00:00 2001 From: Philip Ridout Date: Wed, 7 Nov 2012 21:10:38 +0000 Subject: [PATCH 5/5] Simplified Validate Method --- openlp/core/lib/serviceitem.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 7fb4607f9..87a51171f 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -521,7 +521,4 @@ class ServiceItem(object): """ Validates this service item """ - if not self._raw_frames: - self.is_valid = False - return self.is_valid - + return bool(self._raw_frames)