6960: Error merging citations

Reapply from trunk these commits:
commit 1594f61ea2dbd9eddb44a800c26f170ff5702491
Author: vassilii <vassilii@4ae1f11a-8b86-4847-b8af-ab372f36d1fd>
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 <vassilii@4ae1f11a-8b86-4847-b8af-ab372f36d1fd>
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
This commit is contained in:
Vassilii Khachaturov 2013-08-30 22:43:57 +00:00
parent 21fd8f2cfb
commit 314bbe6ca0
3 changed files with 42 additions and 80 deletions

View File

@ -37,13 +37,14 @@ from .notebase import NoteBase
from .reporef import RepoRef from .reporef import RepoRef
from .const import DIFFERENT, EQUAL, IDENTICAL from .const import DIFFERENT, EQUAL, IDENTICAL
from ..constfunc import cuni from ..constfunc import cuni
from .citationbase import IndirectCitationBase
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# Source class # Source class
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class Source(MediaBase, NoteBase, PrimaryObject): class Source(MediaBase, NoteBase, IndirectCitationBase, PrimaryObject):
"""A record of a source of information.""" """A record of a source of information."""
def __init__(self): def __init__(self):

View File

@ -31,7 +31,7 @@ Provide merge capabilities for citations.
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from ..lib import (Person, Family, Event, Place, from ..lib import (Person, Family, Event, Place,
MediaObject, Repository, Citation) MediaObject, Repository, Citation, Source)
from ..db import DbTxn from ..db import DbTxn
from ..const import GRAMPS_LOCALE as glocale from ..const import GRAMPS_LOCALE as glocale
_ = glocale.translation.sgettext _ = glocale.translation.sgettext
@ -101,6 +101,12 @@ class MergeCitationQuery(object):
citation.replace_citation_references(old_handle, citation.replace_citation_references(old_handle,
new_handle) new_handle)
self.database.commit_citation(citation, trans) 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: else:
raise MergeError("Encounter an object of type %s that has " raise MergeError("Encounter an object of type %s that has "
"a citation reference." % class_name) "a citation reference." % class_name)

View File

@ -56,6 +56,7 @@ from gramps.gui.display import display_help
from gramps.gen.datehandler import get_date from gramps.gen.datehandler import get_date
from gramps.gui.managedwindow import ManagedWindow from gramps.gui.managedwindow import ManagedWindow
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
from gramps.gen.merge import MergeCitationQuery
_ = glocale.translation.sgettext _ = glocale.translation.sgettext
from gramps.gui.glade import Glade from gramps.gui.glade import Glade
@ -189,38 +190,39 @@ class MergeCitations(tool.BatchTool,ManagedWindow):
db.disable_signals() db.disable_signals()
num_merges = 0 num_merges = 0
for handle in db.iter_source_handles(): for handle in db.iter_source_handles():
with DbTxn(_("Merge Citation"), db) as trans: dict = {}
dict = {} citation_handle_list = list(db.find_backlink_handles(handle))
citation_handle_list = list(db.find_backlink_handles(handle)) for (class_name, citation_handle) in citation_handle_list:
for (class_name, citation_handle) in citation_handle_list: if class_name != Citation.__name__:
if class_name != Citation.__name__: raise MergeError("Encountered an object of type %s "
raise MergeError("Encountered an object of type %s " "that has a citation reference." % class_name)
"that has a citation reference." % class_name)
citation = db.get_citation_from_handle(citation_handle) citation = db.get_citation_from_handle(citation_handle)
key = citation.get_page() key = citation.get_page()
if fields != IGNORE_DATE and fields != IGNORE_BOTH: if fields != IGNORE_DATE and fields != IGNORE_BOTH:
key += "\n" + get_date(citation) key += "\n" + get_date(citation)
if fields != IGNORE_CONFIDENCE and fields != IGNORE_BOTH: if fields != IGNORE_CONFIDENCE and fields != IGNORE_BOTH:
key += "\n" + \ key += "\n" + \
confidence[citation.get_confidence_level()] confidence[citation.get_confidence_level()]
if key in dict and \ if key in dict and \
(not dont_merge_notes or len(citation.note_list) == 0): (not dont_merge_notes or len(citation.note_list) == 0):
citation_match_handle = dict[key] citation_match_handle = dict[key]
citation_match = \ citation_match = \
db.get_citation_from_handle(citation_match_handle) db.get_citation_from_handle(citation_match_handle)
try: try:
self.Merge(db, citation_match, citation, trans) query = MergeCitationQuery(
except AssertionError: self.dbstate, citation_match, citation)
print("Tool/Family Tree processing/MergeCitations", \ query.execute()
"citation1 gramps_id", citation_match.get_gramps_id(), \ except AssertionError:
"citation2 gramps_id", citation.get_gramps_id() , \ print("Tool/Family Tree processing/MergeCitations", \
"citation backlink handles", \ "citation1 gramps_id", citation_match.get_gramps_id(), \
list(db.find_backlink_handles(citation.get_handle()))) "citation2 gramps_id", citation.get_gramps_id() , \
num_merges += 1 "citation backlink handles", \
elif (not dont_merge_notes or len(citation.note_list) == 0): list(db.find_backlink_handles(citation.get_handle())))
dict[key] = citation_handle num_merges += 1
self.progress.step() elif (not dont_merge_notes or len(citation.note_list) == 0):
dict[key] = citation_handle
self.progress.step()
db.enable_signals() db.enable_signals()
db.request_rebuild() db.request_rebuild()
self.progress.close() self.progress.close()
@ -229,54 +231,7 @@ class MergeCitations(tool.BatchTool,ManagedWindow):
glocale.translation.ngettext("%(num)d citation merged", glocale.translation.ngettext("%(num)d citation merged",
"%(num)d citations merged", num_merges) % {'num': num_merges}) "%(num)d citations merged", num_merges) % {'num': num_merges})
self.close(obj) 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)
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
# #