5746: Use the new User classes for Importers and Exporters

svn: r19567
This commit is contained in:
Doug Blank 2012-05-18 01:21:30 +00:00
parent 525da42eec
commit de196aea96
16 changed files with 180 additions and 167 deletions

@ -61,6 +61,7 @@ from gui.pluginmanager import GuiPluginManager
import Utils import Utils
import ManagedWindow import ManagedWindow
from QuestionDialog import ErrorDialog from QuestionDialog import ErrorDialog
from gui.user import User
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -631,9 +632,8 @@ class ExportAssistant(gtk.Assistant, ManagedWindow.ManagedWindow) :
export_function = self.map_exporters[ix].get_export_function() export_function = self.map_exporters[ix].get_export_function()
success = export_function(self.dbstate.db, success = export_function(self.dbstate.db,
filename, filename,
ErrorDialog, User(error=ErrorDialog, callback=self.callback),
self.option_box_instance, self.option_box_instance)
self.callback)
return success return success
def pre_save(self,page): def pre_save(self,page):

@ -562,7 +562,7 @@ class ArgHandler(object):
for plugin in pmgr.get_export_plugins(): for plugin in pmgr.get_export_plugins():
if family_tree_format == plugin.get_extension(): if family_tree_format == plugin.get_extension():
export_function = plugin.get_export_function() export_function = plugin.get_export_function()
export_function(self.dbstate.db, filename, self.__error) export_function(self.dbstate.db, filename, User(error=self.__error))
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #

@ -55,10 +55,11 @@ class User(gen.user.User):
This class provides a means to interact with the user via CLI. This class provides a means to interact with the user via CLI.
It implements the interface in gen.user.User() It implements the interface in gen.user.User()
""" """
def __init__(self, callback=None): def __init__(self, callback=None, error=None):
self.steps = 0; self.steps = 0;
self.current_step = 0; self.current_step = 0;
self.callback_function = callback self.callback_function = callback
self.error_function = error
def begin_progress(self, title, message, steps): def begin_progress(self, title, message, steps):
""" """
@ -94,15 +95,25 @@ class User(gen.user.User):
percent = int((float(self.current_step) / self.steps) * 100) percent = int((float(self.current_step) / self.steps) * 100)
sys.stdout.write("\r%02d%%" % percent) sys.stdout.write("\r%02d%%" % percent)
def callback(self, percent): def callback(self, *args):
""" """
Display progress meter. Display progress meter.
""" """
def callback(self, percentage, text=None):
"""
Display the precentage.
"""
if self.callback_function: if self.callback_function:
self.callback_function(percent) if text:
self.callback_function(percentage, text)
else:
self.callback_function(percentage)
else: else:
sys.stdout.write("\r%02d%%" % percent) if text is None:
sys.stdout.write("\r%02d%%" % percentage)
else:
sys.stdout.write("\r%02d%% %s" % (percentage, text))
def end_progress(self): def end_progress(self):
""" """
Stop showing the progress indicator to the user. Stop showing the progress indicator to the user.
@ -145,7 +156,10 @@ class User(gen.user.User):
@type error: str @type error: str
@returns: none @returns: none
""" """
print "%s %s" % (title, error) if self.error_function:
self.error_function(title, error)
else:
print "%s %s" % (title, error)
def notify_db_error(self, error): def notify_db_error(self, error):
""" """

@ -40,13 +40,11 @@ class ExportPlugin(Plugin):
@type description: string @type description: string
@param export_function: A function to call to perform the export. @param export_function: A function to call to perform the export.
The function must take the form: The function must take the form:
def export_function(database, filename, option_box, callback): def export_function(database, filename, user, option_box):
where: where:
"db" is a Gramps database to import the data into "db" is a Gramps database to import the data into
"filename" is the file that the data will be exported to "filename" is the file that the data will be exported to
"callback" is a callable object that takes two parameters. "user" provides UI output (callback, errors, etc)
The first parameter is a progress indicator.
The second parameter is a text string.
@type export_function: callable @type export_function: callable
@param extension: The extension for the output file. @param extension: The extension for the output file.
Example: "ged" Example: "ged"
@ -82,4 +80,4 @@ class ExportPlugin(Plugin):
@return: (??,??) @return: (??,??)
""" """
return self.__config return self.__config

