Bug 7928; Make merging people with complex families more friendly

If families are complex, skip the family merge with a warning message
rather than abort the persons merge
This commit is contained in:
prculley 2016-12-23 16:45:35 -06:00 committed by Nick Hall
parent a09d5471cf
commit 34d6ddada0
2 changed files with 33 additions and 17 deletions

View File

@ -116,13 +116,15 @@ class MergePersonQuery:
""" """
if trans is None: if trans is None:
with DbTxn(_('Merge Person'), self.database) as trans: with DbTxn(_('Merge Person'), self.database) as trans:
self.__execute(family_merger, trans) return self.__execute(family_merger, trans)
else: else:
self.__execute(family_merger, trans) return self.__execute(family_merger, trans)
def __execute(self, family_merger, trans): def __execute(self, family_merger, trans):
""" """
Merges two persons into a single person; trans is compulsory. Merges two persons into a single person; trans is compulsory.
Returns True if all went well, False if we did not complete a full
family merge, because of complex families
""" """
new_handle = self.phoenix.get_handle() new_handle = self.phoenix.get_handle()
old_handle = self.titanic.get_handle() old_handle = self.titanic.get_handle()
@ -147,32 +149,38 @@ class MergePersonQuery:
family_merge_guard = False family_merge_guard = False
parent_list = [] parent_list = []
parent_list_orig = [] parent_list_orig = []
family_merge_ok = True
family_handle_list = self.phoenix.get_family_handle_list()[:] family_handle_list = self.phoenix.get_family_handle_list()[:]
for family_handle in family_handle_list: for family_handle in family_handle_list:
family = self.database.get_family_from_handle(family_handle) family = self.database.get_family_from_handle(family_handle)
parents = (family.get_father_handle(), family.get_mother_handle()) parents = (family.get_father_handle(), family.get_mother_handle())
parent_list_orig.append(parents) parent_list_orig.append(parents)
if family.has_handle_reference('Person', old_handle): if family.has_handle_reference('Person', old_handle):
family.replace_handle_reference('Person', old_handle,
new_handle)
if family_merger and parent_list_orig.count(parents) > 1: if family_merger and parent_list_orig.count(parents) > 1:
raise MergeError(_("A person with multiple relations with " # A person with multiple relations with the same spouse is
"the same spouse is about to be merged. This is beyond " # about to be merged. This is beyond the capabilities of
"the capabilities of the merge routine. The merge is " # the merge routine. The family merge is skipped.
"aborted.")) family_merge_ok = False
family.replace_handle_reference('Person', old_handle,new_handle)
parents = (family.get_father_handle(), parents = (family.get_father_handle(),
family.get_mother_handle()) family.get_mother_handle())
# prune means merging families in this case. # prune means merging families in this case.
if family_merger and parents in parent_list: if (family_merger and parents in parent_list and
family_merge_ok):
# also merge when father_handle or mother_handle == None! # also merge when father_handle or mother_handle == None!
if family_merge_guard: if family_merge_guard:
raise MergeError(_("Multiple families get merged. " # Multiple families get merged.
"This is unusual, the merge is aborted.")) # This is unusual, the merge is skipped.
idx = parent_list.index(parents) family_merge_ok = False
main_family_handle = family_handle_list[idx] else:
self.merge_families(main_family_handle, family, trans) idx = parent_list.index(parents)
family_merge_guard = True main_family_handle = family_handle_list[idx]
continue self.merge_families(main_family_handle, family, trans)
family_merge_guard = True
continue
self.database.commit_family(family, trans) self.database.commit_family(family, trans)
parent_list.append(parents) parent_list.append(parents)
self.database.remove_person(old_handle, trans) self.database.remove_person(old_handle, trans)
return family_merge_ok

View File

@ -45,7 +45,7 @@ from gramps.gen.const import URL_MANUAL_SECT3
from ..display import display_help from ..display import display_help
from gramps.gen.datehandler import get_date from gramps.gen.datehandler import get_date
from gramps.gen.errors import MergeError from gramps.gen.errors import MergeError
from ..dialog import ErrorDialog from ..dialog import ErrorDialog, WarningDialog
from ..managedwindow import ManagedWindow from ..managedwindow import ManagedWindow
from gramps.gen.merge import MergePersonQuery from gramps.gen.merge import MergePersonQuery
@ -337,7 +337,15 @@ class MergePerson(ManagedWindow):
try: try:
query = MergePersonQuery(self.database, phoenix, titanic) query = MergePersonQuery(self.database, phoenix, titanic)
query.execute() family_merge_ok = query.execute()
if not family_merge_ok:
WarningDialog(
_("Warning"),
_("The persons have been merged.\nHowever, the families "
"for this merge were too complex to automatically "
"handle. We recommend that you go to Relationships "
"view and see if additional manual merging of families "
"is necessary."), parent=self.uistate.window)
except MergeError as err: except MergeError as err:
ErrorDialog(_("Cannot merge people"), str(err), ErrorDialog(_("Cannot merge people"), str(err),
parent=self.uistate.window) parent=self.uistate.window)