* src/gramps_main.py (on_export_activate): Switch to new Exporter.
* src/WriteXML.py: Change registration. Return 1 on success and 0 when on failure. * src/Utils.py (get_new_filename): Add function. * src/DbPrompter.py (get_new_filename): Remove function. * src/Exporter.py: Add to CVS. * src/Makefile.am: Ship Exporter.py. * src/Plugins.py (register_export): Change to the new scheme. svn: r3254
This commit is contained in:
parent
c75caa9b05
commit
4491c62a4a
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
2004-07-09 Alex Roitman <shura@alex.neuro.umn.edu>
|
||||||
|
* src/gramps_main.py (on_export_activate): Switch to new Exporter.
|
||||||
|
* src/WriteXML.py: Change registration. Return 1 on success and
|
||||||
|
0 when on failure.
|
||||||
|
* src/Utils.py (get_new_filename): Add function.
|
||||||
|
* src/DbPrompter.py (get_new_filename): Remove function.
|
||||||
|
* src/Exporter.py: Add to CVS.
|
||||||
|
* src/Makefile.am: Ship Exporter.py.
|
||||||
|
* src/Plugins.py (register_export): Change to the new scheme.
|
||||||
|
|
||||||
2004-07-08 Don Allingham <dallingham@users.sourceforge.net>
|
2004-07-08 Don Allingham <dallingham@users.sourceforge.net>
|
||||||
* src/ChooseParents.py: build an exclusion list of those
|
* src/ChooseParents.py: build an exclusion list of those
|
||||||
obviously not the parents
|
obviously not the parents
|
||||||
|
@ -293,7 +293,7 @@ class NewNativeDbPrompter:
|
|||||||
filter.add_mime_type('application/x-gramps')
|
filter.add_mime_type('application/x-gramps')
|
||||||
choose.add_filter(filter)
|
choose.add_filter(filter)
|
||||||
|
|
||||||
new_filename = get_new_filename('grdb')
|
new_filename = Utils.get_new_filename('grdb')
|
||||||
|
|
||||||
choose.set_filename(new_filename)
|
choose.set_filename(new_filename)
|
||||||
choose.set_current_name(os.path.split(new_filename)[1])
|
choose.set_current_name(os.path.split(new_filename)[1])
|
||||||
@ -362,7 +362,7 @@ class SaveAsDbPrompter:
|
|||||||
for (exportData,filter,pattern_list) in Plugins._exports:
|
for (exportData,filter,pattern_list) in Plugins._exports:
|
||||||
self.choose.add_filter(filter)
|
self.choose.add_filter(filter)
|
||||||
|
|
||||||
new_filename = get_new_filename('grdb')
|
new_filename = Utils.get_new_filename('grdb')
|
||||||
self.choose.set_filename(new_filename)
|
self.choose.set_filename(new_filename)
|
||||||
self.choose.set_current_name(os.path.split(new_filename)[1])
|
self.choose.set_current_name(os.path.split(new_filename)[1])
|
||||||
|
|
||||||
@ -414,22 +414,9 @@ class SaveAsDbPrompter:
|
|||||||
if the_filter.get_name().find('XML') + 1:
|
if the_filter.get_name().find('XML') + 1:
|
||||||
new_filename = 'data.gramps'
|
new_filename = 'data.gramps'
|
||||||
elif the_filter.get_name() == _('GRAMPS packages'):
|
elif the_filter.get_name() == _('GRAMPS packages'):
|
||||||
new_filename = get_new_filename('gpkg')
|
new_filename = Utils.get_new_filename('gpkg')
|
||||||
new_filename = os.path.split(new_filename)[1]
|
new_filename = os.path.split(new_filename)[1]
|
||||||
else:
|
else:
|
||||||
new_filename = get_new_filename('grdb')
|
new_filename = Utils.get_new_filename('grdb')
|
||||||
new_filename = os.path.split(new_filename)[1]
|
new_filename = os.path.split(new_filename)[1]
|
||||||
self.choose.set_current_name()
|
self.choose.set_current_name()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
_NEW_NAME_PATTERN = '~/Untitled_%d.%s'
|
|
||||||
|
|
||||||
def get_new_filename(ext):
|
|
||||||
ix = 1
|
|
||||||
while os.path.isfile(os.path.expanduser(_NEW_NAME_PATTERN % (ix,ext) )):
|
|
||||||
ix = ix + 1
|
|
||||||
return os.path.expanduser(_NEW_NAME_PATTERN % (ix,ext))
|
|
||||||
|
227
src/Exporter.py
Normal file
227
src/Exporter.py
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004 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, 2004
|
||||||
|
#
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Python modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
from gettext import gettext as _
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gnome modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
import gtk
|
||||||
|
import gtk.glade
|
||||||
|
import gnome
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# gramps modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
import const
|
||||||
|
import Utils
|
||||||
|
import Plugins
|
||||||
|
import QuestionDialog
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Exporter
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class Exporter:
|
||||||
|
"""
|
||||||
|
This class creates Gnome Druid to guide the user through the various
|
||||||
|
Save as/Export options. The overall goal is to keep things simple by
|
||||||
|
presenting few choice options on each druid page.
|
||||||
|
|
||||||
|
The export formats and options are obtained from the plugins, with the
|
||||||
|
exception of a native save. Native save as just copies file to another
|
||||||
|
name.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self,parent,parent_window):
|
||||||
|
self.parent = parent
|
||||||
|
self.parent_window = parent_window
|
||||||
|
|
||||||
|
self.build_exports()
|
||||||
|
|
||||||
|
self.w = gtk.Window()
|
||||||
|
|
||||||
|
self.fg_color = gtk.gdk.color_parse('#7d684a')
|
||||||
|
self.bg_color = gtk.gdk.color_parse('#e1dbc5')
|
||||||
|
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)
|
||||||
|
|
||||||
|
d = gnome.ui.Druid()
|
||||||
|
self.w.add(d)
|
||||||
|
d.add(self.build_info_page())
|
||||||
|
d.add(self.build_format_page())
|
||||||
|
d.add(self.build_file_sel_page())
|
||||||
|
self.last_page = self.build_last_page()
|
||||||
|
d.add(self.last_page)
|
||||||
|
|
||||||
|
d.connect('cancel',self.close)
|
||||||
|
self.w.connect("destroy_event",self.close)
|
||||||
|
self.w.set_transient_for(self.parent_window)
|
||||||
|
|
||||||
|
self.w.show_all()
|
||||||
|
|
||||||
|
def close(self,obj,obj2=None):
|
||||||
|
self.w.destroy()
|
||||||
|
|
||||||
|
def help(self,obj):
|
||||||
|
#FIXME: point to the correct section when it exists
|
||||||
|
gnome.help_display('gramps-manual','index')
|
||||||
|
|
||||||
|
def build_info_page(self):
|
||||||
|
p = gnome.ui.DruidPageEdge(0)
|
||||||
|
p.set_title(_('Saving your data'))
|
||||||
|
p.set_title_color(self.fg_color)
|
||||||
|
p.set_bg_color(self.bg_color)
|
||||||
|
p.set_logo(self.logo)
|
||||||
|
p.set_watermark(self.splash)
|
||||||
|
p.set_text(_('Under normal circumstances, GRAMPS does not require you '
|
||||||
|
'to directly save your changes. All changes you make are '
|
||||||
|
'immediately saved to the database.\n\n'
|
||||||
|
'This process will help you save a copy of your data '
|
||||||
|
'in any of the several formats supported by GRAMPS. '
|
||||||
|
'This can be used to make a copy of your data, backup '
|
||||||
|
'your data, or convert it to a format that will allow '
|
||||||
|
'you to trasnfer it to a different program.\n\n'
|
||||||
|
'If you change your mind during this process, you '
|
||||||
|
'can safely press Cancel button at any time and your '
|
||||||
|
'present database will still be intact.'))
|
||||||
|
return p
|
||||||
|
|
||||||
|
def build_last_page(self):
|
||||||
|
p = gnome.ui.DruidPageEdge(1)
|
||||||
|
p.set_title_color(self.fg_color)
|
||||||
|
p.set_bg_color(self.bg_color)
|
||||||
|
p.set_logo(self.logo)
|
||||||
|
p.set_watermark(self.splash)
|
||||||
|
p.connect('prepare',self.save)
|
||||||
|
p.connect('finish',self.close)
|
||||||
|
return p
|
||||||
|
|
||||||
|
def save(self,obj,obj2):
|
||||||
|
filename = self.chooser.get_filename()
|
||||||
|
success = self.exports[self.ix][0](self.parent.db,filename)
|
||||||
|
if success:
|
||||||
|
self.last_page.set_title(_('Your data has been saved'))
|
||||||
|
self.last_page.set_text(_('You may press Apply button '
|
||||||
|
'now to continue.'))
|
||||||
|
else:
|
||||||
|
self.last_page.set_title(_('Saving failed'))
|
||||||
|
self.last_page.set_text(_('There was an error '
|
||||||
|
'while saving your data. Please go back and try again.'))
|
||||||
|
|
||||||
|
def build_format_page(self):
|
||||||
|
self.format_buttons = []
|
||||||
|
|
||||||
|
p = gnome.ui.DruidPageStandard()
|
||||||
|
p.set_title(_('Choosing the format to save'))
|
||||||
|
p.set_title_foreground(self.fg_color)
|
||||||
|
p.set_background(self.bg_color)
|
||||||
|
p.set_logo(self.logo)
|
||||||
|
|
||||||
|
box = gtk.VBox()
|
||||||
|
box.set_spacing(12)
|
||||||
|
p.append_item("",box,"")
|
||||||
|
|
||||||
|
table = gtk.Table(2*len(self.exports),2)
|
||||||
|
table.set_row_spacings(6)
|
||||||
|
table.set_col_spacings(6)
|
||||||
|
|
||||||
|
group = None
|
||||||
|
for ix in range(len(self.exports)):
|
||||||
|
title = self.exports[ix][1]
|
||||||
|
description= self.exports[ix][2]
|
||||||
|
|
||||||
|
button = gtk.RadioButton(group,title)
|
||||||
|
if not group:
|
||||||
|
group = button
|
||||||
|
button.connect('toggled',self.on_format_toggled)
|
||||||
|
self.format_buttons.append(button)
|
||||||
|
table.attach(button,0,2,2*ix,2*ix+1)
|
||||||
|
label = gtk.Label(description)
|
||||||
|
label.set_line_wrap(gtk.TRUE)
|
||||||
|
table.attach(label,1,2,2*ix+1,2*ix+2)
|
||||||
|
|
||||||
|
box.add(table)
|
||||||
|
box.show_all()
|
||||||
|
|
||||||
|
return p
|
||||||
|
|
||||||
|
def build_file_sel_page(self):
|
||||||
|
p = gnome.ui.DruidPageStandard()
|
||||||
|
p.set_title(_('Selecting the file name'))
|
||||||
|
p.set_title_foreground(self.fg_color)
|
||||||
|
p.set_background(self.bg_color)
|
||||||
|
p.set_logo(self.logo)
|
||||||
|
|
||||||
|
self.chooser = gtk.FileChooserWidget(gtk.FILE_CHOOSER_ACTION_SAVE)
|
||||||
|
self.on_format_toggled(self.format_buttons[0])
|
||||||
|
p.append_item("",self.chooser,"")
|
||||||
|
|
||||||
|
return p
|
||||||
|
|
||||||
|
def native_export(self,database,filename):
|
||||||
|
try:
|
||||||
|
shutil.copyfile(database.get_save_path(),filename)
|
||||||
|
return 1
|
||||||
|
except IOError, msg:
|
||||||
|
QuestionDialog.ErrorDialog( _("Could not write file: %s") % filename,
|
||||||
|
_('System message was: %s') % msg )
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def on_format_toggled(self,obj):
|
||||||
|
if not obj.get_active():
|
||||||
|
return
|
||||||
|
self.ix = self.format_buttons.index(obj)
|
||||||
|
ext = self.exports[self.ix][4]
|
||||||
|
new_filename = Utils.get_new_filename(ext)
|
||||||
|
self.chooser.set_filename(new_filename)
|
||||||
|
self.chooser.set_current_name(os.path.split(new_filename)[1])
|
||||||
|
|
||||||
|
def build_exports(self):
|
||||||
|
native_title = _('GRAMPS _GRDB database')
|
||||||
|
native_description =_('The GRAMPS GRDB database is a format '
|
||||||
|
'that GRAMPS uses to store information. '
|
||||||
|
'Selecting this option will allow you to '
|
||||||
|
'make a copy of the current database.')
|
||||||
|
native_config = None
|
||||||
|
native_ext = 'grdb'
|
||||||
|
native_export = self.native_export
|
||||||
|
|
||||||
|
self.exports = [ (native_export,native_title,native_description,
|
||||||
|
native_config,native_ext) ]
|
||||||
|
self.exports = self.exports + [ item for item in Plugins._exports ]
|
@ -90,7 +90,8 @@ gdir_PYTHON = \
|
|||||||
Witness.py\
|
Witness.py\
|
||||||
WriteXML.py\
|
WriteXML.py\
|
||||||
SelectPerson.py\
|
SelectPerson.py\
|
||||||
ArgHandler.py
|
ArgHandler.py\
|
||||||
|
Exporter.py
|
||||||
|
|
||||||
# Could use GNU make's ':=' syntax for nice wildcard use.
|
# Could use GNU make's ':=' syntax for nice wildcard use.
|
||||||
# If not using GNU make, then list all files individually
|
# If not using GNU make, then list all files individually
|
||||||
|
@ -460,13 +460,13 @@ def reload_plugins(obj):
|
|||||||
# Plugin registering
|
# Plugin registering
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
def register_export(task, ffilter, pattern_list=None):
|
def register_export(exportData,_title,_description='',_config=None,_filename=''):
|
||||||
"""
|
"""
|
||||||
Register an export filter, taking the task, file filter,
|
Register an export filter, taking the task, file filter,
|
||||||
and the list of patterns for the filename matching.
|
and the list of patterns for the filename matching.
|
||||||
"""
|
"""
|
||||||
if pattern_list:
|
if _description and _filename:
|
||||||
_exports.append((task, ffilter, pattern_list))
|
_exports.append((exportData,_title,_description,_config,_filename))
|
||||||
|
|
||||||
def register_import(task, ffilter, mime=None):
|
def register_import(task, ffilter, mime=None):
|
||||||
"""Register an import filter, taking the task and file filter"""
|
"""Register an import filter, taking the task and file filter"""
|
||||||
|
13
src/Utils.py
13
src/Utils.py
@ -545,3 +545,16 @@ def create_id():
|
|||||||
s += chr(val%57+65)
|
s += chr(val%57+65)
|
||||||
val = int(val/57)
|
val = int(val/57)
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
_NEW_NAME_PATTERN = '~/Untitled_%d.%s'
|
||||||
|
|
||||||
|
def get_new_filename(ext):
|
||||||
|
ix = 1
|
||||||
|
while os.path.isfile(os.path.expanduser(_NEW_NAME_PATTERN % (ix,ext) )):
|
||||||
|
ix = ix + 1
|
||||||
|
return os.path.expanduser(_NEW_NAME_PATTERN % (ix,ext))
|
||||||
|
@ -74,6 +74,7 @@ except:
|
|||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
def exportData(database, filename, callback=None):
|
def exportData(database, filename, callback=None):
|
||||||
|
ret = 0
|
||||||
if os.path.isfile(filename):
|
if os.path.isfile(filename):
|
||||||
try:
|
try:
|
||||||
shutil.copyfile(filename, filename + ".bak")
|
shutil.copyfile(filename, filename + ".bak")
|
||||||
@ -85,7 +86,7 @@ def exportData(database, filename, callback=None):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
g = XmlWriter(database,callback,0,compress)
|
g = XmlWriter(database,callback,0,compress)
|
||||||
g.write(filename)
|
ret = g.write(filename)
|
||||||
except:
|
except:
|
||||||
import DisplayTrace
|
import DisplayTrace
|
||||||
|
|
||||||
@ -97,6 +98,8 @@ def exportData(database, filename, callback=None):
|
|||||||
shutil.copystat(filename + ".bak", filename)
|
shutil.copystat(filename + ".bak", filename)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -144,7 +147,7 @@ class XmlWriter:
|
|||||||
"have permission to write to the directory. "
|
"have permission to write to the directory. "
|
||||||
"Please make sure you have write access to the "
|
"Please make sure you have write access to the "
|
||||||
"directory and try again."))
|
"directory and try again."))
|
||||||
return
|
return 0
|
||||||
|
|
||||||
if os.path.exists(filename):
|
if os.path.exists(filename):
|
||||||
if not os.access(filename,os.W_OK):
|
if not os.access(filename,os.W_OK):
|
||||||
@ -153,7 +156,7 @@ class XmlWriter:
|
|||||||
"have permission to write to the file. "
|
"have permission to write to the file. "
|
||||||
"Please make sure you have write access to the "
|
"Please make sure you have write access to the "
|
||||||
"file and try again."))
|
"file and try again."))
|
||||||
return
|
return 0
|
||||||
|
|
||||||
self.fileroot = os.path.dirname(filename)
|
self.fileroot = os.path.dirname(filename)
|
||||||
try:
|
try:
|
||||||
@ -166,12 +169,13 @@ class XmlWriter:
|
|||||||
g = open(filename,"w")
|
g = open(filename,"w")
|
||||||
except IOError,msg:
|
except IOError,msg:
|
||||||
ErrorDialog(_('Failure writing %s') % filename,msg)
|
ErrorDialog(_('Failure writing %s') % filename,msg)
|
||||||
return
|
return 0
|
||||||
|
|
||||||
self.g = codecs.getwriter("utf8")(g)
|
self.g = codecs.getwriter("utf8")(g)
|
||||||
|
|
||||||
self.write_xml_data()
|
self.write_xml_data()
|
||||||
g.close()
|
g.close()
|
||||||
|
return 1
|
||||||
|
|
||||||
def write_handle(self,handle):
|
def write_handle(self,handle):
|
||||||
"""
|
"""
|
||||||
@ -189,7 +193,7 @@ class XmlWriter:
|
|||||||
self.g = codecs.getwriter("utf8")(g)
|
self.g = codecs.getwriter("utf8")(g)
|
||||||
|
|
||||||
self.write_xml_data()
|
self.write_xml_data()
|
||||||
g.close()
|
g.close()
|
||||||
|
|
||||||
def write_xml_data(self):
|
def write_xml_data(self):
|
||||||
|
|
||||||
@ -421,7 +425,7 @@ class XmlWriter:
|
|||||||
self.g.write('<%s>' % val)
|
self.g.write('<%s>' % val)
|
||||||
self.g.write(self.fix(string.rstrip(text)))
|
self.g.write(self.fix(string.rstrip(text)))
|
||||||
self.g.write("</%s>\n" % val)
|
self.g.write("</%s>\n" % val)
|
||||||
|
|
||||||
def write_text(self,val,text,indent=0):
|
def write_text(self,val,text,indent=0):
|
||||||
if not text:
|
if not text:
|
||||||
return
|
return
|
||||||
@ -431,7 +435,7 @@ class XmlWriter:
|
|||||||
self.g.write('<%s>' % val)
|
self.g.write('<%s>' % val)
|
||||||
self.g.write(self.fix(string.rstrip(text)))
|
self.g.write(self.fix(string.rstrip(text)))
|
||||||
self.g.write("</%s>\n" % val)
|
self.g.write("</%s>\n" % val)
|
||||||
|
|
||||||
def dump_event(self,event,index=1):
|
def dump_event(self,event,index=1):
|
||||||
if event:
|
if event:
|
||||||
self.dump_my_event(event.get_name(),event,index)
|
self.dump_my_event(event.get_name(),event,index)
|
||||||
@ -811,11 +815,12 @@ def conf_priv(obj):
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
_mime_type = 'data.gramps'
|
_title = _('GRAMPS _XML database')
|
||||||
_filter = gtk.FileFilter()
|
_description = _('The GRAMPS XML database is a format used by older '
|
||||||
_filter.set_name(_('GRAMPS XML databases'))
|
'versions of GRAMPS. It is read-write compatible with '
|
||||||
_filter.add_pattern(_mime_type)
|
'the present GRAMPS database format.')
|
||||||
_ext_list = ('.gramps',)
|
_config = None
|
||||||
|
_filename = 'gramps'
|
||||||
|
|
||||||
from Plugins import register_export
|
from Plugins import register_export
|
||||||
register_export(exportData,_filter,_ext_list)
|
register_export(exportData,_title,_description,_config,_filename)
|
||||||
|
@ -71,6 +71,7 @@ import Find
|
|||||||
import DbPrompter
|
import DbPrompter
|
||||||
import TipOfDay
|
import TipOfDay
|
||||||
import ArgHandler
|
import ArgHandler
|
||||||
|
import Exporter
|
||||||
|
|
||||||
from QuestionDialog import *
|
from QuestionDialog import *
|
||||||
|
|
||||||
@ -1367,8 +1368,7 @@ class Gramps:
|
|||||||
prompter.chooser()
|
prompter.chooser()
|
||||||
|
|
||||||
def on_export_activate(self,obj):
|
def on_export_activate(self,obj):
|
||||||
prompter = DbPrompter.SaveAsDbPrompter(self,self.topWindow)
|
Exporter.Exporter(self,self.topWindow)
|
||||||
prompter.chooser()
|
|
||||||
|
|
||||||
def on_revert_activate(self,obj):
|
def on_revert_activate(self,obj):
|
||||||
pass
|
pass
|
||||||
|
Loading…
Reference in New Issue
Block a user