@ -493,7 +493,7 @@ class DbManager(CLIDbManager):
else: else:
base_path = self.dbstate.db.get_save_path() base_path = self.dbstate.db.get_save_path()
archive = os.path.join(base_path, ARCHIVE) archive = os.path.join(base_path, ARCHIVE)
check_in(self.dbstate.db, archive, None, self.__start_cursor) check_in(self.dbstate.db, archive, User(), self.__start_cursor)
self.__end_cursor() self.__end_cursor()
self.__populate() self.__populate()
@ -837,7 +837,7 @@ def check_out(dbase, rev, path, user):
rdr(dbase, xml_file, user) rdr(dbase, xml_file, user)
os.unlink(xml_file) os.unlink(xml_file)
def check_in(dbase, filename, callback, cursor_func = None): def check_in(dbase, filename, user, cursor_func = None):
""" """
Checks in the specified file into RCS Checks in the specified file into RCS
""" """
@ -875,7 +875,7 @@ def check_in(dbase, filename, callback, cursor_func = None):
for plugin in plugin_manager.get_export_plugins(): for plugin in plugin_manager.get_export_plugins():
if plugin.get_extension() == "gramps": if plugin.get_extension() == "gramps":
export_function = plugin.get_export_function() export_function = plugin.get_export_function()
export_function(dbase, filename, None, callback) export_function(dbase, filename, user)
if cursor_func: if cursor_func:
cursor_func(_("Saving archive...")) cursor_func(_("Saving archive..."))

@ -51,9 +51,10 @@ class User(gen.user.User):
This class provides a means to interact with the user via GTK. This class provides a means to interact with the user via GTK.
It implements the interface in gen.user.User() It implements the interface in gen.user.User()
""" """
def __init__(self, callback=None): def __init__(self, callback=None, error=None):
self.progress = None self.progress = None
self.callback_function = callback self.callback_function = callback
self.error_function = error
def begin_progress(self, title, message, steps): def begin_progress(self, title, message, steps):
""" """
@ -82,14 +83,20 @@ class User(gen.user.User):
if self.progress: if self.progress:
self.progress.step() self.progress.step()
def callback(self, percentage): def callback(self, percentage, text=None):
""" """
Display the precentage. Display the precentage.
""" """
if self.callback_function: if self.callback_function:
self.callback_function(percentage) if text:
self.callback_function(percentage, text)
else:
self.callback_function(percentage)
else: else:
sys.stdout.write("\r%02d%%" % percent) if text is None:
sys.stdout.write("\r%02d%%" % percentage)
else:
sys.stdout.write("\r%02d%% %s" % (percentage, text))
def end_progress(self): def end_progress(self):
""" """
@ -135,7 +142,10 @@ class User(gen.user.User):
@type error: str @type error: str
@returns: none @returns: none
""" """
ErrorDialog(title, error) if self.error_function:
self.error_function(title, error)
else:
ErrorDialog(title, error)
def notify_db_error(self, error): def notify_db_error(self, error):
""" """

@ -43,6 +43,7 @@ from gen.ggettext import sgettext as _
from gen.ggettext import ngettext from gen.ggettext import ngettext
from cStringIO import StringIO from cStringIO import StringIO
from collections import defaultdict from collections import defaultdict
from gui.user import User
import sys import sys
import posixpath import posixpath
@ -1575,15 +1576,15 @@ class ViewManager(CLIManager):
if include.get_active(): if include.get_active():
from ExportPkg import PackageWriter from ExportPkg import PackageWriter
writer = PackageWriter(self.dbstate.db, filename, writer = PackageWriter(self.dbstate.db, filename,
msg_callback=lambda m1, m2: ErrorDialog(m1, m2), User(error=ErrorDialog,
callback=self.pulse_progressbar) callback=self.pulse_progressbar))
writer.export() writer.export()
else: else:
from ExportXml import XmlWriter from ExportXml import XmlWriter
writer = XmlWriter(self.dbstate.db, writer = XmlWriter(self.dbstate.db,
msg_callback=lambda m1, m2: ErrorDialog(m1, m2), User(error=ErrorDialog,
callback=self.pulse_progressbar, callback=self.pulse_progressbar),
strip_photos=0, compress=1) strip_photos=0, compress=1)
writer.write(filename) writer.write(filename)
self.uistate.set_busy_cursor(0) self.uistate.set_busy_cursor(0)
self.uistate.progress.hide() self.uistate.progress.hide()

