* src/plugins/WriteGedcom.py: Rewrite to enable passing the

options interface.
* src/Exporter.py: Use options if given by the plugin.


svn: r3262
This commit is contained in:
Alex Roitman 2004-07-11 06:03:07 +00:00
parent 91d89048e1
commit 156607d9af
3 changed files with 200 additions and 156 deletions

View File

@ -3,6 +3,10 @@
* src/Exporter.py: Clean up, add doc strings. * src/Exporter.py: Clean up, add doc strings.
* src/plugins/WriteGedcom.py: Change registration. * src/plugins/WriteGedcom.py: Change registration.
* src/plugins/WriteGedcom.py: Rewrite to enable passing the
options interface.
* src/Exporter.py: Use options if given by the plugin.
2004-07-09 Don Allingham <dallingham@users.sourceforge.net> 2004-07-09 Don Allingham <dallingham@users.sourceforge.net>
* src/AddMedia.py: Handle the new file selector * src/AddMedia.py: Handle the new file selector
* src/MediaView.py: redraw list properly * src/MediaView.py: redraw list properly

View File

@ -76,9 +76,9 @@ class Exporter:
self.parent = parent self.parent = parent
self.parent_window = parent_window self.parent_window = parent_window
if self.parent.active_person: if self.parent.active_person:
self.active_person = self.parent.active_person self.person = self.parent.active_person
else: else:
self.active_person = self.parent.find_initial_person() self.person = self.parent.find_initial_person()
self.build_exports() self.build_exports()
self.confirm_label = gtk.Label() self.confirm_label = gtk.Label()
@ -90,18 +90,19 @@ class Exporter:
self.logo = gtk.gdk.pixbuf_new_from_file("%s/gramps.png" % const.rootDir) self.logo = gtk.gdk.pixbuf_new_from_file("%s/gramps.png" % const.rootDir)
self.splash = gtk.gdk.pixbuf_new_from_file("%s/splash.jpg" % const.rootDir) self.splash = gtk.gdk.pixbuf_new_from_file("%s/splash.jpg" % const.rootDir)
d = gnome.ui.Druid() self.d = gnome.ui.Druid()
self.w.add(d) self.w.add(self.d)
d.add(self.build_info_page()) self.d.add(self.build_info_page())
d.add(self.build_format_page()) self.d.add(self.build_format_page())
d.add(self.build_file_sel_page()) self.file_sel_page = self.build_file_sel_page()
d.add(self.build_confirm_page()) self.d.add(self.file_sel_page)
self.d.add(self.build_confirm_page())
self.last_page = self.build_last_page() self.last_page = self.build_last_page()
d.add(self.last_page) self.d.add(self.last_page)
d.set_show_help(gtk.TRUE) self.d.set_show_help(gtk.TRUE)
d.connect('cancel',self.close) self.d.connect('cancel',self.close)
d.connect('help',self.help) self.d.connect('help',self.help)
self.w.connect("destroy_event",self.close) self.w.connect("destroy_event",self.close)
self.w.set_transient_for(self.parent_window) self.w.set_transient_for(self.parent_window)
@ -202,7 +203,11 @@ class Exporter:
""" """
filename = self.chooser.get_filename() filename = self.chooser.get_filename()
ix = self.get_selected_format_index() ix = self.get_selected_format_index()
success = self.exports[ix][0](self.parent.db,filename) if self.exports[ix][3]:
success = self.exports[ix][0](self.parent.db,filename,self.person,
self.option_box_instance)
else:
success = self.exports[ix][0](self.parent.db,filename,self.person)
if success: if success:
self.last_page.set_title(_('Your data has been saved')) self.last_page.set_title(_('Your data has been saved'))
self.last_page.set_text(_('The copy of your data has been ' self.last_page.set_text(_('The copy of your data has been '
@ -256,8 +261,25 @@ class Exporter:
box.add(table) box.add(table)
box.show_all() box.show_all()
p.connect('next',self.build_options)
return p return p
def build_options(self,obj,obj2):
ix = self.get_selected_format_index()
if self.exports[ix][3]:
title = self.exports[ix][3][0]
option_box_class = self.exports[ix][3][1]
self.option_box_instance = option_box_class(self.person)
p = gnome.ui.DruidPageStandard()
p.set_title(title)
p.set_title_foreground(self.fg_color)
p.set_background(self.bg_color)
p.set_logo(self.logo)
p.append_item("",self.option_box_instance.get_option_box(),"")
self.d.insert_page(self.file_sel_page,p)
p.show_all()
def build_file_sel_page(self): def build_file_sel_page(self):
""" """
Build a druid page embedding the FileChooserWidget. Build a druid page embedding the FileChooserWidget.
@ -298,7 +320,7 @@ class Exporter:
else: else:
return 0 return 0
def native_export(self,database,filename): def native_export(self,database,filename,person):
""" """
Native database export. For now, just stupid copying of the present Native database export. For now, just stupid copying of the present
grdb file under another name. In the future, filter and other grdb file under another name. In the future, filter and other

View File

@ -343,46 +343,29 @@ def writeData(database,person):
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class GedcomWriter: class GedcomWriterOptionBox:
"""Writes a GEDCOM file from the passed database""" """
def __init__(self,db,person,cl=0,name=""): Create a VBox with the option widgets and define methods to retrieve
self.db = db the options.
"""
def __init__(self,person):
self.person = person self.person = person
def get_option_box(self):
self.restrict = 1 self.restrict = 1
self.private = 1 self.private = 1
self.cnvtxt = ansel_utf8.utf8_to_ansel self.cnvtxt = ansel_utf8.utf8_to_ansel
self.plist = {}
self.slist = {}
self.flist = {}
self.adopt = GedcomInfo.ADOPT_EVENT self.adopt = GedcomInfo.ADOPT_EVENT
self.fidval = 0
self.fidmap = {}
self.pidval = 0
self.pidmap = {}
self.sidval = 0
self.sidmap = {}
self.cl = cl
self.name = name
if self.cl:
self.cl_setup()
else:
glade_file = "%s/gedcomexport.glade" % os.path.dirname(__file__) glade_file = "%s/gedcomexport.glade" % os.path.dirname(__file__)
self.topDialog = gtk.glade.XML(glade_file,"gedcomExport","gramps") self.topDialog = gtk.glade.XML(glade_file,"gedcomExport","gramps")
self.topDialog.signal_autoconnect({ self.topDialog.signal_autoconnect({
"destroy_passed_object" : Utils.destroy_passed_object,
"gnu_free" : self.gnu_free, "gnu_free" : self.gnu_free,
"standard_copyright" : self.standard_copyright, "standard_copyright" : self.standard_copyright,
"no_copyright" : self.no_copyright, "no_copyright" : self.no_copyright,
"on_restrict_toggled": self.on_restrict_toggled, "on_restrict_toggled": self.on_restrict_toggled,
"on_ok_clicked" : self.on_ok_clicked,
"on_help_clicked" : self.on_help_clicked
}) })
Utils.set_titles(self.topDialog.get_widget('gedcomExport'),
self.topDialog.get_widget('title'),
_('GEDCOM export'))
filter_obj = self.topDialog.get_widget("filter") filter_obj = self.topDialog.get_widget("filter")
self.copy = 0 self.copy = 0
@ -391,17 +374,17 @@ class GedcomWriter:
all.add_rule(GenericFilter.Everyone([])) all.add_rule(GenericFilter.Everyone([]))
des = GenericFilter.GenericFilter() des = GenericFilter.GenericFilter()
des.set_name(_("Descendants of %s") % person.get_primary_name().get_name()) des.set_name(_("Descendants of %s") % self.person.get_primary_name().get_name())
des.add_rule(GenericFilter.IsDescendantOf([person.get_id()])) des.add_rule(GenericFilter.IsDescendantOf([self.person.get_id()]))
ans = GenericFilter.GenericFilter() ans = GenericFilter.GenericFilter()
ans.set_name(_("Ancestors of %s") % person.get_primary_name().get_name()) ans.set_name(_("Ancestors of %s") % self.person.get_primary_name().get_name())
ans.add_rule(GenericFilter.IsAncestorOf([person.get_id()])) ans.add_rule(GenericFilter.IsAncestorOf([self.person.get_id()]))
com = GenericFilter.GenericFilter() com = GenericFilter.GenericFilter()
com.set_name(_("People with common ancestor with %s") % com.set_name(_("People with common ancestor with %s") %
person.get_primary_name().get_name()) self.person.get_primary_name().get_name())
com.add_rule(GenericFilter.HasCommonAncestorWith([person.get_id()])) com.add_rule(GenericFilter.HasCommonAncestorWith([self.person.get_id()]))
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com]) self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
filter_obj.set_menu(self.filter_menu) filter_obj.set_menu(self.filter_menu)
@ -420,13 +403,11 @@ class GedcomWriter:
target_obj.set_menu(myMenu) target_obj.set_menu(myMenu)
self.target_menu = myMenu self.target_menu = myMenu
pathname = os.path.join (os.path.dirname(db.get_save_path()), the_box = self.topDialog.get_widget('vbox1')
"export.ged") the_parent = self.topDialog.get_widget('dialog-vbox1')
the_parent.remove(the_box)
filetgt = self.topDialog.get_widget('fileentry1') self.topDialog.get_widget("gedcomExport").destroy()
filetgt.set_filename(pathname) return the_box
self.topDialog.get_widget("gedcomExport").show()
def gnu_free(self,obj): def gnu_free(self,obj):
self.copy = 1 self.copy = 1
@ -444,7 +425,7 @@ class GedcomWriter:
self.topDialog.get_widget("notes"), self.topDialog.get_widget("notes"),
self.topDialog.get_widget("sources")]) self.topDialog.get_widget("sources")])
def on_ok_clicked(self,obj): def parse_options(self):
self.restrict = self.topDialog.get_widget("restrict").get_active() self.restrict = self.topDialog.get_widget("restrict").get_active()
self.living = (self.restrict and self.living = (self.restrict and
@ -455,7 +436,7 @@ class GedcomWriter:
self.topDialog.get_widget("sources").get_active()) self.topDialog.get_widget("sources").get_active())
self.private = self.topDialog.get_widget("private").get_active() self.private = self.topDialog.get_widget("private").get_active()
cfilter = self.filter_menu.get_active().get_data("filter") self.cfilter = self.filter_menu.get_active().get_data("filter")
act_tgt = self.target_menu.get_active() act_tgt = self.target_menu.get_active()
self.target_ged = act_tgt.get_data("data") self.target_ged = act_tgt.get_data("data")
@ -482,14 +463,79 @@ class GedcomWriter:
self.cnvtxt = keep_utf8 self.cnvtxt = keep_utf8
self.nl = self.cnvtxt(self.target_ged.get_endl()) self.nl = self.cnvtxt(self.target_ged.get_endl())
name = unicode(self.topDialog.get_widget("filename").get_text())
if cfilter == None: # glade_file = "%s/gedcomexport.glade" % os.path.dirname(__file__)
#
# self.exprogress = gtk.glade.XML(glade_file,"exportprogress","gramps")
# self.exprogress.signal_autoconnect({
# "on_close_clicked" : Utils.destroy_passed_object
# })
#
# Utils.set_titles(self.exprogress.get_widget('exportprogress'),
# self.exprogress.get_widget('title'),
# _('GEDCOM export'))
#
# self.fbar = self.exprogress.get_widget("fbar")
# self.pbar = self.exprogress.get_widget("pbar")
# self.sbar = self.exprogress.get_widget("sbar")
# self.progress = self.exprogress.get_widget('exportprogress')
#
# closebtn = self.exprogress.get_widget("close")
# closebtn.connect("clicked",Utils.destroy_passed_object)
# closebtn.set_sensitive(0)
#
# self.export_data(name)
# closebtn.set_sensitive(1)
class GedcomWriter:
def __init__(self,database,person,cl=0,filename="",option_box=None):
self.db = database
self.person = person
self.option_box = option_box
self.cl = cl
self.filename = filename
self.plist = {}
self.slist = {}
self.flist = {}
self.fidval = 0
self.fidmap = {}
self.pidval = 0
self.pidmap = {}
self.sidval = 0
self.sidmap = {}
if not option_box:
self.cl_setup()
else:
self.option_box.parse_options()
self.restrict = self.option_box.restrict
self.living = self.option_box.living
self.exclnotes = self.option_box.exclnotes
self.exclsrcs = self.option_box.exclsrcs
self.private = self.option_box.private
self.copy = self.option_box.copy
self.images = self.option_box.images
self.target_ged = self.option_box.target_ged
self.dest = self.option_box.dest
self.adopt = self.option_box.adopt
self.conc = self.option_box.conc
self.altname = self.option_box.altname
self.cal = self.option_box.cal
self.obje = self.option_box.obje
self.resi = self.option_box.resi
self.prefix = self.option_box.prefix
self.source_refs = self.option_box.source_refs
self.cnvtxt = self.option_box.cnvtxt
self.nl = self.option_box.nl
if self.option_box.cfilter == None:
for p in self.db.get_person_keys(): for p in self.db.get_person_keys():
self.plist[p] = 1 self.plist[p] = 1
else: else:
try: try:
for p in cfilter.apply(self.db, self.db.get_person_keys()): for p in self.option_box.cfilter.apply(self.db, self.db.get_person_keys()):
self.plist[p] = 1 self.plist[p] = 1
except Errors.FilterError, msg: except Errors.FilterError, msg:
(m1,m2) = msg.messages() (m1,m2) = msg.messages()
@ -500,40 +546,11 @@ class GedcomWriter:
self.slist = {} self.slist = {}
for key in self.plist.keys(): for key in self.plist.keys():
p = self.db.get_person(key) p = self.db.get_person(key)
add_persons_sources(self.db,p,self.slist,self.private) add_persons_sources(self.db,p,self.slist,self.option_box.private)
for family_id in p.get_family_id_list(): for family_id in p.get_family_id_list():
add_familys_sources(self.db,family_id,self.slist,self.private) add_familys_sources(self.db,family_id,self.slist,self.option_box.private)
self.flist[family_id] = 1 self.flist[family_id] = 1
Utils.destroy_passed_object(obj)
glade_file = "%s/gedcomexport.glade" % os.path.dirname(__file__)
self.exprogress = gtk.glade.XML(glade_file,"exportprogress","gramps")
self.exprogress.signal_autoconnect({
"on_close_clicked" : Utils.destroy_passed_object
})
Utils.set_titles(self.exprogress.get_widget('exportprogress'),
self.exprogress.get_widget('title'),
_('GEDCOM export'))
self.fbar = self.exprogress.get_widget("fbar")
self.pbar = self.exprogress.get_widget("pbar")
self.sbar = self.exprogress.get_widget("sbar")
self.progress = self.exprogress.get_widget('exportprogress')
closebtn = self.exprogress.get_widget("close")
closebtn.connect("clicked",Utils.destroy_passed_object)
closebtn.set_sensitive(0)
self.export_data(name)
closebtn.set_sensitive(1)
def on_help_clicked(self,obj):
"""Display the relevant portion of GRAMPS manual"""
gnome.help_display('gramps-manual','export-data')
def cl_setup(self): def cl_setup(self):
self.restrict = 0 self.restrict = 0
self.private = 0 self.private = 0
@ -569,23 +586,22 @@ class GedcomWriter:
add_familys_sources(self.db,family_id,self.slist,self.private) add_familys_sources(self.db,family_id,self.slist,self.private)
self.flist[family_id] = 1 self.flist[family_id] = 1
self.export_data(self.name)
def writeln(self,text): def writeln(self,text):
self.g.write('%s%s' % (text,self.nl)) self.g.write('%s%s' % (text,self.nl))
def export_data(self,filename): def export_data(self,filename):
self.dirname = os.path.dirname (filename) self.dirname = os.path.dirname (filename)
try: try:
self.g = open(filename,"w") self.g = open(filename,"w")
except IOError,msg: except IOError,msg:
msg2 = _("Could not create %s") % filename msg2 = _("Could not create %s") % filename
ErrorDialog(msg2,str(msg)) ErrorDialog(msg2,str(msg))
self.progress.destroy() # self.progress.destroy()
return return
except: except:
ErrorDialog(_("Could not create %s") % filename) ErrorDialog(_("Could not create %s") % filename)
self.progress.destroy() # self.progress.destroy()
return return
date = time.ctime(time.time()).split() date = time.ctime(time.time()).split()
@ -647,19 +663,19 @@ class GedcomWriter:
for key in pkeys: for key in pkeys:
self.write_person(self.db.get_person(key)) self.write_person(self.db.get_person(key))
index = index + 1 index = index + 1
if index%100 == 0 and not self.cl: #if index%100 == 0 and not self.cl:
self.pbar.set_fraction(index/nump) # self.pbar.set_fraction(index/nump)
while(gtk.events_pending()): # while(gtk.events_pending()):
gtk.mainiteration() # gtk.mainiteration()
if not self.cl: # if not self.cl:
self.pbar.set_fraction(1.0) # self.pbar.set_fraction(1.0)
self.write_families() self.write_families()
if self.source_refs: if self.source_refs:
self.write_sources() self.write_sources()
else: #else:
if not self.cl: # if not self.cl:
self.sbar.set_fraction(1.0) # self.sbar.set_fraction(1.0)
self.writeln("0 TRLR") self.writeln("0 TRLR")
self.g.close() self.g.close()
@ -760,13 +776,13 @@ class GedcomWriter:
self.writeln('2 _STAT %s' % f[2]) self.writeln('2 _STAT %s' % f[2])
break break
index = index + 1 # index = index + 1
if index % 100 == 0 and not self.cl: # if index % 100 == 0 and not self.cl:
self.fbar.set_fraction(index/nump) # self.fbar.set_fraction(index/nump)
while(gtk.events_pending()): # while(gtk.events_pending()):
gtk.mainiteration() # gtk.mainiteration()
if not self.cl: #if not self.cl:
self.fbar.set_fraction(1.0) # self.fbar.set_fraction(1.0)
def write_sources(self): def write_sources(self):
nump = float(len(self.slist)) nump = float(len(self.slist))
@ -785,12 +801,12 @@ class GedcomWriter:
if source.get_note(): if source.get_note():
self.write_long_text("NOTE",1,self.cnvtxt(source.get_note())) self.write_long_text("NOTE",1,self.cnvtxt(source.get_note()))
index = index + 1 index = index + 1
if index % 100 == 0 and not self.cl: # if index % 100 == 0 and not self.cl:
self.sbar.set_fraction(index/nump) # self.sbar.set_fraction(index/nump)
while(gtk.events_pending()): # while(gtk.events_pending()):
gtk.mainiteration() # gtk.mainiteration()
if not self.cl: # if not self.cl:
self.sbar.set_fraction(1.0) # self.sbar.set_fraction(1.0)
def write_person(self,person): def write_person(self,person):
self.writeln("0 @%s@ INDI" % self.pid(person.get_id())) self.writeln("0 @%s@ INDI" % self.pid(person.get_id()))
@ -1231,10 +1247,11 @@ class GedcomWriter:
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def exportData(database,filename): def exportData(database,filename,person,option_box):
ret = 0 ret = 0
try: try:
GedcomWriter(database,None,1,filename) gw = GedcomWriter(database,person,0,filename,option_box)
gw.export_data(filename)
ret = 1 ret = 1
except: except:
import DisplayTrace import DisplayTrace
@ -1249,7 +1266,8 @@ def exportData(database,filename):
_title = _('GE_DCOM 5.5') _title = _('GE_DCOM 5.5')
_description = _('GEDCOM is used to transfer data between genealogy programs. ' _description = _('GEDCOM is used to transfer data between genealogy programs. '
'Nearly all genealogy software will accept a GEDCOM file as input. ') 'Nearly all genealogy software will accept a GEDCOM file as input. ')
_config = None #option_box = GedcomWriterOptionBox()
_config = (_('GEDCOM export options'),GedcomWriterOptionBox)
_filename = 'ged' _filename = 'ged'
from Plugins import register_export from Plugins import register_export