def drag_data_received(self, widget, context, x, y, sel_data, info, time): """ Handle the standard gtk interface for drag_data_received. If the selection data is define, extract the value from sel_data.data, and decide if this is a move or a reorder. The only data we accept on mediaview is dropping a file, so URI_LIST. We assume this is what we obtain """ if not sel_data: return files = sel_data.get_uris() for file in files: protocol, site, mfile, j, k, l = urlparse(file) if protocol == "file": name = url2pathname(mfile) mime = get_type(name) if not is_valid_type(mime): return photo = Media() self.uistate.set_busy_cursor(True) photo.set_checksum(create_checksum(name)) self.uistate.set_busy_cursor(False) base_dir = str(media_path(self.dbstate.db)) if os.path.exists(base_dir): name = relative_path(name, base_dir) photo.set_path(name) photo.set_mime_type(mime) basename = os.path.basename(name) (root, ext) = os.path.splitext(basename) photo.set_description(root) with DbTxn(_("Drag Media Object"), self.dbstate.db) as trans: self.dbstate.db.add_media(photo, trans) widget.emit_stop_by_name('drag_data_received')
def drag_data_received(self, widget, context, x, y, sel_data, info, time): """ Handle the standard gtk interface for drag_data_received. If the selection data is define, extract the value from sel_data.data, and decide if this is a move or a reorder. The only data we accept on mediaview is dropping a file, so URI_LIST. We assume this is what we obtain """ if not sel_data: return files = sel_data.get_uris() for file in files: protocol, site, mfile, j, k, l = urlparse(file) if protocol == "file": name = url2pathname(mfile) mime = get_type(name) if not is_valid_type(mime): return photo = MediaObject() self.uistate.set_busy_cursor(True) photo.set_checksum(create_checksum(name)) self.uistate.set_busy_cursor(False) base_dir = str(media_path(self.dbstate.db)) if os.path.exists(base_dir): name = relative_path(name, base_dir) photo.set_path(name) photo.set_mime_type(mime) basename = os.path.basename(name) (root, ext) = os.path.splitext(basename) photo.set_description(root) with DbTxn(_("Drag Media Object"), self.dbstate.db) as trans: self.dbstate.db.add_object(photo, trans) widget.emit_stop_by_name('drag_data_received')
def _photo(self, photo, level): """ Overloaded media-handling method to skip over media if not included. """ # LOG.debug("deb photo %d" % self.relativepath) if self.include_media: photo_obj_id = photo.get_reference_handle() photo_obj = self.dbase.get_media_from_handle(photo_obj_id) if photo_obj: mime = photo_obj.get_mime_type() form = MIME2GED.get(mime, mime) if self.relativepath: fullpath = media_path_full(self.dbase, photo_obj.get_path()) if not os.path.isfile(fullpath): return base = media_path(self.dbase) path = relative_path(fullpath, base) else: path = media_path_full(self.dbase, photo_obj.get_path()) if not os.path.isfile(path): return self._writeln(level, 'OBJE') if form: self._writeln(level + 1, 'FORM', form) self._writeln(level + 1, 'TITL', photo_obj.get_description()) self._writeln(level + 1, 'FILE', path, limit=255) self._note_references(photo_obj.get_note_list(), level + 1) if self.zip: self._packzip(path)
def _run(self): if not self.prepared: self.prepare() self.set_total(len(self.handle_list)) base_dir = media_path(self.db) for handle in self.handle_list: obj = self.db.get_media_from_handle(handle) new_path = relative_path(obj.path, base_dir) obj.set_path(new_path) self.db.commit_media(obj, self.trans) self.update() return True
def save(self, *obj): """ Callback function called when the save button is pressed. The media object is updated, and callback called. """ description = str(self.description.get_text()) if self.file_text.get_filename() is None: msgstr = _("Import failed") msgstr2 = _("The filename supplied could not be found.") ErrorDialog(msgstr, msgstr2, parent=self.window) return filename = self.file_text.get_filename() full_file = filename if self.relpath.get_active(): pname = str(media_path(self.dbase)) if not os.path.exists(pname): msgstr = _("Cannot import %s") msgstr2 = _("Directory specified in preferences: " "Base path for relative media paths: " "%s does not exist. Change preferences " "or do not use relative path when importing") ErrorDialog(msgstr % filename, msgstr2 % pname, parent=self.window) return filename = relative_path(filename, pname) mtype = get_type(full_file) description = description or os.path.basename(filename) self.obj.set_description(description) self.obj.set_mime_type(mtype) name = filename self.obj.set_path(name) self.last_directory = os.path.dirname(full_file) self.relative_path = self.relpath.get_active() self._cleanup_on_exit() if self.callback: self.callback(self.obj) self.close()
def drag_data_received(self, widget, context, x, y, sel_data, info, time): """ Handle the standard gtk interface for drag_data_received. If the selection data is define, extract the value from sel_data.data, and decide if this is a move or a reorder. """ if sel_data and sel_data.get_data(): try: (mytype, selfid, obj, row_from) = pickle.loads(sel_data.get_data()) # make sure this is the correct DND type for this object if mytype == self._DND_TYPE.drag_type: # determine the destination row data = self.iconlist.get_dest_item_at_pos(x, y) if data: (path, pos) = data row = path.get_indices()[0] if pos == Gtk.IconViewDropPosition.DROP_LEFT: row = max(row, 0) elif pos == Gtk.IconViewDropPosition.DROP_RIGHT: row = min(row, len(self.get_data())) elif pos == Gtk.IconViewDropPosition.DROP_INTO: row = min(row+1, len(self.get_data())) else: row = len(self.get_data()) # if the is same object, we have a move, otherwise, # it is a standard drag-n-drop if id(self) == selfid: self._move(row_from, row, obj) else: self._handle_drag(row, obj) self.rebuild() elif mytype == DdTargets.MEDIAOBJ.drag_type: oref = MediaRef() oref.set_reference_handle(obj) self.get_data().append(oref) self.changed = True self.rebuild() elif self._DND_EXTRA and mytype == self._DND_EXTRA.drag_type: self.handle_extra_type(mytype, obj) except pickle.UnpicklingError: files = sel_data.get_uris() for file in files: protocol, site, mfile, j, k, l = urlparse(file) if protocol == "file": name = url2pathname(mfile) mime = get_type(name) if not is_valid_type(mime): return photo = MediaObject() self.uistate.set_busy_cursor(True) photo.set_checksum(create_checksum(name)) self.uistate.set_busy_cursor(False) base_dir = str(media_path(self.dbstate.db)) if os.path.exists(base_dir): name = relative_path(name, base_dir) photo.set_path(name) photo.set_mime_type(mime) basename = os.path.basename(name) (root, ext) = os.path.splitext(basename) photo.set_description(root) with DbTxn(_("Drag Media Object"), self.dbstate.db) as trans: self.dbstate.db.add_object(photo, trans) oref = MediaRef() oref.set_reference_handle(photo.get_handle()) self.get_data().append(oref) self.changed = True self.rebuild()
def verify_media(self, button): """ Verify media objects have the correct path to files in the media directory. List missing files, duplicate files, and files that do not yet have a media file in Gramps. """ self.clear_models() self.moved_files = [] media_path = self.db.get_mediapath() if media_path is None: WarningDialog(self.window_name, _('Media path not set. You must set the "Base path ' 'for relative media paths" in the Preferences.'), self.window) return progress = ProgressMeter(self.window_name, can_cancel=True, parent=self.window) length = 0 for root, dirs, files in os.walk(media_path): length += len(files) progress.set_pass(_('Finding files'), length) all_files = {} for root, dirs, files in os.walk(media_path): for file_name in files: full_path = os.path.join(root, file_name) try: with io.open(full_path, 'rb') as media_file: md5sum = hashlib.md5(media_file.read()).hexdigest() except IOError as err: error_msg = '%s: %s' % (err.strerror, full_path) self.models[5].append((error_msg, None)) progress.step() continue rel_path = relative_path(full_path, media_path) if md5sum in all_files: all_files[md5sum].append(rel_path) else: all_files[md5sum] = [rel_path] progress.step() if progress.get_cancelled(): break length = self.db.get_number_of_media_objects() progress.set_pass(_('Checking paths'), length) in_gramps = [] for handle in self.db.get_media_object_handles(): handle = handle.decode('utf-8') media = self.db.get_object_from_handle(handle) md5sum = media.get_checksum() in_gramps.append(md5sum) # Moved files gramps_path = media.get_path() if md5sum in all_files: file_path = all_files[md5sum] if gramps_path not in file_path: if len(file_path) == 1: self.moved_files.append((handle, file_path[0])) text = '%s -> %s' % (gramps_path, file_path[0]) self.models[0].append((text, handle)) else: gramps_name = os.path.basename(gramps_path) for path in file_path: if os.path.basename(path) == gramps_name: self.moved_files.append((handle, path)) text = '%s -> %s' % (gramps_path, path) self.models[0].append((text, handle)) elif md5sum is None: text = '[%s] %s' % (media.get_gramps_id(), gramps_path) self.models[4].append((text, str(handle))) else: self.models[1].append((gramps_path, handle)) progress.step() if progress.get_cancelled(): break # Duplicate files or files not in Gramps for md5sum in all_files: if len(all_files[md5sum]) > 1: text = ', '.join(all_files[md5sum]) self.models[2].append((text, all_files[md5sum][0])) if md5sum not in in_gramps: text = ', '.join(all_files[md5sum]) self.models[3].append((text, all_files[md5sum][0])) self.show_tabs() progress.close()
def drag_data_received(self, widget, context, x, y, sel_data, info, time): """ Handle the standard gtk interface for drag_data_received. If the selection data is define, extract the value from sel_data.data, and decide if this is a move or a reorder. """ if sel_data and sel_data.get_data(): try: (mytype, selfid, obj, row_from) = pickle.loads(sel_data.get_data()) # make sure this is the correct DND type for this object if mytype == self._DND_TYPE.drag_type: # determine the destination row data = self.iconlist.get_dest_item_at_pos(x, y) if data: (path, pos) = data row = path.get_indices()[0] if pos == Gtk.IconViewDropPosition.DROP_LEFT: row = max(row, 0) elif pos == Gtk.IconViewDropPosition.DROP_RIGHT: row = min(row, len(self.get_data())) elif pos == Gtk.IconViewDropPosition.DROP_INTO: row = min(row + 1, len(self.get_data())) else: row = len(self.get_data()) # if the is same object, we have a move, otherwise, # it is a standard drag-n-drop if id(self) == selfid: self._move(row_from, row, obj) else: self._handle_drag(row, obj) self.rebuild() elif mytype == DdTargets.MEDIAOBJ.drag_type: oref = MediaRef() oref.set_reference_handle(obj) self.get_data().append(oref) self.changed = True self.rebuild() elif self._DND_EXTRA and mytype == self._DND_EXTRA.drag_type: self.handle_extra_type(mytype, obj) except pickle.UnpicklingError: files = sel_data.get_uris() for file in files: protocol, site, mfile, j, k, l = urlparse(file) if protocol == "file": name = url2pathname(mfile) mime = get_type(name) if not is_valid_type(mime): return photo = MediaObject() self.uistate.set_busy_cursor(True) photo.set_checksum(create_checksum(name)) self.uistate.set_busy_cursor(False) base_dir = str(media_path(self.dbstate.db)) if os.path.exists(base_dir): name = relative_path(name, base_dir) photo.set_path(name) photo.set_mime_type(mime) basename = os.path.basename(name) (root, ext) = os.path.splitext(basename) photo.set_description(root) with DbTxn(_("Drag Media Object"), self.dbstate.db) as trans: self.dbstate.db.add_object(photo, trans) oref = MediaRef() oref.set_reference_handle(photo.get_handle()) self.get_data().append(oref) self.changed = True self.rebuild()
def verify_media(self, button): """ Verify media objects have the correct path to files in the media directory. List missing files, duplicate files, and files that do not yet have a media file in Gramps. """ self.clear_models() self.moved_files = [] media_path = self.db.get_mediapath() if media_path is None: WarningDialog( self.window_name, _('Media path not set. You must set the "Base path ' 'for relative media paths" in the Preferences.'), self.window) return progress = ProgressMeter(self.window_name, can_cancel=True, parent=self.window) length = 0 for root, dirs, files in os.walk(media_path): length += len(files) progress.set_pass(_('Finding files'), length) all_files = {} for root, dirs, files in os.walk(media_path): for file_name in files: full_path = os.path.join(root, file_name) try: with io.open(full_path, 'rb') as media_file: md5sum = hashlib.md5(media_file.read()).hexdigest() except IOError as err: error_msg = '%s: %s' % (err.strerror, full_path) self.models[5].append((error_msg, None)) progress.step() continue rel_path = relative_path(full_path, media_path) if md5sum in all_files: all_files[md5sum].append(rel_path) else: all_files[md5sum] = [rel_path] progress.step() if progress.get_cancelled(): break length = self.db.get_number_of_media() progress.set_pass(_('Checking paths'), length) in_gramps = [] for handle in self.db.get_media_handles(): media = self.db.get_media_from_handle(handle) md5sum = media.get_checksum() in_gramps.append(md5sum) # Moved files gramps_path = media.get_path() if md5sum in all_files: file_path = all_files[md5sum] if gramps_path not in file_path: if len(file_path) == 1: self.moved_files.append((handle, file_path[0])) text = '%s -> %s' % (gramps_path, file_path[0]) self.models[0].append((text, handle)) else: gramps_name = os.path.basename(gramps_path) for path in file_path: if os.path.basename(path) == gramps_name: self.moved_files.append((handle, path)) text = '%s -> %s' % (gramps_path, path) self.models[0].append((text, handle)) elif md5sum is None: text = '[%s] %s' % (media.get_gramps_id(), gramps_path) self.models[4].append((text, str(handle))) else: self.models[1].append((gramps_path, handle)) progress.step() if progress.get_cancelled(): break # Duplicate files or files not in Gramps for md5sum in all_files: if len(all_files[md5sum]) > 1: text = ', '.join(all_files[md5sum]) self.models[2].append((text, all_files[md5sum][0])) if md5sum not in in_gramps: text = ', '.join(all_files[md5sum]) self.models[3].append((text, all_files[md5sum][0])) self.show_tabs() progress.close()
def verify_media(self, button): """ Verify media objects have the correct path to files in the media directory. List missing files, duplicate files, and files that do not yet have a media file in Gramps. """ self.clear_models() self.moved_files = [] media_path = self.db.get_mediapath() if media_path is None: WarningDialog(self.window_name, _('Media path not set. You must set the "Base path ' 'for relative media paths" in the Preferences.'), self.window) return progress = ProgressMeter(self.window_name, can_cancel=True, parent=self.window) length = 0 for root, dirs, files in os.walk(media_path): length += len(files) progress.set_pass(_('Finding files'), length) all_files = {} for root, dirs, files in os.walk(media_path): for file_name in files: full_path = os.path.join(root, file_name) md5sum = create_checksum(full_path) if not md5sum: error_msg = 'IOError: %s' % full_path self.models[5].append((error_msg, None)) progress.step() continue rel_path = relative_path(full_path, media_path) if md5sum in all_files: all_files[md5sum].append(rel_path) else: all_files[md5sum] = [rel_path] progress.step() if progress.get_cancelled(): break # the following allows cancelling with subdirectries else: # normal exit of for file_name loop continue # just continue with outer loop break # inner loop had break, so break outer as well. length = self.db.get_number_of_media() progress.set_pass(_('Checking paths'), length) in_gramps = [] for handle in self.db.get_media_handles(): media = self.db.get_media_from_handle(handle) md5sum = media.get_checksum() in_gramps.append(md5sum) # Moved files gramps_path = media.get_path() if md5sum in all_files: file_path = all_files[md5sum] if gramps_path not in file_path: if len(file_path) == 1: self.moved_files.append((handle, file_path[0])) text = '%s -> %s' % (gramps_path, file_path[0]) self.models[0].append((text, handle)) else: gramps_name = os.path.basename(gramps_path) for path in file_path: if os.path.basename(path) == gramps_name: self.moved_files.append((handle, path)) text = '%s -> %s' % (gramps_path, path) self.models[0].append((text, handle)) elif md5sum is None: text = '[%s] %s' % (media.get_gramps_id(), gramps_path) self.models[4].append((text, str(handle))) else: self.models[1].append((gramps_path, handle)) progress.step() if progress.get_cancelled(): break # Duplicate files or files not in Gramps for md5sum in all_files: if len(all_files[md5sum]) > 1: text = ', '.join(all_files[md5sum]) self.models[2].append((text, all_files[md5sum][0])) if md5sum not in in_gramps: text = ', '.join(all_files[md5sum]) self.models[3].append((text, all_files[md5sum][0])) self.show_tabs() progress.close()