@ -62,8 +62,8 @@ from glade import Glade
# The function that does the exporting # The function that does the exporting
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def exportData(database, filename, msg_callback, option_box=None, callback=None): def exportData(database, filename, user, option_box=None):
gw = CSVWriter(database, filename, msg_callback, option_box, callback) gw = CSVWriter(database, filename, user, option_box)
return gw.export_data() return gw.export_data()
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -224,13 +224,12 @@ class CSVWriterOptionBox(WriterOptionBox):
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class CSVWriter(object): class CSVWriter(object):
def __init__(self, database, filename, msg_callback, option_box=None, callback=None): def __init__(self, database, filename, user, option_box=None):
self.db = database self.db = database
self.option_box = option_box self.option_box = option_box
self.filename = filename self.filename = filename
self.callback = callback self.user = user
self.msg_callback = msg_callback if callable(self.user.callback): # callback is really callable
if callable(self.callback): # callback is really callable
self.update = self.update_real self.update = self.update_real
else: else:
self.update = self.update_empty self.update = self.update_empty
@ -281,7 +280,7 @@ class CSVWriter(object):
self.count += 1 self.count += 1
newval = int(100*self.count/self.total) newval = int(100*self.count/self.total)
if newval != self.oldval: if newval != self.oldval:
self.callback(newval) self.user.callback(newval)
self.oldval = newval self.oldval = newval
def writeln(self): def writeln(self):
@ -298,10 +297,10 @@ class CSVWriter(object):
self.g = UnicodeWriter(self.fp) self.g = UnicodeWriter(self.fp)
except IOError,msg: except IOError,msg:
msg2 = _("Could not create %s") % self.filename msg2 = _("Could not create %s") % self.filename
self.msg_callback(msg2,str(msg)) self.user.notify_error(msg2,str(msg))
return False return False
except: except:
self.msg_callback(_("Could not create %s") % self.filename) self.user.notify_error(_("Could not create %s") % self.filename)
return False return False
######################### initialize progress bar ######################### initialize progress bar
self.count = 0 self.count = 0

@ -56,8 +56,8 @@ from glade import Glade
# writeData # writeData
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def writeData(database, filename, msg_callback, option_box=None, callback=None): def writeData(database, filename, user, option_box=None):
writer = FtreeWriter(database, filename, msg_callback, option_box, callback) writer = FtreeWriter(database, filename, user, option_box)
return writer.export_data() return writer.export_data()
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -67,14 +67,12 @@ def writeData(database, filename, msg_callback, option_box=None, callback=None):
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class FtreeWriter(object): class FtreeWriter(object):
def __init__(self, database, filename, msg_callback, option_box=None, def __init__(self, database, filename, user, option_box=None):
callback = None):
self.db = database self.db = database
self.filename = filename self.filename = filename
self.msg_callback = msg_callback self.user = user
self.option_box = option_box self.option_box = option_box
self.callback = callback if callable(self.user.callback): # callback is really callable
if callable(self.callback): # callback is really callable
self.update = self.update_real self.update = self.update_real
else: else:
self.update = self.update_empty self.update = self.update_empty
@ -92,7 +90,7 @@ class FtreeWriter(object):
self.count += 1 self.count += 1
newval = int(100*self.count/self.total) newval = int(100*self.count/self.total)
if newval != self.oldval: if newval != self.oldval:
self.callback(newval) self.user.callback(newval)
self.oldval = newval self.oldval = newval
def export_data(self): def export_data(self):

@ -213,12 +213,10 @@ class GedcomWriter(UpdateCallback):
so that it can provide visual feedback via a progress bar if needed. so that it can provide visual feedback via a progress bar if needed.
""" """
def __init__(self, database, cmd_line=0, def __init__(self, database, user, option_box=None):
option_box=None, callback=None): UpdateCallback.__init__(self, user.callback)
UpdateCallback.__init__(self, callback) self.total = 100
self.dbase = database self.dbase = database
self.cmd_line = cmd_line
self.dirname = None self.dirname = None
self.gedcom_file = None self.gedcom_file = None
@ -1435,17 +1433,17 @@ class GedcomWriter(UpdateCallback):
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def export_data(database, filename, msg_callback, option_box=None, callback=None): def export_data(database, filename, user, option_box=None):
""" """
External interface used to register with the plugin system. External interface used to register with the plugin system.
""" """
ret = False ret = False
try: try:
ged_write = GedcomWriter(database, 0, option_box, callback) ged_write = GedcomWriter(database, user, option_box)
ret = ged_write.write_gedcom_file(filename) ret = ged_write.write_gedcom_file(filename)
except IOError, msg: except IOError, msg:
msg2 = _("Could not create %s") % filename msg2 = _("Could not create %s") % filename
msg_callback(msg2, str(msg)) user.notify_error(msg2, str(msg))
except Errors.DatabaseError, msg: except Errors.DatabaseError, msg:
msg_callback(_("Export failed"), str(msg)) user.notify_db_error(_("Export failed"), str(msg))
return ret return ret

