6960: fix merging citations batch tool; sources

Back-port from gramps40 of r22971.

svn: r22972
This commit is contained in:
Vassilii Khachaturov 2013-08-30 23:06:06 +00:00
parent 4ee02a80af
commit e5d995517a
2 changed files with 40 additions and 79 deletions

View File

@ -31,7 +31,7 @@ Provide merge capabilities for citations.
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gen.lib import (Person, Family, Event, Place, from gen.lib import (Person, Family, Event, Place,
MediaObject, Repository, Citation) MediaObject, Repository, Citation, Source)
from gen.db import DbTxn from gen.db import DbTxn
from gen.ggettext import sgettext as _ from gen.ggettext import sgettext as _
import const import const
@ -232,6 +232,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

@ -60,6 +60,7 @@ from gen.db import DbTxn
from gen.lib import (Person, Family, Event, Place, MediaObject, Citation, from gen.lib import (Person, Family, Event, Place, MediaObject, Citation,
Repository) Repository)
from Errors import MergeError from Errors import MergeError
from Merge import MergeCitationQuery
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -186,7 +187,6 @@ class MergeCitations(tool.BatchTool,ManagedWindow.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:
@ -207,7 +207,9 @@ class MergeCitations(tool.BatchTool,ManagedWindow.ManagedWindow):
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(
self.dbstate, citation_match, citation)
query.execute()
except AssertionError: except AssertionError:
print "Tool/Family Tree processing/MergeCitations", \ print "Tool/Family Tree processing/MergeCitations", \
"citation1 gramps_id", citation_match.get_gramps_id(), \ "citation1 gramps_id", citation_match.get_gramps_id(), \
@ -227,53 +229,6 @@ class MergeCitations(tool.BatchTool,ManagedWindow.ManagedWindow):
"%(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)
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
# #