def cb_merge(self, obj): """ Perform the merge of the media objects when the merge button is clicked. """ use_handle1 = self.get_widget("handle_btn1").get_active() if use_handle1: phoenix = self.mo1 titanic = self.mo2 else: phoenix = self.mo2 titanic = self.mo1 # Add second handle to history so that when merge is complete, # phoenix is the selected row. self.uistate.set_active(phoenix.get_handle(), 'Media') if self.get_widget("path_btn1").get_active() ^ use_handle1: phoenix.set_path(titanic.get_path()) phoenix.set_mime_type(titanic.get_mime_type()) if self.get_widget("desc_btn1").get_active() ^ use_handle1: phoenix.set_description(titanic.get_description()) if self.get_widget("date_btn1").get_active() ^ use_handle1: phoenix.set_date_object(titanic.get_date_object()) if self.get_widget("gramps_btn1").get_active() ^ use_handle1: phoenix.set_gramps_id(titanic.get_gramps_id()) query = MergeMediaQuery(self.dbstate, phoenix, titanic) query.execute() self.close()
def run(self): """ Perform the actual extraction of information. """ # finds prefix, number, suffix of a Gramps ID ignoring a leading or # trailing space. The number must be at least three digits. _prob_id = re.compile(r'^ *([^\d]*)(\d{3,9})([^\d]*) *$') self.db.disable_signals() self.change = False num_merges = 0 with self.user.progress(_("Media Merge"), '', self.db.get_number_of_media()) as step: path_dict = {} for media in self.db.iter_media(): # this should collapse '../' constructs, deal with Windows '\' # and deal with Windows case insensitivity as well as deal # with relative paths and paths with environment variables. # it won't properly compare a Windows UNC path with an assigned # drive letter to that UNC path path = os.path.normcase( os.path.normpath(media_path_full(self.db, media.get_path()))) if path in path_dict: try: media1 = path_dict[path] # lets keep the shorter path, or if same # try to select the lower gramps_id # or lower handle as phoenix match = _prob_id.match(media.gramps_id) match1 = _prob_id.match(media1.gramps_id) mqo = media, media1 if len(media1.get_path()) < len(media.get_path()): mqo = media1, media elif len(media1.get_path()) == len(media.get_path()): if match and match1: if match1.groups()[1] < match.groups()[1]: mqo = media1, media else: # not (match and match1) if media1.handle < media.handle: mqo = media1, media query = MergeMediaQuery(self.dbstate, *mqo) # update to one we are keeping path_dict[path] = mqo[0] query.execute() except AssertionError: print("Tool/Family Tree processing/MediaMerge", "media1 gramps_id", path_dict[path].gramps_id, "media2 gramps_id", media.gramps_id) num_merges += 1 else: path_dict[path] = media step() self.db.enable_signals() self.db.request_rebuild() # translators: leave all/any {...} untranslated message = ngettext("{number_of} media merged", "{number_of} media merged", num_merges).format(number_of=num_merges) if num_merges: OkDialog(_("Number of merges done"), message, parent=self.user.uistate.window) else: OkDialog(_('No modifications made'), _("No media items merged."), parent=self.user.uistate.window)
def run_tool(self): try: obj_type = self.options.handler.options_dict['type'] primary_id = self.options.handler.options_dict['primary'] secondary_id = self.options.handler.options_dict['secondary'] if not primary_id or not secondary_id: raise MergeError( "Both primary and secondary object IDs need to " "be specified.") if not obj_type: id2type = { 'I': 'Person', 'F': 'Family', 'E': 'Event', 'P': 'Place', 'C': 'Citation', 'S': 'Source', 'R': 'Repository', 'O': 'Media', 'N': 'Note' } obj_type = id2type[primary_id[0]] database = self.dbstate.db primary = database.get_from_name_and_gramps_id( obj_type, primary_id) secondary = database.get_from_name_and_gramps_id( obj_type, secondary_id) if not primary or not secondary: raise MergeError("Can't get object from ID.") if type(primary) != type(secondary): raise MergeError("Primary and secondary object need to be of " "the same type.") if obj_type == 'Person': from gramps.gen.merge import MergePersonQuery query = MergePersonQuery(database, primary, secondary) elif obj_type == 'Family': # TODO make sure father_handle is in phoenix or titanic father_handle = self.options.handler.options_dict['father_h'] mother_handle = self.options.handler.options_dict['mother_h'] from gramps.gen.merge import MergeFamilyQuery query = MergeFamilyQuery(database, primary, secondary, father_handle, mother_handle) elif obj_type == 'Event': from gramps.gen.merge import MergeEventQuery query = MergeEventQuery(self.dbstate, primary, secondary) elif obj_type == 'Place': from gramps.gen.merge import MergePlaceQuery query = MergePlaceQuery(self.dbstate, primary, secondary) elif obj_type == 'Citation': from gramps.gen.merge import MergeCitationQuery query = MergeCitationQuery(self.dbstate, primary, secondary) elif obj_type == 'Source': from gramps.gen.merge import MergeSourceQuery query = MergeSourceQuery(self.dbstate, primary, secondary) elif obj_type == 'Repository': from gramps.gen.merge import MergeRepositoryQuery query = MergeRepositoryQuery(self.dbstate, primary, secondary) elif obj_type == 'Media': from gramps.gen.merge import MergeMediaQuery query = MergeMediaQuery(self.dbstate, primary, secondary) elif obj_type == 'Note': from gramps.gen.merge import MergeNoteQuery query = MergeNoteQuery(self.dbstate, primary, secondary) else: raise MergeError(("Merge for %s not implemented.") % \ str(type(primary))) query.execute() except MergeError as err: print(err, file=sys.stderr)
def run(self): """ Perform the actual extraction of information. """ # finds prefix, number, suffix of a Gramps ID ignoring a leading or # trailing space. The number must be at least three digits. _prob_id = re.compile(r'^ *([^\d]*)(\d{3,9})([^\d]*) *$') self.db.disable_signals() self.change = False num_merges = 0 with self.user.progress(_("Media Merge"), '', self.db.get_number_of_media()) as step: path_dict = {} for media in self.db.iter_media(): # this should collapse '../' constructs, deal with Windows '\' # and deal with Windows case insensitivity as well as deal # with relative paths and paths with environment variables. # it won't properly compare a Windows UNC path with an assigned # drive letter to that UNC path path = os.path.normcase(os.path.normpath( media_path_full(self.db, media.get_path()))) if path in path_dict: try: media1 = path_dict[path] # lets keep the shorter path, or if same # try to select the lower gramps_id # or lower handle as phoenix match = _prob_id.match(media.gramps_id) match1 = _prob_id.match(media1.gramps_id) mqo = media, media1 if len(media1.get_path()) < len(media.get_path()): mqo = media1, media elif len(media1.get_path()) == len(media.get_path()): if match and match1: if match1.groups()[1] < match.groups()[1]: mqo = media1, media else: # not (match and match1) if media1.handle < media.handle: mqo = media1, media query = MergeMediaQuery(self.dbstate, *mqo) # update to one we are keeping path_dict[path] = mqo[0] query.execute() except AssertionError: print("Tool/Family Tree processing/MediaMerge", "media1 gramps_id", path_dict[path].gramps_id, "media2 gramps_id", media.gramps_id) num_merges += 1 else: path_dict[path] = media step() self.db.enable_signals() self.db.request_rebuild() # translators: leave all/any {...} untranslated message = ngettext("{number_of} media merged", "{number_of} media merged", num_merges ).format(number_of=num_merges) if num_merges: OkDialog(_("Number of merges done"), message, parent=self.user.uistate.window) else: OkDialog(_('No modifications made'), _("No media items merged."), parent=self.user.uistate.window)