@ -55,14 +55,12 @@ from glade import Glade
import config import config
class GeneWebWriter(object): class GeneWebWriter(object):
def __init__(self, database, filename, msg_callback, option_box=None, def __init__(self, database, filename, user, option_box=None):
callback=None):
self.db = database self.db = database
self.filename = filename self.filename = filename
self.msg_callback = msg_callback self.user = user
self.option_box = option_box self.option_box = option_box
self.callback = callback if callable(self.user.callback): # callback is really callable
if callable(self.callback): # callback is really callable
self.update = self.update_real self.update = self.update_real
else: else:
self.update = self.update_empty self.update = self.update_empty
@ -82,7 +80,7 @@ class GeneWebWriter(object):
self.count += 1 self.count += 1
newval = int(100*self.count/self.total) newval = int(100*self.count/self.total)
if newval != self.oldval: if newval != self.oldval:
self.callback(newval) self.user.callback(newval)
self.oldval = newval self.oldval = newval
def writeln(self, text): def writeln(self, text):
@ -95,15 +93,15 @@ class GeneWebWriter(object):
self.g = open(self.filename, "w") self.g = open(self.filename, "w")
except IOError,msg: except IOError,msg:
msg2 = _("Could not create %s") % self.filename msg2 = _("Could not create %s") % self.filename
self.msg_callback(msg2, str(msg)) self.user.notify_error(msg2, str(msg))
return False return False
except: except:
self.msg_callback(_("Could not create %s") % self.filename) self.user.notify_error(_("Could not create %s") % self.filename)
return False return False
self.flist = [x for x in self.db.iter_family_handles()] self.flist = [x for x in self.db.iter_family_handles()]
if len(self.flist) < 1: if len(self.flist) < 1:
self.msg_callback(_("No families matched by selected filter")) self.notify_error(_("No families matched by selected filter"))
return False return False
self.count = 0 self.count = 0
@ -491,6 +489,6 @@ class GeneWebWriter(object):
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def exportData(database, filename, msg_callback, option_box=None, callback=None): def exportData(database, filename, user, option_box=None):
gw = GeneWebWriter(database, filename, msg_callback, option_box, callback) gw = GeneWebWriter(database, filename, user, option_box)
return gw.export_data() return gw.export_data()

