3142: To allow backups into GRAMPS XML format without Proxy or Living filters; added two config settings for quick-backup dir and filename pattern; added dbstate.db_name

svn: r15644
This commit is contained in:
Doug Blank 2010-07-22 01:50:00 +00:00
parent ed3bd66d0d
commit 59403835fe
3 changed files with 146 additions and 0 deletions

View File

@ -187,6 +187,7 @@ class CLIManager(object):
""" """
def __init__(self, dbstate, setloader): def __init__(self, dbstate, setloader):
self.dbstate = dbstate self.dbstate = dbstate
self.db_name = None
if setloader: if setloader:
self.db_loader = CLIDbLoader(self.dbstate) self.db_loader = CLIDbLoader(self.dbstate)
else: else:
@ -249,6 +250,7 @@ class CLIManager(object):
if filename[-1] == os.path.sep: if filename[-1] == os.path.sep:
filename = filename[:-1] filename = filename[:-1]
name = os.path.basename(filename) name = os.path.basename(filename)
self.db_name = title
if title: if title:
name = title name = title

View File

@ -248,6 +248,9 @@ register('paths.recent-file', '')
register('paths.recent-import-dir', '') register('paths.recent-import-dir', '')
register('paths.report-directory', const.USER_HOME) register('paths.report-directory', const.USER_HOME)
register('paths.website-directory', const.USER_HOME) register('paths.website-directory', const.USER_HOME)
register('paths.quick-backup-directory', const.USER_HOME)
register('paths.quick-backup-filename',
"%(filename)s_%(year)d-%(month)02d-%(day)02d.%(extension)s")
register('preferences.complete-color', '#008b00') register('preferences.complete-color', '#008b00')
register('preferences.custom-marker-color', '#8b008b') register('preferences.custom-marker-color', '#8b008b')

View File

