2007-03-24 Don Allingham <don@gramps-project.org>

* src/ViewManager.py: add support for new directory type
	* src/GrampsDb/_GrampsDbBase.py: use normal pickle encoding
	* src/GrampsDb/_GrampsDBDir.py: new directory based type
	* src/GrampsDb/_GrampsDbFactories.py: add support for new directory type
	* src/Editors/_EditNote.py: only update on save
	* src/Selectors/_SelectPerson.py: use normal columns
	* src/GrampsDbUtils/_ReadGedcom.py: add support for new directory type
	* src/GrampsDbUtils/__init__.py: add support for new directory type
	* src/GrampsDbUtils/_Backup.py: fast pickle based backup
	* src/ArgHandler.py: add support for new directory type



svn: r8313
This commit is contained in:
Don Allingham 2007-03-25 02:25:37 +00:00
parent be30e422b9
commit d20b4833f9
10 changed files with 1784 additions and 57 deletions

View File

@ -1,3 +1,15 @@
2007-03-24 Don Allingham <don@gramps-project.org>
* src/ViewManager.py: add support for new directory type
* src/GrampsDb/_GrampsDbBase.py: use normal pickle encoding
* src/GrampsDb/_GrampsDBDir.py: new directory based type
* src/GrampsDb/_GrampsDbFactories.py: add support for new directory type
* src/Editors/_EditNote.py: only update on save
* src/Selectors/_SelectPerson.py: use normal columns
* src/GrampsDbUtils/_ReadGedcom.py: add support for new directory type
* src/GrampsDbUtils/__init__.py: add support for new directory type
* src/GrampsDbUtils/_Backup.py: fast pickle based backup
* src/ArgHandler.py: add support for new directory type
2007-03-24 Zsolt Foldvari <zfoldvar@users.sourceforge.net> 2007-03-24 Zsolt Foldvari <zfoldvar@users.sourceforge.net>
* src/Editors/_EditAddress.py: * src/Editors/_EditAddress.py:
* src/Editors/_EditLdsOrd.py: * src/Editors/_EditLdsOrd.py:

View File

