From 53cc3c990de728b50429f43bff7c940cbc89ba7c Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Sun, 26 Jun 2005 22:31:25 +0000 Subject: [PATCH] * src/ReadXML.py: prevent duplicate place names on import * src/ReadGedcom.py: prevent duplicate place names on import svn: r4879 --- gramps2/ChangeLog | 4 ++ gramps2/src/ReadGedcom.py | 37 +++++++++++++-- gramps2/src/ReadXML.py | 97 +++++++-------------------------------- 3 files changed, 53 insertions(+), 85 deletions(-) diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 10bd81135..6ad5a9ef9 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,7 @@ +2005-06-26 Don Allingham + * src/ReadXML.py: prevent duplicate place names on import + * src/ReadGedcom.py: prevent duplicate place names on import + 2005-06-26 Julio Sanchez * src/GenericFilter.py: Fix uninitialized ancestor_cache in HasCommonAncestorWithFilterMatch, fix or-ing filters diff --git a/gramps2/src/ReadGedcom.py b/gramps2/src/ReadGedcom.py index 2e7cb5de1..f48af74d2 100644 --- a/gramps2/src/ReadGedcom.py +++ b/gramps2/src/ReadGedcom.py @@ -32,6 +32,7 @@ import re import string import const import time +import sets from gettext import gettext as _ #------------------------------------------------------------------------- @@ -279,6 +280,15 @@ class GedcomParser: self.lid2id = {} self.fid2id = {} + self.place_names = sets.Set() + cursor = dbase.get_place_cursor() + data = cursor.next() + while data: + (handle,val) = data + self.place_names.add(val[2]) + data = cursor.next() + cursor.close() + self.f = open(filename,"rU") self.filename = filename self.index = 0 @@ -742,16 +752,35 @@ class GedcomParser: self.sid2id[gramps_id] = intid return source - def find_or_create_place(self,gramps_id): + def find_or_create_place(self,title): place = RelLib.Place() - intid = self.lid2id.get(gramps_id) + + # check to see if we've encountered this name before + # if we haven't we need to get a new GRAMPS ID + intid = self.lid2id.get(title) + if intid == None: + new_id = self.db.find_next_place_gramps_id() + else: + new_id = None + + # check to see if the name already existed in the database + # if it does, create a new name by appending the GRAMPS ID. + # generate a GRAMPS ID if needed + + if title in self.place_names: + if not new_id: + new_id = self.db.find_next_place_gramps_id() + pname = "%s [%s]" % (title,new_id) + else: + pname = title + if self.db.place_map.has_key(intid): place.unserialize(self.db.place_map.get(intid)) else: intid = create_id() place.set_handle(intid) - place.set_title(gramps_id) - place.set_gramps_id(self.db.find_next_place_gramps_id()) + place.set_title(pname) + place.set_gramps_id(new_id) self.db.add_place(place,self.trans) self.lid2id[gramps_id] = intid return place diff --git a/gramps2/src/ReadXML.py b/gramps2/src/ReadXML.py index c68674187..41ee97573 100644 --- a/gramps2/src/ReadXML.py +++ b/gramps2/src/ReadXML.py @@ -26,6 +26,7 @@ # #------------------------------------------------------------------------- import os +import sets import gtk import shutil from xml.parsers.expat import ExpatError, ParserCreate @@ -171,87 +172,6 @@ def importData(database, filename, callback=None,cl=0,use_trans=True): database.commit_media_object(mobject,None,change) except (IOError,OSError),msg: ErrorDialog(_('Could not copy file'),str(msg)) - - -#------------------------------------------------------------------------- -# def remove_clicked(): -# # File is lost => remove all references and the object itself -# mobj = database.find_object_from_handle(NewMediaID) -# for fid in database.get_family_handles(): -# p = database.get_family_from_handle(fid) -# nl = p.get_media_list() -# for o in nl: -# if o.get_reference() == mobj: -# nl.remove(o) -# p.set_media_list(nl) -# for key in database.get_person_handles(sort_handles=False): -# p = database.find_person_from_handle(key) -# nl = p.get_media_list() -# for o in nl: -# if o.get_reference_handle() == mobj.get_handle(): -# nl.remove(o) -# p.set_media_list(nl) -# for key in database.get_source_handles(): -# p = database.find_source_from_handle(key) -# nl = p.get_media_list() -# for o in nl: -# if o.get_reference_handle() == mobj.get_handle(): -# nl.remove(o) -# p.set_media_list(nl) -# for key in database.get_place_handles(): -# p = database.find_place_from_handle(key) -# nl = p.get_media_list() -# for o in nl: -# if o.get_reference() == mobj: -# nl.remove(o) -# p.set_media_list(nl) -# database.remove_object(NewMediaID) - - -# def leave_clicked(): -# # File is lost => do nothing, leave as is -# pass - -# def select_clicked(): -# # File is lost => select a file to replace the lost one -# def fs_close_window(obj): -# pass - -# def fs_ok_clicked(obj): -# name = fs_top.get_filename() -# if os.path.isfile(name): -# shutil.copyfile(name,newfile) -# try: -# shutil.copystat(name,newfile) -# except: -# pass - -# choose = gtk.FileChooserDialog('Select file', -# None, -# gtk.FILE_CHOOSER_ACTION_OPEN, -# (gtk.STOCK_CANCEL, -# gtk.RESPONSE_CANCEL, -# gtk.STOCK_OPEN, -# gtk.RESPONSE_OK)) - -# filter = gtk.FileFilter() -# filter.set_name(_('All files')) -# filter.add_pattern('*') -# choose.add_filter(filter) - -# response = choose.run() -# if response == gtk.RESPONSE_OK: -# name = fs_top.get_filename() -# if os.path.isfile(name): -# shutil.copyfile(name,newfile) -# try: -# shutil.copystat(name,newfile) -# except: -# pass -# choose.destroy() - -# del parser -# return 1 #------------------------------------------------------------------------- # @@ -286,6 +206,15 @@ class GrampsParser: self.gid2sid = {} self.change = change self.dp = DateHandler.parser + + self.place_names = sets.Set() + cursor = database.get_place_cursor() + data = cursor.next() + while data: + (handle,val) = data + self.place_names.add(val[2]) + data = cursor.next() + cursor.close() self.ord = None self.objref = None @@ -615,6 +544,7 @@ class GrampsParser: title = attrs['title'] if title == "": title = attrs['id'] + self.placeobj.set_title(title) self.locations = 0 if self.callback != None and self.count % self.increment == 0: @@ -1156,6 +1086,11 @@ class GrampsParser: if self.placeobj.get_title() == "": loc = self.placeobj.get_main_location() self.placeobj.set_title(build_place_title(loc)) + + title = self.placeobj.get_title() + if title in self.place_names: + self.placeobj.set_title(title + " [%s]" % self.placeobj.get_gramps_id()) + self.db.commit_place(self.placeobj,self.trans,self.change) self.placeobj = None