#
# 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("" + val + ">\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%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('%s>\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")
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()