From 314bbe6ca05498f2db5ebe0bbebf9a776ce1b383 Mon Sep 17 00:00:00 2001 From: Vassilii Khachaturov Date: Fri, 30 Aug 2013 22:43:57 +0000 Subject: [PATCH] 6960: Error merging citations Reapply from trunk these commits: commit 1594f61ea2dbd9eddb44a800c26f170ff5702491 Author: vassilii Date: Fri Aug 30 22:33:58 2013 +0000 6960: Bless Source with an IndirectCitationBase git-svn-id: svn+ssh://svn.code.sf.net/p/gramps/code/trunk@22970 4ae1f11a-8b86-4847-b8af-ab372f36d1fd commit 6ec4b56d6530bd98638cb66365e6205d057f48ca Author: vassilii Date: Fri Aug 30 22:03:14 2013 +0000 6960: mergecitations has broken copy of MCQ The MergeCitations batch tool had a cut-and-pasted code replicating MergeCitationQuery logic. Naturally, it diverged :-) Removed MergeCitations.Merge and use MergeCitationQuery instead. git-svn-id: svn+ssh://svn.code.sf.net/p/gramps/code/trunk@22969 4ae1f11a-8b86-4847-b8af-ab372f36d1fd svn: r22971 --- gramps/gen/lib/src.py | 3 +- gramps/gen/merge/mergecitationquery.py | 8 +- gramps/plugins/tool/mergecitations.py | 111 ++++++++----------------- 3 files changed, 42 insertions(+), 80 deletions(-) diff --git a/gramps/gen/lib/src.py b/gramps/gen/lib/src.py index e6566769d..cb20c6688 100644 --- a/gramps/gen/lib/src.py +++ b/gramps/gen/lib/src.py @@ -37,13 +37,14 @@ from .notebase import NoteBase from .reporef import RepoRef from .const import DIFFERENT, EQUAL, IDENTICAL from ..constfunc import cuni +from .citationbase import IndirectCitationBase #------------------------------------------------------------------------- # # Source class # #------------------------------------------------------------------------- -class Source(MediaBase, NoteBase, PrimaryObject): +class Source(MediaBase, NoteBase, IndirectCitationBase, PrimaryObject): """A record of a source of information.""" def __init__(self): diff --git a/gramps/gen/merge/mergecitationquery.py b/gramps/gen/merge/mergecitationquery.py index fba082e8b..79cd0a216 100644 --- a/gramps/gen/merge/mergecitationquery.py +++ b/gramps/gen/merge/mergecitationquery.py @@ -31,7 +31,7 @@ Provide merge capabilities for citations. # #------------------------------------------------------------------------- from ..lib import (Person, Family, Event, Place, - MediaObject, Repository, Citation) + MediaObject, Repository, Citation, Source) from ..db import DbTxn from ..const import GRAMPS_LOCALE as glocale _ = glocale.translation.sgettext @@ -101,6 +101,12 @@ class MergeCitationQuery(object): citation.replace_citation_references(old_handle, new_handle) self.database.commit_citation(citation, trans) + elif class_name == Source.__name__: + source = self.database.get_source_from_handle(handle) + assert(source.has_citation_reference(old_handle)) + source.replace_citation_references(old_handle, + new_handle) + self.database.commit_source(source, trans) else: raise MergeError("Encounter an object of type %s that has " "a citation reference." % class_name) diff --git a/gramps/plugins/tool/mergecitations.py b/gramps/plugins/tool/mergecitations.py index 0374141e2..bd6826d89 100644 --- a/gramps/plugins/tool/mergecitations.py +++ b/gramps/plugins/tool/mergecitations.py @@ -56,6 +56,7 @@ from gramps.gui.display import display_help from gramps.gen.datehandler import get_date from gramps.gui.managedwindow import ManagedWindow from gramps.gen.const import GRAMPS_LOCALE as glocale +from gramps.gen.merge import MergeCitationQuery _ = glocale.translation.sgettext from gramps.gui.glade import Glade @@ -189,38 +190,39 @@ class MergeCitations(tool.BatchTool,ManagedWindow): db.disable_signals() num_merges = 0 for handle in db.iter_source_handles(): - with DbTxn(_("Merge Citation"), db) as trans: - dict = {} - citation_handle_list = list(db.find_backlink_handles(handle)) - for (class_name, citation_handle) in citation_handle_list: - if class_name != Citation.__name__: - raise MergeError("Encountered an object of type %s " - "that has a citation reference." % class_name) + dict = {} + citation_handle_list = list(db.find_backlink_handles(handle)) + for (class_name, citation_handle) in citation_handle_list: + if class_name != Citation.__name__: + raise MergeError("Encountered an object of type %s " + "that has a citation reference." % class_name) - citation = db.get_citation_from_handle(citation_handle) - key = citation.get_page() - if fields != IGNORE_DATE and fields != IGNORE_BOTH: - key += "\n" + get_date(citation) - if fields != IGNORE_CONFIDENCE and fields != IGNORE_BOTH: - key += "\n" + \ - confidence[citation.get_confidence_level()] - if key in dict and \ - (not dont_merge_notes or len(citation.note_list) == 0): - citation_match_handle = dict[key] - citation_match = \ - db.get_citation_from_handle(citation_match_handle) - try: - self.Merge(db, citation_match, citation, trans) - except AssertionError: - print("Tool/Family Tree processing/MergeCitations", \ - "citation1 gramps_id", citation_match.get_gramps_id(), \ - "citation2 gramps_id", citation.get_gramps_id() , \ - "citation backlink handles", \ - list(db.find_backlink_handles(citation.get_handle()))) - num_merges += 1 - elif (not dont_merge_notes or len(citation.note_list) == 0): - dict[key] = citation_handle - self.progress.step() + citation = db.get_citation_from_handle(citation_handle) + key = citation.get_page() + if fields != IGNORE_DATE and fields != IGNORE_BOTH: + key += "\n" + get_date(citation) + if fields != IGNORE_CONFIDENCE and fields != IGNORE_BOTH: + key += "\n" + \ + confidence[citation.get_confidence_level()] + if key in dict and \ + (not dont_merge_notes or len(citation.note_list) == 0): + citation_match_handle = dict[key] + citation_match = \ + db.get_citation_from_handle(citation_match_handle) + try: + query = MergeCitationQuery( + self.dbstate, citation_match, citation) + query.execute() + except AssertionError: + print("Tool/Family Tree processing/MergeCitations", \ + "citation1 gramps_id", citation_match.get_gramps_id(), \ + "citation2 gramps_id", citation.get_gramps_id() , \ + "citation backlink handles", \ + list(db.find_backlink_handles(citation.get_handle()))) + num_merges += 1 + elif (not dont_merge_notes or len(citation.note_list) == 0): + dict[key] = citation_handle + self.progress.step() db.enable_signals() db.request_rebuild() self.progress.close() @@ -229,54 +231,7 @@ class MergeCitations(tool.BatchTool,ManagedWindow): glocale.translation.ngettext("%(num)d citation merged", "%(num)d citations merged", num_merges) % {'num': num_merges}) self.close(obj) - - def Merge (self, db, citation1, citation2, trans): - """ - Merges two citations into a single citation. - """ - new_handle = citation1.get_handle() - old_handle = citation2.get_handle() - citation1.merge(citation2) - - db.commit_citation(citation1, trans) - for (class_name, handle) in db.find_backlink_handles( - old_handle): - if class_name == Person.__name__: - person = db.get_person_from_handle(handle) - assert(person.has_citation_reference(old_handle)) - person.replace_citation_references(old_handle, new_handle) - db.commit_person(person, trans) - elif class_name == Family.__name__: - family = db.get_family_from_handle(handle) - assert(family.has_citation_reference(old_handle)) - family.replace_citation_references(old_handle, new_handle) - db.commit_family(family, trans) - elif class_name == Event.__name__: - event = db.get_event_from_handle(handle) - assert(event.has_citation_reference(old_handle)) - event.replace_citation_references(old_handle, new_handle) - db.commit_event(event, trans) - elif class_name == Place.__name__: - place = db.get_place_from_handle(handle) - assert(place.has_citation_reference(old_handle)) - place.replace_citation_references(old_handle, new_handle) - db.commit_place(place, trans) - elif class_name == MediaObject.__name__: - obj = db.get_object_from_handle(handle) - assert(obj.has_citation_reference(old_handle)) - obj.replace_citation_references(old_handle, new_handle) - db.commit_media_object(obj, trans) - elif class_name == Repository.__name__: - repository = db.get_repository_from_handle(handle) - assert(repository.has_citation_reference(old_handle)) - repository.replace_citation_references(old_handle, new_handle) - db.commit_repository(repository, trans) - else: - raise MergeError("Encountered an object of type %s that has " - "a citation reference." % class_name) - db.remove_citation(old_handle, trans) - #------------------------------------------------------------------------ # #