@ -69,7 +69,7 @@ import constfunc
# writeData # writeData
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def writeData(database, filename, msg_callback, option_box=None, callback=None): def writeData(database, filename, user, option_box=None):
# Rename file, if it exists already, with <filename>.bak # Rename file, if it exists already, with <filename>.bak
# as it it for normal XML export. # as it it for normal XML export.
@ -85,7 +85,7 @@ def writeData(database, filename, msg_callback, option_box=None, callback=None):
option_box.parse_options() option_box.parse_options()
database = option_box.get_filtered_database(database) database = option_box.get_filtered_database(database)
writer = PackageWriter(database, filename, msg_callback, callback) writer = PackageWriter(database, filename, user)
return writer.export() return writer.export()
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -95,91 +95,90 @@ def writeData(database, filename, msg_callback, option_box=None, callback=None):
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class PackageWriter(object): class PackageWriter(object):
def __init__(self, database, filename, msg_callback, callback=None): def __init__(self, database, filename, user):
self.db = database self.db = database
self.callback = callback self.user = user
self.msg_callback = msg_callback
self.filename = filename self.filename = filename
def export(self): def export(self):
# missmedia_action = 0 # missmedia_action = 0
#-------------------------------------------------------------- #--------------------------------------------------------------
def remove_clicked(): # def remove_clicked():
# File is lost => remove all references and the object itself # # File is lost => remove all references and the object itself
for p_id in self.db.iter_family_handles(): # for p_id in self.db.iter_family_handles():
p = self.db.get_family_from_handle(p_id) # p = self.db.get_family_from_handle(p_id)
nl = p.get_media_list() # nl = p.get_media_list()
for o in nl: # for o in nl:
if o.get_reference_handle() == m_id: # if o.get_reference_handle() == m_id:
nl.remove(o) # nl.remove(o)
p.set_media_list(nl) # p.set_media_list(nl)
self.db.commit_family(p,None) # self.db.commit_family(p,None)
for key in self.db.iter_person_handles(): # for key in self.db.iter_person_handles():
p = self.db.get_person_from_handle(key) # p = self.db.get_person_from_handle(key)
nl = p.get_media_list() # nl = p.get_media_list()
for o in nl: # for o in nl:
if o.get_reference_handle() == m_id: # if o.get_reference_handle() == m_id:
nl.remove(o) # nl.remove(o)
p.set_media_list(nl) # p.set_media_list(nl)
self.db.commit_person(p,None) # self.db.commit_person(p,None)
for key in self.db.get_source_handles(): # for key in self.db.get_source_handles():
p = self.db.get_source_from_handle(key) # p = self.db.get_source_from_handle(key)
nl = p.get_media_list() # nl = p.get_media_list()
for o in nl: # for o in nl:
if o.get_reference_handle() == m_id: # if o.get_reference_handle() == m_id:
nl.remove(o) # nl.remove(o)
p.set_media_list(nl) # p.set_media_list(nl)
self.db.commit_source(p,None) # self.db.commit_source(p,None)
for key in self.db.get_place_handles(): # for key in self.db.get_place_handles():
p = self.db.get_place_from_handle(key) # p = self.db.get_place_from_handle(key)
nl = p.get_media_list() # nl = p.get_media_list()
for o in nl: # for o in nl:
if o.get_reference_handle() == m_id: # if o.get_reference_handle() == m_id:
nl.remove(o) # nl.remove(o)
p.set_media_list(nl) # p.set_media_list(nl)
self.db.commit_place(p,None) # self.db.commit_place(p,None)
for key in self.db.get_event_handles(): # for key in self.db.get_event_handles():
p = self.db.get_event_from_handle(key) # p = self.db.get_event_from_handle(key)
nl = p.get_media_list() # nl = p.get_media_list()
for o in nl: # for o in nl:
if o.get_reference_handle() == m_id: # if o.get_reference_handle() == m_id:
nl.remove(o) # nl.remove(o)
p.set_media_list(nl) # p.set_media_list(nl)
self.db.commit_event(p,None) # self.db.commit_event(p,None)
self.db.remove_object(m_id,None) # self.db.remove_object(m_id,None)
def leave_clicked(): # def leave_clicked():
# File is lost => do nothing, leave as is # # File is lost => do nothing, leave as is
pass # pass
def select_clicked(): # def select_clicked():
# File is lost => select a file to replace the lost one # # File is lost => select a file to replace the lost one
def fs_close_window(obj): # def fs_close_window(obj):
pass # pass
def fs_ok_clicked(obj): # def fs_ok_clicked(obj):
name = Utils.get_unicode_path_from_file_chooser(fs_top.get_filename()) # name = Utils.get_unicode_path_from_file_chooser(fs_top.get_filename())
if os.path.isfile(name): # if os.path.isfile(name):
archive.add(name) # archive.add(name)
fs_top = gtk.FileChooserDialog("%s - GRAMPS" % _("Select file"), # fs_top = gtk.FileChooserDialog("%s - GRAMPS" % _("Select file"),
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, # buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OK, gtk.RESPONSE_OK) # gtk.STOCK_OK, gtk.RESPONSE_OK)
) # )
response = fs_top.run() # response = fs_top.run()
if response == gtk.RESPONSE_OK: # if response == gtk.RESPONSE_OK:
fs_ok_clicked(fs_top) # fs_ok_clicked(fs_top)
elif response == gtk.RESPONSE_CANCEL: # elif response == gtk.RESPONSE_CANCEL:
fs_close_window(fs_top) # fs_close_window(fs_top)
fs_top.destroy() # fs_top.destroy()
#--------------------------------------------------------------- #---------------------------------------------------------------
try: try:
archive = tarfile.open(self.filename,'w:gz') archive = tarfile.open(self.filename,'w:gz')
except EnvironmentError, msg: except EnvironmentError, msg:
log.warn(str(msg)) log.warn(str(msg))
self.msg_callback(_('Failure writing %s') % self.filename, str(msg)) self.user.notify_error(_('Failure writing %s') % self.filename, str(msg))
return 0 return 0
# Write media files first, since the database may be modified # Write media files first, since the database may be modified
@ -213,7 +212,7 @@ class PackageWriter(object):
# Write XML now # Write XML now
g = StringIO() g = StringIO()
gfile = XmlWriter(self.db, self.msg_callback, self.callback, 2) gfile = XmlWriter(self.db, self.user, 2)
gfile.write_handle(g) gfile.write_handle(g)
tarinfo = tarfile.TarInfo('data.gramps') tarinfo = tarfile.TarInfo('data.gramps')
tarinfo.size = len(g.getvalue()) tarinfo.size = len(g.getvalue())