@ -299,7 +299,7 @@ class ArgHandler:
filename = os.path.abspath(os.path.expanduser(self.open_gui)) filename = os.path.abspath(os.path.expanduser(self.open_gui))
filetype = Mime.get_type(filename) filetype = Mime.get_type(filename)
if filetype in (const.app_gramps,const.app_gedcom, if filetype in (const.app_gramps,const.app_gedcom,
const.app_gramps_xml): const.app_gramps_xml, 'x-directory/normal'):
# Say the type outloud # Say the type outloud
if filetype == const.app_gramps: if filetype == const.app_gramps:
print "Type: GRAMPS database" print "Type: GRAMPS database"
@ -314,6 +314,7 @@ class ArgHandler:
success = True success = True
except: except:
print "Cannot open %s. Exiting..." print "Cannot open %s. Exiting..."
elif filetype in (const.app_gramps_package,): elif filetype in (const.app_gramps_package,):
QuestionDialog.OkDialog( _("Opening non-native format"), QuestionDialog.OkDialog( _("Opening non-native format"),
_("New GRAMPS database has to be set up " _("New GRAMPS database has to be set up "
@ -370,6 +371,9 @@ class ArgHandler:
elif format == 'gramps-xml': elif format == 'gramps-xml':
filetype = const.app_gramps_xml filetype = const.app_gramps_xml
print "Type: GRAMPS XML" print "Type: GRAMPS XML"
elif format == 'x-directory/normal':
filetype = 'x-directory/normal'
print "Type: GRAMPS DIR"
else: else:
print "Unknown file type: %s" % format print "Unknown file type: %s" % format
print "Exiting..." print "Exiting..."

View File

@ -150,6 +150,7 @@ class EditNote(EditPrimary):
] ]
buffer = EditorBuffer() buffer = EditorBuffer()
self.buffer = buffer
self.text = self.top.get_widget('text') self.text = self.top.get_widget('text')
self.text.set_editable(not self.dbstate.db.readonly) self.text.set_editable(not self.dbstate.db.readonly)
@ -193,9 +194,10 @@ class EditNote(EditPrimary):
self.empty = True self.empty = True
# connection to buffer signals must be after the initial values are set # connection to buffer signals must be after the initial values are set
buffer.connect('changed', self.update_note) #buffer.connect('changed', self.update_note)
buffer.connect_after('apply-tag', self.update_note) self.sig_list = []
buffer.connect_after('remove-tag', self.update_note) self.sig_list.append(buffer.connect_after('apply-tag', self.update_note))
self.sig_list.append(buffer.connect_after('remove-tag', self.update_note))
def update_note(self, buffer, *args): def update_note(self, buffer, *args):
"""Update the Note object with current value. """Update the Note object with current value.
@ -207,6 +209,7 @@ class EditNote(EditPrimary):
start = buffer.get_start_iter() start = buffer.get_start_iter()
stop = buffer.get_end_iter() stop = buffer.get_end_iter()
text = buffer.get_text(start, stop) text = buffer.get_text(start, stop)
print text
self.obj.set(text) self.obj.set(text)
else: else:
log.debug("NOTE OBJ DOES NOT EXIST") log.debug("NOTE OBJ DOES NOT EXIST")
@ -222,7 +225,13 @@ class EditNote(EditPrimary):
""" """
Save the data. Save the data.
""" """
for i in self.sig_list:
self.buffer.disconnect(i)
trans = self.db.transaction_begin() trans = self.db.transaction_begin()
self.update_note(self.text.get_buffer())
if self.obj.get_handle(): if self.obj.get_handle():
self.db.commit_note(self.obj,trans) self.db.commit_note(self.obj,trans)
else: else:

1568
src/GrampsDb/_GrampsDBDir.py Normal file

File diff suppressed because it is too large Load Diff

View File

@ -2469,12 +2469,8 @@ class Transaction:
is the object's database handle, and the data is the tuple returned is the object's database handle, and the data is the tuple returned
by the object's serialize method. by the object's serialize method.
""" """
self.last = self.db.append(cPickle.dumps((obj_type, self.last = self.db.append(
handle, cPickle.dumps((obj_type, handle, old_data, new_data)))
old_data,
new_data),
1)
)
if self.first == None: if self.first == None:
self.first = self.last self.first = self.last

View File

@ -70,6 +70,9 @@ def gramps_db_factory(db_type):
elif db_type == const.app_gedcom: elif db_type == const.app_gedcom:
from _GrampsGEDDB import GrampsGEDDB from _GrampsGEDDB import GrampsGEDDB
cls = GrampsGEDDB cls = GrampsGEDDB
elif db_type == 'x-directory/normal':
from _GrampsDBDir import GrampsDBDir
cls = GrampsDBDir
else: else:
raise GrampsDbException("Attempt to create unknown " raise GrampsDbException("Attempt to create unknown "
"database backend class: " "database backend class: "

View File

@ -0,0 +1,126 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2006 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: _WriteXML.py 8144 2007-02-17 22:12:56Z hippy $
"""
Contains the interface to allow a database to get written using
GRAMPS' XML file format.
"""
#-------------------------------------------------------------------------
#
# load standard python libraries
#
#-------------------------------------------------------------------------
from gettext import gettext as _
#------------------------------------------------------------------------
#
# Gramps libs
#
#------------------------------------------------------------------------
from QuestionDialog import ErrorDialog
#------------------------------------------------------------------------
#
# Set up logging
#
#------------------------------------------------------------------------
import logging
import os
import cPickle as pickle
import time
LOG = logging.getLogger(".Backukp")
def __base_dir(database):
return os.path.dirname(database.get_save_path())
def export(database):
try:
do_export(database)
except (OSError, IOError), msg:
ErrorDialog(
_("Error saving backup data"),
str(msg))
def do_export(database):
t = time.time()
tables = [
('person', database.person_map.db),
('family', database.family_map.db),
('place', database.place_map.db),
('source', database.place_map.db),
('repo', database.repository_map.db),
('note', database.note_map.db),
('media', database.media_map.db),
('event', database.media_map.db),
]
for (base, db) in tables:
backup_name = os.path.join(__base_dir(database), base + ".gbkp")
print backup_name
backup_table = open(backup_name, 'w')
cursor = db.cursor()
d = cursor.first()
while d:
backup_table.write(d[1])
d = cursor.next()
cursor.close()
backup_table.close()
print time.time() - t
def restore(database):
try:
do_restore(database)
except (OSError, IOError), msg:
ErrorDialog(
_("Error restoring backup data"),
str(msg))
def do_restore(database):
t = time.time()
tables = [
('person', database.person_map),
('family', database.family_map),
('place', database.place_map),
('source', database.place_map),
('repo', database.repository_map),
('note', database.note_map),
('media', database.media_map),
('event', database.media_map),
]
for (base, db) in tables:
backup_name = os.path.join(__base_dir(database), base + ".gbkp")
backup_table = open(backup_name, 'r')
for line in backup_table:
data = pickle.loads(line)
db[data[0]] = data
backup_table.close()
print time.time() - t

View File

@ -46,3 +46,5 @@ from _WriteGedcom import GedcomWriter
from _WriteXML import XmlWriter from _WriteXML import XmlWriter
import _Backup as Backup

View File

@ -44,6 +44,18 @@ import const
from DisplayModels import PeopleModel from DisplayModels import PeopleModel
import ManagedWindow import ManagedWindow
column_names = [
_('Name'),
_('ID') ,
_('Gender'),
_('Birth Date'),
_('Birth Place'),
_('Death Date'),
_('Death Place'),
_('Spouse'),
_('Last Change'),
]
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# SelectPerson # SelectPerson
@ -62,7 +74,7 @@ class SelectPerson(ManagedWindow.ManagedWindow):
self.renderer = gtk.CellRendererText() self.renderer = gtk.CellRendererText()
self.renderer.set_property('ellipsize',pango.ELLIPSIZE_END) self.renderer.set_property('ellipsize',pango.ELLIPSIZE_END)
self.db = dbstate.db self.dbstate = dbstate
self.glade = gtk.glade.XML(const.gladeFile,"select_person","gramps") self.glade = gtk.glade.XML(const.gladeFile,"select_person","gramps")
self.plist = self.glade.get_widget('plist') self.plist = self.glade.get_widget('plist')
self.showall = self.glade.get_widget('showall') self.showall = self.glade.get_widget('showall')
@ -78,7 +90,7 @@ class SelectPerson(ManagedWindow.ManagedWindow):
self.skip = skip self.skip = skip
self.model = PeopleModel(self.db, self.model = PeopleModel(self.dbstate.db,
(PeopleModel.FAST, filter), (PeopleModel.FAST, filter),
skip=skip) skip=skip)
@ -93,7 +105,7 @@ class SelectPerson(ManagedWindow.ManagedWindow):
else: else:
filt = self.filter filt = self.filter
self.model = PeopleModel(self.db, self.model = PeopleModel(self.dbstate.db,
(PeopleModel.FAST, filt), (PeopleModel.FAST, filt),
skip=self.skip) skip=self.skip)
self.plist.set_model(self.model) self.plist.set_model(self.model)
@ -102,23 +114,37 @@ class SelectPerson(ManagedWindow.ManagedWindow):
return (self.title, None) return (self.title, None)
def add_columns(self, tree): def add_columns(self, tree):
tree.set_fixed_height_mode(True)
try:
column = gtk.TreeViewColumn(
_('Name'),
self.renderer,
text=0,
foreground=self.model.marker_color_column)
except AttributeError:
column = gtk.TreeViewColumn(_('Name'), self.renderer, text=0) column = gtk.TreeViewColumn(_('Name'), self.renderer, text=0)
column.set_resizable(True)
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
column.set_fixed_width(225) column.set_fixed_width(225)
column.set_resizable(True)
tree.append_column(column) tree.append_column(column)
column = gtk.TreeViewColumn(_('ID'), self.renderer, text=1) for pair in self.dbstate.db.get_person_column_order():
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) if not pair[0]:
column.set_fixed_width(75) continue
column.set_resizable(True) name = column_names[pair[1]]
tree.append_column(column) try:
column = gtk.TreeViewColumn(
name, self.renderer, markup=pair[1],
foreground=self.model.marker_color_column)
except AttributeError:
column = gtk.TreeViewColumn(
name, self.renderer, markup=pair[1])
column = gtk.TreeViewColumn(_('Birth date'), self.renderer, markup=3)
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
column.set_fixed_width(160)
column.set_resizable(True) column.set_resizable(True)
column.set_fixed_width(pair[2])
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
tree.append_column(column) tree.append_column(column)
def select_function(self,store,path,iter,id_list): def select_function(self,store,path,iter,id_list):
@ -135,7 +161,7 @@ class SelectPerson(ManagedWindow.ManagedWindow):
idlist = self.get_selected_ids() idlist = self.get_selected_ids()
self.close() self.close()
if idlist and idlist[0]: if idlist and idlist[0]:
return_value = self.db.get_person_from_handle(idlist[0]) return_value = self.dbstate.db.get_person_from_handle(idlist[0])
else: else:
return_value = None return_value = None
return return_value return return_value

View File

@ -533,31 +533,12 @@ class ViewManager:
import GrampsDbUtils import GrampsDbUtils
if self.state.db.undoindex > 0: if self.state.db.undoindex > 0:
# build backup path name
bpath = self.state.db.get_save_path()
backup = os.path.splitext(bpath)[0] + ".backup.gramps"
# check to see if the old file exists
if os.path.exists(backup):
if os.path.exists(backup + ".old"):
os.remove(backup + ".old")
os.rename(backup, backup + ".old")
try:
self.uistate.set_busy_cursor(1) self.uistate.set_busy_cursor(1)
self.uistate.progress.show() self.uistate.progress.show()
self.uistate.push_message(self.state, _("Autobackup...")) self.uistate.push_message(self.state, _("Autobackup..."))
writer = GrampsDbUtils.XmlWriter( writer = GrampsDbUtils.Backup.export(self.state.db)
self.state.db, self.uistate.pulse_progressbar, 0, 1)
writer.write(backup)
self.uistate.set_busy_cursor(0) self.uistate.set_busy_cursor(0)
self.uistate.progress.hide() self.uistate.progress.hide()
except:
# the backup failed, so we assume that the autobackup file was corrupted,
# so restore the old file
if os.path.exists(backup + ".old"):
os.rename(backup+".old", backup)
def abort(self, obj=None): def abort(self, obj=None):
""" """