# # Gramps - a GTK+/GNOME based genealogy program # # Copyright (C) 2000 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 # from RelLib import * from Researcher import * import const import string import time import gzip import shutil import os #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def sortById(first,second): fid = first.getId() sid = second.getId() if fid < sid: return -1 else: return fid != sid #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def fix(line): l = string.strip(line) l = string.replace(l,'&','&') l = string.replace(l,'>','>') l = string.replace(l,'<','<') return string.replace(l,'"','"') #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def writeNote(g,val,note): if not note: return g.write("<" + val + ">") g.write(fix(note)) g.write("\n") #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def dump_event(g,event): if event: dump_my_event(g,event.getName(),event) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def dump_my_event(g,name,event): if not event: return date = event.getSaveDate() place = event.getPlace() description = event.getDescription() if not name and not date and not place and not description: return g.write("\n") write_line(g,"date",date) write_line(g,"place",place) write_line(g,"description",description) if event.getNote() != "": writeNote(g,"note",event.getNote()) dump_source_ref(g,event.getSourceRef()) g.write("\n") #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def dump_source_ref(g,source_ref): if source_ref: source = source_ref.getBase() if source: p = source_ref.getPage() c = source_ref.getComments() t = source_ref.getText() d = source_ref.getDate().getSaveDate() if p == "" and c == "" and t == "" and d == "": g.write("\n" % source.getId()) else: g.write("\n" % source.getId()) write_line(g,"spage",p) writeNote(g,"scomments",c) writeNote(g,"stext",t) write_line(g,"sdate",d) g.write("\n") #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def write_ref(g,label,person): if person: g.write('<%s ref="%s"/>\n' % (label,str(person.getId()))) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def write_id(g,label,person): if person: g.write('<%s id="%s">\n' % (label,str(person.getId()))) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def write_family_id(g,family): if family: rel = family.getRelationship() if rel != "": g.write('\n' % (str(family.getId()),rel)) else: g.write('\n' % str(family.getId())) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def write_line(g,label,value): if value: g.write('<%s>%s\n' % (label,fix(value),label)) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def dump_name(g,label,name): g.write('<%s>\n' % label) write_line(g,"first",name.getFirstName()) write_line(g,"last",name.getSurname()) write_line(g,"suffix",name.getSuffix()) write_line(g,"title",name.getTitle()) g.write('\n' % label) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def exportData(database, filename, callback): global db db = database date = string.split(time.ctime(time.time())) fileroot = os.path.dirname(filename) owner = database.getResearcher() personList = database.getPersonMap().values() personList.sort(sortById) familyList = database.getFamilyMap().values() familyList.sort(sortById) sourceList = database.getSourceMap().values() sourceList.sort(sortById) total = len(personList) + len(familyList) if os.path.isfile(filename): shutil.copy(filename, filename + ".bak") g = gzip.open(filename,"wb") g.write("\n") g.write("\n") g.write("
\n") g.write("\n" % len(database.getFamilyMap().values())) g.write("\n") write_line(g,"resname",owner.getName()) write_line(g,"resaddr",owner.getAddress()) write_line(g,"rescity",owner.getCity()) write_line(g,"resstate",owner.getState()) write_line(g,"rescountry",owner.getCountry()) write_line(g,"respostal",owner.getPostalCode()) write_line(g,"resphone",owner.getPhone()) write_line(g,"resemail",owner.getEmail()) g.write("\n") g.write("
\n") g.write("\n") total = len(personList) + len(familyList) delta = max(int(total/50),1) count = 0 for person in personList: if count % delta == 0: callback(float(count)/float(total)) count = count + 1 write_id(g,"person",person) if person.getGender() == Person.male: write_line(g,"gender","M") else: write_line(g,"gender","F") dump_name(g,"name",person.getPrimaryName()) for name in person.getAlternateNames(): dump_name(g,"aka",name) write_line(g,"uid",person.getPafUid()) write_line(g,"nick",person.getNickName()) dump_my_event(g,"Birth",person.getBirth()) dump_my_event(g,"Death",person.getDeath()) for event in person.getEventList(): dump_event(g,event) for photo in person.getPhotoList(): path = photo.getPath() if os.path.dirname(path) == fileroot: path = os.path.basename(path) g.write("\n") if len(person.getAddressList()) > 0: g.write("\n") for address in person.getAddressList(): g.write('
\n') write_line(g,"date",address.getDateObj().getSaveDate()) write_line(g,"street",address.getStreet()) write_line(g,"city",address.getCity()) write_line(g,"state",address.getState()) write_line(g,"country",address.getCountry()) write_line(g,"postal",address.getPostal()) if address.getNote() != "": writeNote(g,"note",address.getNote()) dump_source_ref(g,address.getSourceRef()) g.write('
\n') g.write('
\n') if len(person.getAttributeList()) > 0: g.write("\n") for attr in person.getAttributeList(): if attr.getSourceRef() or attr.getNote(): g.write('\n') write_line(g,"attr_type",attr.getType()) write_line(g,"attr_value",attr.getValue()) dump_source_ref(g,attr.getSourceRef()) writeNote(g,"note",attr.getNote()) g.write('\n') else: g.write('' % attr.getType()) g.write(fix(attr.getValue())) g.write('\n') g.write('\n') if len(person.getUrlList()) > 0: g.write("\n") for url in person.getUrlList(): g.write('\n') g.write('\n') write_ref(g,"childof",person.getMainFamily()) for alt in person.getAltFamilyList(): g.write("\n") for family in person.getFamilyList(): write_ref(g,"parentin",family) writeNote(g,"note",person.getNote()) g.write("\n") g.write("\n") g.write("\n") for family in familyList: if count % delta == 0: callback(float(count)/float(total)) count = count + 1 write_family_id(g,family) write_ref(g,"father",family.getFather()) write_ref(g,"mother",family.getMother()) dump_event(g,family.getMarriage()) dump_event(g,family.getDivorce()) for event in family.getEventList(): dump_event(g,event) for photo in family.getPhotoList(): path = photo.getPath() if os.path.dirname(path) == fileroot: path = os.path.basename(path) g.write("\n") if len(family.getChildList()) > 0: g.write("\n") for person in family.getChildList(): write_ref(g,"child",person) g.write("\n") if len(family.getAttributeList()) > 0: g.write("\n") for attr in family.getAttributeList(): g.write('\n') write_line(g,"attr_type",attr.getType()) write_line(g,"attr_value",attr.getValue()) dump_source_ref(g,attr.getSourceRef()) writeNote(g,"note",attr.getNote()) g.write('\n') g.write('\n') writeNote(g,"note",family.getNote()) g.write("
\n") g.write("\n") if len(sourceList) > 0: g.write("\n") for source in sourceList: g.write("\n") write_line(g,"stitle",source.getTitle()) write_line(g,"sauthor",source.getAuthor()) write_line(g,"spubinfo",source.getPubInfo()) write_line(g,"scallno",source.getCallNumber()) if source.getNote() != "": writeNote(g,"note",source.getNote()) for photo in source.getPhotoList(): path = photo.getPath() if os.path.dirname(path) == fileroot: path = os.path.basename(path) g.write("\n") g.write("\n") g.write("\n") if len(db.getBookmarks()) > 0: g.write("\n") for person in db.getBookmarks(): g.write("\n") g.write("\n") g.write("\n") g.close()