@ -55,14 +55,12 @@ import Errors
from glade import Glade from glade import Glade
class CalendarWriter(object): class CalendarWriter(object):
def __init__(self, database, filename, msg_callback, option_box=None, def __init__(self, database, filename, user, option_box=None):
callback=None):
self.db = database self.db = database
self.filename = filename self.filename = filename
self.msg_callback = msg_callback self.user = user
self.option_box = option_box self.option_box = option_box
self.callback = callback if callable(self.user.callback): # callback is really callable
if callable(self.callback): # callback is really callable
self.update = self.update_real self.update = self.update_real
else: else:
self.update = self.update_empty self.update = self.update_empty
@ -88,7 +86,7 @@ class CalendarWriter(object):
self.count += 1 self.count += 1
newval = int(100 * self.count / self.total) newval = int(100 * self.count / self.total)
if newval != self.oldval: if newval != self.oldval:
self.callback(newval) self.user.callback(newval)
self.oldval = newval self.oldval = newval
def writeln(self, text): def writeln(self, text):
@ -102,10 +100,10 @@ class CalendarWriter(object):
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
self.msg_callback(msg2, str(msg)) self.user.notify_error(msg2, str(msg))
return False return False
except: except:
self.msg_callback(_("Could not create %s") % filename) self.user.notify_error(_("Could not create %s") % filename)
return False return False
self.writeln("BEGIN:VCALENDAR") self.writeln("BEGIN:VCALENDAR")
@ -252,6 +250,6 @@ class CalendarWriter(object):
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def exportData(database, filename, msg_callback, option_box=None, callback=None): def exportData(database, filename, user, option_box=None):
cw = CalendarWriter(database, 0, filename, option_box, callback) cw = CalendarWriter(database, filename, user, option_box)
return cw.export_data(filename) return cw.export_data(filename)

@ -61,17 +61,17 @@ from gen.plug.utils import OpenFileOrStdout
# Support Functions # Support Functions
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def exportData(database, filename, msg_callback, option_box=None, callback=None): def exportData(database, filename, user, option_box=None):
"""Function called by Gramps to export data on persons in VCard format.""" """Function called by Gramps to export data on persons in VCard format."""
cardw = VCardWriter(database, filename, option_box, callback) cardw = VCardWriter(database, filename, option_box, user)
try: try:
cardw.export_data() cardw.export_data()
except EnvironmentError, msg: except EnvironmentError, msg:
msg_callback(_("Could not create %s") % filename, str(msg)) user.notify_error(_("Could not create %s") % filename, str(msg))
return False return False
except: except:
# Export shouldn't bring Gramps down. # Export shouldn't bring Gramps down.
msg_callback(_("Could not create %s") % filename) user.notify_error(_("Could not create %s") % filename)
return False return False
return True return True
@ -102,13 +102,13 @@ class VCardWriter(object):
raise TypeError("VCard escaping is not implemented for " raise TypeError("VCard escaping is not implemented for "
"data type %s." % str(type(data))) "data type %s." % str(type(data)))
def __init__(self, database, filename, option_box=None, callback=None): def __init__(self, database, filename, option_box=None, user=None):
self.db = database self.db = database
self.filename = filename self.filename = filename
self.user = user
self.filehandle = None self.filehandle = None
self.option_box = option_box self.option_box = option_box
self.callback = callback if callable(self.user.callback): # callback is really callable
if callable(self.callback): # callback is really callable
self.update = self.update_real self.update = self.update_real
else: else:
self.update = self.update_empty self.update = self.update_empty
@ -134,7 +134,7 @@ class VCardWriter(object):
self.count += 1 self.count += 1
newval = int(100*self.count/self.total) newval = int(100*self.count/self.total)
if newval != self.oldval: if newval != self.oldval:
self.callback(newval) self.user.callback(newval)
self.oldval = newval self.oldval = newval
def writeln(self, text): def writeln(self, text):