@ -34,6 +34,7 @@ Manages the main window and the pluggable views
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import os import os
import time
from gen.ggettext import gettext as _ from gen.ggettext import gettext as _
from cStringIO import StringIO from cStringIO import StringIO
from collections import defaultdict from collections import defaultdict
@ -76,6 +77,7 @@ from QuestionDialog import (ErrorDialog, WarningDialog, QuestionDialog2,
InfoDialog) InfoDialog)
from gui import widgets from gui import widgets
import UndoHistory import UndoHistory
import Utils
from gui.dbloader import DbLoader from gui.dbloader import DbLoader
import GrampsDisplay import GrampsDisplay
from gui.widgets.progressdialog import ProgressMonitor, GtkProgressDialog from gui.widgets.progressdialog import ProgressMonitor, GtkProgressDialog
@ -102,6 +104,7 @@ UIDEFAULT = '''<ui>
<menuitem action="Import"/> <menuitem action="Import"/>
<menuitem action="Export"/> <menuitem action="Export"/>
<placeholder name="LocalExport"/> <placeholder name="LocalExport"/>
<menuitem action="Backup"/>
<separator/> <separator/>
<menuitem action="Abandon"/> <menuitem action="Abandon"/>
<menuitem action="Quit"/> <menuitem action="Quit"/>
@ -239,6 +242,7 @@ class ViewManager(CLIManager):
""" """
CLIManager.__init__(self, dbstate, False) CLIManager.__init__(self, dbstate, False)
self.view_category_order = view_category_order self.view_category_order = view_category_order
#set pluginmanager to GUI one #set pluginmanager to GUI one
self._pmgr = GuiPluginManager.get_instance() self._pmgr = GuiPluginManager.get_instance()
self.active_page = None self.active_page = None
@ -460,6 +464,8 @@ class ViewManager(CLIManager):
self._readonly_action_list = [ self._readonly_action_list = [
('Export', 'gramps-export', _('_Export...'), "<control>e", None, ('Export', 'gramps-export', _('_Export...'), "<control>e", None,
self.export_data), self.export_data),
('Backup', None, _("Make Backup..."), None,
_("Make a Gramps XML backup of the database"), self.quick_backup),
('Abandon', gtk.STOCK_REVERT_TO_SAVED, ('Abandon', gtk.STOCK_REVERT_TO_SAVED,
_('_Abandon Changes and Quit'), None, None, self.abort), _('_Abandon Changes and Quit'), None, None, self.abort),
('Reports', 'gramps-reports', _('_Reports'), None, ('Reports', 'gramps-reports', _('_Reports'), None,
@ -987,6 +993,7 @@ class ViewManager(CLIManager):
if filename[-1] == os.path.sep: if filename[-1] == os.path.sep:
filename = filename[:-1] filename = filename[:-1]
name = os.path.basename(filename) name = os.path.basename(filename)
self.db_name = title
if title: if title:
name = title name = title
@ -1065,6 +1072,140 @@ class ViewManager(CLIManager):
# Let it go: history window does not exist # Let it go: history window does not exist
return return
def quick_backup(self, obj):
"""
Make a quick XML back with or without media.
"""
window = gtk.Dialog(_("Gramps XML Backup"),
self.uistate.window,
gtk.DIALOG_DESTROY_WITH_PARENT, None)
window.set_size_request(400, -1)
ok_button = window.add_button(gtk.STOCK_OK,
gtk.RESPONSE_APPLY)
close_button = window.add_button(gtk.STOCK_CLOSE,
gtk.RESPONSE_CLOSE)
vbox = window.get_content_area()
hbox = gtk.HBox()
label = gtk.Label(_("Path:"))
label.set_justify(gtk.JUSTIFY_LEFT)
label.set_size_request(90, -1)
label.set_alignment(0, .5)
hbox.pack_start(label, False)
path_entry = gtk.Entry()
path_entry.set_text(config.get('paths.quick-backup-directory'))
hbox.pack_start(path_entry, True)
file_entry = gtk.Entry()
button = gtk.Button()
button.connect("clicked",
lambda widget: self.select_backup_path(widget, path_entry))
image = gtk.Image()
image.set_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON)
image.show()
button.add(image)
hbox.pack_end(button, False)
vbox.pack_start(hbox, False)
hbox = gtk.HBox()
label = gtk.Label(_("File:"))
label.set_justify(gtk.JUSTIFY_LEFT)
label.set_size_request(90, -1)
label.set_alignment(0, .5)
hbox.pack_start(label, False)
struct_time = time.localtime()
file_entry.set_text(config.get('paths.quick-backup-filename') %
{"filename": self.db_name,
"year": struct_time.tm_year,
"month": struct_time.tm_mon,
"day": struct_time.tm_mday,
"hour": struct_time.tm_hour,
"minutes": struct_time.tm_min,
"seconds": struct_time.tm_sec,
"extension": "gpkg",
})
hbox.pack_end(file_entry, True)
vbox.pack_start(hbox, False)
hbox = gtk.HBox()
label = gtk.Label(_("Media:"))
label.set_justify(gtk.JUSTIFY_LEFT)
label.set_size_request(90, -1)
label.set_alignment(0, .5)
hbox.pack_start(label, False)
include = gtk.RadioButton(None, _("Include"))
exclude = gtk.RadioButton(include, _("Exclude"))
include.connect("toggled", lambda widget: self.media_toggle(widget, file_entry))
hbox.pack_start(include, True)
hbox.pack_end(exclude, True)
vbox.pack_start(hbox, False)
window.show_all()
d = window.run()
window.hide()
if d == gtk.RESPONSE_APPLY:
self.uistate.set_busy_cursor(1)
self.uistate.progress.show()
self.uistate.push_message(self.dbstate, _("Making backup..."))
filename = os.path.join(path_entry.get_text(), file_entry.get_text())
if include.toggled():
from ExportPkg import PackageWriter
writer = PackageWriter(self.dbstate.db, filename,
msg_callback=lambda m1, m2: ErrorDialog(m1[0], m1[1]),
callback=None)
writer.export()
else:
from ExportXml import XmlWriter
writer = XmlWriter(self.dbstate.db,
msg_callback=lambda m1, m2: ErrorDialog(m1[0], m1[1]),
callback=None, strip_photos=0, compress=1)
writer.write(filename)
self.uistate.set_busy_cursor(0)
self.uistate.progress.hide()
self.uistate.push_message(self.dbstate, _("Backup saved to '%s'" % filename))
config.set('paths.quick-backup-directory', path_entry.get_text())
else:
self.uistate.push_message(self.dbstate, _("Backup aborted"))
window.destroy()
def select_backup_path(self, widget, path_entry):
"""
Choose a backup folder. Make sure there is one highlighted in
right pane, otherwise FileChooserDialog will hang.
"""
f = gtk.FileChooserDialog(
_("Select backup directory"),
action=gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER,
buttons=(gtk.STOCK_CANCEL,
gtk.RESPONSE_CANCEL,
gtk.STOCK_APPLY,
gtk.RESPONSE_OK))
mpath = path_entry.get_text()
if not mpath:
mpath = const.HOME_DIR
f.set_current_folder(os.path.dirname(mpath))
f.set_filename(os.path.join(mpath, "."))
status = f.run()
if status == gtk.RESPONSE_OK:
filename = f.get_filename()
if filename:
val = Utils.get_unicode_path(filename)
if val:
path_entry.set_text(val)
f.destroy()
return True
def media_toggle(self, widget, file_entry):
"""
Toggles media include values in the quick backup dialog.
"""
include = widget.get_active()
if include:
extension = "gpkg"
else:
extension = "gramps"
filename = file_entry.get_text()
if "." in filename:
base, ext = filename.rsplit(".", 1)
file_entry.set_text("%s.%s" % (base, extension))
else:
file_entry.set_text("%s.%s" % (filename, extension))
def reports_clicked(self, obj): def reports_clicked(self, obj):
""" """
Displays the Reports dialog Displays the Reports dialog