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

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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.") +

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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")

View File

@ -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
#-------------------------------------------------------------------------
#

View File

@ -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):

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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.") +

View File

@ -19,4 +19,4 @@
#
__version__ = "$Revision: $"
__all__ = [ "proxy" ]
__all__ = [ "proxy", "db" ]

30
src/gen/db/Makefile.am Normal file
View 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));

View File

@ -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

View File

@ -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:

View File

@ -1,4 +1,4 @@
from _LongOpStatus import LongOpStatus
from longop import LongOpStatus
class CursorIterator(object):

View File

@ -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

View File

@ -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)

View File

@ -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"),
}

View File

@ -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)

View File

@ -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)

View File

@ -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()
#-------------------------------------------------------------------------
#