@ -62,7 +62,6 @@ from gen.updatecallback import UpdateCallback
from gen.db.exceptions import DbWriteFailure from gen.db.exceptions import DbWriteFailure
import const import const
import constfunc import constfunc
#from QuestionDialog import ErrorDialog
from ExportOptions import WriterOptionBox from ExportOptions import WriterOptionBox
import libgrampsxml import libgrampsxml
@ -99,7 +98,7 @@ class GrampsXmlWriter(UpdateCallback):
""" """
def __init__(self, db, strip_photos=0, compress=1, version="unknown", def __init__(self, db, strip_photos=0, compress=1, version="unknown",
callback=None): user=None):
""" """
Initialize, but does not write, an XML file. Initialize, but does not write, an XML file.
@ -110,7 +109,8 @@ class GrampsXmlWriter(UpdateCallback):
> 2: remove leading slash (quick write) > 2: remove leading slash (quick write)
compress - attempt to compress the database compress - attempt to compress the database
""" """
UpdateCallback.__init__(self, callback) UpdateCallback.__init__(self, user.callback)
self.user = user
self.compress = compress self.compress = compress
if not _gzip_ok: if not _gzip_ok:
self.compress = False self.compress = False
@ -1247,7 +1247,7 @@ def conf_priv(obj):
# export_data # export_data
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def export_data(database, filename, msg_callback, option_box=None, callback=None): def export_data(database, filename, user, option_box=None):
""" """
Call the XML writer with the syntax expected by the export plugin. Call the XML writer with the syntax expected by the export plugin.
""" """
@ -1264,7 +1264,7 @@ def export_data(database, filename, msg_callback, option_box=None, callback=None
option_box.parse_options() option_box.parse_options()
database = option_box.get_filtered_database(database) database = option_box.get_filtered_database(database)
g = XmlWriter(database, msg_callback, callback, 0, compress) g = XmlWriter(database, user, 0, compress)
return g.write(filename) return g.write(filename)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -1277,11 +1277,11 @@ class XmlWriter(GrampsXmlWriter):
Writes a database to the XML file. Writes a database to the XML file.
""" """
def __init__(self, dbase, msg_callback, callback, strip_photos, compress=1): def __init__(self, dbase, user, strip_photos, compress=1):
GrampsXmlWriter.__init__( GrampsXmlWriter.__init__(
self, dbase, strip_photos, compress, const.VERSION, callback) self, dbase, strip_photos, compress, const.VERSION, user)
self.msg_callback = msg_callback self.user = user
def write(self, filename): def write(self, filename):
""" """
Write the database to the specified file. Write the database to the specified file.
@ -1291,5 +1291,5 @@ class XmlWriter(GrampsXmlWriter):
ret = GrampsXmlWriter.write(self, filename) ret = GrampsXmlWriter.write(self, filename)
except DbWriteFailure, msg: except DbWriteFailure, msg:
(m1,m2) = msg.messages() (m1,m2) = msg.messages()
self.msg_callback(m1, m2) self.user.notify_db_error(m1, m2)
return ret return ret

@ -102,11 +102,11 @@ def download(url, filename=None):
r.close() r.close()
return success return success
def export_file(db, filename, callback): def export_file(db, filename, user):
""" """
Export the db to a file (such as a GEDCOM file). Export the db to a file (such as a GEDCOM file).
>>> export_file(DbDjango(), "/home/user/Untitled_1.ged", lambda a: a) >>> export_file(DbDjango(), "/home/user/Untitled_1.ged", User())
""" """
dbstate = DbState.DbState() dbstate = DbState.DbState()
climanager = CLIManager(dbstate, False) # do not load db_loader climanager = CLIManager(dbstate, False) # do not load db_loader
@ -125,7 +125,7 @@ def export_file(db, filename, callback):
print "ERROR:", name, exception print "ERROR:", name, exception
return False return False
export_function = getattr(mod, pdata.export_function) export_function = getattr(mod, pdata.export_function)
export_function(db, filename, callback) export_function(db, filename, user)
return True return True
return False return False