diff --git a/ChangeLog b/ChangeLog index 12a04a055..a80cd248d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-01-28 Alex Roitman + * src/PedView.py: Fix remnants of gnome.canvas syntax. + * src/ReadGrdb.py: Add to CVS: native database importer. + * src/DbPrompter.py: Support for the native importer. + * src/Errors.py: Add HandleError exception for duplicate handles. + 2005-01-26 Don Allingham * src/DbPrompter.py: gnome.vfs vs. gnomevfs, tolerence * src/GrampsMime.py: gnome.vfs vs. gnomevfs tolerence diff --git a/src/DbPrompter.py b/src/DbPrompter.py index f0ea2d6d5..b9d158e38 100644 --- a/src/DbPrompter.py +++ b/src/DbPrompter.py @@ -249,12 +249,11 @@ class ImportDbPrompter: mime_filter.add_pattern('*') choose.add_filter(mime_filter) -# FIXME: Uncomment when we have grdb importer -# # Always add native format filter -# mime_filter = gtk.FileFilter() -# mime_filter.set_name(_('GRAMPS databases')) -# mime_filter.add_mime_type(const.app_gramps) -# choose.add_filter(mime_filter) + # Always add native format filter + mime_filter = gtk.FileFilter() + mime_filter.set_name(_('GRAMPS databases')) + mime_filter.add_mime_type(const.app_gramps) + choose.add_filter(mime_filter) # Add more data type selections if opening existing db for (importData,mime_filter,mime_type,native_format) in PluginMgr.import_list: @@ -275,12 +274,13 @@ class ImportDbPrompter: if response == gtk.RESPONSE_OK: filename = choose.get_filename() filetype = get_mime_type(filename) -# FIXME: Uncomment when we have grdb importer -# -# if filetype == 'application/x-gramps': -# choose.destroy() -# self.parent.read_file(filename) -# return True + + if filetype == 'application/x-gramps': + choose.destroy() + import ReadGrdb + ReadGrdb.importData(self.parent.db,filename) + self.parent.import_tool_callback() + return True (the_path,the_file) = os.path.split(filename) GrampsKeys.save_last_import_dir(the_path) diff --git a/src/Errors.py b/src/Errors.py index f769eaf1b..7e814364f 100644 --- a/src/Errors.py +++ b/src/Errors.py @@ -1,7 +1,7 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2003 Donald N. Allingham +# Copyright (C) 2003-2005 Donald N. Allingham # # 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 @@ -18,6 +18,8 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +# $Id$ + class FilterError(Exception): """Error used to report Filter errors""" def __init__(self,value,value2=""): @@ -70,3 +72,12 @@ class PluginError(Exception): def __str__(self): return self.value + +class HandleError(Exception): + """Error used to report wrong database handle errors""" + def __init__(self,value): + Exception.__init__(self) + self.value = value + + def __str__(self): + return self.value diff --git a/src/PedView.py b/src/PedView.py index 7e3a8a74c..0a9c6402f 100644 --- a/src/PedView.py +++ b/src/PedView.py @@ -1,7 +1,7 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2001-2004 Donald N. Allingham +# Copyright (C) 2001-2005 Donald N. Allingham # # 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 @@ -98,8 +98,8 @@ class DispBox: self.exp = "%s" % self.name - self.group = self.root.add(gnome.canvas.CanvasGroup,x=x,y=y) - self.shadow = self.group.add(gnome.canvas.CanvasRect, + self.group = self.root.add(CanvasGroup,x=x,y=y) + self.shadow = self.group.add(CanvasRect, x1=shadow, y1=shadow, x2=w+shadow, @@ -108,7 +108,7 @@ class DispBox: fill_color_gdk=style.dark[gtk.STATE_NORMAL]) # draw the real box - self.bkgnd = self.group.add(gnome.canvas.CanvasRect, + self.bkgnd = self.group.add(CanvasRect, x1=0, y1=0, x2=w, @@ -117,7 +117,7 @@ class DispBox: fill_color_gdk=style.base[gtk.STATE_NORMAL]) font = gtk.gdk.font_from_description(style.font_desc) - self.textbox = self.group.add(gnome.canvas.CanvasText, + self.textbox = self.group.add(CanvasText, x=xpad, y=h/2.0, text=self.name, @@ -265,7 +265,7 @@ class PedigreeView: xpts = self.build_x_coords(cw/xdiv,_CANVASPAD+h) ypts = self.build_y_coords((ch-h)/32.0, h) - self.anchor_txt = self.root.add(gnome.canvas.CanvasText, + self.anchor_txt = self.root.add(CanvasText, x=0, y=y2-12, font=font, @@ -279,7 +279,7 @@ class PedigreeView: if len(family.get_child_handle_list()) > 0: button,arrow = self.make_arrow_button(gtk.ARROW_LEFT, self.on_show_child_menu) - item = self.root.add(gnome.canvas.CanvasWidget, widget=button, + item = self.root.add(CanvasWidget, widget=button, x=_CANVASPAD, y=ypts[0]+(h/2.0), height=h, width=h, size_pixels=1, anchor=gtk.ANCHOR_WEST) @@ -305,7 +305,7 @@ class PedigreeView: gen_no = len(firstRel)-len(secondRel) for i in range(int(xdiv)): - item = self.root.add(gnome.canvas.CanvasText, x=(cw*i/xdiv + cpad), y=h, + item = self.root.add(CanvasText, x=(cw*i/xdiv + cpad), y=h, text=str(gen_no), font=font, anchor=gtk.ANCHOR_WEST) @@ -422,7 +422,7 @@ class PedigreeView: button,arrow = self.make_arrow_button(gtk.ARROW_RIGHT,self.change_to_parent) button.set_data(_PERSON,parent.get_handle()) - item = self.root.add(gnome.canvas.CanvasWidget, widget=button, x=x, y=y+(h/2), + item = self.root.add(CanvasWidget, widget=button, x=x, y=y+(h/2), height=h, width=h, size_pixels=1, anchor=gtk.ANCHOR_EAST) self.canvas_items.append(arrow) @@ -445,7 +445,7 @@ class PedigreeView: startx = x1+(w/2.0) pts = [startx,y1, startx,y2+(h/2.0), x2,y2+(h/2.0)] - item = self.root.add(gnome.canvas.CanvasLine, width_pixels=2, + item = self.root.add(CanvasLine, width_pixels=2, points=pts, line_style=ls, fill_color_gdk=style.fg[gtk.STATE_NORMAL]) item.set_data(_PERSON,data.get_handle()) diff --git a/src/ReadGrdb.py b/src/ReadGrdb.py new file mode 100644 index 000000000..6c616d825 --- /dev/null +++ b/src/ReadGrdb.py @@ -0,0 +1,176 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2005 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +# $Id$ + +# Written by Alex Roitman, +# largely based on ReadXML by Don Allingham + +#------------------------------------------------------------------------- +# +# Standard Python Modules +# +#------------------------------------------------------------------------- +import os +from gettext import gettext as _ + +#------------------------------------------------------------------------- +# +# GTK +# +#------------------------------------------------------------------------- +import gtk + +#------------------------------------------------------------------------- +# +# Gramps Modules +# +#------------------------------------------------------------------------- +import GrampsBSDDB +from QuestionDialog import ErrorDialog +import Errors + +#------------------------------------------------------------------------- +# +# Importing data into the currently open database. +# +#------------------------------------------------------------------------- +def importData(database, filename, callback=None,cl=0,use_trans=True): + + filename = os.path.normpath(filename) + basefile = os.path.dirname(filename) + + change = os.path.getmtime(filename) + + other_database = GrampsBSDDB.GrampsBSDDB() + + try: + other_database.load(filename,callback) + except: + if cl: + print "Error: %s could not be opened. Exiting." % filename + else: + ErrorDialog(_("%s could not be opened") % filename) + return + + trans = database.transaction_begin() + # copy all data from new_database to database, + # rename gramps IDs of first-class objects when conflicts are found + + # People table + for person_handle in other_database.person_map.keys(): + person = other_database.get_person_from_handle(person_handle) + + # First, check whether this handle is a duplicate, and do something + if person_handle in database.person_map.keys(): + raise Errors.HandleError( + 'Handle %s is already present in the opened database.\n' + 'Name: %s' % (person_handle,person.get_primary_name().get_regular_name()) + ) + + # Then we check gramps_id for conflicts and change it if needed + gramps_id = str(person.get_gramps_id()) + if database.id_trans.has_key(gramps_id): + gramps_id = database.find_next_person_gramps_id() + person.set_gramps_id(gramps_id) + database.add_person(person,trans) + + # Family table + for family_handle in other_database.family_map.keys(): + family = other_database.get_family_from_handle(family_handle) + + # First, check whether this handle is a duplicate, and do something + if family_handle in database.family_map.keys(): + raise Errors.HandleError( + 'Handle %s is already present in the opened database.' % family_handle + ) + + # Then we check gramps_id for conflicts and change it if needed + gramps_id = str(family.get_gramps_id()) + if database.fid_trans.has_key(gramps_id): + gramps_id = database.find_next_family_gramps_id() + family.set_gramps_id(gramps_id) + database.add_family(family,trans) + + # Place table + for place_handle in other_database.place_map.keys(): + place = other_database.get_place_from_handle(place_handle) + + # First, check whether this handle is a duplicate, and do something + if place_handle in database.place_map.keys(): + raise Errors.HandleError( + 'Handle %s is already present in the opened database.' % place_handle + ) + + # Then we check gramps_id for conflicts and change it if needed + gramps_id = str(place.get_gramps_id()) + if database.pid_trans.has_key(gramps_id): + gramps_id = database.find_next_place_gramps_id() + place.set_gramps_id(gramps_id) + database.add_place(place,trans) + + # Source table + for source_handle in other_database.source_map.keys(): + source = other_database.get_source_from_handle(source_handle) + + # First, check whether this handle is a duplicate, and do something + if source_handle in database.source_map.keys(): + raise Errors.HandleError( + 'Handle %s is already present in the opened database.' % source_handle + ) + + # Then we check gramps_id for conflicts and change it if needed + gramps_id = str(source.get_gramps_id()) + if database.sid_trans.has_key(gramps_id): + gramps_id = database.find_next_source_gramps_id() + source.set_gramps_id(gramps_id) + database.add_source(source,trans) + + # Media table + for media_handle in other_database.media_map.keys(): + media = other_database.get_object_from_handle(media_handle) + + # First, check whether this handle is a duplicate, and do something + if media_handle in database.media_map.keys(): + raise Errors.HandleError( + 'Handle %s is already present in the opened database.' % media_handle + ) + + # Then we check gramps_id for conflicts and change it if needed + gramps_id = str(media.get_gramps_id()) + if database.oid_trans.has_key(gramps_id): + gramps_id = database.find_next_object_gramps_id() + media.set_gramps_id(gramps_id) + database.add_object(media,trans) + + # Event table + for event_handle in other_database.event_map.keys(): + event = other_database.get_event_from_handle(event_handle) + + # First, check whether this handle is a duplicate, and do something + if event_handle in database.event_map.keys(): + raise Errors.HandleError( + 'Handle %s is already present in the opened database.' % event_handle + ) + + # Events don't have gramps IDs, so we don't need to check here + database.add_event(event,trans) + + database.transaction_commit(trans,_("Import database"))