GEPS008: Re-structure merge files
svn: r19665
This commit is contained in:
parent
b206ade3d3
commit
c2b4f96ddc
@ -110,6 +110,7 @@ src/gen/filters/rules/repository/Makefile
|
|||||||
src/gen/filters/rules/note/Makefile
|
src/gen/filters/rules/note/Makefile
|
||||||
src/gen/filters/rules/citation/Makefile
|
src/gen/filters/rules/citation/Makefile
|
||||||
src/gen/lib/Makefile
|
src/gen/lib/Makefile
|
||||||
|
src/gen/merge/Makefile
|
||||||
src/gen/mime/Makefile
|
src/gen/mime/Makefile
|
||||||
src/gen/plug/Makefile
|
src/gen/plug/Makefile
|
||||||
src/gen/plug/docbackend/Makefile
|
src/gen/plug/docbackend/Makefile
|
||||||
@ -124,6 +125,7 @@ src/gui/editors/displaytabs/Makefile
|
|||||||
src/gui/filters/Makefile
|
src/gui/filters/Makefile
|
||||||
src/gui/filters/sidebar/Makefile
|
src/gui/filters/sidebar/Makefile
|
||||||
src/gui/glade/Makefile
|
src/gui/glade/Makefile
|
||||||
|
src/gui/merge/Makefile
|
||||||
src/gui/plug/Makefile
|
src/gui/plug/Makefile
|
||||||
src/gui/plug/report/Makefile
|
src/gui/plug/report/Makefile
|
||||||
src/gui/selectors/Makefile
|
src/gui/selectors/Makefile
|
||||||
@ -131,7 +133,6 @@ src/gui/views/Makefile
|
|||||||
src/gui/views/treemodels/Makefile
|
src/gui/views/treemodels/Makefile
|
||||||
src/gui/widgets/Makefile
|
src/gui/widgets/Makefile
|
||||||
src/GrampsLogger/Makefile
|
src/GrampsLogger/Makefile
|
||||||
src/Merge/Makefile
|
|
||||||
src/docgen/Makefile
|
src/docgen/Makefile
|
||||||
src/Simple/Makefile
|
src/Simple/Makefile
|
||||||
src/GrampsLocale/Makefile
|
src/GrampsLocale/Makefile
|
||||||
|
@ -294,6 +294,17 @@ src/gen/lib/srcmediatype.py
|
|||||||
src/gen/lib/surnamebase.py
|
src/gen/lib/surnamebase.py
|
||||||
src/gen/lib/urltype.py
|
src/gen/lib/urltype.py
|
||||||
|
|
||||||
|
# gen.merge package
|
||||||
|
src/gen/merge/mergecitationquery.py
|
||||||
|
src/gen/merge/mergeeventquery.py
|
||||||
|
src/gen/merge/mergefamilyquery.py
|
||||||
|
src/gen/merge/mergemediaquery.py
|
||||||
|
src/gen/merge/mergenotequery.py
|
||||||
|
src/gen/merge/mergepersonquery.py
|
||||||
|
src/gen/merge/mergeplacequery.py
|
||||||
|
src/gen/merge/mergerepositoryquery.py
|
||||||
|
src/gen/merge/mergesourcequery.py
|
||||||
|
|
||||||
# gen mime API
|
# gen mime API
|
||||||
src/gen/mime/_gnomemime.py
|
src/gen/mime/_gnomemime.py
|
||||||
src/gen/mime/_pythonmime.py
|
src/gen/mime/_pythonmime.py
|
||||||
@ -396,6 +407,17 @@ src/gui/filters/sidebar/_mediasidebarfilter.py
|
|||||||
src/gui/filters/sidebar/_reposidebarfilter.py
|
src/gui/filters/sidebar/_reposidebarfilter.py
|
||||||
src/gui/filters/sidebar/_notesidebarfilter.py
|
src/gui/filters/sidebar/_notesidebarfilter.py
|
||||||
|
|
||||||
|
# gui.merge package
|
||||||
|
src/gui/merge/mergecitation.py
|
||||||
|
src/gui/merge/mergeevent.py
|
||||||
|
src/gui/merge/mergefamily.py
|
||||||
|
src/gui/merge/mergemedia.py
|
||||||
|
src/gui/merge/mergenote.py
|
||||||
|
src/gui/merge/mergeperson.py
|
||||||
|
src/gui/merge/mergeplace.py
|
||||||
|
src/gui/merge/mergerepository.py
|
||||||
|
src/gui/merge/mergesource.py
|
||||||
|
|
||||||
# gui plugin API (was PluginUtils and ReportBase)
|
# gui plugin API (was PluginUtils and ReportBase)
|
||||||
src/gui/plug/_dialogs.py
|
src/gui/plug/_dialogs.py
|
||||||
src/gui/plug/_guioptions.py
|
src/gui/plug/_guioptions.py
|
||||||
@ -451,20 +473,6 @@ src/Simple/_SimpleTable.py
|
|||||||
# Config package
|
# Config package
|
||||||
src/config.py
|
src/config.py
|
||||||
|
|
||||||
# Merge package
|
|
||||||
src/Merge/mergecitation.py
|
|
||||||
src/Merge/mergeevent.py
|
|
||||||
src/Merge/mergefamily.py
|
|
||||||
src/Merge/mergemedia.py
|
|
||||||
src/Merge/mergenote.py
|
|
||||||
src/Merge/mergeperson.py
|
|
||||||
src/Merge/mergeplace.py
|
|
||||||
src/Merge/mergerepository.py
|
|
||||||
src/Merge/mergesource.py
|
|
||||||
#src/Merge/_MergePerson.py
|
|
||||||
#src/Merge/_MergePlace.py
|
|
||||||
#src/Merge/_MergeSource.py
|
|
||||||
|
|
||||||
# docgen directory
|
# docgen directory
|
||||||
src/docgen/ODSTab.py
|
src/docgen/ODSTab.py
|
||||||
src/docgen/TextBufDoc.py
|
src/docgen/TextBufDoc.py
|
||||||
|
@ -162,6 +162,10 @@ src/gen/lib/url.py
|
|||||||
src/gen/lib/urlbase.py
|
src/gen/lib/urlbase.py
|
||||||
src/gen/lib/witness.py
|
src/gen/lib/witness.py
|
||||||
|
|
||||||
|
# gen.merge package
|
||||||
|
src/gen/merge/__init__.py
|
||||||
|
src/gen/merge/test/merge_ref_test.py
|
||||||
|
|
||||||
# gen mime API
|
# gen mime API
|
||||||
src/gen/mime/__init__.py
|
src/gen/mime/__init__.py
|
||||||
src/gen/mime/_winmime.py
|
src/gen/mime/_winmime.py
|
||||||
@ -264,6 +268,9 @@ src/gui/filters/_filtercombobox.py
|
|||||||
src/gui/filters/_filtermenu.py
|
src/gui/filters/_filtermenu.py
|
||||||
src/gui/filters/__init__.py
|
src/gui/filters/__init__.py
|
||||||
|
|
||||||
|
# gui.merge package
|
||||||
|
src/gui/merge/__init__.py
|
||||||
|
|
||||||
# gui/selectors - the GUI selectors package
|
# gui/selectors - the GUI selectors package
|
||||||
src/gui/selectors/__init__.py
|
src/gui/selectors/__init__.py
|
||||||
src/gui/selectors/baseselector.py
|
src/gui/selectors/baseselector.py
|
||||||
@ -294,10 +301,6 @@ src/guiQML/views/centralview.py
|
|||||||
src/guiQML/views/personview.py
|
src/guiQML/views/personview.py
|
||||||
src/guiQML/views/dbman.py
|
src/guiQML/views/dbman.py
|
||||||
|
|
||||||
# Merge package
|
|
||||||
src/Merge/__init__.py
|
|
||||||
src/Merge/test/merge_ref_test.py
|
|
||||||
|
|
||||||
# plugins gpr directory
|
# plugins gpr directory
|
||||||
src/plugins/sidebar/sidebar.gpr.py
|
src/plugins/sidebar/sidebar.gpr.py
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@ SUBDIRS = \
|
|||||||
GrampsLogger \
|
GrampsLogger \
|
||||||
gui \
|
gui \
|
||||||
images \
|
images \
|
||||||
Merge \
|
|
||||||
plugins \
|
plugins \
|
||||||
Simple
|
Simple
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ SUBDIRS = \
|
|||||||
display \
|
display \
|
||||||
filters \
|
filters \
|
||||||
lib \
|
lib \
|
||||||
|
merge \
|
||||||
mime \
|
mime \
|
||||||
plug \
|
plug \
|
||||||
proxy \
|
proxy \
|
||||||
|
@ -26,5 +26,5 @@ The gen module provides packages that are common to all gramps
|
|||||||
interfaces (gui, cli and web).
|
interfaces (gui, cli and web).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__all__ = [ "datehandler", "db", "display", "filters", "lib", "mime", "plug",
|
__all__ = [ "datehandler", "db", "display", "filters", "lib", "merge", "mime",
|
||||||
"proxy", "utils" ]
|
"plug", "proxy", "utils" ]
|
||||||
|
30
src/gen/merge/Makefile.am
Normal file
30
src/gen/merge/Makefile.am
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# This is the src/RelLib level Makefile for Gramps
|
||||||
|
# $Id: Makefile.am 18851 2012-02-10 20:25:15Z josipsf $
|
||||||
|
# We could use GNU make's ':=' syntax for nice wildcard use,
|
||||||
|
# but that is not necessarily portable.
|
||||||
|
# If not using GNU make, then list all .py files individually
|
||||||
|
|
||||||
|
pkgpythondir = $(datadir)/@PACKAGE@/gen/merge
|
||||||
|
|
||||||
|
pkgpython_PYTHON = \
|
||||||
|
__init__.py \
|
||||||
|
mergepersonquery.py \
|
||||||
|
mergefamilyquery.py \
|
||||||
|
mergeeventquery.py \
|
||||||
|
mergeplacequery.py \
|
||||||
|
mergesourcequery.py \
|
||||||
|
mergecitationquery.py \
|
||||||
|
mergerepositoryquery.py \
|
||||||
|
mergemediaquery.py \
|
||||||
|
mergenotequery.py
|
||||||
|
|
||||||
|
pkgpyexecdir = @pkgpyexecdir@/gen/merge
|
||||||
|
|
||||||
|
# Clean up all the byte-compiled files
|
||||||
|
MOSTLYCLEANFILES = *pyc *pyo
|
||||||
|
|
||||||
|
GRAMPS_PY_MODPATH = "../../"
|
||||||
|
|
||||||
|
pycheck:
|
||||||
|
(export PYTHONPATH=$(GRAMPS_PY_MODPATH); \
|
||||||
|
pychecker $(pkgpython_PYTHON));
|
35
src/gen/merge/__init__.py
Normal file
35
src/gen/merge/__init__.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004-2006 Donald N. Allingham
|
||||||
|
# Copyright (C) 2011 Tim G L Lyons
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
from mergepersonquery import *
|
||||||
|
from mergefamilyquery import *
|
||||||
|
from mergeeventquery import *
|
||||||
|
from mergeplacequery import *
|
||||||
|
from mergesourcequery import *
|
||||||
|
from mergecitationquery import *
|
||||||
|
from mergerepositoryquery import *
|
||||||
|
from mergemediaquery import *
|
||||||
|
from mergenotequery import *
|
99
src/gen/merge/mergecitationquery.py
Normal file
99
src/gen/merge/mergecitationquery.py
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2000-2005 Donald N. Allingham
|
||||||
|
# Copyright (C) 2011 Tim G L Lyons
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provide merge capabilities for citations.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.lib import (Person, Family, Event, Place, MediaObject, Repository)
|
||||||
|
from gen.db import DbTxn
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
from Errors import MergeError
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergeCitationQuery
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergeCitationQuery(object):
|
||||||
|
"""
|
||||||
|
Create database query to merge two citations.
|
||||||
|
"""
|
||||||
|
def __init__(self, dbstate, phoenix, titanic):
|
||||||
|
self.database = dbstate.db
|
||||||
|
self.phoenix = phoenix
|
||||||
|
self.titanic = titanic
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
"""
|
||||||
|
Merges to citations into a single citation.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
|
||||||
|
self.phoenix.merge(self.titanic)
|
||||||
|
|
||||||
|
with DbTxn(_("Merge Citation"), self.database) as trans:
|
||||||
|
self.database.commit_citation(self.phoenix, trans)
|
||||||
|
for (class_name, handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle):
|
||||||
|
if class_name == Person.__name__:
|
||||||
|
person = self.database.get_person_from_handle(handle)
|
||||||
|
assert(person.has_citation_reference(old_handle))
|
||||||
|
person.replace_citation_references(old_handle, new_handle)
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
|
elif class_name == Family.__name__:
|
||||||
|
family = self.database.get_family_from_handle(handle)
|
||||||
|
assert(family.has_citation_reference(old_handle))
|
||||||
|
family.replace_citation_references(old_handle, new_handle)
|
||||||
|
self.database.commit_family(family, trans)
|
||||||
|
elif class_name == Event.__name__:
|
||||||
|
event = self.database.get_event_from_handle(handle)
|
||||||
|
assert(event.has_citation_reference(old_handle))
|
||||||
|
event.replace_citation_references(old_handle, new_handle)
|
||||||
|
self.database.commit_event(event, trans)
|
||||||
|
elif class_name == Place.__name__:
|
||||||
|
place = self.database.get_place_from_handle(handle)
|
||||||
|
assert(place.has_citation_reference(old_handle))
|
||||||
|
place.replace_citation_references(old_handle, new_handle)
|
||||||
|
self.database.commit_place(place, trans)
|
||||||
|
elif class_name == MediaObject.__name__:
|
||||||
|
obj = self.database.get_object_from_handle(handle)
|
||||||
|
assert(obj.has_citation_reference(old_handle))
|
||||||
|
obj.replace_citation_references(old_handle, new_handle)
|
||||||
|
self.database.commit_media_object(obj, trans)
|
||||||
|
elif class_name == Repository.__name__:
|
||||||
|
repository = self.database.get_repository_from_handle(handle)
|
||||||
|
assert(repository.has_citation_reference(old_handle))
|
||||||
|
repository.replace_citation_references(old_handle,
|
||||||
|
new_handle)
|
||||||
|
self.database.commit_repository(repository, trans)
|
||||||
|
else:
|
||||||
|
raise MergeError("Encounter an object of type %s that has "
|
||||||
|
"a citation reference." % class_name)
|
||||||
|
self.database.remove_citation(old_handle, trans)
|
95
src/gen/merge/mergeeventquery.py
Normal file
95
src/gen/merge/mergeeventquery.py
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2010 Michiel D. Nauta
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provide merge capabilities for events.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.lib import Person, Family
|
||||||
|
from gen.db import DbTxn
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
from Errors import MergeError
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergeEventQuery
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergeEventQuery(object):
|
||||||
|
"""
|
||||||
|
Create database query to merge two events.
|
||||||
|
"""
|
||||||
|
def __init__(self, dbstate, phoenix, titanic):
|
||||||
|
self.database = dbstate.db
|
||||||
|
self.phoenix = phoenix
|
||||||
|
self.titanic = titanic
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
"""
|
||||||
|
Merges two events into a single event.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
|
||||||
|
self.phoenix.merge(self.titanic)
|
||||||
|
|
||||||
|
with DbTxn(_("Merge Event Objects"), self.database) as trans:
|
||||||
|
self.database.commit_event(self.phoenix, trans)
|
||||||
|
for (class_name, handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle):
|
||||||
|
if class_name == Person.__name__:
|
||||||
|
person = self.database.get_person_from_handle(handle)
|
||||||
|
assert(person.has_handle_reference("Event", old_handle))
|
||||||
|
bri = person.birth_ref_index
|
||||||
|
dri = person.death_ref_index
|
||||||
|
person.replace_handle_reference("Event", old_handle,
|
||||||
|
new_handle)
|
||||||
|
if person.birth_ref_index != bri and \
|
||||||
|
person.birth_ref_index == -1:
|
||||||
|
for index, ref in enumerate(person.get_event_ref_list()):
|
||||||
|
event = self.database.get_event_from_handle(ref.ref)
|
||||||
|
if event.type.is_birth() and ref.role.is_primary():
|
||||||
|
person.birth_ref_index = index
|
||||||
|
break
|
||||||
|
if person.death_ref_index != dri and \
|
||||||
|
person.death_ref_index == -1:
|
||||||
|
for index, ref in enumerate(person.get_event_ref_list()):
|
||||||
|
event = self.database.get_event_from_handle(ref.ref)
|
||||||
|
if event.type.is_death() and ref.role.is_primary():
|
||||||
|
person.death_ref_index = index
|
||||||
|
break
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
|
elif class_name == Family.__name__:
|
||||||
|
family = self.database.get_family_from_handle(handle)
|
||||||
|
assert(family.has_handle_reference("Event", old_handle))
|
||||||
|
family.replace_handle_reference("Event", old_handle,
|
||||||
|
new_handle)
|
||||||
|
self.database.commit_family(family, trans)
|
||||||
|
else:
|
||||||
|
raise MergeError("Encounter an object of type %s that has "
|
||||||
|
"an event reference." % class_name)
|
||||||
|
self.database.remove_event(old_handle, trans)
|
175
src/gen/merge/mergefamilyquery.py
Normal file
175
src/gen/merge/mergefamilyquery.py
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2010 Michiel D. Nauta
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provide merge capabilities for families.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.db import DbTxn
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
from Errors import MergeError
|
||||||
|
from gen.merge import MergePersonQuery
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergeFamilyQuery
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergeFamilyQuery(object):
|
||||||
|
"""
|
||||||
|
Create database query to merge two families.
|
||||||
|
"""
|
||||||
|
def __init__(self, database, phoenix, titanic, phoenix_fh=None,
|
||||||
|
phoenix_mh=None):
|
||||||
|
self.database = database
|
||||||
|
self.phoenix = phoenix
|
||||||
|
self.titanic = titanic
|
||||||
|
if phoenix_fh is None:
|
||||||
|
self.phoenix_fh = self.phoenix.get_father_handle()
|
||||||
|
else:
|
||||||
|
self.phoenix_fh = phoenix_fh
|
||||||
|
if phoenix_mh is None:
|
||||||
|
self.phoenix_mh = self.phoenix.get_mother_handle()
|
||||||
|
else:
|
||||||
|
self.phoenix_mh = phoenix_mh
|
||||||
|
|
||||||
|
if self.phoenix.get_father_handle() == self.phoenix_fh:
|
||||||
|
self.titanic_fh = self.titanic.get_father_handle()
|
||||||
|
self.father_swapped = False
|
||||||
|
else:
|
||||||
|
assert self.phoenix_fh == self.titanic.get_father_handle()
|
||||||
|
self.titanic_fh = self.phoenix.get_father_handle()
|
||||||
|
self.father_swapped = True
|
||||||
|
if self.phoenix.get_mother_handle() == self.phoenix_mh:
|
||||||
|
self.titanic_mh = self.titanic.get_mother_handle()
|
||||||
|
self.mother_swapped = False
|
||||||
|
else:
|
||||||
|
assert self.phoenix_mh == self.titanic.get_mother_handle()
|
||||||
|
self.titanic_mh = self.phoenix.get_mother_handle()
|
||||||
|
self.mother_swapped = True
|
||||||
|
|
||||||
|
def merge_person(self, phoenix_person, titanic_person, parent, trans):
|
||||||
|
"""
|
||||||
|
Merge two persons even if they are None; no families are merged!
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
|
||||||
|
if parent == 'father':
|
||||||
|
swapped = self.father_swapped
|
||||||
|
family_add_person_handle = (
|
||||||
|
(self.phoenix if swapped else self.titanic).set_father_handle)
|
||||||
|
elif parent == 'mother':
|
||||||
|
swapped = self.mother_swapped
|
||||||
|
family_add_person_handle = (
|
||||||
|
(self.phoenix if swapped else self.titanic).set_mother_handle)
|
||||||
|
else:
|
||||||
|
raise ValueError(_("A parent should be a father or mother."))
|
||||||
|
|
||||||
|
if phoenix_person is None:
|
||||||
|
if titanic_person is not None:
|
||||||
|
raise MergeError("""When merging people where one person """
|
||||||
|
"""doesn't exist, that "person" must be the person that """
|
||||||
|
"""will be deleted from the database.""")
|
||||||
|
return
|
||||||
|
elif titanic_person is None:
|
||||||
|
if swapped:
|
||||||
|
if any(childref.get_reference_handle() == phoenix_person.get_handle()
|
||||||
|
for childref in self.phoenix.get_child_ref_list()):
|
||||||
|
|
||||||
|
raise MergeError(_("A parent and child cannot be merged. "
|
||||||
|
"To merge these people, you must first break the "
|
||||||
|
"relationship between them."))
|
||||||
|
|
||||||
|
phoenix_person.add_family_handle(new_handle)
|
||||||
|
family_add_person_handle(phoenix_person.get_handle())
|
||||||
|
self.database.commit_family(self.phoenix, trans)
|
||||||
|
else:
|
||||||
|
if any(childref.get_reference_handle() == phoenix_person.get_handle()
|
||||||
|
for childref in self.titanic.get_child_ref_list()):
|
||||||
|
|
||||||
|
raise MergeError(_("A parent and child cannot be merged. "
|
||||||
|
"To merge these people, you must first break the "
|
||||||
|
"relationship between them."))
|
||||||
|
|
||||||
|
phoenix_person.add_family_handle(old_handle)
|
||||||
|
family_add_person_handle(phoenix_person.get_handle())
|
||||||
|
self.database.commit_family(self.titanic, trans)
|
||||||
|
|
||||||
|
self.database.commit_person(phoenix_person, trans)
|
||||||
|
else:
|
||||||
|
query = MergePersonQuery(self.database, phoenix_person,
|
||||||
|
titanic_person)
|
||||||
|
query.execute(family_merger=False, trans=trans)
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
"""
|
||||||
|
Merges two families into a single family.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
|
||||||
|
with DbTxn(_('Merge Family'), self.database) as trans:
|
||||||
|
|
||||||
|
phoenix_father = self.database.get_person_from_handle(self.phoenix_fh)
|
||||||
|
titanic_father = self.database.get_person_from_handle(self.titanic_fh)
|
||||||
|
self.merge_person(phoenix_father, titanic_father, 'father', trans)
|
||||||
|
|
||||||
|
phoenix_mother = self.database.get_person_from_handle(self.phoenix_mh)
|
||||||
|
titanic_mother = self.database.get_person_from_handle(self.titanic_mh)
|
||||||
|
self.phoenix = self.database.get_family_from_handle(new_handle)
|
||||||
|
self.titanic = self.database.get_family_from_handle(old_handle)
|
||||||
|
self.merge_person(phoenix_mother, titanic_mother, 'mother', trans)
|
||||||
|
|
||||||
|
phoenix_father = self.database.get_person_from_handle(self.phoenix_fh)
|
||||||
|
phoenix_mother = self.database.get_person_from_handle(self.phoenix_mh)
|
||||||
|
self.phoenix = self.database.get_family_from_handle(new_handle)
|
||||||
|
self.titanic = self.database.get_family_from_handle(old_handle)
|
||||||
|
self.phoenix.merge(self.titanic)
|
||||||
|
self.database.commit_family(self.phoenix, trans)
|
||||||
|
for childref in self.titanic.get_child_ref_list():
|
||||||
|
child = self.database.get_person_from_handle(
|
||||||
|
childref.get_reference_handle())
|
||||||
|
if new_handle in child.parent_family_list:
|
||||||
|
child.remove_handle_references('Family', [old_handle])
|
||||||
|
else:
|
||||||
|
child.replace_handle_reference('Family', old_handle,
|
||||||
|
new_handle)
|
||||||
|
self.database.commit_person(child, trans)
|
||||||
|
if phoenix_father:
|
||||||
|
phoenix_father.remove_family_handle(old_handle)
|
||||||
|
self.database.commit_person(phoenix_father, trans)
|
||||||
|
if phoenix_mother:
|
||||||
|
phoenix_mother.remove_family_handle(old_handle)
|
||||||
|
self.database.commit_person(phoenix_mother, trans)
|
||||||
|
# replace the family in lds ordinances
|
||||||
|
for (dummy, person_handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle, ['Person']):
|
||||||
|
person = self.database.get_person_from_handle(person_handle)
|
||||||
|
person.replace_handle_reference('Family', old_handle,new_handle)
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
|
self.database.remove_family(old_handle, trans)
|
97
src/gen/merge/mergemediaquery.py
Normal file
97
src/gen/merge/mergemediaquery.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2010 Michiel D. Nauta
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provide merge capabilities for media objects.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.lib import Person, Family, Event, Source, Citation, Place
|
||||||
|
from gen.db import DbTxn
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
from Errors import MergeError
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergeMediaQuery
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergeMediaQuery(object):
|
||||||
|
"""
|
||||||
|
Create datqabase query to merge two media objects.
|
||||||
|
"""
|
||||||
|
def __init__(self, dbstate, phoenix, titanic):
|
||||||
|
self.database = dbstate.db
|
||||||
|
self.phoenix = phoenix
|
||||||
|
self.titanic = titanic
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
"""
|
||||||
|
Merges two media objects into a single object.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
|
||||||
|
self.phoenix.merge(self.titanic)
|
||||||
|
|
||||||
|
with DbTxn(_("Merge Media Objects"), self.database) as trans:
|
||||||
|
self.database.commit_media_object(self.phoenix, trans)
|
||||||
|
for (class_name, handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle):
|
||||||
|
if class_name == Person.__name__:
|
||||||
|
person = self.database.get_person_from_handle(handle)
|
||||||
|
assert(person.has_media_reference(old_handle))
|
||||||
|
person.replace_media_references(old_handle, new_handle)
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
|
elif class_name == Family.__name__:
|
||||||
|
family = self.database.get_family_from_handle(handle)
|
||||||
|
assert(family.has_media_reference(old_handle))
|
||||||
|
family.replace_media_references(old_handle, new_handle)
|
||||||
|
self.database.commit_family(family, trans)
|
||||||
|
elif class_name == Event.__name__:
|
||||||
|
event = self.database.get_event_from_handle(handle)
|
||||||
|
assert(event.has_media_reference(old_handle))
|
||||||
|
event.replace_media_references(old_handle, new_handle)
|
||||||
|
self.database.commit_event(event, trans)
|
||||||
|
elif class_name == Source.__name__:
|
||||||
|
source = self.database.get_source_from_handle(handle)
|
||||||
|
assert(source.has_media_reference(old_handle))
|
||||||
|
source.replace_media_references(old_handle, new_handle)
|
||||||
|
self.database.commit_source(source, trans)
|
||||||
|
elif class_name == Citation.__name__:
|
||||||
|
citation = self.database.get_citation_from_handle(handle)
|
||||||
|
assert(citation.has_media_reference(old_handle))
|
||||||
|
citation.replace_media_references(old_handle, new_handle)
|
||||||
|
self.database.commit_citation(citation, trans)
|
||||||
|
elif class_name == Place.__name__:
|
||||||
|
place = self.database.get_place_from_handle(handle)
|
||||||
|
assert(place.has_media_reference(old_handle))
|
||||||
|
place.replace_media_references(old_handle, new_handle)
|
||||||
|
self.database.commit_place(place, trans)
|
||||||
|
else:
|
||||||
|
raise MergeError("Encounter an object of type % s that has "
|
||||||
|
"a media object reference." % class_name)
|
||||||
|
self.database.remove_object(old_handle, trans)
|
106
src/gen/merge/mergenotequery.py
Normal file
106
src/gen/merge/mergenotequery.py
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2010 Michiel D. Nauta
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provide merge capabilities for notes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.lib import (Person, Family, Event, Place, Source, Citation, Repository,
|
||||||
|
MediaObject)
|
||||||
|
from gen.db import DbTxn
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
from Errors import MergeError
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergeNoteQuery
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergeNoteQuery(object):
|
||||||
|
"""
|
||||||
|
Create database query to merge two notes.
|
||||||
|
"""
|
||||||
|
def __init__(self, dbstate, phoenix, titanic):
|
||||||
|
self.database = dbstate.db
|
||||||
|
self.phoenix = phoenix
|
||||||
|
self.titanic = titanic
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
"""
|
||||||
|
Merges two notes into a single note.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
self.phoenix.merge(self.titanic)
|
||||||
|
with DbTxn(_("Merge Notes"), self.database) as trans:
|
||||||
|
self.database.commit_note(self.phoenix, trans)
|
||||||
|
for (class_name, handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle):
|
||||||
|
if class_name == Person.__name__:
|
||||||
|
person = self.database.get_person_from_handle(handle)
|
||||||
|
assert(person.has_note_reference(old_handle))
|
||||||
|
person.replace_note_references(old_handle, new_handle)
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
|
elif class_name == Family.__name__:
|
||||||
|
family = self.database.get_family_from_handle(handle)
|
||||||
|
assert(family.has_note_reference(old_handle))
|
||||||
|
family.replace_note_references(old_handle, new_handle)
|
||||||
|
self.database.commit_family(family, trans)
|
||||||
|
elif class_name == Event.__name__:
|
||||||
|
event = self.database.get_event_from_handle(handle)
|
||||||
|
assert(event.has_note_reference(old_handle))
|
||||||
|
event.replace_note_references(old_handle, new_handle)
|
||||||
|
self.database.commit_event(event, trans)
|
||||||
|
elif class_name == Source.__name__:
|
||||||
|
source = self.database.get_source_from_handle(handle)
|
||||||
|
assert(source.has_note_reference(old_handle))
|
||||||
|
source.replace_note_references(old_handle, new_handle)
|
||||||
|
self.database.commit_source(source, trans)
|
||||||
|
elif class_name == Citation.__name__:
|
||||||
|
citation = self.database.get_citation_from_handle(handle)
|
||||||
|
assert(citation.has_note_reference(old_handle))
|
||||||
|
citation.replace_note_references(old_handle, new_handle)
|
||||||
|
self.database.commit_citation(citation, trans)
|
||||||
|
elif class_name == Place.__name__:
|
||||||
|
place = self.database.get_place_from_handle(handle)
|
||||||
|
assert(place.has_note_reference(old_handle))
|
||||||
|
place.replace_note_references(old_handle, new_handle)
|
||||||
|
self.database.commit_place(place, trans)
|
||||||
|
elif class_name == MediaObject.__name__:
|
||||||
|
obj = self.database.get_object_from_handle(handle)
|
||||||
|
assert(obj.has_note_reference(old_handle))
|
||||||
|
obj.replace_note_references(old_handle, new_handle)
|
||||||
|
self.database.commit_media_object(obj, trans)
|
||||||
|
elif class_name == Repository.__name__:
|
||||||
|
repo = self.database.get_repository_from_handle(handle)
|
||||||
|
assert(repo.has_note_reference(old_handle))
|
||||||
|
repo.replace_note_references(old_handle, new_handle)
|
||||||
|
self.database.commit_repository(repo, trans)
|
||||||
|
else:
|
||||||
|
raise MergeError("Encounter object of type %s that has "
|
||||||
|
"a note reference." % class_name)
|
||||||
|
self.database.remove_note(old_handle, trans)
|
178
src/gen/merge/mergepersonquery.py
Normal file
178
src/gen/merge/mergepersonquery.py
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2000-2007 Donald N. Allingham
|
||||||
|
# Copyright (C) 2010 Michiel D. Nauta
|
||||||
|
# Copyright (C) 2010 Jakim Friant
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provide merge capabilities for persons.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.db import DbTxn
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
from Errors import MergeError
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergePersonQuery
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergePersonQuery(object):
|
||||||
|
"""
|
||||||
|
Create database query to merge two persons.
|
||||||
|
"""
|
||||||
|
def __init__(self, database, phoenix, titanic):
|
||||||
|
self.database = database
|
||||||
|
self.phoenix = phoenix
|
||||||
|
self.titanic = titanic
|
||||||
|
if self.check_for_spouse(self.phoenix, self.titanic):
|
||||||
|
raise MergeError(_("Spouses cannot be merged. To merge these "
|
||||||
|
"people, you must first break the relationship between them."))
|
||||||
|
if self.check_for_child(self.phoenix, self.titanic):
|
||||||
|
raise MergeError(_("A parent and child cannot be merged. To merge "
|
||||||
|
"these people, you must first break the relationship between "
|
||||||
|
"them."))
|
||||||
|
|
||||||
|
def check_for_spouse(self, person1, person2):
|
||||||
|
"""Return if person1 and person2 are spouses of eachother."""
|
||||||
|
fs1 = set(person1.get_family_handle_list())
|
||||||
|
fs2 = set(person2.get_family_handle_list())
|
||||||
|
return len(fs1.intersection(fs2)) != 0
|
||||||
|
|
||||||
|
def check_for_child(self, person1, person2):
|
||||||
|
"""Return if person1 and person2 have a child-parent relationship."""
|
||||||
|
fs1 = set(person1.get_family_handle_list())
|
||||||
|
fp1 = set(person1.get_parent_family_handle_list())
|
||||||
|
fs2 = set(person2.get_family_handle_list())
|
||||||
|
fp2 = set(person2.get_parent_family_handle_list())
|
||||||
|
return len(fs1.intersection(fp2)) != 0 or len(fs2.intersection(fp1))
|
||||||
|
|
||||||
|
def merge_families(self, main_family_handle, family, trans):
|
||||||
|
"""
|
||||||
|
Merge content of family into the family with handle main_family_handle.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle() if self.phoenix else None
|
||||||
|
old_handle = self.titanic.get_handle() if self.titanic else None
|
||||||
|
family_handle = family.get_handle()
|
||||||
|
main_family = self.database.get_family_from_handle(main_family_handle)
|
||||||
|
main_family.merge(family)
|
||||||
|
for childref in family.get_child_ref_list():
|
||||||
|
child = self.database.get_person_from_handle(
|
||||||
|
childref.get_reference_handle())
|
||||||
|
if main_family_handle in child.parent_family_list:
|
||||||
|
child.remove_handle_references('Family', [family_handle])
|
||||||
|
else:
|
||||||
|
child.replace_handle_reference('Family', family_handle,
|
||||||
|
main_family_handle)
|
||||||
|
self.database.commit_person(child, trans)
|
||||||
|
if self.phoenix:
|
||||||
|
self.phoenix.remove_family_handle(family_handle)
|
||||||
|
self.database.commit_person(self.phoenix, trans)
|
||||||
|
family_father_handle = family.get_father_handle()
|
||||||
|
spouse_handle = family.get_mother_handle() if \
|
||||||
|
new_handle == family_father_handle else family_father_handle
|
||||||
|
spouse = self.database.get_person_from_handle(spouse_handle)
|
||||||
|
if spouse:
|
||||||
|
spouse.remove_family_handle(family_handle)
|
||||||
|
self.database.commit_person(spouse, trans)
|
||||||
|
# replace the family in lds ordinances
|
||||||
|
for (dummy, person_handle) in self.database.find_backlink_handles(
|
||||||
|
family_handle, ['Person']):
|
||||||
|
if person_handle == old_handle:
|
||||||
|
continue
|
||||||
|
person = self.database.get_person_from_handle(person_handle)
|
||||||
|
person.replace_handle_reference('Family', family_handle,
|
||||||
|
main_family_handle)
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
|
self.database.remove_family(family_handle, trans)
|
||||||
|
self.database.commit_family(main_family, trans)
|
||||||
|
|
||||||
|
def execute(self, family_merger=True, trans=None):
|
||||||
|
"""
|
||||||
|
Merges two persons into a single person.
|
||||||
|
"""
|
||||||
|
if trans is None:
|
||||||
|
with DbTxn(_('Merge Person'), self.database) as trans:
|
||||||
|
self.__execute(family_merger, trans)
|
||||||
|
else:
|
||||||
|
self.__execute(family_merger, trans)
|
||||||
|
|
||||||
|
def __execute(self, family_merger, trans):
|
||||||
|
"""
|
||||||
|
Merges two persons into a single person; trans is compulsory.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
|
||||||
|
self.phoenix.merge(self.titanic)
|
||||||
|
self.database.commit_person(self.phoenix, trans)
|
||||||
|
|
||||||
|
for (dummy, person_handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle, ['Person']):
|
||||||
|
person = self.database.get_person_from_handle(person_handle)
|
||||||
|
assert person.has_handle_reference('Person', old_handle)
|
||||||
|
person.replace_handle_reference('Person', old_handle, new_handle)
|
||||||
|
if person_handle != old_handle:
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
|
|
||||||
|
for family_handle in self.phoenix.get_parent_family_handle_list():
|
||||||
|
family = self.database.get_family_from_handle(family_handle)
|
||||||
|
if family.has_handle_reference('Person', old_handle):
|
||||||
|
family.replace_handle_reference('Person', old_handle,new_handle)
|
||||||
|
self.database.commit_family(family, trans)
|
||||||
|
|
||||||
|
family_merge_guard = False
|
||||||
|
parent_list = []
|
||||||
|
parent_list_orig = []
|
||||||
|
family_handle_list = self.phoenix.get_family_handle_list()[:]
|
||||||
|
for family_handle in family_handle_list:
|
||||||
|
family = self.database.get_family_from_handle(family_handle)
|
||||||
|
parents = (family.get_father_handle(), family.get_mother_handle())
|
||||||
|
parent_list_orig.append(parents)
|
||||||
|
if family.has_handle_reference('Person', old_handle):
|
||||||
|
if family_merger and parent_list_orig.count(parents) > 1:
|
||||||
|
raise MergeError(_("A person with multiple relations with "
|
||||||
|
"the same spouse is about to be merged. This is beyond "
|
||||||
|
"the capabilities of the merge routine. The merge is "
|
||||||
|
"aborted."))
|
||||||
|
family.replace_handle_reference('Person', old_handle,new_handle)
|
||||||
|
parents = (family.get_father_handle(),
|
||||||
|
family.get_mother_handle())
|
||||||
|
# prune means merging families in this case.
|
||||||
|
if family_merger and parents in parent_list:
|
||||||
|
# also merge when father_handle or mother_handle == None!
|
||||||
|
if family_merge_guard:
|
||||||
|
raise MergeError(_("Multiple families get merged. "
|
||||||
|
"This is unusual, the merge is aborted."))
|
||||||
|
idx = parent_list.index(parents)
|
||||||
|
main_family_handle = family_handle_list[idx]
|
||||||
|
self.merge_families(main_family_handle, family, trans)
|
||||||
|
family_merge_guard = True
|
||||||
|
continue
|
||||||
|
self.database.commit_family(family, trans)
|
||||||
|
parent_list.append(parents)
|
||||||
|
|
||||||
|
self.database.remove_person(old_handle, trans)
|
86
src/gen/merge/mergeplacequery.py
Normal file
86
src/gen/merge/mergeplacequery.py
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2000-2007 Donald N. Allingham
|
||||||
|
# Copyright (C) 2010 Michiel D. Nauta
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provide merge capabilities for places.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.lib import Person, Family, Event
|
||||||
|
from gen.db import DbTxn
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
from Errors import MergeError
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergePlaceQuery
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergePlaceQuery(object):
|
||||||
|
"""
|
||||||
|
Create database query to merge two places.
|
||||||
|
"""
|
||||||
|
def __init__(self, dbstate, phoenix, titanic):
|
||||||
|
self.database = dbstate.db
|
||||||
|
self.phoenix = phoenix
|
||||||
|
self.titanic = titanic
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
"""
|
||||||
|
Merges to places into a single place.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
|
||||||
|
self.phoenix.merge(self.titanic)
|
||||||
|
|
||||||
|
with DbTxn(_("Merge Places"), self.database) as trans:
|
||||||
|
self.database.commit_place(self.phoenix, trans)
|
||||||
|
for (class_name, handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle):
|
||||||
|
if class_name == Person.__name__:
|
||||||
|
person = self.database.get_person_from_handle(handle)
|
||||||
|
assert(person.has_handle_reference('Place', old_handle))
|
||||||
|
person.replace_handle_reference('Place', old_handle,
|
||||||
|
new_handle)
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
|
elif class_name == Family.__name__:
|
||||||
|
family = self.database.get_family_from_handle(handle)
|
||||||
|
assert(family.has_handle_reference('Place', old_handle))
|
||||||
|
family.replace_handle_reference('Place', old_handle,
|
||||||
|
new_handle)
|
||||||
|
self.database.commit_family(family, trans)
|
||||||
|
elif class_name == Event.__name__:
|
||||||
|
event = self.database.get_event_from_handle(handle)
|
||||||
|
assert(event.has_handle_reference('Place', old_handle))
|
||||||
|
event.replace_handle_reference('Place', old_handle,
|
||||||
|
new_handle)
|
||||||
|
self.database.commit_event(event, trans)
|
||||||
|
else:
|
||||||
|
raise MergeError("Encounter an object of type %s that has "
|
||||||
|
"a place reference." % class_name)
|
||||||
|
self.database.remove_place(old_handle, trans)
|
72
src/gen/merge/mergerepositoryquery.py
Normal file
72
src/gen/merge/mergerepositoryquery.py
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2010 Michiel D. Nauta
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provide merge capabilities for repositories.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.lib import Source
|
||||||
|
from gen.db import DbTxn
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
from Errors import MergeError
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergeRepoQuery
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergeRepositoryQuery(object):
|
||||||
|
"""
|
||||||
|
Create database query to merge two repositories.
|
||||||
|
"""
|
||||||
|
def __init__(self, dbstate, phoenix, titanic):
|
||||||
|
self.database = dbstate.db
|
||||||
|
self.phoenix = phoenix
|
||||||
|
self.titanic = titanic
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
"""
|
||||||
|
Merges two repositories into a single repository.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
|
||||||
|
self.phoenix.merge(self.titanic)
|
||||||
|
|
||||||
|
with DbTxn(_("Merge Repositories"), self.database) as trans:
|
||||||
|
self.database.commit_repository(self.phoenix, trans)
|
||||||
|
for (class_name, handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle):
|
||||||
|
if class_name == Source.__name__:
|
||||||
|
source = self.database.get_source_from_handle(handle)
|
||||||
|
assert source.has_handle_reference('Repository', old_handle)
|
||||||
|
source.replace_repo_references(old_handle, new_handle)
|
||||||
|
self.database.commit_source(source, trans)
|
||||||
|
else:
|
||||||
|
raise MergeError("Encounter an object of type %s that has "
|
||||||
|
"a repository reference." % class_name)
|
||||||
|
self.database.remove_repository(old_handle, trans)
|
75
src/gen/merge/mergesourcequery.py
Normal file
75
src/gen/merge/mergesourcequery.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2000-2005 Donald N. Allingham
|
||||||
|
# Copyright (C) 2010 Michiel D. Nauta
|
||||||
|
# Copyright (C) 2011 Tim G L Lyons
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provide merge capabilities for sources.
|
||||||
|
"""
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gen.lib import (Person, Family, Event, Place, Source, Repository,
|
||||||
|
MediaObject, Citation)
|
||||||
|
from gen.db import DbTxn
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
from Errors import MergeError
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergeSourceQuery
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergeSourceQuery(object):
|
||||||
|
"""
|
||||||
|
Create database query to merge two sources.
|
||||||
|
"""
|
||||||
|
def __init__(self, dbstate, phoenix, titanic):
|
||||||
|
self.database = dbstate.db
|
||||||
|
self.phoenix = phoenix
|
||||||
|
self.titanic = titanic
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
"""
|
||||||
|
Merges to sources into a single source.
|
||||||
|
"""
|
||||||
|
new_handle = self.phoenix.get_handle()
|
||||||
|
old_handle = self.titanic.get_handle()
|
||||||
|
|
||||||
|
self.phoenix.merge(self.titanic)
|
||||||
|
|
||||||
|
with DbTxn(_("Merge Source"), self.database) as trans:
|
||||||
|
self.database.commit_source(self.phoenix, trans)
|
||||||
|
for (class_name, handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle):
|
||||||
|
if class_name == Citation.__name__:
|
||||||
|
citation = self.database.get_citation_from_handle(handle)
|
||||||
|
assert(citation.get_reference_handle() == old_handle)
|
||||||
|
citation.set_reference_handle(new_handle)
|
||||||
|
self.database.commit_citation(citation, trans)
|
||||||
|
else:
|
||||||
|
raise MergeError("Encounter an object of type %s that has "
|
||||||
|
"a source reference." % class_name)
|
||||||
|
self.database.remove_source(old_handle, trans)
|
@ -8,6 +8,7 @@ SUBDIRS = \
|
|||||||
editors \
|
editors \
|
||||||
filters \
|
filters \
|
||||||
glade \
|
glade \
|
||||||
|
merge \
|
||||||
plug \
|
plug \
|
||||||
selectors \
|
selectors \
|
||||||
views \
|
views \
|
||||||
|
@ -26,4 +26,4 @@ Package init for the gui package.
|
|||||||
|
|
||||||
# DO NOT IMPORT METHODS/CLASSES FROM src/gui HERE ! Only __all__
|
# DO NOT IMPORT METHODS/CLASSES FROM src/gui HERE ! Only __all__
|
||||||
|
|
||||||
__all__ = [ "editors", "filters", "selectors", "views", "widgets" ]
|
__all__ = [ "editors", "filters", "merge", "selectors", "views", "widgets" ]
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
# but that is not necessarily portable.
|
# but that is not necessarily portable.
|
||||||
# If not using GNU make, then list all .py files individually
|
# If not using GNU make, then list all .py files individually
|
||||||
|
|
||||||
pkgpythondir = $(datadir)/@PACKAGE@/Merge
|
pkgpythondir = $(datadir)/@PACKAGE@/gui/merge
|
||||||
|
|
||||||
pkgpython_PYTHON = \
|
pkgpython_PYTHON = \
|
||||||
__init__.py \
|
__init__.py \
|
||||||
@ -18,12 +18,12 @@ pkgpython_PYTHON = \
|
|||||||
mergemedia.py \
|
mergemedia.py \
|
||||||
mergenote.py
|
mergenote.py
|
||||||
|
|
||||||
pkgpyexecdir = @pkgpyexecdir@/Merge
|
pkgpyexecdir = @pkgpyexecdir@/gui/merge
|
||||||
|
|
||||||
# Clean up all the byte-compiled files
|
# Clean up all the byte-compiled files
|
||||||
MOSTLYCLEANFILES = *pyc *pyo
|
MOSTLYCLEANFILES = *pyc *pyo
|
||||||
|
|
||||||
GRAMPS_PY_MODPATH = "../"
|
GRAMPS_PY_MODPATH = "../../"
|
||||||
|
|
||||||
pycheck:
|
pycheck:
|
||||||
(export PYTHONPATH=$(GRAMPS_PY_MODPATH); \
|
(export PYTHONPATH=$(GRAMPS_PY_MODPATH); \
|
@ -30,15 +30,13 @@ Provide merge capabilities for citations.
|
|||||||
# Gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gen.lib import (Person, Family, Event, Place, MediaObject, Repository)
|
|
||||||
from gen.db import DbTxn
|
|
||||||
from gen.ggettext import sgettext as _
|
from gen.ggettext import sgettext as _
|
||||||
import const
|
import const
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
import gen.datehandler
|
import gen.datehandler
|
||||||
from Errors import MergeError
|
|
||||||
from Utils import confidence
|
from Utils import confidence
|
||||||
|
from gen.merge import MergeCitationQuery
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -52,10 +50,10 @@ _GLADE_FILE = 'mergecitation.glade'
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Merge Citations
|
# MergeCitation
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class MergeCitations(ManagedWindow.ManagedWindow):
|
class MergeCitation(ManagedWindow.ManagedWindow):
|
||||||
"""
|
"""
|
||||||
Displays a dialog box that allows the citations to be combined into one.
|
Displays a dialog box that allows the citations to be combined into one.
|
||||||
"""
|
"""
|
||||||
@ -171,61 +169,3 @@ class MergeCitations(ManagedWindow.ManagedWindow):
|
|||||||
query.execute()
|
query.execute()
|
||||||
self.uistate.set_busy_cursor(False)
|
self.uistate.set_busy_cursor(False)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
class MergeCitationQuery(object):
|
|
||||||
"""
|
|
||||||
Create database query to merge two citations.
|
|
||||||
"""
|
|
||||||
def __init__(self, dbstate, phoenix, titanic):
|
|
||||||
self.database = dbstate.db
|
|
||||||
self.phoenix = phoenix
|
|
||||||
self.titanic = titanic
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""
|
|
||||||
Merges to citations into a single citation.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
|
|
||||||
self.phoenix.merge(self.titanic)
|
|
||||||
|
|
||||||
with DbTxn(_("Merge Citation"), self.database) as trans:
|
|
||||||
self.database.commit_citation(self.phoenix, trans)
|
|
||||||
for (class_name, handle) in self.database.find_backlink_handles(
|
|
||||||
old_handle):
|
|
||||||
if class_name == Person.__name__:
|
|
||||||
person = self.database.get_person_from_handle(handle)
|
|
||||||
assert(person.has_citation_reference(old_handle))
|
|
||||||
person.replace_citation_references(old_handle, new_handle)
|
|
||||||
self.database.commit_person(person, trans)
|
|
||||||
elif class_name == Family.__name__:
|
|
||||||
family = self.database.get_family_from_handle(handle)
|
|
||||||
assert(family.has_citation_reference(old_handle))
|
|
||||||
family.replace_citation_references(old_handle, new_handle)
|
|
||||||
self.database.commit_family(family, trans)
|
|
||||||
elif class_name == Event.__name__:
|
|
||||||
event = self.database.get_event_from_handle(handle)
|
|
||||||
assert(event.has_citation_reference(old_handle))
|
|
||||||
event.replace_citation_references(old_handle, new_handle)
|
|
||||||
self.database.commit_event(event, trans)
|
|
||||||
elif class_name == Place.__name__:
|
|
||||||
place = self.database.get_place_from_handle(handle)
|
|
||||||
assert(place.has_citation_reference(old_handle))
|
|
||||||
place.replace_citation_references(old_handle, new_handle)
|
|
||||||
self.database.commit_place(place, trans)
|
|
||||||
elif class_name == MediaObject.__name__:
|
|
||||||
obj = self.database.get_object_from_handle(handle)
|
|
||||||
assert(obj.has_citation_reference(old_handle))
|
|
||||||
obj.replace_citation_references(old_handle, new_handle)
|
|
||||||
self.database.commit_media_object(obj, trans)
|
|
||||||
elif class_name == Repository.__name__:
|
|
||||||
repository = self.database.get_repository_from_handle(handle)
|
|
||||||
assert(repository.has_citation_reference(old_handle))
|
|
||||||
repository.replace_citation_references(old_handle,
|
|
||||||
new_handle)
|
|
||||||
self.database.commit_repository(repository, trans)
|
|
||||||
else:
|
|
||||||
raise MergeError("Encounter an object of type %s that has "
|
|
||||||
"a citation reference." % class_name)
|
|
||||||
self.database.remove_citation(old_handle, trans)
|
|
@ -29,15 +29,13 @@ Provide merge capabilities for events.
|
|||||||
# Gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gen.lib import Person, Family
|
|
||||||
from gen.db import DbTxn
|
|
||||||
from gen.ggettext import sgettext as _
|
from gen.ggettext import sgettext as _
|
||||||
import const
|
import const
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
import gen.datehandler
|
import gen.datehandler
|
||||||
import Utils
|
import Utils
|
||||||
from Errors import MergeError
|
from gen.merge import MergeEventQuery
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -51,10 +49,10 @@ _GLADE_FILE = 'mergeevent.glade'
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Merge Events
|
# MergeEvent
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class MergeEvents(ManagedWindow.ManagedWindow):
|
class MergeEvent(ManagedWindow.ManagedWindow):
|
||||||
"""
|
"""
|
||||||
Displays a dialog box that allows the events to be combined into one.
|
Displays a dialog box that allows the events to be combined into one.
|
||||||
"""
|
"""
|
||||||
@ -189,63 +187,3 @@ class MergeEvents(ManagedWindow.ManagedWindow):
|
|||||||
query.execute()
|
query.execute()
|
||||||
self.uistate.set_busy_cursor(False)
|
self.uistate.set_busy_cursor(False)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Merge Event Query
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
class MergeEventQuery(object):
|
|
||||||
"""
|
|
||||||
Create database query to merge two events.
|
|
||||||
"""
|
|
||||||
def __init__(self, dbstate, phoenix, titanic):
|
|
||||||
self.database = dbstate.db
|
|
||||||
self.phoenix = phoenix
|
|
||||||
self.titanic = titanic
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""
|
|
||||||
Merges two events into a single event.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
|
|
||||||
self.phoenix.merge(self.titanic)
|
|
||||||
|
|
||||||
with DbTxn(_("Merge Event Objects"), self.database) as trans:
|
|
||||||
self.database.commit_event(self.phoenix, trans)
|
|
||||||
for (class_name, handle) in self.database.find_backlink_handles(
|
|
||||||
old_handle):
|
|
||||||
if class_name == Person.__name__:
|
|
||||||
person = self.database.get_person_from_handle(handle)
|
|
||||||
assert(person.has_handle_reference("Event", old_handle))
|
|
||||||
bri = person.birth_ref_index
|
|
||||||
dri = person.death_ref_index
|
|
||||||
person.replace_handle_reference("Event", old_handle,
|
|
||||||
new_handle)
|
|
||||||
if person.birth_ref_index != bri and \
|
|
||||||
person.birth_ref_index == -1:
|
|
||||||
for index, ref in enumerate(person.get_event_ref_list()):
|
|
||||||
event = self.database.get_event_from_handle(ref.ref)
|
|
||||||
if event.type.is_birth() and ref.role.is_primary():
|
|
||||||
person.birth_ref_index = index
|
|
||||||
break
|
|
||||||
if person.death_ref_index != dri and \
|
|
||||||
person.death_ref_index == -1:
|
|
||||||
for index, ref in enumerate(person.get_event_ref_list()):
|
|
||||||
event = self.database.get_event_from_handle(ref.ref)
|
|
||||||
if event.type.is_death() and ref.role.is_primary():
|
|
||||||
person.death_ref_index = index
|
|
||||||
break
|
|
||||||
self.database.commit_person(person, trans)
|
|
||||||
elif class_name == Family.__name__:
|
|
||||||
family = self.database.get_family_from_handle(handle)
|
|
||||||
assert(family.has_handle_reference("Event", old_handle))
|
|
||||||
family.replace_handle_reference("Event", old_handle,
|
|
||||||
new_handle)
|
|
||||||
self.database.commit_family(family, trans)
|
|
||||||
else:
|
|
||||||
raise MergeError("Encounter an object of type %s that has "
|
|
||||||
"an event reference." % class_name)
|
|
||||||
self.database.remove_event(old_handle, trans)
|
|
@ -29,15 +29,14 @@ Provide merge capabilities for families.
|
|||||||
# Gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gen.db import DbTxn
|
|
||||||
from gen.ggettext import sgettext as _
|
from gen.ggettext import sgettext as _
|
||||||
from gen.display.name import displayer as name_displayer
|
from gen.display.name import displayer as name_displayer
|
||||||
import const
|
import const
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
from QuestionDialog import ErrorDialog
|
|
||||||
from Errors import MergeError
|
from Errors import MergeError
|
||||||
|
from QuestionDialog import ErrorDialog
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
from Merge.mergeperson import MergePersonQuery
|
from gen.merge import MergePersonQuery, MergeFamilyQuery
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -51,10 +50,10 @@ _GLADE_FILE = 'mergefamily.glade'
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Merge Families
|
# MergeFamily
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class MergeFamilies(ManagedWindow.ManagedWindow):
|
class MergeFamily(ManagedWindow.ManagedWindow):
|
||||||
"""
|
"""
|
||||||
Merges two families into a single family. Displays a dialog box that allows
|
Merges two families into a single family. Displays a dialog box that allows
|
||||||
the families to be combined into one.
|
the families to be combined into one.
|
||||||
@ -225,138 +224,3 @@ class MergeFamilies(ManagedWindow.ManagedWindow):
|
|||||||
ErrorDialog( _("Cannot merge people"), str(err))
|
ErrorDialog( _("Cannot merge people"), str(err))
|
||||||
self.uistate.set_busy_cursor(False)
|
self.uistate.set_busy_cursor(False)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
class MergeFamilyQuery(object):
|
|
||||||
"""
|
|
||||||
Create database query to merge two families.
|
|
||||||
"""
|
|
||||||
def __init__(self, database, phoenix, titanic, phoenix_fh=None,
|
|
||||||
phoenix_mh=None):
|
|
||||||
self.database = database
|
|
||||||
self.phoenix = phoenix
|
|
||||||
self.titanic = titanic
|
|
||||||
if phoenix_fh is None:
|
|
||||||
self.phoenix_fh = self.phoenix.get_father_handle()
|
|
||||||
else:
|
|
||||||
self.phoenix_fh = phoenix_fh
|
|
||||||
if phoenix_mh is None:
|
|
||||||
self.phoenix_mh = self.phoenix.get_mother_handle()
|
|
||||||
else:
|
|
||||||
self.phoenix_mh = phoenix_mh
|
|
||||||
|
|
||||||
if self.phoenix.get_father_handle() == self.phoenix_fh:
|
|
||||||
self.titanic_fh = self.titanic.get_father_handle()
|
|
||||||
self.father_swapped = False
|
|
||||||
else:
|
|
||||||
assert self.phoenix_fh == self.titanic.get_father_handle()
|
|
||||||
self.titanic_fh = self.phoenix.get_father_handle()
|
|
||||||
self.father_swapped = True
|
|
||||||
if self.phoenix.get_mother_handle() == self.phoenix_mh:
|
|
||||||
self.titanic_mh = self.titanic.get_mother_handle()
|
|
||||||
self.mother_swapped = False
|
|
||||||
else:
|
|
||||||
assert self.phoenix_mh == self.titanic.get_mother_handle()
|
|
||||||
self.titanic_mh = self.phoenix.get_mother_handle()
|
|
||||||
self.mother_swapped = True
|
|
||||||
|
|
||||||
def merge_person(self, phoenix_person, titanic_person, parent, trans):
|
|
||||||
"""
|
|
||||||
Merge two persons even if they are None; no families are merged!
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
|
|
||||||
if parent == 'father':
|
|
||||||
swapped = self.father_swapped
|
|
||||||
family_add_person_handle = (
|
|
||||||
(self.phoenix if swapped else self.titanic).set_father_handle)
|
|
||||||
elif parent == 'mother':
|
|
||||||
swapped = self.mother_swapped
|
|
||||||
family_add_person_handle = (
|
|
||||||
(self.phoenix if swapped else self.titanic).set_mother_handle)
|
|
||||||
else:
|
|
||||||
raise ValueError(_("A parent should be a father or mother."))
|
|
||||||
|
|
||||||
if phoenix_person is None:
|
|
||||||
if titanic_person is not None:
|
|
||||||
raise MergeError("""When merging people where one person """
|
|
||||||
"""doesn't exist, that "person" must be the person that """
|
|
||||||
"""will be deleted from the database.""")
|
|
||||||
return
|
|
||||||
elif titanic_person is None:
|
|
||||||
if swapped:
|
|
||||||
if any(childref.get_reference_handle() == phoenix_person.get_handle()
|
|
||||||
for childref in self.phoenix.get_child_ref_list()):
|
|
||||||
|
|
||||||
raise MergeError(_("A parent and child cannot be merged. "
|
|
||||||
"To merge these people, you must first break the "
|
|
||||||
"relationship between them."))
|
|
||||||
|
|
||||||
phoenix_person.add_family_handle(new_handle)
|
|
||||||
family_add_person_handle(phoenix_person.get_handle())
|
|
||||||
self.database.commit_family(self.phoenix, trans)
|
|
||||||
else:
|
|
||||||
if any(childref.get_reference_handle() == phoenix_person.get_handle()
|
|
||||||
for childref in self.titanic.get_child_ref_list()):
|
|
||||||
|
|
||||||
raise MergeError(_("A parent and child cannot be merged. "
|
|
||||||
"To merge these people, you must first break the "
|
|
||||||
"relationship between them."))
|
|
||||||
|
|
||||||
phoenix_person.add_family_handle(old_handle)
|
|
||||||
family_add_person_handle(phoenix_person.get_handle())
|
|
||||||
self.database.commit_family(self.titanic, trans)
|
|
||||||
|
|
||||||
self.database.commit_person(phoenix_person, trans)
|
|
||||||
else:
|
|
||||||
query = MergePersonQuery(self.database, phoenix_person,
|
|
||||||
titanic_person)
|
|
||||||
query.execute(family_merger=False, trans=trans)
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""
|
|
||||||
Merges two families into a single family.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
|
|
||||||
with DbTxn(_('Merge Family'), self.database) as trans:
|
|
||||||
|
|
||||||
phoenix_father = self.database.get_person_from_handle(self.phoenix_fh)
|
|
||||||
titanic_father = self.database.get_person_from_handle(self.titanic_fh)
|
|
||||||
self.merge_person(phoenix_father, titanic_father, 'father', trans)
|
|
||||||
|
|
||||||
phoenix_mother = self.database.get_person_from_handle(self.phoenix_mh)
|
|
||||||
titanic_mother = self.database.get_person_from_handle(self.titanic_mh)
|
|
||||||
self.phoenix = self.database.get_family_from_handle(new_handle)
|
|
||||||
self.titanic = self.database.get_family_from_handle(old_handle)
|
|
||||||
self.merge_person(phoenix_mother, titanic_mother, 'mother', trans)
|
|
||||||
|
|
||||||
phoenix_father = self.database.get_person_from_handle(self.phoenix_fh)
|
|
||||||
phoenix_mother = self.database.get_person_from_handle(self.phoenix_mh)
|
|
||||||
self.phoenix = self.database.get_family_from_handle(new_handle)
|
|
||||||
self.titanic = self.database.get_family_from_handle(old_handle)
|
|
||||||
self.phoenix.merge(self.titanic)
|
|
||||||
self.database.commit_family(self.phoenix, trans)
|
|
||||||
for childref in self.titanic.get_child_ref_list():
|
|
||||||
child = self.database.get_person_from_handle(
|
|
||||||
childref.get_reference_handle())
|
|
||||||
if new_handle in child.parent_family_list:
|
|
||||||
child.remove_handle_references('Family', [old_handle])
|
|
||||||
else:
|
|
||||||
child.replace_handle_reference('Family', old_handle,
|
|
||||||
new_handle)
|
|
||||||
self.database.commit_person(child, trans)
|
|
||||||
if phoenix_father:
|
|
||||||
phoenix_father.remove_family_handle(old_handle)
|
|
||||||
self.database.commit_person(phoenix_father, trans)
|
|
||||||
if phoenix_mother:
|
|
||||||
phoenix_mother.remove_family_handle(old_handle)
|
|
||||||
self.database.commit_person(phoenix_mother, trans)
|
|
||||||
# replace the family in lds ordinances
|
|
||||||
for (dummy, person_handle) in self.database.find_backlink_handles(
|
|
||||||
old_handle, ['Person']):
|
|
||||||
person = self.database.get_person_from_handle(person_handle)
|
|
||||||
person.replace_handle_reference('Family', old_handle,new_handle)
|
|
||||||
self.database.commit_person(person, trans)
|
|
||||||
self.database.remove_family(old_handle, trans)
|
|
@ -29,14 +29,12 @@ Provide merge capabilities for media objects.
|
|||||||
# Gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gen.lib import Person, Family, Event, Source, Citation, Place
|
|
||||||
from gen.db import DbTxn
|
|
||||||
from gen.ggettext import sgettext as _
|
from gen.ggettext import sgettext as _
|
||||||
import const
|
import const
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
import gen.datehandler
|
import gen.datehandler
|
||||||
from Errors import MergeError
|
from gen.merge import MergeMediaQuery
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -50,10 +48,10 @@ _GLADE_FILE = 'mergemedia.glade'
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Merge Media Objects
|
# MergeMedia
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class MergeMediaObjects(ManagedWindow.ManagedWindow):
|
class MergeMedia(ManagedWindow.ManagedWindow):
|
||||||
"""
|
"""
|
||||||
Displays a dialog box that allows the media objects to be combined into one.
|
Displays a dialog box that allows the media objects to be combined into one.
|
||||||
"""
|
"""
|
||||||
@ -168,60 +166,3 @@ class MergeMediaObjects(ManagedWindow.ManagedWindow):
|
|||||||
query = MergeMediaQuery(self.dbstate, phoenix, titanic)
|
query = MergeMediaQuery(self.dbstate, phoenix, titanic)
|
||||||
query.execute()
|
query.execute()
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
class MergeMediaQuery(object):
|
|
||||||
"""
|
|
||||||
Create datqabase query to merge two media objects.
|
|
||||||
"""
|
|
||||||
def __init__(self, dbstate, phoenix, titanic):
|
|
||||||
self.database = dbstate.db
|
|
||||||
self.phoenix = phoenix
|
|
||||||
self.titanic = titanic
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""
|
|
||||||
Merges two media objects into a single object.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
|
|
||||||
self.phoenix.merge(self.titanic)
|
|
||||||
|
|
||||||
with DbTxn(_("Merge Media Objects"), self.database) as trans:
|
|
||||||
self.database.commit_media_object(self.phoenix, trans)
|
|
||||||
for (class_name, handle) in self.database.find_backlink_handles(
|
|
||||||
old_handle):
|
|
||||||
if class_name == Person.__name__:
|
|
||||||
person = self.database.get_person_from_handle(handle)
|
|
||||||
assert(person.has_media_reference(old_handle))
|
|
||||||
person.replace_media_references(old_handle, new_handle)
|
|
||||||
self.database.commit_person(person, trans)
|
|
||||||
elif class_name == Family.__name__:
|
|
||||||
family = self.database.get_family_from_handle(handle)
|
|
||||||
assert(family.has_media_reference(old_handle))
|
|
||||||
family.replace_media_references(old_handle, new_handle)
|
|
||||||
self.database.commit_family(family, trans)
|
|
||||||
elif class_name == Event.__name__:
|
|
||||||
event = self.database.get_event_from_handle(handle)
|
|
||||||
assert(event.has_media_reference(old_handle))
|
|
||||||
event.replace_media_references(old_handle, new_handle)
|
|
||||||
self.database.commit_event(event, trans)
|
|
||||||
elif class_name == Source.__name__:
|
|
||||||
source = self.database.get_source_from_handle(handle)
|
|
||||||
assert(source.has_media_reference(old_handle))
|
|
||||||
source.replace_media_references(old_handle, new_handle)
|
|
||||||
self.database.commit_source(source, trans)
|
|
||||||
elif class_name == Citation.__name__:
|
|
||||||
citation = self.database.get_citation_from_handle(handle)
|
|
||||||
assert(citation.has_media_reference(old_handle))
|
|
||||||
citation.replace_media_references(old_handle, new_handle)
|
|
||||||
self.database.commit_citation(citation, trans)
|
|
||||||
elif class_name == Place.__name__:
|
|
||||||
place = self.database.get_place_from_handle(handle)
|
|
||||||
assert(place.has_media_reference(old_handle))
|
|
||||||
place.replace_media_references(old_handle, new_handle)
|
|
||||||
self.database.commit_place(place, trans)
|
|
||||||
else:
|
|
||||||
raise MergeError("Encounter an object of type % s that has "
|
|
||||||
"a media object reference." % class_name)
|
|
||||||
self.database.remove_object(old_handle, trans)
|
|
@ -29,15 +29,12 @@ Provide merge capabilities for notes.
|
|||||||
# Gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gen.lib import (Person, Family, Event, Place, Source, Citation, Repository,
|
|
||||||
MediaObject)
|
|
||||||
from gen.db import DbTxn
|
|
||||||
from gen.ggettext import sgettext as _
|
from gen.ggettext import sgettext as _
|
||||||
import const
|
import const
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
from gui.widgets.styledtextbuffer import StyledTextBuffer
|
from gui.widgets.styledtextbuffer import StyledTextBuffer
|
||||||
from Errors import MergeError
|
from gen.merge import MergeNoteQuery
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -51,10 +48,10 @@ _GLADE_FILE = 'mergenote.glade'
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Merge Notes
|
# MergeNote
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class MergeNotes(ManagedWindow.ManagedWindow):
|
class MergeNote(ManagedWindow.ManagedWindow):
|
||||||
"""
|
"""
|
||||||
Displays a dialog box that allows two notes to be combined into one.
|
Displays a dialog box that allows two notes to be combined into one.
|
||||||
"""
|
"""
|
||||||
@ -178,73 +175,3 @@ class MergeNotes(ManagedWindow.ManagedWindow):
|
|||||||
query = MergeNoteQuery(self.dbstate, phoenix, titanic)
|
query = MergeNoteQuery(self.dbstate, phoenix, titanic)
|
||||||
query.execute()
|
query.execute()
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Merge Note Query
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
class MergeNoteQuery(object):
|
|
||||||
"""
|
|
||||||
Create database query to merge two notes.
|
|
||||||
"""
|
|
||||||
def __init__(self, dbstate, phoenix, titanic):
|
|
||||||
self.database = dbstate.db
|
|
||||||
self.phoenix = phoenix
|
|
||||||
self.titanic = titanic
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""
|
|
||||||
Merges two notes into a single note.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
self.phoenix.merge(self.titanic)
|
|
||||||
with DbTxn(_("Merge Notes"), self.database) as trans:
|
|
||||||
self.database.commit_note(self.phoenix, trans)
|
|
||||||
for (class_name, handle) in self.database.find_backlink_handles(
|
|
||||||
old_handle):
|
|
||||||
if class_name == Person.__name__:
|
|
||||||
person = self.database.get_person_from_handle(handle)
|
|
||||||
assert(person.has_note_reference(old_handle))
|
|
||||||
person.replace_note_references(old_handle, new_handle)
|
|
||||||
self.database.commit_person(person, trans)
|
|
||||||
elif class_name == Family.__name__:
|
|
||||||
family = self.database.get_family_from_handle(handle)
|
|
||||||
assert(family.has_note_reference(old_handle))
|
|
||||||
family.replace_note_references(old_handle, new_handle)
|
|
||||||
self.database.commit_family(family, trans)
|
|
||||||
elif class_name == Event.__name__:
|
|
||||||
event = self.database.get_event_from_handle(handle)
|
|
||||||
assert(event.has_note_reference(old_handle))
|
|
||||||
event.replace_note_references(old_handle, new_handle)
|
|
||||||
self.database.commit_event(event, trans)
|
|
||||||
elif class_name == Source.__name__:
|
|
||||||
source = self.database.get_source_from_handle(handle)
|
|
||||||
assert(source.has_note_reference(old_handle))
|
|
||||||
source.replace_note_references(old_handle, new_handle)
|
|
||||||
self.database.commit_source(source, trans)
|
|
||||||
elif class_name == Citation.__name__:
|
|
||||||
citation = self.database.get_citation_from_handle(handle)
|
|
||||||
assert(citation.has_note_reference(old_handle))
|
|
||||||
citation.replace_note_references(old_handle, new_handle)
|
|
||||||
self.database.commit_citation(citation, trans)
|
|
||||||
elif class_name == Place.__name__:
|
|
||||||
place = self.database.get_place_from_handle(handle)
|
|
||||||
assert(place.has_note_reference(old_handle))
|
|
||||||
place.replace_note_references(old_handle, new_handle)
|
|
||||||
self.database.commit_place(place, trans)
|
|
||||||
elif class_name == MediaObject.__name__:
|
|
||||||
obj = self.database.get_object_from_handle(handle)
|
|
||||||
assert(obj.has_note_reference(old_handle))
|
|
||||||
obj.replace_note_references(old_handle, new_handle)
|
|
||||||
self.database.commit_media_object(obj, trans)
|
|
||||||
elif class_name == Repository.__name__:
|
|
||||||
repo = self.database.get_repository_from_handle(handle)
|
|
||||||
assert(repo.has_note_reference(old_handle))
|
|
||||||
repo.replace_note_references(old_handle, new_handle)
|
|
||||||
self.database.commit_repository(repo, trans)
|
|
||||||
else:
|
|
||||||
raise MergeError("Encounter object of type %s that has "
|
|
||||||
"a note reference." % class_name)
|
|
||||||
self.database.remove_note(old_handle, trans)
|
|
@ -38,16 +38,16 @@ import pango
|
|||||||
# Gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gen.db import DbTxn
|
|
||||||
from gen.ggettext import sgettext as _
|
from gen.ggettext import sgettext as _
|
||||||
from gen.plug.report import utils as ReportUtils
|
from gen.plug.report import utils as ReportUtils
|
||||||
from gen.display.name import displayer as name_displayer
|
from gen.display.name import displayer as name_displayer
|
||||||
import const
|
import const
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
import gen.datehandler
|
import gen.datehandler
|
||||||
from QuestionDialog import ErrorDialog
|
|
||||||
from Errors import MergeError
|
from Errors import MergeError
|
||||||
|
from QuestionDialog import ErrorDialog
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
|
from gen.merge import MergePersonQuery
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -67,7 +67,12 @@ def name_of(person):
|
|||||||
return ""
|
return ""
|
||||||
return "%s [%s]" % (name_displayer.display(person), person.get_gramps_id())
|
return "%s [%s]" % (name_displayer.display(person), person.get_gramps_id())
|
||||||
|
|
||||||
class MergePeople(ManagedWindow.ManagedWindow):
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# MergePerson
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class MergePerson(ManagedWindow.ManagedWindow):
|
||||||
"""
|
"""
|
||||||
Displays a dialog box that allows the persons to be combined into one.
|
Displays a dialog box that allows the persons to be combined into one.
|
||||||
"""
|
"""
|
||||||
@ -336,140 +341,3 @@ class MergePeople(ManagedWindow.ManagedWindow):
|
|||||||
self.close()
|
self.close()
|
||||||
if self.update:
|
if self.update:
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
class MergePersonQuery(object):
|
|
||||||
"""
|
|
||||||
Create database query to merge two persons.
|
|
||||||
"""
|
|
||||||
def __init__(self, database, phoenix, titanic):
|
|
||||||
self.database = database
|
|
||||||
self.phoenix = phoenix
|
|
||||||
self.titanic = titanic
|
|
||||||
if self.check_for_spouse(self.phoenix, self.titanic):
|
|
||||||
raise MergeError(_("Spouses cannot be merged. To merge these "
|
|
||||||
"people, you must first break the relationship between them."))
|
|
||||||
if self.check_for_child(self.phoenix, self.titanic):
|
|
||||||
raise MergeError(_("A parent and child cannot be merged. To merge "
|
|
||||||
"these people, you must first break the relationship between "
|
|
||||||
"them."))
|
|
||||||
|
|
||||||
def check_for_spouse(self, person1, person2):
|
|
||||||
"""Return if person1 and person2 are spouses of eachother."""
|
|
||||||
fs1 = set(person1.get_family_handle_list())
|
|
||||||
fs2 = set(person2.get_family_handle_list())
|
|
||||||
return len(fs1.intersection(fs2)) != 0
|
|
||||||
|
|
||||||
def check_for_child(self, person1, person2):
|
|
||||||
"""Return if person1 and person2 have a child-parent relationship."""
|
|
||||||
fs1 = set(person1.get_family_handle_list())
|
|
||||||
fp1 = set(person1.get_parent_family_handle_list())
|
|
||||||
fs2 = set(person2.get_family_handle_list())
|
|
||||||
fp2 = set(person2.get_parent_family_handle_list())
|
|
||||||
return len(fs1.intersection(fp2)) != 0 or len(fs2.intersection(fp1))
|
|
||||||
|
|
||||||
def merge_families(self, main_family_handle, family, trans):
|
|
||||||
"""
|
|
||||||
Merge content of family into the family with handle main_family_handle.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle() if self.phoenix else None
|
|
||||||
old_handle = self.titanic.get_handle() if self.titanic else None
|
|
||||||
family_handle = family.get_handle()
|
|
||||||
main_family = self.database.get_family_from_handle(main_family_handle)
|
|
||||||
main_family.merge(family)
|
|
||||||
for childref in family.get_child_ref_list():
|
|
||||||
child = self.database.get_person_from_handle(
|
|
||||||
childref.get_reference_handle())
|
|
||||||
if main_family_handle in child.parent_family_list:
|
|
||||||
child.remove_handle_references('Family', [family_handle])
|
|
||||||
else:
|
|
||||||
child.replace_handle_reference('Family', family_handle,
|
|
||||||
main_family_handle)
|
|
||||||
self.database.commit_person(child, trans)
|
|
||||||
if self.phoenix:
|
|
||||||
self.phoenix.remove_family_handle(family_handle)
|
|
||||||
self.database.commit_person(self.phoenix, trans)
|
|
||||||
family_father_handle = family.get_father_handle()
|
|
||||||
spouse_handle = family.get_mother_handle() if \
|
|
||||||
new_handle == family_father_handle else family_father_handle
|
|
||||||
spouse = self.database.get_person_from_handle(spouse_handle)
|
|
||||||
if spouse:
|
|
||||||
spouse.remove_family_handle(family_handle)
|
|
||||||
self.database.commit_person(spouse, trans)
|
|
||||||
# replace the family in lds ordinances
|
|
||||||
for (dummy, person_handle) in self.database.find_backlink_handles(
|
|
||||||
family_handle, ['Person']):
|
|
||||||
if person_handle == old_handle:
|
|
||||||
continue
|
|
||||||
person = self.database.get_person_from_handle(person_handle)
|
|
||||||
person.replace_handle_reference('Family', family_handle,
|
|
||||||
main_family_handle)
|
|
||||||
self.database.commit_person(person, trans)
|
|
||||||
self.database.remove_family(family_handle, trans)
|
|
||||||
self.database.commit_family(main_family, trans)
|
|
||||||
|
|
||||||
def execute(self, family_merger=True, trans=None):
|
|
||||||
"""
|
|
||||||
Merges two persons into a single person.
|
|
||||||
"""
|
|
||||||
if trans is None:
|
|
||||||
with DbTxn(_('Merge Person'), self.database) as trans:
|
|
||||||
self.__execute(family_merger, trans)
|
|
||||||
else:
|
|
||||||
self.__execute(family_merger, trans)
|
|
||||||
|
|
||||||
def __execute(self, family_merger, trans):
|
|
||||||
"""
|
|
||||||
Merges two persons into a single person; trans is compulsory.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
|
|
||||||
self.phoenix.merge(self.titanic)
|
|
||||||
self.database.commit_person(self.phoenix, trans)
|
|
||||||
|
|
||||||
for (dummy, person_handle) in self.database.find_backlink_handles(
|
|
||||||
old_handle, ['Person']):
|
|
||||||
person = self.database.get_person_from_handle(person_handle)
|
|
||||||
assert person.has_handle_reference('Person', old_handle)
|
|
||||||
person.replace_handle_reference('Person', old_handle, new_handle)
|
|
||||||
if person_handle != old_handle:
|
|
||||||
self.database.commit_person(person, trans)
|
|
||||||
|
|
||||||
for family_handle in self.phoenix.get_parent_family_handle_list():
|
|
||||||
family = self.database.get_family_from_handle(family_handle)
|
|
||||||
if family.has_handle_reference('Person', old_handle):
|
|
||||||
family.replace_handle_reference('Person', old_handle,new_handle)
|
|
||||||
self.database.commit_family(family, trans)
|
|
||||||
|
|
||||||
family_merge_guard = False
|
|
||||||
parent_list = []
|
|
||||||
parent_list_orig = []
|
|
||||||
family_handle_list = self.phoenix.get_family_handle_list()[:]
|
|
||||||
for family_handle in family_handle_list:
|
|
||||||
family = self.database.get_family_from_handle(family_handle)
|
|
||||||
parents = (family.get_father_handle(), family.get_mother_handle())
|
|
||||||
parent_list_orig.append(parents)
|
|
||||||
if family.has_handle_reference('Person', old_handle):
|
|
||||||
if family_merger and parent_list_orig.count(parents) > 1:
|
|
||||||
raise MergeError(_("A person with multiple relations with "
|
|
||||||
"the same spouse is about to be merged. This is beyond "
|
|
||||||
"the capabilities of the merge routine. The merge is "
|
|
||||||
"aborted."))
|
|
||||||
family.replace_handle_reference('Person', old_handle,new_handle)
|
|
||||||
parents = (family.get_father_handle(),
|
|
||||||
family.get_mother_handle())
|
|
||||||
# prune means merging families in this case.
|
|
||||||
if family_merger and parents in parent_list:
|
|
||||||
# also merge when father_handle or mother_handle == None!
|
|
||||||
if family_merge_guard:
|
|
||||||
raise MergeError(_("Multiple families get merged. "
|
|
||||||
"This is unusual, the merge is aborted."))
|
|
||||||
idx = parent_list.index(parents)
|
|
||||||
main_family_handle = family_handle_list[idx]
|
|
||||||
self.merge_families(main_family_handle, family, trans)
|
|
||||||
family_merge_guard = True
|
|
||||||
continue
|
|
||||||
self.database.commit_family(family, trans)
|
|
||||||
parent_list.append(parents)
|
|
||||||
|
|
||||||
self.database.remove_person(old_handle, trans)
|
|
@ -37,13 +37,11 @@ import gtk
|
|||||||
# Gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gen.lib import Person, Family, Event
|
|
||||||
from gen.db import DbTxn
|
|
||||||
from gen.ggettext import sgettext as _
|
from gen.ggettext import sgettext as _
|
||||||
import const
|
import const
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
from Errors import MergeError
|
from gen.merge import MergePlaceQuery
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -57,10 +55,10 @@ _GLADE_FILE = 'mergeplace.glade'
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Merge Places
|
# MergePlace
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class MergePlaces(ManagedWindow.ManagedWindow):
|
class MergePlace(ManagedWindow.ManagedWindow):
|
||||||
"""
|
"""
|
||||||
Displays a dialog box that allows the places to be combined into one.
|
Displays a dialog box that allows the places to be combined into one.
|
||||||
"""
|
"""
|
||||||
@ -195,48 +193,3 @@ class MergePlaces(ManagedWindow.ManagedWindow):
|
|||||||
query.execute()
|
query.execute()
|
||||||
self.uistate.set_busy_cursor(False)
|
self.uistate.set_busy_cursor(False)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
class MergePlaceQuery(object):
|
|
||||||
"""
|
|
||||||
Create database query to merge two places.
|
|
||||||
"""
|
|
||||||
def __init__(self, dbstate, phoenix, titanic):
|
|
||||||
self.database = dbstate.db
|
|
||||||
self.phoenix = phoenix
|
|
||||||
self.titanic = titanic
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""
|
|
||||||
Merges to places into a single place.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
|
|
||||||
self.phoenix.merge(self.titanic)
|
|
||||||
|
|
||||||
with DbTxn(_("Merge Places"), self.database) as trans:
|
|
||||||
self.database.commit_place(self.phoenix, trans)
|
|
||||||
for (class_name, handle) in self.database.find_backlink_handles(
|
|
||||||
old_handle):
|
|
||||||
if class_name == Person.__name__:
|
|
||||||
person = self.database.get_person_from_handle(handle)
|
|
||||||
assert(person.has_handle_reference('Place', old_handle))
|
|
||||||
person.replace_handle_reference('Place', old_handle,
|
|
||||||
new_handle)
|
|
||||||
self.database.commit_person(person, trans)
|
|
||||||
elif class_name == Family.__name__:
|
|
||||||
family = self.database.get_family_from_handle(handle)
|
|
||||||
assert(family.has_handle_reference('Place', old_handle))
|
|
||||||
family.replace_handle_reference('Place', old_handle,
|
|
||||||
new_handle)
|
|
||||||
self.database.commit_family(family, trans)
|
|
||||||
elif class_name == Event.__name__:
|
|
||||||
event = self.database.get_event_from_handle(handle)
|
|
||||||
assert(event.has_handle_reference('Place', old_handle))
|
|
||||||
event.replace_handle_reference('Place', old_handle,
|
|
||||||
new_handle)
|
|
||||||
self.database.commit_event(event, trans)
|
|
||||||
else:
|
|
||||||
raise MergeError("Encounter an object of type %s that has "
|
|
||||||
"a place reference." % class_name)
|
|
||||||
self.database.remove_place(old_handle, trans)
|
|
@ -29,13 +29,11 @@ Provide merge capabilities for repositories.
|
|||||||
# Gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gen.lib import Source
|
|
||||||
from gen.db import DbTxn
|
|
||||||
from gen.ggettext import sgettext as _
|
from gen.ggettext import sgettext as _
|
||||||
import const
|
import const
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
from Errors import MergeError
|
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
|
from gen.merge import MergeRepositoryQuery
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -49,10 +47,10 @@ _GLADE_FILE = 'mergerepository.glade'
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Merge Repositories
|
# MergeRepository
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class MergeRepositories(ManagedWindow.ManagedWindow):
|
class MergeRepository(ManagedWindow.ManagedWindow):
|
||||||
"""
|
"""
|
||||||
Displays a dialog box that allows two repositories to be combined into one.
|
Displays a dialog box that allows two repositories to be combined into one.
|
||||||
"""
|
"""
|
||||||
@ -151,39 +149,7 @@ class MergeRepositories(ManagedWindow.ManagedWindow):
|
|||||||
if self.get_widget("gramps_btn1").get_active() ^ use_handle1:
|
if self.get_widget("gramps_btn1").get_active() ^ use_handle1:
|
||||||
phoenix.set_gramps_id(titanic.get_gramps_id())
|
phoenix.set_gramps_id(titanic.get_gramps_id())
|
||||||
|
|
||||||
query = MergeRepoQuery(self.dbstate, phoenix, titanic)
|
query = MergeRepositoryQuery(self.dbstate, phoenix, titanic)
|
||||||
query.execute()
|
query.execute()
|
||||||
self.uistate.set_busy_cursor(False)
|
self.uistate.set_busy_cursor(False)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
class MergeRepoQuery(object):
|
|
||||||
"""
|
|
||||||
Create database query to merge two repositories.
|
|
||||||
"""
|
|
||||||
def __init__(self, dbstate, phoenix, titanic):
|
|
||||||
self.database = dbstate.db
|
|
||||||
self.phoenix = phoenix
|
|
||||||
self.titanic = titanic
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""
|
|
||||||
Merges two repositories into a single repository.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
|
|
||||||
self.phoenix.merge(self.titanic)
|
|
||||||
|
|
||||||
with DbTxn(_("Merge Repositories"), self.database) as trans:
|
|
||||||
self.database.commit_repository(self.phoenix, trans)
|
|
||||||
for (class_name, handle) in self.database.find_backlink_handles(
|
|
||||||
old_handle):
|
|
||||||
if class_name == Source.__name__:
|
|
||||||
source = self.database.get_source_from_handle(handle)
|
|
||||||
assert source.has_handle_reference('Repository', old_handle)
|
|
||||||
source.replace_repo_references(old_handle, new_handle)
|
|
||||||
self.database.commit_source(source, trans)
|
|
||||||
else:
|
|
||||||
raise MergeError("Encounter an object of type %s that has "
|
|
||||||
"a repository reference." % class_name)
|
|
||||||
self.database.remove_repository(old_handle, trans)
|
|
@ -31,14 +31,11 @@ Provide merge capabilities for sources.
|
|||||||
# Gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gen.lib import (Person, Family, Event, Place, Source, Repository,
|
|
||||||
MediaObject, Citation)
|
|
||||||
from gen.db import DbTxn
|
|
||||||
from gen.ggettext import sgettext as _
|
from gen.ggettext import sgettext as _
|
||||||
import const
|
import const
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
from Errors import MergeError
|
from gen.merge import MergeSourceQuery
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -52,10 +49,10 @@ _GLADE_FILE = 'mergesource.glade'
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Merge Sources
|
# MergeSource
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class MergeSources(ManagedWindow.ManagedWindow):
|
class MergeSource(ManagedWindow.ManagedWindow):
|
||||||
"""
|
"""
|
||||||
Displays a dialog box that allows the sources to be combined into one.
|
Displays a dialog box that allows the sources to be combined into one.
|
||||||
"""
|
"""
|
||||||
@ -183,35 +180,3 @@ class MergeSources(ManagedWindow.ManagedWindow):
|
|||||||
query.execute()
|
query.execute()
|
||||||
self.uistate.set_busy_cursor(False)
|
self.uistate.set_busy_cursor(False)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
class MergeSourceQuery(object):
|
|
||||||
"""
|
|
||||||
Create database query to merge two sources.
|
|
||||||
"""
|
|
||||||
def __init__(self, dbstate, phoenix, titanic):
|
|
||||||
self.database = dbstate.db
|
|
||||||
self.phoenix = phoenix
|
|
||||||
self.titanic = titanic
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""
|
|
||||||
Merges to sources into a single source.
|
|
||||||
"""
|
|
||||||
new_handle = self.phoenix.get_handle()
|
|
||||||
old_handle = self.titanic.get_handle()
|
|
||||||
|
|
||||||
self.phoenix.merge(self.titanic)
|
|
||||||
|
|
||||||
with DbTxn(_("Merge Source"), self.database) as trans:
|
|
||||||
self.database.commit_source(self.phoenix, trans)
|
|
||||||
for (class_name, handle) in self.database.find_backlink_handles(
|
|
||||||
old_handle):
|
|
||||||
if class_name == Citation.__name__:
|
|
||||||
citation = self.database.get_citation_from_handle(handle)
|
|
||||||
assert(citation.get_reference_handle() == old_handle)
|
|
||||||
citation.set_reference_handle(new_handle)
|
|
||||||
self.database.commit_citation(citation, trans)
|
|
||||||
else:
|
|
||||||
raise MergeError("Encounter an object of type %s that has "
|
|
||||||
"a source reference." % class_name)
|
|
||||||
self.database.remove_source(old_handle, trans)
|
|
@ -59,6 +59,7 @@ import config
|
|||||||
from DdTargets import DdTargets
|
from DdTargets import DdTargets
|
||||||
from gui.editors import EditPerson
|
from gui.editors import EditPerson
|
||||||
from gui.filters.sidebar import PersonSidebarFilter
|
from gui.filters.sidebar import PersonSidebarFilter
|
||||||
|
from gui.merge import MergePerson
|
||||||
from gen.plug import CATEGORY_QR_PERSON
|
from gen.plug import CATEGORY_QR_PERSON
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -419,8 +420,7 @@ class BasePersonView(ListView):
|
|||||||
"A second person can be selected by holding down the "
|
"A second person can be selected by holding down the "
|
||||||
"control key while clicking on the desired person."))
|
"control key while clicking on the desired person."))
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergePerson(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergePeople(self.dbstate, self.uistate, mlist[0], mlist[1])
|
|
||||||
|
|
||||||
def tag_updated(self, handle_list):
|
def tag_updated(self, handle_list):
|
||||||
"""
|
"""
|
||||||
|
@ -56,6 +56,7 @@ from gui.pluginmanager import GuiPluginManager
|
|||||||
from DdTargets import DdTargets
|
from DdTargets import DdTargets
|
||||||
from gui.editors import EditPlace, DeletePlaceQuery
|
from gui.editors import EditPlace, DeletePlaceQuery
|
||||||
from gui.filters.sidebar import PlaceSidebarFilter
|
from gui.filters.sidebar import PlaceSidebarFilter
|
||||||
|
from gui.merge import MergePlace
|
||||||
from gen.plug import CATEGORY_QR_PLACE
|
from gen.plug import CATEGORY_QR_PLACE
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -412,8 +413,7 @@ class PlaceBaseView(ListView):
|
|||||||
"control key while clicking on the desired place.")
|
"control key while clicking on the desired place.")
|
||||||
ErrorDialog(msg, msg2)
|
ErrorDialog(msg, msg2)
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergePlace(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergePlaces(self.dbstate, self.uistate, mlist[0], mlist[1])
|
|
||||||
|
|
||||||
def get_handle_from_gramps_id(self, gid):
|
def get_handle_from_gramps_id(self, gid):
|
||||||
obj = self.dbstate.db.get_place_from_gramps_id(gid)
|
obj = self.dbstate.db.get_place_from_gramps_id(gid)
|
||||||
|
@ -45,7 +45,7 @@ from gen.display.name import displayer as name_displayer
|
|||||||
from QuestionDialog import OkDialog
|
from QuestionDialog import OkDialog
|
||||||
import ListModel
|
import ListModel
|
||||||
import Errors
|
import Errors
|
||||||
from Merge import MergePeople
|
from gui.merge import MergePerson
|
||||||
import GrampsDisplay
|
import GrampsDisplay
|
||||||
import ManagedWindow
|
import ManagedWindow
|
||||||
from QuestionDialog import RunDatabaseRepair
|
from QuestionDialog import RunDatabaseRepair
|
||||||
@ -600,7 +600,7 @@ class ShowMatches(ManagedWindow.ManagedWindow):
|
|||||||
return
|
return
|
||||||
|
|
||||||
(self.p1,self.p2) = self.list.get_object(iter)
|
(self.p1,self.p2) = self.list.get_object(iter)
|
||||||
MergePeople(self.dbstate, self.uistate, self.p1, self.p2,
|
MergePerson(self.dbstate, self.uistate, self.p1, self.p2,
|
||||||
self.on_update, True)
|
self.on_update, True)
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
|
@ -56,6 +56,7 @@ from DdTargets import DdTargets
|
|||||||
from QuestionDialog import ErrorDialog
|
from QuestionDialog import ErrorDialog
|
||||||
from gui.editors import EditCitation, DeleteCitationQuery
|
from gui.editors import EditCitation, DeleteCitationQuery
|
||||||
from gui.filters.sidebar import CitationSidebarFilter
|
from gui.filters.sidebar import CitationSidebarFilter
|
||||||
|
from gui.merge import MergeCitation
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -336,9 +337,7 @@ class CitationListView(ListView):
|
|||||||
"sources first.")
|
"sources first.")
|
||||||
ErrorDialog(msg, msg2)
|
ErrorDialog(msg, msg2)
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergeCitation(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergeCitations(self.dbstate, self.uistate,
|
|
||||||
mlist[0], mlist[1])
|
|
||||||
|
|
||||||
def get_handle_from_gramps_id(self, gid):
|
def get_handle_from_gramps_id(self, gid):
|
||||||
obj = self.dbstate.db.get_citation_from_gramps_id(gid)
|
obj = self.dbstate.db.get_citation_from_gramps_id(gid)
|
||||||
|
@ -58,6 +58,7 @@ from QuestionDialog import ErrorDialog
|
|||||||
from gui.editors import EditCitation, DeleteCitationQuery, EditSource, \
|
from gui.editors import EditCitation, DeleteCitationQuery, EditSource, \
|
||||||
DeleteSrcQuery
|
DeleteSrcQuery
|
||||||
from gui.filters.sidebar import SourceSidebarFilter
|
from gui.filters.sidebar import SourceSidebarFilter
|
||||||
|
from gui.merge import MergeCitation, MergeSource
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -551,13 +552,10 @@ class CitationTreeView(ListView):
|
|||||||
"sources first.")
|
"sources first.")
|
||||||
ErrorDialog(msg, msg2)
|
ErrorDialog(msg, msg2)
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergeCitation(self.dbstate, self.uistate, mlist[0],
|
||||||
Merge.MergeCitations(self.dbstate, self.uistate,
|
mlist[1])
|
||||||
mlist[0], mlist[1])
|
|
||||||
elif source1 and source2:
|
elif source1 and source2:
|
||||||
import Merge
|
MergeSource(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergeSources(self.dbstate, self.uistate,
|
|
||||||
mlist[0], mlist[1])
|
|
||||||
else:
|
else:
|
||||||
msg = _("Cannot perform merge.")
|
msg = _("Cannot perform merge.")
|
||||||
msg2 = _("Both objects must be of the same type, either "
|
msg2 = _("Both objects must be of the same type, either "
|
||||||
|
@ -57,6 +57,7 @@ from DdTargets import DdTargets
|
|||||||
from QuestionDialog import ErrorDialog
|
from QuestionDialog import ErrorDialog
|
||||||
from gui.editors import EditEvent, DeleteEventQuery
|
from gui.editors import EditEvent, DeleteEventQuery
|
||||||
from gui.filters.sidebar import EventSidebarFilter
|
from gui.filters.sidebar import EventSidebarFilter
|
||||||
|
from gui.merge import MergeEvent
|
||||||
from gen.plug import CATEGORY_QR_EVENT
|
from gen.plug import CATEGORY_QR_EVENT
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -276,8 +277,7 @@ class EventView(ListView):
|
|||||||
"control key while clicking on the desired event.")
|
"control key while clicking on the desired event.")
|
||||||
ErrorDialog(msg, msg2)
|
ErrorDialog(msg, msg2)
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergeEvent(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergeEvents(self.dbstate, self.uistate, mlist[0], mlist[1])
|
|
||||||
|
|
||||||
def dummy_report(self, obj):
|
def dummy_report(self, obj):
|
||||||
""" For the xml UI definition of popup to work, the submenu
|
""" For the xml UI definition of popup to work, the submenu
|
||||||
|
@ -54,6 +54,7 @@ import Errors
|
|||||||
import config
|
import config
|
||||||
from QuestionDialog import ErrorDialog
|
from QuestionDialog import ErrorDialog
|
||||||
from gui.filters.sidebar import FamilySidebarFilter
|
from gui.filters.sidebar import FamilySidebarFilter
|
||||||
|
from gui.merge import MergeFamily
|
||||||
from gen.plug import CATEGORY_QR_FAMILY
|
from gen.plug import CATEGORY_QR_FAMILY
|
||||||
from DdTargets import DdTargets
|
from DdTargets import DdTargets
|
||||||
|
|
||||||
@ -285,8 +286,7 @@ class FamilyView(ListView):
|
|||||||
"control key while clicking on the desired family.")
|
"control key while clicking on the desired family.")
|
||||||
ErrorDialog(msg, msg2)
|
ErrorDialog(msg, msg2)
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergeFamily(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergeFamilies(self.dbstate, self.uistate, mlist[0], mlist[1])
|
|
||||||
|
|
||||||
def _make_father_active(self, obj):
|
def _make_father_active(self, obj):
|
||||||
"""
|
"""
|
||||||
|
@ -64,6 +64,7 @@ from gen.db import DbTxn
|
|||||||
from gui.editors import EditMedia, DeleteMediaQuery
|
from gui.editors import EditMedia, DeleteMediaQuery
|
||||||
import Errors
|
import Errors
|
||||||
from gui.filters.sidebar import MediaSidebarFilter
|
from gui.filters.sidebar import MediaSidebarFilter
|
||||||
|
from gui.merge import MergeMedia
|
||||||
from DdTargets import DdTargets
|
from DdTargets import DdTargets
|
||||||
from QuestionDialog import ErrorDialog
|
from QuestionDialog import ErrorDialog
|
||||||
from gen.plug import CATEGORY_QR_MEDIA
|
from gen.plug import CATEGORY_QR_MEDIA
|
||||||
@ -386,9 +387,7 @@ class MediaView(ListView):
|
|||||||
"control key while clicking on the desired object.")
|
"control key while clicking on the desired object.")
|
||||||
ErrorDialog(msg, msg2)
|
ErrorDialog(msg, msg2)
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergeMedia(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergeMediaObjects(self.dbstate, self.uistate, mlist[0],
|
|
||||||
mlist[1])
|
|
||||||
|
|
||||||
def get_handle_from_gramps_id(self, gid):
|
def get_handle_from_gramps_id(self, gid):
|
||||||
"""
|
"""
|
||||||
|
@ -56,6 +56,7 @@ from DdTargets import DdTargets
|
|||||||
from QuestionDialog import ErrorDialog
|
from QuestionDialog import ErrorDialog
|
||||||
from gui.filters.sidebar import NoteSidebarFilter
|
from gui.filters.sidebar import NoteSidebarFilter
|
||||||
from gui.editors import EditNote, DeleteNoteQuery
|
from gui.editors import EditNote, DeleteNoteQuery
|
||||||
|
from gui.merge import MergeNote
|
||||||
from gen.plug import CATEGORY_QR_NOTE
|
from gen.plug import CATEGORY_QR_NOTE
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -272,8 +273,7 @@ class NoteView(ListView):
|
|||||||
"control key while clicking on the desired note.")
|
"control key while clicking on the desired note.")
|
||||||
ErrorDialog(msg, msg2)
|
ErrorDialog(msg, msg2)
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergeNote(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergeNotes(self.dbstate, self.uistate, mlist[0], mlist[1])
|
|
||||||
|
|
||||||
def tag_updated(self, handle_list):
|
def tag_updated(self, handle_list):
|
||||||
"""
|
"""
|
||||||
|
@ -46,6 +46,7 @@ from gui.editors import EditRepository, DeleteRepositoryQuery
|
|||||||
from DdTargets import DdTargets
|
from DdTargets import DdTargets
|
||||||
from QuestionDialog import ErrorDialog
|
from QuestionDialog import ErrorDialog
|
||||||
from gui.filters.sidebar import RepoSidebarFilter
|
from gui.filters.sidebar import RepoSidebarFilter
|
||||||
|
from gui.merge import MergeRepository
|
||||||
from gen.plug import CATEGORY_QR_REPOSITORY
|
from gen.plug import CATEGORY_QR_REPOSITORY
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -252,9 +253,7 @@ class RepositoryView(ListView):
|
|||||||
"repository.")
|
"repository.")
|
||||||
ErrorDialog(msg, msg2)
|
ErrorDialog(msg, msg2)
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergeRepository(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergeRepositories(self.dbstate, self.uistate, mlist[0],
|
|
||||||
mlist[1])
|
|
||||||
|
|
||||||
def get_handle_from_gramps_id(self, gid):
|
def get_handle_from_gramps_id(self, gid):
|
||||||
obj = self.dbstate.db.get_repository_from_gramps_id(gid)
|
obj = self.dbstate.db.get_repository_from_gramps_id(gid)
|
||||||
|
@ -50,6 +50,7 @@ from DdTargets import DdTargets
|
|||||||
from QuestionDialog import ErrorDialog
|
from QuestionDialog import ErrorDialog
|
||||||
from gui.editors import EditSource, DeleteSrcQuery
|
from gui.editors import EditSource, DeleteSrcQuery
|
||||||
from gui.filters.sidebar import SourceSidebarFilter
|
from gui.filters.sidebar import SourceSidebarFilter
|
||||||
|
from gui.merge import MergeSource
|
||||||
from gen.plug import CATEGORY_QR_SOURCE
|
from gen.plug import CATEGORY_QR_SOURCE
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -243,8 +244,7 @@ class SourceView(ListView):
|
|||||||
"control key while clicking on the desired source.")
|
"control key while clicking on the desired source.")
|
||||||
ErrorDialog(msg, msg2)
|
ErrorDialog(msg, msg2)
|
||||||
else:
|
else:
|
||||||
import Merge
|
MergeSource(self.dbstate, self.uistate, mlist[0], mlist[1])
|
||||||
Merge.MergeSources(self.dbstate, self.uistate, mlist[0], mlist[1])
|
|
||||||
|
|
||||||
def get_handle_from_gramps_id(self, gid):
|
def get_handle_from_gramps_id(self, gid):
|
||||||
obj = self.dbstate.db.get_source_from_gramps_id(gid)
|
obj = self.dbstate.db.get_source_from_gramps_id(gid)
|
||||||
|
Loading…
Reference in New Issue
Block a user