2007-10-06 Don Allingham <don@gramps-project.org>

* various: creation of gen.db package



svn: r9091
This commit is contained in:
Don Allingham
2007-10-07 03:19:35 +00:00
parent e7f02d1855
commit 32d7968365
35 changed files with 1304 additions and 1273 deletions

View File

@@ -8,7 +8,7 @@
# 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,
# 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.
@@ -26,7 +26,6 @@
#
#-------------------------------------------------------------------------
from gettext import gettext as _
import sets
#-------------------------------------------------------------------------
#
@@ -57,7 +56,7 @@ class PersonCompare(ManagedWindow.ManagedWindow):
def __init__(self, dbstate, uistate, person1, person2, update=None) :
ManagedWindow.ManagedWindow.__init__(self,uistate,[],self.__class__)
ManagedWindow.ManagedWindow.__init__(self, uistate, [], self.__class__)
self.glade = gtk.glade.XML(const.MERGE_GLADE, "merge")
window = self.glade.get_widget('merge')
@@ -69,36 +68,36 @@ class PersonCompare(ManagedWindow.ManagedWindow):
self.p2 = person2
self.update = update
self.set_window(window,self.glade.get_widget('title'),
self.set_window(window, self.glade.get_widget('title'),
_("Compare People"))
self.display(self.text1.get_buffer(), person1)
self.display(self.text2.get_buffer(), person2)
self.glade.get_widget('cancel').connect('clicked',self.close)
self.glade.get_widget('close').connect('clicked',self.merge)
self.glade.get_widget('help').connect('clicked',self.help)
self.glade.get_widget('cancel').connect('clicked', self.close)
self.glade.get_widget('close').connect('clicked', self.merge)
self.glade.get_widget('help').connect('clicked', self.help)
def help(self,obj):
def help(self, obj):
"""Display the relevant portion of GRAMPS manual"""
GrampsDisplay.help('adv-merge-people')
def merge(self,obj):
if check_for_spouse(self.p1,self.p2):
def merge(self, obj):
if check_for_spouse(self.p1, self.p2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("Cannot merge people"),
_("Spouses cannot be merged. To merge these people, "
"you must first break the relationship between them."))
elif check_for_child(self.p1,self.p2):
elif check_for_child(self.p1, self.p2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("Cannot merge people"),
_("A parent and child cannot be merged. To merge these "
"people, you must first break the relationship between "
"them."))
else:
if self.glade.get_widget('select1').get_active():
merge = MergePeople(self.db,self.p1,self.p2)
merge = MergePeople(self.db, self.p1, self.p2)
else:
merge = MergePeople(self.db,self.p2,self.p1)
merge = MergePeople(self.db, self.p2, self.p1)
self.close()
merge.merge()
if self.update:
@@ -106,90 +105,90 @@ class PersonCompare(ManagedWindow.ManagedWindow):
def add(self, tobj, tag, text):
text += "\n"
tobj.insert_with_tags(tobj.get_end_iter(),text,tag)
tobj.insert_with_tags(tobj.get_end_iter(), text, tag)
def display(self, tobj, person):
normal = tobj.create_tag()
normal.set_property('indent',10)
normal.set_property('pixels-above-lines',1)
normal.set_property('pixels-below-lines',1)
normal.set_property('indent', 10)
normal.set_property('pixels-above-lines', 1)
normal.set_property('pixels-below-lines', 1)
indent = tobj.create_tag()
indent.set_property('indent',30)
indent.set_property('pixels-above-lines',1)
indent.set_property('pixels-below-lines',1)
indent.set_property('indent', 30)
indent.set_property('pixels-above-lines', 1)
indent.set_property('pixels-below-lines', 1)
title = tobj.create_tag()
title.set_property('weight',pango.WEIGHT_BOLD)
title.set_property('scale',pango.SCALE_LARGE)
self.add(tobj,title,name_displayer.display(person))
self.add(tobj,normal,"%s:\t%s" % (_('ID'),person.get_gramps_id()))
self.add(tobj,normal,"%s:\t%s" % (_('Gender'),sex[person.get_gender()]))
title.set_property('weight', pango.WEIGHT_BOLD)
title.set_property('scale', pango.SCALE_LARGE)
self.add(tobj, title, name_displayer.display(person))
self.add(tobj, normal, "%s:\t%s" % (_('ID'), person.get_gramps_id()))
self.add(tobj, normal, "%s:\t%s" % (_('Gender'), sex[person.get_gender()]))
bref = person.get_birth_ref()
if bref:
self.add(tobj,normal,"%s:\t%s" % (_('Birth'),self.get_event_info(bref.ref)))
self.add(tobj, normal, "%s:\t%s" % (_('Birth'), self.get_event_info(bref.ref)))
dref = person.get_death_ref()
if dref:
self.add(tobj,normal,"%s:\t%s" % (_('Death'),self.get_event_info(dref.ref)))
self.add(tobj, normal, "%s:\t%s" % (_('Death'), self.get_event_info(dref.ref)))
nlist = person.get_alternate_names()
if len(nlist) > 0:
self.add(tobj,title,_("Alternate Names"))
self.add(tobj, title, _("Alternate Names"))
for name in nlist:
self.add(tobj,normal,name_displayer.display_name(name))
self.add(tobj, normal, name_displayer.display_name(name))
elist = person.get_event_ref_list()
if len(elist) > 0:
self.add(tobj,title,_("Events"))
self.add(tobj, title, _("Events"))
for event_ref in person.get_event_ref_list():
event_handle = event_ref.ref
name = str(
self.db.get_event_from_handle(event_handle).get_type())
self.add(tobj,normal,"%s:\t%s" % (name,self.get_event_info(event_handle)))
self.add(tobj, normal, "%s:\t%s" % (name, self.get_event_info(event_handle)))
plist = person.get_parent_family_handle_list()
if len(plist) > 0:
self.add(tobj,title,_("Parents"))
self.add(tobj, title, _("Parents"))
for fid in person.get_parent_family_handle_list():
(fn,mn,gid) = self.get_parent_info(fid)
self.add(tobj,normal,"%s:\t%s" % (_('Family ID'),gid))
(fn, mn, gid) = self.get_parent_info(fid)
self.add(tobj, normal, "%s:\t%s" % (_('Family ID'), gid))
if fn:
self.add(tobj,indent,"%s:\t%s" % (_('Father'),fn))
self.add(tobj, indent, "%s:\t%s" % (_('Father'), fn))
if mn:
self.add(tobj,indent,"%s:\t%s" % (_('Mother'),mn))
self.add(tobj, indent, "%s:\t%s" % (_('Mother'), mn))
else:
self.add(tobj,normal,_("No parents found"))
self.add(tobj, normal, _("No parents found"))
self.add(tobj,title,_("Spouses"))
self.add(tobj, title, _("Spouses"))
slist = person.get_family_handle_list()
if len(slist) > 0:
for fid in slist:
(fn,mn,pid) = self.get_parent_info(fid)
(fn, mn, pid) = self.get_parent_info(fid)
family = self.db.get_family_from_handle(fid)
self.add(tobj,normal,"%s:\t%s" % (_('Family ID'),pid))
spouse_id = ReportUtils.find_spouse(person,family)
self.add(tobj, normal, "%s:\t%s" % (_('Family ID'), pid))
spouse_id = ReportUtils.find_spouse(person, family)
if spouse_id:
spouse = self.db.get_person_from_handle(spouse_id)
self.add(tobj,indent,"%s:\t%s" % (_('Spouse'),name_of(spouse)))
self.add(tobj, indent, "%s:\t%s" % (_('Spouse'), name_of(spouse)))
relstr = str(family.get_relationship())
self.add(tobj,indent,"%s:\t%s" % (_('Type'),relstr))
event = ReportUtils.find_marriage(self.db,family)
self.add(tobj, indent, "%s:\t%s" % (_('Type'), relstr))
event = ReportUtils.find_marriage(self.db, family)
if event:
self.add(tobj,indent,"%s:\t%s" % (
self.add(tobj, indent, "%s:\t%s" % (
_('Marriage'), self.get_event_info(event.get_handle())))
for child_ref in family.get_child_ref_list():
child = self.db.get_person_from_handle(child_ref.ref)
self.add(tobj,indent,"%s:\t%s" % (_('Child'),name_of(child)))
self.add(tobj, indent, "%s:\t%s" % (_('Child'), name_of(child)))
else:
self.add(tobj,normal,_("No spouses or children found"))
self.add(tobj, normal, _("No spouses or children found"))
alist = person.get_address_list()
if len(alist) > 0:
self.add(tobj,title,_("Addresses"))
self.add(tobj, title, _("Addresses"))
for addr in alist:
location = ", ".join([addr.get_street(),addr.get_city(),
addr.get_state(),addr.get_country()])
self.add(tobj,normal,location.strip())
location = ", ".join([addr.get_street(), addr.get_city(),
addr.get_state(), addr.get_country()])
self.add(tobj, normal, location.strip())
def get_parent_info(self,fid):
def get_parent_info(self, fid):
family = self.db.get_family_from_handle(fid)
father_id = family.get_father_handle()
mother_id = family.get_mother_handle()
@@ -203,9 +202,9 @@ class PersonCompare(ManagedWindow.ManagedWindow):
mname = name_of(mother)
else:
mname = u""
return (fname,mname,family.get_gramps_id())
return (fname, mname, family.get_gramps_id())
def get_event_info(self,handle):
def get_event_info(self, handle):
date = ""
place = ""
if handle:
@@ -214,7 +213,7 @@ class PersonCompare(ManagedWindow.ManagedWindow):
place = self.place_name(event)
if date:
if place:
return "%s, %s" % (date,place)
return "%s, %s" % (date, place)
else:
return date
else:
@@ -225,7 +224,7 @@ class PersonCompare(ManagedWindow.ManagedWindow):
else:
return ""
def place_name(self,event):
def place_name(self, event):
place_id = event.get_place_handle()
if place_id:
place = self.db.get_place_from_handle(place_id)
@@ -236,18 +235,18 @@ class PersonCompare(ManagedWindow.ManagedWindow):
def check_for_spouse(p1, p2):
f1 = sets.Set(p1.get_family_handle_list())
f2 = sets.Set(p2.get_family_handle_list())
f1 = set(p1.get_family_handle_list())
f2 = set(p2.get_family_handle_list())
return len(f1.intersection(f2)) != 0
def check_for_child(p1, p2):
fs1 = sets.Set(p1.get_family_handle_list())
fp1 = sets.Set(p1.get_parent_family_handle_list())
fs1 = set(p1.get_family_handle_list())
fp1 = set(p1.get_parent_family_handle_list())
fs2 = sets.Set(p2.get_family_handle_list())
fp2 = sets.Set(p2.get_parent_family_handle_list())
fs2 = set(p2.get_family_handle_list())
fp2 = set(p2.get_parent_family_handle_list())
return len(fs1.intersection(fp2)) != 0 or len(fs2.intersection(fp1))
@@ -262,20 +261,20 @@ class MergePeopleUI(ManagedWindow.ManagedWindow):
if check_for_spouse(person1, person2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("Cannot merge people"),
_("Spouses cannot be merged. To merge these people, "
"you must first break the relationship between them."))
return
if check_for_child(person1, person2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("Cannot merge people"),
_("A parent and child cannot be merged. To merge these "
"people, you must first break the relationship between "
"them."))
return
ManagedWindow.ManagedWindow.__init__(self,uistate,[],self.__class__)
ManagedWindow.ManagedWindow.__init__(self, uistate, [], self.__class__)
glade = gtk.glade.XML(const.MERGE_GLADE, 'merge_people')
window = glade.get_widget('merge_people')
@@ -290,7 +289,7 @@ class MergePeopleUI(ManagedWindow.ManagedWindow):
p1.set_label(n1)
p2.set_label(n2)
glade.get_widget('help').connect('clicked',self.help)
glade.get_widget('help').connect('clicked', self.help)
ret = gtk.RESPONSE_HELP
while ret == gtk.RESPONSE_HELP:
@@ -298,31 +297,31 @@ class MergePeopleUI(ManagedWindow.ManagedWindow):
if ret == gtk.RESPONSE_OK:
if check_for_spouse(person1,person2):
if check_for_spouse(person1, person2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("Cannot merge people"),
_("Spouses cannot be merged. To merge these people, "
"you must first break the relationship between them."))
elif check_for_child(person1,person2):
elif check_for_child(person1, person2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("Cannot merge people"),
_("A parent and child cannot be merged. To merge these "
"people, you must first break the relationship between "
"them."))
else:
if p1.get_active():
merge = MergePeople(dbstate.db,person1,person2)
merge = MergePeople(dbstate.db, person1, person2)
else:
merge = MergePeople(dbstate.db,person2,person1)
merge = MergePeople(dbstate.db, person2, person1)
merge.merge()
if update:
update()
self.close()
def build_menu_names(self,obj):
return (_('Merge People'),None)
def build_menu_names(self, obj):
return (_('Merge People'), None)
def help(self,obj):
def help(self, obj):
"""Display the relevant portion of GRAMPS manual"""
GrampsDisplay.help('adv-merge-people')
@@ -330,7 +329,7 @@ class MergePeopleUI(ManagedWindow.ManagedWindow):
def name_of(p):
if not p:
return ""
return "%s [%s]" % (name_displayer.display(p),p.get_gramps_id())
return "%s [%s]" % (name_displayer.display(p), p.get_gramps_id())
#-------------------------------------------------------------------------
#
@@ -339,15 +338,15 @@ def name_of(p):
#-------------------------------------------------------------------------
class MergePeople:
def __init__(self,db,person1,person2):
def __init__(self, db, person1, person2):
self.db = db
self.p1 = person1
self.p2 = person2
def copy_note(self,one,two):
def copy_note(self, one, two):
one.set_note_list(one.get_note_list() + two.get_note_list())
def copy_sources(self,one,two):
def copy_sources(self, one, two):
slist = one.get_source_references()[:]
for xsrc in two.get_source_references():
for src in slist:
@@ -356,13 +355,13 @@ class MergePeople:
else:
one.add_source_reference(xsrc)
def debug_person(self,person, msg=""):
def debug_person(self, person, msg=""):
if __debug__:
print "## %s person handle %s" % (msg,person.get_handle())
print "## %s person handle %s" % (msg, person.get_handle())
for h in person.get_family_handle_list():
fam = self.db.get_family_from_handle(h)
print " - family %s has father: %s, mother: %s" % \
(h,fam.get_father_handle(),fam.get_mother_handle())
(h, fam.get_father_handle(), fam.get_mother_handle())
for h in person.get_parent_family_handle_list():
print " - parent family %s" % h
@@ -384,18 +383,18 @@ class MergePeople:
new = RelLib.Person()
trans = self.db.transaction_begin()
self.merge_person_information(new,trans)
self.merge_person_information(new, trans)
self.debug_person(new, "NEW")
self.merge_family_information(new,trans)
self.merge_family_information(new, trans)
self.debug_person(new, "NEW")
self.db.commit_person(new,trans)
self.db.commit_person(new, trans)
self.debug_person(new, "NEW")
self.db.remove_person(self.old_handle,trans)
self.db.transaction_commit(trans,"Merge Person")
self.db.remove_person(self.old_handle, trans)
self.db.transaction_commit(trans, "Merge Person")
def merge_person_information(self,new,trans):
def merge_person_information(self, new, trans):
"""
Merging the person's individual information is pretty simple. The
person 'new' is a new, empty person. The data is loaded in this
@@ -454,7 +453,7 @@ class MergePeople:
# note
new.set_note_list(self.p1.get_note_list() + self.p2.get_note_list())
def merge_gramps_ids(self,new):
def merge_gramps_ids(self, new):
"""
Merges the GRAMPS IDs. The new GRAMPS ID is taken from
destination person. The GRAMPS ID of the other person is added
@@ -497,7 +496,7 @@ class MergePeople:
else:
new.add_alternate_name(name)
def merge_birth(self, new,trans):
def merge_birth(self, new, trans):
"""
Merges the birth events of the two people. If the primary
person does not have a birth event, then the birth event from
@@ -560,7 +559,7 @@ class MergePeople:
list any parents that are not already there. This eliminates
any duplicates.
Once this has been completed, we loop through each family,
Once this has been completed, we loop through each family,
converting any child handles referring to the secondary person
to the destination person.
"""
@@ -579,7 +578,7 @@ class MergePeople:
# person
for family_handle in parent_list:
self.convert_child_ids(family_handle, self.new_handle,
self.convert_child_ids(family_handle, self.new_handle,
self.old_handle, trans)
new.add_parent_family_handle(family_handle)
@@ -610,9 +609,9 @@ class MergePeople:
if [ref.ref for ref in new_ref_list] \
!= [ref.ref for ref in orig_ref_list]:
family.set_child_ref_list(new_ref_list)
self.db.commit_family(family,trans)
self.db.commit_family(family, trans)
def merge_relationships(self,new,trans):
def merge_relationships(self, new, trans):
"""
Merges the relationships associated with the merged people.
"""
@@ -649,14 +648,14 @@ class MergePeople:
else:
if __debug__:
print "Merging family pair"
self.merge_family_pair(tgt_family,src_family,trans)
self.merge_family_pair(tgt_family, src_family, trans)
# change parents of the family to point to the new
# family
self.adjust_family_pointers(tgt_family, src_family, trans)
new.remove_family_handle(src_handle)
self.db.remove_family(src_handle,trans)
self.db.remove_family(src_handle, trans)
if __debug__:
print "Deleted src_family %s" % src_handle
else:
@@ -680,7 +679,7 @@ class MergePeople:
if __debug__:
print "Family %s now has mother %s" % (
src_handle, self.new_handle)
self.db.commit_family(src_family,trans)
self.db.commit_family(src_family, trans)
# a little debugging here
@@ -697,10 +696,10 @@ class MergePeople:
## if self.p2 == fam.get_mother_handle():
## fam.set_mother_handle(self.p1)
## if fam.get_father_handle() == None and fam.get_mother_handle() == None:
## self.delete_empty_family(fam,trans)
## self.delete_empty_family(fam, trans)
## data = cursor.next()
def find_modified_family(self,family):
def find_modified_family(self, family):
"""
Look for a existing family that matches the merged person. This means
looking at the current family, and replacing the secondary person's
@@ -736,7 +735,7 @@ class MergePeople:
myfamily = None
while node:
# data[2] == father_handle field, data[2] == mother_handle field
(thandle,data) = node
(thandle, data) = node
if data[2] == fhandle and data[3] == mhandle and thandle != family_handle:
myfamily = RelLib.Family()
myfamily.unserialize(data)
@@ -766,14 +765,14 @@ class MergePeople:
father.remove_family_handle(src_family_handle)
if __debug__:
print "Removed family %s from father %s" % (src_family_handle, father_id)
self.db.commit_person(father,trans)
self.db.commit_person(father, trans)
if mother and src_family_handle in mother.get_family_handle_list():
mother.remove_family_handle(src_family_handle)
if __debug__:
print "Removed family %s from mother %s" % (src_family_handle, mother_id)
self.db.commit_person(mother,trans)
self.db.commit_person(mother, trans)
self.merge_family_pair(tgt_family,src_family,trans)
self.merge_family_pair(tgt_family, src_family, trans)
for child_ref in src_family.get_child_ref_list():
child_handle = child_ref.ref
@@ -782,19 +781,19 @@ class MergePeople:
if child.remove_parent_family_handle(src_family_handle):
if __debug__:
print "Remove parent family %s from %s" \
% (src_family_handle,child_handle)
% (src_family_handle, child_handle)
child.add_parent_family_handle(tgt_family.handle)
self.db.commit_person(child,trans)
self.db.commit_person(child, trans)
# delete the old source family
self.db.remove_family(src_family_handle,trans)
self.db.remove_family(src_family_handle, trans)
if __debug__:
print "Deleted src_family %s" % src_family_handle
self.db.commit_family(tgt_family,trans)
self.db.commit_family(tgt_family, trans)
if tgt_family.get_handle() not in new.get_family_handle_list():
new.add_family_handle(tgt_family.get_handle())
def merge_family_pair(self,tgt_family,src_family,trans):
def merge_family_pair(self, tgt_family, src_family, trans):
tgt_family_child_handles = [ref.ref
for ref in tgt_family.get_child_ref_list()]
@@ -810,9 +809,9 @@ class MergePeople:
i = 0
for fam in parents[:]:
if fam[0] == src_family.get_handle():
parents[i] = (tgt_family.get_handle(),fam[1],fam[2])
parents[i] = (tgt_family.get_handle(), fam[1], fam[2])
i += 1
self.db.commit_person(child,trans)
self.db.commit_person(child, trans)
# merge family events
@@ -834,7 +833,7 @@ class MergePeople:
# merge family top-level sources
self.copy_sources(tgt_family,src_family)
self.copy_sources(tgt_family, src_family)
# merge multimedia objects
@@ -861,7 +860,7 @@ class MergePeople:
tgt_family_handle, father_handle)
# commit the change
self.db.commit_person(father,trans)
self.db.commit_person(father, trans)
mother_handle = src_family.get_mother_handle()
if mother_handle:
@@ -874,7 +873,7 @@ class MergePeople:
tgt_family_handle, mother_handle)
# commit the change
self.db.commit_person(mother,trans)
self.db.commit_person(mother, trans)
# remove the children from the old family
for child_ref in src_family.get_child_ref_list():
@@ -882,16 +881,16 @@ class MergePeople:
if child_handle != self.new_handle:
child = self.db.get_person_from_handle(child_handle)
if child.remove_parent_family_handle(src_family_handle):
self.db.commit_person(child,trans)
self.db.commit_person(child, trans)
def remove_marriage(self,family,person,trans):
def remove_marriage(self, family, person, trans):
if person:
person.remove_family_handle(family.get_handle())
if family.get_father_handle() == None and family.get_mother_handle() == None:
self.delete_empty_family(family,trans)
if family.get_father_handle() is None and family.get_mother_handle() is None:
self.delete_empty_family(family, trans)
def delete_empty_family(self,family,trans):
def delete_empty_family(self, family, trans):
family_handle = family.get_handle()
for child_ref in family.get_child_ref_list():
child_handle = child_ref.ref
@@ -900,8 +899,8 @@ class MergePeople:
child.set_main_parent_family_handle(None)
else:
child.remove_parent_family_handle(family_handle)
self.db.commit_person(child,trans)
self.db.remove_family(family_handle,trans)
self.db.commit_person(child, trans)
self.db.remove_family(family_handle, trans)
if __debug__:
print "Deleted empty family %s" % family_handle