2007-10-06 Don Allingham <don@gramps-project.org>
* various: creation of gen.db package svn: r9091
This commit is contained in:
parent
e7f02d1855
commit
32d7968365
@ -1,3 +1,6 @@
|
||||
2007-10-06 Don Allingham <don@gramps-project.org>
|
||||
* various: creation of gen.db package
|
||||
|
||||
2007-10-06 Benny Malengier <benny.malengier@gramps-project.org>
|
||||
* src/DataViews/_RelationView.py: don't crash on missing media ref
|
||||
* src/DisplayTabs/_GalleryTab.py: on missing media ref, notify to run check tool
|
||||
|
@ -179,6 +179,7 @@ src/plugins/Makefile
|
||||
src/DateHandler/Makefile
|
||||
src/gen/Makefile
|
||||
src/gen/proxy/Makefile
|
||||
src/gen/db/Makefile
|
||||
src/data/Makefile
|
||||
src/data/templates/Makefile
|
||||
src/glade/Makefile
|
||||
|
@ -283,7 +283,7 @@ class PersonView(PageView.PersonNavView):
|
||||
self.tree.set_headers_visible(True)
|
||||
self.tree.set_fixed_height_mode(True)
|
||||
self.tree.connect('key-press-event', self._key_press)
|
||||
self.tree.connect('start-interactive-search',self.open_all_nodes)
|
||||
self.tree.connect('start-interactive-search', self.open_all_nodes)
|
||||
|
||||
scrollwindow = gtk.ScrolledWindow()
|
||||
scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
@ -866,8 +866,8 @@ class PersonView(PageView.PersonNavView):
|
||||
return True
|
||||
return False
|
||||
|
||||
def _key_press(self,obj,event):
|
||||
if not event.state or event.state in (gtk.gdk.MOD2_MASK,):
|
||||
def _key_press(self, obj, event):
|
||||
if not event.state or event.state in (gtk.gdk.MOD2_MASK, ):
|
||||
if event.keyval in (gtk.keysyms.Return, gtk.keysyms.KP_Enter):
|
||||
if self.dbstate.active:
|
||||
self.edit(obj)
|
||||
@ -971,19 +971,19 @@ class PersonView(PageView.PersonNavView):
|
||||
# since the iterator method only works on top level nodes. So we must
|
||||
# loop through based off of paths
|
||||
|
||||
path = (0,)
|
||||
path = (0, )
|
||||
node = self.model.on_get_iter(path)
|
||||
while node:
|
||||
real_iter = self.model.get_iter(path)
|
||||
for subindex in range(0, self.model.iter_n_children(real_iter)):
|
||||
subpath = ((path[0],subindex))
|
||||
subpath = ((path[0], subindex))
|
||||
row = self.model[subpath]
|
||||
ofile.start_row()
|
||||
for index in data_cols:
|
||||
ofile.write_cell(row[index])
|
||||
ofile.end_row()
|
||||
node = self.model.on_iter_next(node)
|
||||
path = (path[0]+1,)
|
||||
path = (path[0]+1, )
|
||||
ofile.end_page()
|
||||
ofile.close()
|
||||
|
||||
|
@ -57,6 +57,7 @@ import const
|
||||
import Config
|
||||
import Mime
|
||||
import GrampsDb
|
||||
import gen.db
|
||||
import GrampsDbUtils
|
||||
import Utils
|
||||
from PluginUtils import import_list
|
||||
@ -117,7 +118,7 @@ class DbLoader:
|
||||
filetype = type_selector.get_value()
|
||||
if filetype == 'auto':
|
||||
filetype = Mime.get_type(filename)
|
||||
(the_path, the_file) = os.path.split(filename)
|
||||
# (the_path, the_file) = os.path.split(filename)
|
||||
choose.destroy()
|
||||
if filetype in OPEN_FORMATS:
|
||||
self.read_file(filename, filetype)
|
||||
@ -376,8 +377,9 @@ class DbLoader:
|
||||
mode = 'w'
|
||||
|
||||
try:
|
||||
dbclass = GrampsDb.gramps_db_factory(db_type = filetype)
|
||||
except GrampsDb.GrampsDbException, msg:
|
||||
#dbclass = GrampsDb.gramps_db_factory(db_type = filetype)
|
||||
dbclass = gen.db.GrampsDBDir
|
||||
except gen.db.GrampsDbException, msg:
|
||||
QuestionDialog.ErrorDialog(
|
||||
_("Could not open file: %s") % filename,
|
||||
_("This may be caused by an improper installation of GRAMPS.") +
|
||||
|
@ -25,7 +25,7 @@ Provides the database state class
|
||||
__author__ = "Donald N. Allingham"
|
||||
__revision__ = "$Revision: 8032 $"
|
||||
|
||||
from GrampsDb import GrampsDBCallback, GrampsDbBase
|
||||
from gen.db import GrampsDBCallback, GrampsDbBase
|
||||
import Config
|
||||
|
||||
class DbState(GrampsDBCallback):
|
||||
|
@ -151,7 +151,7 @@ class FamilyModel(BaseModel):
|
||||
return "%012x" % data[13]
|
||||
|
||||
def column_change(self, data):
|
||||
return unicode(time.strftime('%x %X',time.localtime(data[13])),
|
||||
return unicode(time.strftime('%x %X', time.localtime(data[13])),
|
||||
GrampsLocale.codeset)
|
||||
|
||||
def column_marker_text(self, data):
|
||||
@ -175,11 +175,12 @@ class FamilyModel(BaseModel):
|
||||
pass
|
||||
return None
|
||||
|
||||
def column_tooltip(self,data):
|
||||
def column_tooltip(self, data):
|
||||
if const.USE_TIPS:
|
||||
try:
|
||||
t = ToolTips.TipFromFunction(self.db, lambda:
|
||||
self.db.get_family_from_handle(data[0]))
|
||||
t = ToolTips.TipFromFunction(
|
||||
self.db, lambda:
|
||||
self.db.get_family_from_handle(data[0]))
|
||||
except:
|
||||
log.error("Failed to create tooltip.", exc_info=True)
|
||||
return t
|
||||
|
@ -65,7 +65,7 @@ import DateHandler
|
||||
import ToolTips
|
||||
import GrampsLocale
|
||||
import Config
|
||||
from GrampsDb import LongOpStatus
|
||||
from gen.db.longop import LongOpStatus
|
||||
from Filters import SearchFilter, ExactSearchFilter
|
||||
from Lru import LRU
|
||||
|
||||
|
@ -49,7 +49,7 @@ import gtk
|
||||
# GRAMPS modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import GrampsDb
|
||||
import gen.db
|
||||
import Config
|
||||
from BasicUtils import name_displayer
|
||||
import const
|
||||
@ -63,7 +63,7 @@ DISABLED = -1
|
||||
# History manager
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class History(GrampsDb.GrampsDBCallback):
|
||||
class History(gen.db.GrampsDBCallback):
|
||||
""" History manages the objects of a certain type that have been viewed,
|
||||
with ability to go back, or forward.
|
||||
When accessing an object, it should be pushed on the History.
|
||||
@ -75,7 +75,7 @@ class History(GrampsDb.GrampsDBCallback):
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
GrampsDb.GrampsDBCallback.__init__(self)
|
||||
gen.db.GrampsDBCallback.__init__(self)
|
||||
self.clear()
|
||||
|
||||
def clear(self):
|
||||
@ -290,7 +290,7 @@ class WarnHandler(RotateHandler):
|
||||
top.run()
|
||||
top.destroy()
|
||||
|
||||
class DisplayState(GrampsDb.GrampsDBCallback):
|
||||
class DisplayState(gen.db.GrampsDBCallback):
|
||||
|
||||
__signals__ = {
|
||||
'filters-changed' : (str, ),
|
||||
@ -306,7 +306,7 @@ class DisplayState(GrampsDb.GrampsDBCallback):
|
||||
self.uimanager = uimanager
|
||||
self.progress_monitor = progress_monitor
|
||||
self.window = window
|
||||
GrampsDb.GrampsDBCallback.__init__(self)
|
||||
gen.db.GrampsDBCallback.__init__(self)
|
||||
self.status = status
|
||||
self.status_id = status.get_context_id('GRAMPS')
|
||||
self.progress = progress
|
||||
|
@ -45,13 +45,13 @@ __LOG = logging.getLogger(".GrampsDb")
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from RelLib import *
|
||||
from _GrampsDbBase import *
|
||||
from gen.db.base import *
|
||||
from _DbUtils import db_copy
|
||||
import _GrampsDbConst as const
|
||||
import gen.db.const as const
|
||||
from _GrampsDbExceptions import FileVersionError
|
||||
from BasicUtils import UpdateCallback
|
||||
|
||||
from _GrampsCursor import GrampsCursor
|
||||
from gen.db.cursor import GrampsCursor
|
||||
|
||||
_MINVERSION = 9
|
||||
_DBVERSION = 13
|
||||
|
@ -38,7 +38,8 @@ required e.g.:
|
||||
> GrampsDb.gramps_db_reader_factory(db_type = const.APP_GEDCOM)
|
||||
|
||||
"""
|
||||
import _GrampsDbConst as const
|
||||
import gen.db.dbconst as const
|
||||
from gen.db.exceptions import GrampsDbException
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(".GrampDb")
|
||||
@ -50,7 +51,6 @@ except:
|
||||
log.warn("No Config module available, using defaults.")
|
||||
config = None
|
||||
|
||||
from _GrampsDbExceptions import GrampsDbException
|
||||
|
||||
def gramps_db_factory(db_type):
|
||||
"""Factory class for obtaining a Gramps database backend.
|
||||
|
@ -54,12 +54,12 @@ log = logging.getLogger(".WriteXML")
|
||||
import RelLib
|
||||
from BasicUtils import UpdateCallback
|
||||
|
||||
from _GrampsDbConst import \
|
||||
from gen.db.dbconst import \
|
||||
PERSON_KEY,FAMILY_KEY,SOURCE_KEY,EVENT_KEY,\
|
||||
MEDIA_KEY,PLACE_KEY,REPOSITORY_KEY,NOTE_KEY
|
||||
|
||||
from _GrampsDbExceptions import *
|
||||
from _LongOpStatus import LongOpStatus
|
||||
from gen.db.exceptions import *
|
||||
from gen.db.longop import LongOpStatus
|
||||
|
||||
import gen.proxy
|
||||
|
||||
|
@ -38,22 +38,21 @@ the database objects. Read the comments in _GrampsDBCallback.py for more
|
||||
information.
|
||||
"""
|
||||
|
||||
from _GrampsDbBase import GrampsDbBase
|
||||
#from _GrampsDbBase import GrampsDbBase
|
||||
|
||||
from _GrampsDbFactories import \
|
||||
gramps_db_factory
|
||||
from _GrampsDbFactories import gramps_db_factory
|
||||
|
||||
from _GrampsDbExceptions import *
|
||||
#from _GrampsDbExceptions import *
|
||||
|
||||
from _GrampsDBCallback import GrampsDBCallback
|
||||
#from _GrampsDBCallback import GrampsDBCallback
|
||||
|
||||
from _DbUtils import *
|
||||
|
||||
import _GrampsDbConst as GrampsDbConst
|
||||
#import _GrampsDbConst as GrampsDbConst
|
||||
|
||||
from _GrampsDbWriteXML import GrampsDbXmlWriter, \
|
||||
exportData, quick_write
|
||||
|
||||
from _LongOpStatus import LongOpStatus
|
||||
#from _LongOpStatus import LongOpStatus
|
||||
from _ProgressMonitor import ProgressMonitor
|
||||
|
||||
|
@ -66,7 +66,7 @@ from QuestionDialog import ErrorDialog
|
||||
#------------------------------------------------------------------------
|
||||
import logging
|
||||
import os
|
||||
from GrampsDb import _GrampsDBDir as GrampsDBDir
|
||||
from gen.db.dbdir import GrampsDBDir
|
||||
import cPickle as pickle
|
||||
|
||||
LOG = logging.getLogger(".Backup")
|
||||
|
@ -122,7 +122,7 @@ import _GedcomUtils as GedcomUtils
|
||||
import _GedcomLex as GedcomLex
|
||||
import _GedcomChar as GedcomChar
|
||||
|
||||
from GrampsDb._GrampsDbConst import EVENT_KEY
|
||||
from gen.db.dbconst import EVENT_KEY
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -41,7 +41,7 @@ import logging
|
||||
log = logging.getLogger(".GrampDb")
|
||||
|
||||
|
||||
from GrampsDb import GrampsDbException
|
||||
from gen.db import GrampsDbException
|
||||
|
||||
|
||||
def gramps_db_writer_factory(db_type):
|
||||
|
@ -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,26 +68,26 @@ 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"),
|
||||
_("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"),
|
||||
_("A parent and child cannot be merged. To merge these "
|
||||
@ -96,9 +95,9 @@ class PersonCompare(ManagedWindow.ManagedWindow):
|
||||
"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))
|
||||
|
||||
@ -275,7 +274,7 @@ class MergePeopleUI(ManagedWindow.ManagedWindow):
|
||||
"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,12 +297,12 @@ 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"),
|
||||
_("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"),
|
||||
_("A parent and child cannot be merged. To merge these "
|
||||
@ -311,18 +310,18 @@ class MergePeopleUI(ManagedWindow.ManagedWindow):
|
||||
"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
|
||||
@ -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
|
||||
|
||||
|
@ -87,7 +87,7 @@ class GtkProgressDialog(gtk.Dialog):
|
||||
|
||||
self._progress_bars = []
|
||||
|
||||
def add(self,long_op_status):
|
||||
def add(self, long_op_status):
|
||||
"""Add a new status object to the progress dialog.
|
||||
|
||||
@param long_op_status: the status object.
|
||||
@ -145,7 +145,7 @@ class GtkProgressDialog(gtk.Dialog):
|
||||
gtk.Dialog.hide(self)
|
||||
self._process_events()
|
||||
|
||||
def _warn(self,x,y):
|
||||
def _warn(self, x, y):
|
||||
return True
|
||||
|
||||
def close(self):
|
||||
@ -155,7 +155,7 @@ if __name__ == '__main__':
|
||||
import time
|
||||
from GrampsDb import LongOpStatus, ProgressMonitor
|
||||
|
||||
def test(a,b):
|
||||
def test(a, b):
|
||||
d = ProgressMonitor(GtkProgressDialog)
|
||||
|
||||
s = LongOpStatus("Doing very long operation", 100, 10)
|
||||
|
@ -24,6 +24,7 @@ Provide utilities for printing endnotes in text reports.
|
||||
"""
|
||||
|
||||
import BaseDoc
|
||||
from gettext import gettext as _
|
||||
|
||||
def add_endnote_styles(style_sheet):
|
||||
"""
|
||||
@ -33,30 +34,30 @@ def add_endnote_styles(style_sheet):
|
||||
@type style_sheet: L{Basedoc.StyleSheet}
|
||||
"""
|
||||
font = BaseDoc.FontStyle()
|
||||
font.set(face=BaseDoc.FONT_SANS_SERIF,size=14,italic=1)
|
||||
font.set(face=BaseDoc.FONT_SANS_SERIF, size=14, italic=1)
|
||||
para = BaseDoc.ParagraphStyle()
|
||||
para.set_font(font)
|
||||
para.set_header_level(2)
|
||||
para.set_top_margin(0.25)
|
||||
para.set_bottom_margin(0.25)
|
||||
para.set_description(_('The style used for the generation header.'))
|
||||
style_sheet.add_paragraph_style("Endnotes-Header",para)
|
||||
style_sheet.add_paragraph_style("Endnotes-Header", para)
|
||||
|
||||
para = BaseDoc.ParagraphStyle()
|
||||
para.set(first_indent=-0.75,lmargin=.75)
|
||||
para.set(first_indent=-0.75, lmargin=.75)
|
||||
para.set_top_margin(0.25)
|
||||
para.set_bottom_margin(0.25)
|
||||
para.set_description(_('The basic style used for the endnotes source display.'))
|
||||
style_sheet.add_paragraph_style("Endnotes-Source",para)
|
||||
style_sheet.add_paragraph_style("Endnotes-Source", para)
|
||||
|
||||
para = BaseDoc.ParagraphStyle()
|
||||
para.set(lmargin=1.5)
|
||||
para.set_top_margin(0.25)
|
||||
para.set_bottom_margin(0.25)
|
||||
para.set_description(_('The basic style used for the endnotes reference display.'))
|
||||
style_sheet.add_paragraph_style("Endnotes-Ref",para)
|
||||
style_sheet.add_paragraph_style("Endnotes-Ref", para)
|
||||
|
||||
def cite_source(bibliography,obj):
|
||||
def cite_source(bibliography, obj):
|
||||
"""
|
||||
Cite any sources for the object and add them to the bibliography.
|
||||
|
||||
@ -71,15 +72,15 @@ def cite_source(bibliography,obj):
|
||||
first = 1
|
||||
for ref in slist:
|
||||
if not first:
|
||||
txt += ','
|
||||
txt += ', '
|
||||
first = 0
|
||||
(cindex,key) = bibliography.add_reference(ref)
|
||||
(cindex, key) = bibliography.add_reference(ref)
|
||||
txt += "%d" % (cindex + 1)
|
||||
if key != None:
|
||||
txt += key
|
||||
return txt
|
||||
|
||||
def write_endnotes(bibliography,database,doc):
|
||||
def write_endnotes(bibliography, database, doc):
|
||||
"""
|
||||
Write all the entries in the bibliography as endnotes.
|
||||
|
||||
@ -103,7 +104,7 @@ def write_endnotes(bibliography,database,doc):
|
||||
source = database.get_source_from_handle(citation.get_source_handle())
|
||||
first = True
|
||||
|
||||
doc.start_paragraph('Endnotes-Source',"%d." % cindex)
|
||||
doc.start_paragraph('Endnotes-Source', "%d." % cindex)
|
||||
|
||||
src_txt = _format_source_text(source)
|
||||
|
||||
@ -117,8 +118,8 @@ def write_endnotes(bibliography,database,doc):
|
||||
|
||||
first = True
|
||||
rindex = 0
|
||||
for key,ref in ref_list:
|
||||
txt = "%s: %s" % (key,ref.get_page())
|
||||
for key, ref in ref_list:
|
||||
txt = "%s: %s" % (key, ref.get_page())
|
||||
if first:
|
||||
doc.write_text(txt)
|
||||
first = False
|
||||
|
@ -1063,13 +1063,13 @@ def rgb_color(color):
|
||||
|
||||
@param color: list or tuple of integer values for red, green, and blue
|
||||
@type color: int
|
||||
@returns: (r,g,b) tuple of floating point color values
|
||||
@returns: (r, g, b) tuple of floating point color values
|
||||
@rtype: 3-tuple
|
||||
"""
|
||||
r = float(color[0])/255.0
|
||||
g = float(color[1])/255.0
|
||||
b = float(color[2])/255.0
|
||||
return (r,g,b)
|
||||
return (r, g, b)
|
||||
|
||||
def draw_wedge(doc, style, centerx, centery, radius, start_angle,
|
||||
end_angle, short_radius=0):
|
||||
@ -1159,7 +1159,7 @@ def draw_pie_chart(doc, center_x, center_y, radius, data, start=0):
|
||||
|
||||
for item in data:
|
||||
incr = 360.0*(item[1]/total)
|
||||
draw_wedge(doc,item[0], center_x, center_y, radius, start, start + incr)
|
||||
draw_wedge(doc, item[0], center_x, center_y, radius, start, start + incr)
|
||||
start += incr
|
||||
|
||||
def draw_legend(doc, start_x, start_y, data, title, label_style):
|
||||
@ -1225,12 +1225,12 @@ def draw_vertical_bar_graph(doc, format, start_x, start_y, height, width, data):
|
||||
the L{draw_legend} function.
|
||||
@type data: list
|
||||
"""
|
||||
doc.draw_line(format,start_x,start_y+height,start_x,start_y)
|
||||
doc.draw_line(format,start_x,start_y+height,start_x+width,start_y+height)
|
||||
doc.draw_line(format, start_x, start_y+height, start_x, start_y)
|
||||
doc.draw_line(format, start_x, start_y+height, start_x+width, start_y+height)
|
||||
|
||||
largest = 0.0
|
||||
for item in data:
|
||||
largest = max(item[1],largest)
|
||||
largest = max(item[1], largest)
|
||||
|
||||
scale = float(height)/float(largest)
|
||||
units = len(data)
|
||||
@ -1241,19 +1241,19 @@ def draw_vertical_bar_graph(doc, format, start_x, start_y, height, width, data):
|
||||
start = 0.5*box_width + start_x
|
||||
for index in range(units):
|
||||
size = float(data[index][1]) * scale
|
||||
doc.draw_box(data[index][0],"",start,bottom-size,box_width,box_height)
|
||||
doc.draw_box(data[index][0], "", start, bottom-size, box_width, box_height)
|
||||
start += box_width * 1.5
|
||||
|
||||
|
||||
_t = time.localtime(time.time())
|
||||
_TODAY = DateHandler.parser.parse("%04d-%02d-%02d" % (_t[0],_t[1],_t[2]))
|
||||
_TODAY = DateHandler.parser.parse("%04d-%02d-%02d" % (_t[0], _t[1], _t[2]))
|
||||
|
||||
def estimate_age(db, person, end_handle=None, start_handle=None, today=_TODAY):
|
||||
"""
|
||||
Estimates the age of a person based off the birth and death
|
||||
dates of the person. A tuple containing the estimated upper
|
||||
and lower bounds of the person's age is returned. If either
|
||||
the birth or death date is missing, a (-1,-1) is returned.
|
||||
the birth or death date is missing, a (-1, -1) is returned.
|
||||
|
||||
@param db: GRAMPS database to which the Person object belongs
|
||||
@type db: GrampsDbBase
|
||||
@ -1267,7 +1267,7 @@ def estimate_age(db, person, end_handle=None, start_handle=None, today=_TODAY):
|
||||
used
|
||||
@type start_handle: str
|
||||
@returns: tuple containing the lower and upper bounds of the
|
||||
person's age, or (-1,-1) if it could not be determined.
|
||||
person's age, or (-1, -1) if it could not be determined.
|
||||
@rtype: tuple
|
||||
"""
|
||||
|
||||
@ -1289,7 +1289,7 @@ def estimate_age(db, person, end_handle=None, start_handle=None, today=_TODAY):
|
||||
|
||||
# if either of the events is not defined, return an error message
|
||||
if not bhandle:
|
||||
return (-1,-1)
|
||||
return (-1, -1)
|
||||
|
||||
bdata = db.get_event_from_handle(bhandle).get_date_object()
|
||||
if dhandle:
|
||||
@ -1298,15 +1298,15 @@ def estimate_age(db, person, end_handle=None, start_handle=None, today=_TODAY):
|
||||
if today != None:
|
||||
ddata = today
|
||||
else:
|
||||
return (-1,-1)
|
||||
return (-1, -1)
|
||||
|
||||
# if the date is not valid, return an error message
|
||||
if not bdata.get_valid() or not ddata.get_valid():
|
||||
return (-1,-1)
|
||||
return (-1, -1)
|
||||
|
||||
# if a year is not valid, return an error message
|
||||
if not bdata.get_year_valid() or not ddata.get_year_valid():
|
||||
return (-1,-1)
|
||||
return (-1, -1)
|
||||
|
||||
bstart = bdata.get_start_date()
|
||||
bstop = bdata.get_stop_date()
|
||||
@ -1314,27 +1314,27 @@ def estimate_age(db, person, end_handle=None, start_handle=None, today=_TODAY):
|
||||
dstart = ddata.get_start_date()
|
||||
dstop = ddata.get_stop_date()
|
||||
|
||||
def _calc_diff(low,high):
|
||||
if (low[1],low[0]) > (high[1],high[0]):
|
||||
def _calc_diff(low, high):
|
||||
if (low[1], low[0]) > (high[1], high[0]):
|
||||
return high[2] - low[2] - 1
|
||||
else:
|
||||
return high[2] - low[2]
|
||||
|
||||
if bstop == RelLib.Date.EMPTY and dstop == RelLib.Date.EMPTY:
|
||||
lower = _calc_diff(bstart,dstart)
|
||||
lower = _calc_diff(bstart, dstart)
|
||||
age = (lower, lower)
|
||||
elif bstop == RelLib.Date.EMPTY:
|
||||
lower = _calc_diff(bstart,dstart)
|
||||
upper = _calc_diff(bstart,dstop)
|
||||
age = (lower,upper)
|
||||
lower = _calc_diff(bstart, dstart)
|
||||
upper = _calc_diff(bstart, dstop)
|
||||
age = (lower, upper)
|
||||
elif dstop == RelLib.Date.EMPTY:
|
||||
lower = _calc_diff(bstop,dstart)
|
||||
upper = _calc_diff(bstart,dstart)
|
||||
age = (lower,upper)
|
||||
lower = _calc_diff(bstop, dstart)
|
||||
upper = _calc_diff(bstart, dstart)
|
||||
age = (lower, upper)
|
||||
else:
|
||||
lower = _calc_diff(bstop,dstart)
|
||||
upper = _calc_diff(bstart,dstop)
|
||||
age = (lower,upper)
|
||||
lower = _calc_diff(bstop, dstart)
|
||||
upper = _calc_diff(bstart, dstop)
|
||||
age = (lower, upper)
|
||||
return age
|
||||
|
||||
def estimate_age_on_date(db, person, ddata=_TODAY):
|
||||
@ -1346,38 +1346,38 @@ def estimate_age_on_date(db, person, ddata=_TODAY):
|
||||
if bref:
|
||||
bhandle = bref.get_reference_handle()
|
||||
if not bhandle:
|
||||
return (-1,-1)
|
||||
return (-1, -1)
|
||||
bdata = db.get_event_from_handle(bhandle).get_date_object()
|
||||
# if the date is not valid, return an error message
|
||||
if not bdata.get_valid() or not ddata.get_valid():
|
||||
return (-1,-1)
|
||||
return (-1, -1)
|
||||
# if a year is not valid, return an error message
|
||||
if not bdata.get_year_valid() or not ddata.get_year_valid():
|
||||
return (-1,-1)
|
||||
return (-1, -1)
|
||||
bstart = bdata.get_start_date()
|
||||
bstop = bdata.get_stop_date()
|
||||
dstart = ddata.get_start_date()
|
||||
dstop = ddata.get_stop_date()
|
||||
def _calc_diff(low,high):
|
||||
if (low[1],low[0]) > (high[1],high[0]):
|
||||
def _calc_diff(low, high):
|
||||
if (low[1], low[0]) > (high[1], high[0]):
|
||||
return high[2] - low[2] - 1
|
||||
else:
|
||||
return high[2] - low[2]
|
||||
if bstop == RelLib.Date.EMPTY and dstop == RelLib.Date.EMPTY:
|
||||
lower = _calc_diff(bstart,dstart)
|
||||
lower = _calc_diff(bstart, dstart)
|
||||
age = [lower, lower]
|
||||
elif bstop == RelLib.Date.EMPTY:
|
||||
lower = _calc_diff(bstart,dstart)
|
||||
upper = _calc_diff(bstart,dstop)
|
||||
age = [lower,upper]
|
||||
lower = _calc_diff(bstart, dstart)
|
||||
upper = _calc_diff(bstart, dstop)
|
||||
age = [lower, upper]
|
||||
elif dstop == RelLib.Date.EMPTY:
|
||||
lower = _calc_diff(bstop,dstart)
|
||||
upper = _calc_diff(bstart,dstart)
|
||||
age = [lower,upper]
|
||||
lower = _calc_diff(bstop, dstart)
|
||||
upper = _calc_diff(bstart, dstart)
|
||||
age = [lower, upper]
|
||||
else:
|
||||
lower = _calc_diff(bstop,dstart)
|
||||
upper = _calc_diff(bstart,dstop)
|
||||
age = [lower,upper]
|
||||
lower = _calc_diff(bstop, dstart)
|
||||
upper = _calc_diff(bstart, dstop)
|
||||
age = [lower, upper]
|
||||
if age[0] < 0 and age[1] < 0:
|
||||
age = (-1, -1)
|
||||
elif age[0] > 120 and age[1] > 120:
|
||||
@ -1396,7 +1396,7 @@ def roman(num):
|
||||
if not 0 < num < 4000:
|
||||
return "?"
|
||||
vals = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
|
||||
nums = ( 'M','CM', 'D','CD', 'C','XC', 'L','XL', 'X','IX', 'V','IV', 'I')
|
||||
nums = ( 'M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I')
|
||||
retval = ""
|
||||
for i in range(len(vals)):
|
||||
amount = int(num / vals[i])
|
||||
@ -1409,7 +1409,7 @@ def roman(num):
|
||||
#
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def place_name(db,place_handle):
|
||||
def place_name(db, place_handle):
|
||||
if place_handle:
|
||||
place = db.get_place_from_handle(place_handle).get_title()
|
||||
else:
|
||||
@ -1432,7 +1432,7 @@ def insert_image(database, doc, photo, w_cm=4.0, h_cm=4.0):
|
||||
if mime_type and mime_type.startswith("image"):
|
||||
filename = media_object.get_path()
|
||||
if os.path.exists(filename):
|
||||
doc.add_media_object(filename,"right",w_cm,h_cm)
|
||||
doc.add_media_object(filename, "right", w_cm, h_cm)
|
||||
else:
|
||||
WarningDialog(_("Could not add photo to page"),
|
||||
"%s: %s" % (filename, _('File does not exist')))
|
||||
@ -1446,7 +1446,7 @@ def empty_notes(whatever):
|
||||
# Empty stab function for when endnotes are not needed
|
||||
return ""
|
||||
|
||||
def get_birth_death_strings(database,person,empty_date="",empty_place=""):
|
||||
def get_birth_death_strings(database, person, empty_date="", empty_place=""):
|
||||
"""
|
||||
Returns strings for dates and places of birth and death.
|
||||
"""
|
||||
@ -1481,9 +1481,9 @@ def get_birth_death_strings(database,person,empty_date="",empty_place=""):
|
||||
ddate_full = ddate_obj and ddate_obj.get_day_valid()
|
||||
ddate_mod = ddate_obj and ddate_obj.get_modifier() != RelLib.Date.MOD_NONE
|
||||
|
||||
return (bdate,bplace,bdate_full,bdate_mod,ddate,dplace,ddate_full,ddate_mod)
|
||||
return (bdate, bplace, bdate_full, bdate_mod, ddate, dplace, ddate_full, ddate_mod)
|
||||
|
||||
def born_died_str(database,person,endnotes=None,name_object=None,person_name=None):
|
||||
def born_died_str(database, person, endnotes=None, name_object=None, person_name=None):
|
||||
"""
|
||||
Composes a string describing birth and death of a person.
|
||||
Missing information will be omitted without loss of readability.
|
||||
@ -1522,8 +1522,8 @@ def born_died_str(database,person,endnotes=None,name_object=None,person_name=Non
|
||||
else:
|
||||
person_name = _('She')
|
||||
|
||||
bdate,bplace,bdate_full,bdate_mod,ddate,dplace,ddate_full,ddate_mod = \
|
||||
get_birth_death_strings(database,person)
|
||||
bdate, bplace, bdate_full, bdate_mod, ddate, dplace, ddate_full, ddate_mod = \
|
||||
get_birth_death_strings(database, person)
|
||||
|
||||
birth = None
|
||||
birth_ref = person.get_birth_ref()
|
||||
@ -1700,8 +1700,8 @@ def born_died_str(database,person,endnotes=None,name_object=None,person_name=Non
|
||||
# married_str
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def married_str(database,person,family,endnotes=None,
|
||||
empty_date="",empty_place="",is_first=True):
|
||||
def married_str(database, person, family, endnotes=None,
|
||||
empty_date="", empty_place="", is_first=True):
|
||||
"""
|
||||
Composes a string describing marriage of a person. Missing information will
|
||||
be omitted without loss of readability. Optional references may be added to
|
||||
@ -1897,7 +1897,7 @@ def child_str(person, father_name="", mother_name="", dead=0, person_name=0):
|
||||
# find_spouse
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def find_spouse(person,family):
|
||||
def find_spouse(person, family):
|
||||
if person.get_handle() == family.get_father_handle():
|
||||
spouse_handle = family.get_mother_handle()
|
||||
else:
|
||||
@ -1909,7 +1909,7 @@ def find_spouse(person,family):
|
||||
# find_marriage
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def find_marriage(database,family):
|
||||
def find_marriage(database, family):
|
||||
for event_ref in family.get_event_ref_list():
|
||||
event = database.get_event_from_handle(event_ref.ref)
|
||||
if event and int(event.get_type()) == RelLib.EventType.MARRIAGE:
|
||||
@ -1921,7 +1921,7 @@ def find_marriage(database,family):
|
||||
# born_str
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def born_str(database,person,person_name=None,empty_date="",empty_place=""):
|
||||
def born_str(database, person, person_name=None, empty_date="", empty_place=""):
|
||||
"""
|
||||
Check birth record.
|
||||
Statement formats name precedes this
|
||||
@ -1941,8 +1941,8 @@ def born_str(database,person,person_name=None,empty_date="",empty_place=""):
|
||||
|
||||
text = ""
|
||||
|
||||
bdate,bplace,bdate_full,bdate_mod,ddate,dplace,ddate_full,ddate_mod = \
|
||||
get_birth_death_strings(database,person,empty_date,empty_place)
|
||||
bdate, bplace, bdate_full, bdate_mod, ddate, dplace, ddate_full, ddate_mod = \
|
||||
get_birth_death_strings(database, person, empty_date, empty_place)
|
||||
|
||||
value_map = {
|
||||
'name' : person_name,
|
||||
@ -1987,8 +1987,8 @@ def born_str(database,person,person_name=None,empty_date="",empty_place=""):
|
||||
# died_str
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def died_str(database,person,person_name=None,empty_date="",empty_place="",
|
||||
age=None,age_units=0):
|
||||
def died_str(database, person, person_name=None, empty_date="", empty_place="",
|
||||
age=None, age_units=0):
|
||||
"""
|
||||
Write obit sentence.
|
||||
FIRSTNAME died on Date
|
||||
@ -2025,8 +2025,8 @@ def died_str(database,person,person_name=None,empty_date="",empty_place="",
|
||||
|
||||
text = ""
|
||||
|
||||
bdate,bplace,bdate_full,bdate_mod,ddate,dplace,ddate_full,ddate_mod = \
|
||||
get_birth_death_strings(database,person,empty_date,empty_place)
|
||||
bdate, bplace, bdate_full, bdate_mod, ddate, dplace, ddate_full, ddate_mod = \
|
||||
get_birth_death_strings(database, person, empty_date, empty_place)
|
||||
|
||||
value_map = {
|
||||
'name' : person_name,
|
||||
@ -2072,7 +2072,7 @@ def died_str(database,person,person_name=None,empty_date="",empty_place="",
|
||||
# buried_str
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def buried_str(database,person,person_name=None,empty_date="",empty_place=""):
|
||||
def buried_str(database, person, person_name=None, empty_date="", empty_place=""):
|
||||
"""
|
||||
Check burial record.
|
||||
Statement formats name precedes this
|
||||
@ -2157,13 +2157,13 @@ def buried_str(database,person,person_name=None,empty_date="",empty_place=""):
|
||||
# list_person_str
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def list_person_str(database,person,empty_date="",empty_place=""):
|
||||
def list_person_str(database, person, empty_date="", empty_place=""):
|
||||
"""
|
||||
Briefly list person and birth/death events.
|
||||
"""
|
||||
|
||||
bdate,bplace,bdate_full,bdate_mod,ddate,dplace,ddate_full,ddate_mod = \
|
||||
get_birth_death_strings(database,person)
|
||||
bdate, bplace, bdate_full, bdate_mod, ddate, dplace, ddate_full, ddate_mod = \
|
||||
get_birth_death_strings(database, person)
|
||||
|
||||
text = ""
|
||||
|
||||
@ -2229,7 +2229,7 @@ def list_person_str(database,person,empty_date="",empty_place=""):
|
||||
text = ""
|
||||
return text
|
||||
|
||||
def get_birth_or_fallback(database,person):
|
||||
def get_birth_or_fallback(database, person):
|
||||
birth_ref = person.get_birth_ref()
|
||||
if birth_ref: # regular birth found
|
||||
return database.get_event_from_handle(birth_ref.ref)
|
||||
@ -2240,7 +2240,7 @@ def get_birth_or_fallback(database,person):
|
||||
return event
|
||||
return None
|
||||
|
||||
def get_death_or_fallback(database,person):
|
||||
def get_death_or_fallback(database, person):
|
||||
birth_ref = person.get_death_ref()
|
||||
if birth_ref: # regular death found
|
||||
return database.get_event_from_handle(birth_ref.ref)
|
||||
@ -2251,11 +2251,11 @@ def get_death_or_fallback(database,person):
|
||||
return event
|
||||
return None
|
||||
|
||||
def old_calc_age(database,person):
|
||||
def old_calc_age(database, person):
|
||||
"""
|
||||
Calulate age.
|
||||
|
||||
Returns a tuple (age,units) where units is an integer representing
|
||||
Returns a tuple (age, units) where units is an integer representing
|
||||
time units:
|
||||
no age info: 0
|
||||
years: 1
|
||||
@ -2286,7 +2286,7 @@ def old_calc_age(database,person):
|
||||
|
||||
# wihtout at least a year for each event we're clueless
|
||||
if not (birth_year_valid and death_year_valid):
|
||||
return (age,units)
|
||||
return (age, units)
|
||||
|
||||
# FIXME: The code below uses hard-coded 31 days in a month
|
||||
# and 12 month in a year. This is incorrect for half the Gregorian
|
||||
@ -2328,10 +2328,10 @@ def old_calc_age(database,person):
|
||||
age = death.get_day() + 31 - birth.get_day()
|
||||
unit = DAYS
|
||||
|
||||
return (age,units)
|
||||
return (age, units)
|
||||
|
||||
|
||||
def common_name(person,use_call=False):
|
||||
def common_name(person, use_call=False):
|
||||
if use_call and person.get_primary_name().get_call_name():
|
||||
return person.get_primary_name().get_call_name()
|
||||
else:
|
||||
@ -2342,7 +2342,7 @@ def common_name(person,use_call=False):
|
||||
# Indexing function
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def get_person_mark(db,person):
|
||||
def get_person_mark(db, person):
|
||||
"""
|
||||
Returns a IndexMark that can be used to index a person in a report
|
||||
|
||||
@ -2370,7 +2370,7 @@ def get_person_mark(db,person):
|
||||
if birth == " " and death == " ":
|
||||
key = name
|
||||
else:
|
||||
key = "%s (%s - %s)" % (name,birth,death)
|
||||
key = "%s (%s - %s)" % (name, birth, death)
|
||||
|
||||
return BaseDoc.IndexMark( key, BaseDoc.INDEX_TYPE_ALP )
|
||||
|
||||
@ -2399,7 +2399,7 @@ def get_address_str(addr):
|
||||
if str == "":
|
||||
str = info
|
||||
else:
|
||||
str = "%s, %s" % (str,info)
|
||||
str = "%s, %s" % (str, info)
|
||||
return str
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@ -2407,7 +2407,7 @@ def get_address_str(addr):
|
||||
# People Filters
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def get_person_filters(person,include_single=True):
|
||||
def get_person_filters(person, include_single=True):
|
||||
"""
|
||||
Returns a list of filters that are relevant for the given person
|
||||
|
||||
@ -2437,23 +2437,23 @@ def get_person_filters(person,include_single=True):
|
||||
|
||||
des = GenericFilter()
|
||||
des.set_name(_("Descendants of %s") % name)
|
||||
des.add_rule(Rules.Person.IsDescendantOf([gramps_id,1]))
|
||||
des.add_rule(Rules.Person.IsDescendantOf([gramps_id, 1]))
|
||||
|
||||
df = GenericFilter()
|
||||
df.set_name(_("Descendant Families of %s") % name)
|
||||
df.add_rule(Rules.Person.IsDescendantFamilyOf([gramps_id,1]))
|
||||
df.add_rule(Rules.Person.IsDescendantFamilyOf([gramps_id, 1]))
|
||||
|
||||
ans = GenericFilter()
|
||||
ans.set_name(_("Ancestors of %s") % name)
|
||||
ans.add_rule(Rules.Person.IsAncestorOf([gramps_id,1]))
|
||||
ans.add_rule(Rules.Person.IsAncestorOf([gramps_id, 1]))
|
||||
|
||||
com = GenericFilter()
|
||||
com.set_name(_("People with common ancestor with %s") % name)
|
||||
com.add_rule(Rules.Person.HasCommonAncestorWith([gramps_id]))
|
||||
|
||||
if include_single == True:
|
||||
the_filters = [filt_id,all,des,df,ans,com]
|
||||
the_filters = [filt_id, all, des, df, ans, com]
|
||||
else:
|
||||
the_filters = [all,des,df,ans,com]
|
||||
the_filters = [all, des, df, ans, com]
|
||||
the_filters.extend(CustomFilters.get_filters('Person'))
|
||||
return the_filters
|
||||
|
@ -77,6 +77,8 @@ import UndoHistory
|
||||
from DbLoader import DbLoader
|
||||
import GrampsDisplay
|
||||
from GrampsDb import ProgressMonitor
|
||||
import gen.db
|
||||
|
||||
import ProgressDialog
|
||||
|
||||
def show_url(dialog, link, user_data):
|
||||
@ -1050,8 +1052,6 @@ class ViewManager:
|
||||
should enable signals, as well as finish up with other UI goodies.
|
||||
"""
|
||||
|
||||
import GrampsDb
|
||||
|
||||
if os.path.exists(filename):
|
||||
if not os.access(filename, os.W_OK):
|
||||
mode = "r"
|
||||
@ -1071,8 +1071,8 @@ class ViewManager:
|
||||
mode = 'w'
|
||||
|
||||
try:
|
||||
dbclass = GrampsDb.gramps_db_factory(db_type = filetype)
|
||||
except GrampsDb.GrampsDbException, msg:
|
||||
dbclass = gen.db.dbdir.GrampsDBDir
|
||||
except gen.db.exceptions.GrampsDbException, msg:
|
||||
QuestionDialog.ErrorDialog(
|
||||
_("Could not open file: %s") % filename,
|
||||
_("This may be caused by an improper installation of GRAMPS.") +
|
||||
|
@ -19,4 +19,4 @@
|
||||
#
|
||||
|
||||
__version__ = "$Revision: $"
|
||||
__all__ = [ "proxy" ]
|
||||
__all__ = [ "proxy", "db" ]
|
||||
|
30
src/gen/db/Makefile.am
Normal file
30
src/gen/db/Makefile.am
Normal file
@ -0,0 +1,30 @@
|
||||
# This is the src/RelLib level Makefile for Gramps
|
||||
# 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
|
||||
|
||||
pkgdatadir = $(datadir)/@PACKAGE@/db
|
||||
|
||||
pkgdata_PYTHON = \
|
||||
__init__.py\
|
||||
base.py \
|
||||
callback.py \
|
||||
cursor.py \
|
||||
dbconst.py \
|
||||
dbdir.py \
|
||||
exceptions.py \
|
||||
iterator.py \
|
||||
longop.py
|
||||
|
||||
pkgpyexecdir = @pkgpyexecdir@/db
|
||||
pkgpythondir = @pkgpythondir@/db
|
||||
|
||||
|
||||
# Clean up all the byte-compiled files
|
||||
MOSTLYCLEANFILES = *pyc *pyo
|
||||
|
||||
GRAMPS_PY_MODPATH = "../"
|
||||
|
||||
pycheck:
|
||||
(export PYTHONPATH=$(GRAMPS_PY_MODPATH); \
|
||||
pychecker $(pkgdata_PYTHON));
|
@ -51,16 +51,16 @@ LOG = logging.getLogger(".GrampsDb")
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from RelLib import *
|
||||
from _GrampsDBCallback import GrampsDBCallback
|
||||
from _CursorIterator import CursorIterator
|
||||
from callback import GrampsDBCallback
|
||||
from iterator import CursorIterator
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# constants
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from _GrampsDbConst import *
|
||||
from _GrampsCursor import GrampsCursor
|
||||
from dbconst import *
|
||||
from cursor import GrampsCursor
|
||||
|
||||
_UNDO_SIZE = 1000
|
||||
|
@ -48,12 +48,11 @@ log = logging.getLogger(".GrampsDb")
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from RelLib import *
|
||||
from _GrampsDbBase import *
|
||||
from _DbUtils import db_copy
|
||||
import _GrampsDbConst as const
|
||||
from _GrampsDbExceptions import FileVersionError
|
||||
from base import *
|
||||
import dbconst as const
|
||||
from exceptions import FileVersionError
|
||||
from BasicUtils import UpdateCallback
|
||||
from _GrampsCursor import GrampsCursor
|
||||
from cursor import GrampsCursor
|
||||
import Errors
|
||||
|
||||
_MINVERSION = 9
|
||||
@ -172,7 +171,7 @@ class GrampsDBDirDupCursor(GrampsDBDirAssocCursor):
|
||||
# GrampsDBDir
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class GrampsDBDir(GrampsDbBase,UpdateCallback):
|
||||
class GrampsDBDir(GrampsDbBase, UpdateCallback):
|
||||
"""GRAMPS database object. This object is a base class for other
|
||||
objects."""
|
||||
|
||||
@ -590,6 +589,7 @@ class GrampsDBDir(GrampsDbBase,UpdateCallback):
|
||||
def load_from(self, other_database, filename, callback):
|
||||
try:
|
||||
self.load(filename,callback)
|
||||
from GrampsDb import db_copy
|
||||
db_copy(other_database,self,callback)
|
||||
return 1
|
||||
except DBERRS, msg:
|
@ -1,4 +1,4 @@
|
||||
from _LongOpStatus import LongOpStatus
|
||||
from longop import LongOpStatus
|
||||
|
||||
class CursorIterator(object):
|
||||
|
@ -1,6 +1,6 @@
|
||||
import time
|
||||
|
||||
from _GrampsDBCallback import GrampsDBCallback
|
||||
from callback import GrampsDBCallback
|
||||
|
||||
class LongOpStatus(GrampsDBCallback):
|
||||
"""LongOpStatus provides a way of communicating the status of a long
|
@ -72,13 +72,13 @@ def register_stock_icons ():
|
||||
#iconpath to the base image. The front of the list has highest priority
|
||||
if platform.system() == "Windows":
|
||||
iconpaths = [
|
||||
(os.path.join(const.IMAGE_DIR,'48x48'),'.png'),
|
||||
(const.IMAGE_DIR,'.png'),
|
||||
(os.path.join(const.IMAGE_DIR, '48x48'), '.png'),
|
||||
(const.IMAGE_DIR, '.png'),
|
||||
]
|
||||
else :
|
||||
iconpaths = [
|
||||
(os.path.join(const.IMAGE_DIR,'scalable'),'.svg'),
|
||||
(const.IMAGE_DIR,'.svg'), (const.IMAGE_DIR,'.png'),
|
||||
(os.path.join(const.IMAGE_DIR, 'scalable'), '.svg'),
|
||||
(const.IMAGE_DIR, '.svg'), (const.IMAGE_DIR, '.png'),
|
||||
]
|
||||
|
||||
#sizes: menu=16, small_toolbar=18, large_toolbar=24,
|
||||
@ -94,48 +94,48 @@ def register_stock_icons ():
|
||||
]
|
||||
|
||||
items = [
|
||||
('gramps-db',_('Family Trees'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-address',_('Address'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-attribute',_('Attribute'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
#('gramps-bookmark',_('Bookmarks'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
#('gramps-bookmark-delete',_('Delete bookmark'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-bookmark-edit',_('Edit Bookmarks'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-bookmark-new',_('Add Bookmark'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-date',_('Date'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-date-edit',_('Edit Date'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-event',_('Events'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-family',_('Family'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-font',_('Font'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-font-color',_('Font Color'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-font-bgcolor',_('Font Background Color'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-lock',_('Public'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-media',_('Media'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-notes',_('Notes'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-parents',_('Parents'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-parents-add',_('Add Parents'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-parents-open',_('Select Parents'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-pedigree',_('Pedigree'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-person',_('Person'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-place',_('Places'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-relation',_('Relationships'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-reports',_('Reports'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-repository',_('Repositories'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-source',_('Sources'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-spouse',_('Add Spouse'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-tools',_('Tools'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-unlock',_('Private'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-viewmedia',_('View'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-zoom-in',_('Zoom In'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-zoom-out',_('Zoom Out'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-zoom-fit-width',_('Fit Width'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-zoom-best-fit',_('Fit Page'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-db', _('Family Trees'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-address', _('Address'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-attribute', _('Attribute'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
#('gramps-bookmark', _('Bookmarks'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
#('gramps-bookmark-delete', _('Delete bookmark'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-bookmark-edit', _('Edit Bookmarks'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-bookmark-new', _('Add Bookmark'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-date', _('Date'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-date-edit', _('Edit Date'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-event', _('Events'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-family', _('Family'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-font', _('Font'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-font-color', _('Font Color'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-font-bgcolor', _('Font Background Color'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-lock', _('Public'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-media', _('Media'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-notes', _('Notes'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-parents', _('Parents'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-parents-add', _('Add Parents'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-parents-open', _('Select Parents'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-pedigree', _('Pedigree'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-person', _('Person'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-place', _('Places'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-relation', _('Relationships'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-reports', _('Reports'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-repository', _('Repositories'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-source', _('Sources'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-spouse', _('Add Spouse'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-tools', _('Tools'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-unlock', _('Private'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-viewmedia', _('View'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-zoom-in', _('Zoom In'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-zoom-out', _('Zoom Out'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-zoom-fit-width', _('Fit Width'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-zoom-best-fit', _('Fit Page'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
]
|
||||
# the following icons are not yet in new directory structure
|
||||
# they should be ported in the near future
|
||||
items_legacy = [
|
||||
('gramps-export',_('Export'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-undo-history',_('Undo History'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-url',_('URL'),gtk.gdk.CONTROL_MASK,0,''),
|
||||
('gramps-export', _('Export'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-undo-history', _('Undo History'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
('gramps-url', _('URL'), gtk.gdk.CONTROL_MASK, 0, ''),
|
||||
]
|
||||
|
||||
# Register our stock items
|
||||
@ -147,8 +147,8 @@ def register_stock_icons ():
|
||||
|
||||
for data in items+items_legacy:
|
||||
pixbuf = 0
|
||||
for (dirname,ext) in iconpaths:
|
||||
icon_file = os.path.expanduser(os.path.join(dirname,data[0]+ext))
|
||||
for (dirname, ext) in iconpaths:
|
||||
icon_file = os.path.expanduser(os.path.join(dirname, data[0]+ext))
|
||||
if os.path.isfile(icon_file):
|
||||
try:
|
||||
pixbuf = gtk.gdk.pixbuf_new_from_file (icon_file)
|
||||
@ -157,7 +157,7 @@ def register_stock_icons ():
|
||||
pass
|
||||
|
||||
if not pixbuf :
|
||||
icon_file = os.path.join(const.IMAGE_DIR,'gramps.png')
|
||||
icon_file = os.path.join(const.IMAGE_DIR, 'gramps.png')
|
||||
pixbuf = gtk.gdk.pixbuf_new_from_file (icon_file)
|
||||
|
||||
pixbuf = pixbuf.add_alpha(True, chr(0xff), chr(0xff), chr(0xff))
|
||||
@ -185,11 +185,11 @@ def register_stock_icons ():
|
||||
|
||||
def build_user_paths():
|
||||
user_paths = [const.HOME_DIR,
|
||||
os.path.join(const.HOME_DIR,"filters"),
|
||||
os.path.join(const.HOME_DIR,"plugins"),
|
||||
os.path.join(const.HOME_DIR,"docgen"),
|
||||
os.path.join(const.HOME_DIR,"templates"),
|
||||
os.path.join(const.HOME_DIR,"thumb")]
|
||||
os.path.join(const.HOME_DIR, "filters"),
|
||||
os.path.join(const.HOME_DIR, "plugins"),
|
||||
os.path.join(const.HOME_DIR, "docgen"),
|
||||
os.path.join(const.HOME_DIR, "templates"),
|
||||
os.path.join(const.HOME_DIR, "thumb")]
|
||||
|
||||
for path in user_paths:
|
||||
if not os.path.isdir(path):
|
||||
@ -208,23 +208,20 @@ class Gramps:
|
||||
process. It may spawn several windows and control several databases.
|
||||
"""
|
||||
|
||||
def __init__(self,args):
|
||||
def __init__(self, args):
|
||||
try:
|
||||
build_user_paths()
|
||||
self.welcome()
|
||||
except OSError, msg:
|
||||
ErrorDialog(_("Configuration error"),str(msg))
|
||||
return
|
||||
ErrorDialog(_("Configuration error"), str(msg))
|
||||
except Errors.GConfSchemaError, val:
|
||||
ErrorDialog(_("Configuration error"),str(val) +
|
||||
ErrorDialog(_("Configuration error"), str(val) +
|
||||
_("\n\nPossibly the installation of GRAMPS "
|
||||
"was incomplete. Make sure the GConf schema "
|
||||
"of GRAMPS is properly installed."))
|
||||
gtk.main_quit()
|
||||
return
|
||||
except:
|
||||
log.error("Error reading configuration.", exc_info=True)
|
||||
return
|
||||
|
||||
if not mime_type_is_defined(const.APP_GRAMPS):
|
||||
ErrorDialog(_("Configuration error"),
|
||||
@ -234,7 +231,6 @@ class Gramps:
|
||||
"of GRAMPS are properly installed.")
|
||||
% const.APP_GRAMPS)
|
||||
gtk.main_quit()
|
||||
return
|
||||
|
||||
register_stock_icons()
|
||||
|
||||
@ -247,7 +243,7 @@ class Gramps:
|
||||
|
||||
# Depending on the nature of this session,
|
||||
# we may need to change the order of operation
|
||||
ah = ArgHandler.ArgHandler(state,self.vm,args)
|
||||
ah = ArgHandler.ArgHandler(state, self.vm, args)
|
||||
if ah.need_gui():
|
||||
ah.handle_args()
|
||||
self.vm.post_init_interface()
|
||||
@ -275,6 +271,6 @@ class Gramps:
|
||||
# "releases of GRAMPS. <b>BACKUP</b> your existing databases "
|
||||
# "before opening them with this version, and make "
|
||||
# "sure to export your data to XML every now and then."))
|
||||
# Config.set(Config.AUTOLOAD,False)
|
||||
# Config.set(Config.BETAWARN,True)
|
||||
# Config.set(Config.AUTOLOAD, False)
|
||||
# Config.set(Config.BETAWARN, True)
|
||||
|
||||
|
@ -130,8 +130,8 @@ class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
# Draw dialog and make it handle everything
|
||||
|
||||
base = os.path.dirname(__file__)
|
||||
glade_file = "%s/%s" % (base,"checkpoint.glade")
|
||||
self.glade = gtk.glade.XML(glade_file,"top","gramps")
|
||||
glade_file = "%s/%s" % (base, "checkpoint.glade")
|
||||
self.glade = gtk.glade.XML(glade_file, "top", "gramps")
|
||||
|
||||
self.cust_arch_cb = self.glade.get_widget("cust_arch")
|
||||
self.cust_ret_cb = self.glade.get_widget("cust_ret")
|
||||
@ -153,7 +153,7 @@ class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
self.cust_arch_cb.set_sensitive(self.cust_rb.get_active())
|
||||
self.cust_ret_cb.set_sensitive(self.cust_rb.get_active())
|
||||
|
||||
self.rcs_rb.connect('toggled',self.rcs_toggled)
|
||||
self.rcs_rb.connect('toggled', self.rcs_toggled)
|
||||
|
||||
# Disable RCS if the rcs binary is not available
|
||||
# and show the normally hidden warning
|
||||
@ -161,7 +161,7 @@ class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
|
||||
self.title = _("Checkpoint Data")
|
||||
window = self.glade.get_widget('top')
|
||||
self.set_window(window,self.glade.get_widget('title'),self.title)
|
||||
self.set_window(window, self.glade.get_widget('title'), self.title)
|
||||
|
||||
self.glade.signal_autoconnect({
|
||||
"on_close_clicked" : self.close,
|
||||
@ -179,38 +179,38 @@ class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
else:
|
||||
warning_label.hide()
|
||||
|
||||
def build_menu_names(self,obj):
|
||||
return (_("Checkpoint tool"),None)
|
||||
def build_menu_names(self, obj):
|
||||
return (_("Checkpoint tool"), None)
|
||||
|
||||
def rcs_toggled(self,obj):
|
||||
def rcs_toggled(self, obj):
|
||||
self.cust_arch_cb.set_sensitive(not obj.get_active())
|
||||
self.cust_ret_cb.set_sensitive(not obj.get_active())
|
||||
|
||||
def on_help_clicked(self,obj):
|
||||
def on_help_clicked(self, obj):
|
||||
"""Display the relevant portion of GRAMPS manual"""
|
||||
GrampsDisplay.help('index')
|
||||
|
||||
def on_archive_clicked(self,obj):
|
||||
def on_archive_clicked(self, obj):
|
||||
self.options.handler.options_dict['cacmd'] = unicode(
|
||||
self.cust_arch_cb.get_text())
|
||||
self.options.handler.options_dict['rcs'] = int(
|
||||
self.rcs_rb.get_active())
|
||||
|
||||
self.run_tool(archive=True,cli=False)
|
||||
self.run_tool(archive=True, cli=False)
|
||||
# Save options
|
||||
self.options.handler.save_options()
|
||||
|
||||
def on_retrieve_clicked(self,obj):
|
||||
def on_retrieve_clicked(self, obj):
|
||||
self.options.handler.options_dict['crcmd'] = unicode(
|
||||
self.cust_ret_cb.get_text())
|
||||
self.options.handler.options_dict['rcs'] = int(
|
||||
self.rcs_rb.get_active())
|
||||
|
||||
self.run_tool(archive=False,cli=False)
|
||||
self.run_tool(archive=False, cli=False)
|
||||
# Save options
|
||||
self.options.handler.save_options()
|
||||
|
||||
def run_tool(self,archive=True,cli=False):
|
||||
def run_tool(self, archive=True, cli=False):
|
||||
"""
|
||||
RCS will be a builtin command, since we can handle all
|
||||
configuration on our own. This isn't true for most versioning
|
||||
@ -237,9 +237,9 @@ class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
self.uistate.modify_statusbar(self.dbstate)
|
||||
|
||||
def timestamp(self):
|
||||
return unicode(time.strftime('%x %X',time.localtime(time.time())))
|
||||
return unicode(time.strftime('%x %X', time.localtime(time.time())))
|
||||
|
||||
def custom(self,cmd,checkin,cli):
|
||||
def custom(self, cmd, checkin, cli):
|
||||
"""
|
||||
Passed the generated XML file to the specified command.
|
||||
"""
|
||||
@ -282,19 +282,19 @@ class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
print msg1
|
||||
print msg2
|
||||
else:
|
||||
dialog(msg1,msg2)
|
||||
dialog(msg1, msg2)
|
||||
|
||||
def rcs(self, checkin, cli):
|
||||
"""
|
||||
Check the generated XML file into RCS. Initialize the RCS file if
|
||||
it does not already exist.
|
||||
"""
|
||||
(archive_base,ext) = os.path.splitext(self.db.get_save_path())
|
||||
(archive_base, ext) = os.path.splitext(self.db.get_save_path())
|
||||
|
||||
archive_base = os.path.join(archive_base, "archive")
|
||||
comment = self.timestamp()
|
||||
|
||||
archive = archive_base + ",v"
|
||||
archive = archive_base + ", v"
|
||||
|
||||
# If the archive file does not exist, we either set it up
|
||||
# or die trying
|
||||
@ -319,7 +319,7 @@ class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
print msg1
|
||||
print msg2
|
||||
else:
|
||||
dialog(msg1,msg2)
|
||||
dialog(msg1, msg2)
|
||||
|
||||
if status:
|
||||
return
|
||||
@ -356,7 +356,7 @@ class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
print msg1
|
||||
print msg2
|
||||
else:
|
||||
dialog(msg1,msg2)
|
||||
dialog(msg1, msg2)
|
||||
else:
|
||||
proc = subprocess.Popen(
|
||||
("co", "-p", archive_base), stdout=subprocess.PIPE,
|
||||
@ -379,9 +379,9 @@ class Checkpoint(Tool.Tool, ManagedWindow.ManagedWindow):
|
||||
print msg1
|
||||
print msg2
|
||||
else:
|
||||
dialog(msg1,msg2)
|
||||
dialog(msg1, msg2)
|
||||
|
||||
def callback_real(self,value):
|
||||
def callback_real(self, value):
|
||||
"""
|
||||
Call back function for the WriteXML function that updates the
|
||||
status progress bar.
|
||||
@ -400,8 +400,8 @@ class CheckpointOptions(Tool.ToolOptions):
|
||||
Defines options and provides handling interface.
|
||||
"""
|
||||
|
||||
def __init__(self,name,person_id=None):
|
||||
Tool.ToolOptions.__init__(self,name,person_id)
|
||||
def __init__(self, name, person_id=None):
|
||||
Tool.ToolOptions.__init__(self, name, person_id)
|
||||
|
||||
def set_new_options(self):
|
||||
# Options specific for this report
|
||||
@ -414,15 +414,15 @@ class CheckpointOptions(Tool.ToolOptions):
|
||||
self.options_help = {
|
||||
'rcs' : ("=0/1",
|
||||
"Whether to use RCS (ignores custom commands).",
|
||||
["Do not use RCS","Use RCS"],
|
||||
["Do not use RCS", "Use RCS"],
|
||||
True),
|
||||
'archive' : ("=0/1",
|
||||
"Whether to archive or retrieve.",
|
||||
["Retrieve","Archive"],
|
||||
["Retrieve", "Archive"],
|
||||
True),
|
||||
'cacmd' : ("=str","Custom command line for archiving",
|
||||
'cacmd' : ("=str", "Custom command line for archiving",
|
||||
"Custom command string"),
|
||||
'crcmd' : ("=str","Custom command line for retrieval",
|
||||
'crcmd' : ("=str", "Custom command line for retrieval",
|
||||
"Custom command string"),
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ from PluginUtils import register_import
|
||||
# Importing data into the currently open database.
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def importData(database, filename, callback=None,cl=0,use_trans=True):
|
||||
def importData(database, filename, callback=None, cl=0, use_trans=True):
|
||||
|
||||
other_database = GrampsBSDDB()
|
||||
|
||||
@ -72,14 +72,14 @@ def importData(database, filename, callback=None,cl=0,use_trans=True):
|
||||
other_database.make_env_name = lambda x: new_env_name
|
||||
|
||||
# Copy data
|
||||
shutil.copyfile(orig_filename,new_filename)
|
||||
shutil.copyfile(orig_filename, new_filename)
|
||||
# Copy env if we need and if it exists
|
||||
if other_database.UseTXN and os.path.isdir(orig_env_name):
|
||||
shutil.rmtree(new_env_name)
|
||||
shutil.copytree(orig_env_name,new_env_name)
|
||||
shutil.copytree(orig_env_name, new_env_name)
|
||||
|
||||
try:
|
||||
other_database.load(new_filename,callback)
|
||||
other_database.load(new_filename, callback)
|
||||
except:
|
||||
if cl:
|
||||
print "Error: %s could not be opened. Exiting." % new_filename
|
||||
@ -105,9 +105,9 @@ def importData(database, filename, callback=None,cl=0,use_trans=True):
|
||||
# If other_database contains its custom name formats,
|
||||
# we need to do tricks to remap the format numbers
|
||||
if len(other_database.name_formats) > 0:
|
||||
formats_map = remap_name_formats(database,other_database)
|
||||
formats_map = remap_name_formats(database, other_database)
|
||||
name_displayer.set_name_format(database.name_formats)
|
||||
get_person = make_peron_name_remapper(other_database,formats_map)
|
||||
get_person = make_peron_name_remapper(other_database, formats_map)
|
||||
else:
|
||||
# No remapping necessary, proceed as usual
|
||||
get_person = other_database.get_person_from_handle
|
||||
@ -173,13 +173,13 @@ def importData(database, filename, callback=None,cl=0,use_trans=True):
|
||||
'other_table': other_database.repository_map,
|
||||
},
|
||||
'Note' : {'table': database.note_map,
|
||||
'id_table': database.nid_trans,
|
||||
'add_obj': database.add_note,
|
||||
'find_next_gramps_id': database.find_next_note_gramps_id,
|
||||
'other_get_from_handle':
|
||||
other_database.get_note_from_handle,
|
||||
'other_table': other_database.note_map,
|
||||
},
|
||||
'id_table': database.nid_trans,
|
||||
'add_obj': database.add_note,
|
||||
'find_next_gramps_id': database.find_next_note_gramps_id,
|
||||
'other_get_from_handle':
|
||||
other_database.get_note_from_handle,
|
||||
'other_table': other_database.note_map,
|
||||
},
|
||||
}
|
||||
|
||||
uc = UpdateCallback(callback)
|
||||
@ -193,12 +193,12 @@ def importData(database, filename, callback=None,cl=0,use_trans=True):
|
||||
table = table_dict['table']
|
||||
other_table = table_dict['other_table']
|
||||
msg = '%s handles in two databases overlap.' % key
|
||||
the_len += check_common_handles(table,other_table,msg)
|
||||
the_len += check_common_handles(table, other_table, msg)
|
||||
uc.update()
|
||||
|
||||
# Proceed with preparing for import
|
||||
if use_trans:
|
||||
trans = database.transaction_begin("",batch=True)
|
||||
trans = database.transaction_begin("", batch=True)
|
||||
else:
|
||||
print "Transaction is None! This is no way to go!"
|
||||
trans = None
|
||||
@ -216,8 +216,8 @@ def importData(database, filename, callback=None,cl=0,use_trans=True):
|
||||
find_next_gramps_id = table_dict['find_next_gramps_id']
|
||||
other_table = table_dict['other_table']
|
||||
other_get_from_handle = table_dict['other_get_from_handle']
|
||||
import_table(id_table,add_obj,find_next_gramps_id,
|
||||
other_table,other_get_from_handle,trans,uc)
|
||||
import_table(id_table, add_obj, find_next_gramps_id,
|
||||
other_table, other_get_from_handle, trans, uc)
|
||||
|
||||
# Copy bookmarks over:
|
||||
# we already know that there's no overlap in handles anywhere
|
||||
@ -237,11 +237,11 @@ def importData(database, filename, callback=None,cl=0,use_trans=True):
|
||||
os.unlink(new_filename)
|
||||
shutil.rmtree(new_env_name)
|
||||
|
||||
database.transaction_commit(trans,_("Import database"))
|
||||
database.transaction_commit(trans, _("Import database"))
|
||||
database.enable_signals()
|
||||
database.request_rebuild()
|
||||
|
||||
def check_common_handles(table,other_table,msg):
|
||||
def check_common_handles(table, other_table, msg):
|
||||
# Check for duplicate handles. At the moment we simply exit here,
|
||||
# before modifying any data. In the future we will need to handle
|
||||
# this better. How?
|
||||
@ -251,8 +251,8 @@ def check_common_handles(table,other_table,msg):
|
||||
raise HandleError(msg)
|
||||
return len(other_handles)
|
||||
|
||||
def import_table(id_table,add_obj,find_next_gramps_id,
|
||||
other_table,other_get_from_handle,trans,uc):
|
||||
def import_table(id_table, add_obj, find_next_gramps_id,
|
||||
other_table, other_get_from_handle, trans, uc):
|
||||
|
||||
for handle in other_table.keys():
|
||||
obj = other_get_from_handle(handle)
|
||||
@ -262,14 +262,14 @@ def import_table(id_table,add_obj,find_next_gramps_id,
|
||||
if id_table.has_key(gramps_id):
|
||||
gramps_id = find_next_gramps_id()
|
||||
obj.gramps_id = gramps_id
|
||||
add_obj(obj,trans)
|
||||
add_obj(obj, trans)
|
||||
uc.update()
|
||||
|
||||
def remap_name_formats(database,other_database):
|
||||
def remap_name_formats(database, other_database):
|
||||
formats_map = {}
|
||||
taken_numbers = [num for (num,name,fmt_str,active)
|
||||
taken_numbers = [num for (num, name, fmt_str, active)
|
||||
in database.name_formats]
|
||||
for (number,name,fmt_str,act) in other_database.name_formats:
|
||||
for (number, name, fmt_str, act) in other_database.name_formats:
|
||||
if number in taken_numbers:
|
||||
new_number = -1
|
||||
while new_number in taken_numbers:
|
||||
@ -278,10 +278,10 @@ def remap_name_formats(database,other_database):
|
||||
formats_map[number] = new_number
|
||||
else:
|
||||
new_number = number
|
||||
database.name_formats.append((new_number,name,fmt_str,act))
|
||||
database.name_formats.append((new_number, name, fmt_str, act))
|
||||
return formats_map
|
||||
|
||||
def remap_name(person,formats_map):
|
||||
def remap_name(person, formats_map):
|
||||
for name in [person.primary_name] + person.alternate_names:
|
||||
try:
|
||||
name.sort_as = formats_map[name.sort_as]
|
||||
@ -292,10 +292,10 @@ def remap_name(person,formats_map):
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
def make_peron_name_remapper(other_database,formats_map):
|
||||
def make_peron_name_remapper(other_database, formats_map):
|
||||
def new_get_person(handle):
|
||||
person = other_database.get_person_from_handle(handle)
|
||||
remap_name(person,formats_map)
|
||||
remap_name(person, formats_map)
|
||||
return person
|
||||
return new_get_person
|
||||
|
||||
@ -310,4 +310,4 @@ _filter.set_name(_('GRAMPS 2.x database'))
|
||||
_filter.add_mime_type(_mime_type)
|
||||
_format_name = _('GRAMPS 2.x database')
|
||||
|
||||
register_import(importData,_filter,_mime_type,0,_format_name)
|
||||
register_import(importData, _filter, _mime_type, 0, _format_name)
|
||||
|
@ -5,7 +5,7 @@
|
||||
#
|
||||
# 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
|
||||
# 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,
|
||||
@ -62,41 +62,41 @@ from PluginUtils import register_import
|
||||
#
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def impData(database, name,cb=None,cl=0):
|
||||
def impData(database, name, cb=None, cl=0):
|
||||
# Create tempdir, if it does not exist, then check for writability
|
||||
# THE TEMP DIR is named as the filname.gpkg.media and is created
|
||||
# in the same dir as the database that we are importing into.
|
||||
db_path = os.path.dirname(database.get_save_path())
|
||||
media_dir = "%s.media" % os.path.basename(name)
|
||||
tmpdir_path = os.path.join(db_path,media_dir)
|
||||
tmpdir_path = os.path.join(db_path, media_dir)
|
||||
if not os.path.isdir(tmpdir_path):
|
||||
try:
|
||||
os.mkdir(tmpdir_path,0700)
|
||||
os.mkdir(tmpdir_path, 0700)
|
||||
except:
|
||||
ErrorDialog( _("Could not create temporary directory %s") %
|
||||
tmpdir_path )
|
||||
return
|
||||
elif not os.access(tmpdir_path,os.W_OK):
|
||||
elif not os.access(tmpdir_path, os.W_OK):
|
||||
ErrorDialog(_("Temporary directory %s is not writable") % tmpdir_path)
|
||||
return
|
||||
else: # tempdir exists and writable -- clean it up if not empty
|
||||
files = os.listdir(tmpdir_path) ;
|
||||
for filename in files:
|
||||
os.remove(os.path.join(tmpdir_path,filename))
|
||||
os.remove(os.path.join(tmpdir_path, filename))
|
||||
|
||||
try:
|
||||
archive = tarfile.open(name)
|
||||
for tarinfo in archive:
|
||||
archive.extract(tarinfo,tmpdir_path)
|
||||
archive.extract(tarinfo, tmpdir_path)
|
||||
archive.close()
|
||||
except:
|
||||
ErrorDialog(_("Error extracting into %s") % tmpdir_path)
|
||||
return
|
||||
|
||||
imp_db_name = os.path.join(tmpdir_path,const.XMLFILE)
|
||||
imp_db_name = os.path.join(tmpdir_path, const.XMLFILE)
|
||||
|
||||
importer = gramps_db_reader_factory(const.APP_GRAMPS_XML)
|
||||
importer(database,imp_db_name,cb)
|
||||
importer(database, imp_db_name, cb)
|
||||
|
||||
# Clean up tempdir after ourselves
|
||||
# THIS HAS BEEN CHANGED, because now we want to keep images
|
||||
@ -105,7 +105,7 @@ def impData(database, name,cb=None,cl=0):
|
||||
|
||||
## files = os.listdir(tmpdir_path)
|
||||
## for filename in files:
|
||||
## os.remove(os.path.join(tmpdir_path,filename))
|
||||
## os.remove(os.path.join(tmpdir_path, filename))
|
||||
## os.rmdir(tmpdir_path)
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
@ -119,4 +119,4 @@ _filter.set_name(_('GRAMPS packages'))
|
||||
_filter.add_mime_type(_mime_type)
|
||||
_format_name = _('GRAMPS package')
|
||||
|
||||
register_import(impData,_filter,_mime_type,0,_format_name)
|
||||
register_import(impData, _filter, _mime_type, 0, _format_name)
|
||||
|
@ -82,8 +82,7 @@ _title_string = _("Export to CD")
|
||||
def writeData(database, filename, person, option_box=None, callback=None):
|
||||
ret = 0
|
||||
writer = PackageWriter(database, filename, callback)
|
||||
ret = writer.export()
|
||||
return ret
|
||||
writer.export()
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
Loading…
x
Reference in New Issue
Block a user