From 97170b5251cc3a976d1fc28b874a292344998368 Mon Sep 17 00:00:00 2001 From: Gary Burton Date: Sun, 20 Jul 2008 18:33:04 +0000 Subject: [PATCH] Make exclusion of unlinked records optional svn: r10883 --- src/Config/_GrampsConfigKeys.py | 3 ++ src/ExportOptions.py | 11 +++- src/GrampsDbUtils/_WriteGedcom.py | 86 ++++++++++++++++++++++--------- src/GrampsDbUtils/_WriteXML.py | 10 ++-- src/plugins/WritePkg.py | 13 +++-- 5 files changed, 86 insertions(+), 37 deletions(-) diff --git a/src/Config/_GrampsConfigKeys.py b/src/Config/_GrampsConfigKeys.py index c186d1f77..7596528e3 100644 --- a/src/Config/_GrampsConfigKeys.py +++ b/src/Config/_GrampsConfigKeys.py @@ -2,6 +2,7 @@ # Gramps - a GTK+/GNOME based genealogy program # # Copyright (C) 2006-2007 Donald N. Allingham +# Copyright (C) 2008 Gary Burton # # 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 @@ -53,6 +54,7 @@ file, and provide a default value according to the value's type. EXPORT_NO_PRIVATE = ('export', 'no-private', 0) EXPORT_RESTRICT = ('export', 'restrict-living', 0) +EXPORT_NO_UNLINKED = ('export', 'no-unlinked', 0) DEFAULT_SOURCE = ('preferences', 'default-source', 0) RELATION_SHADE = ('preferences', 'relation-shade', 0) ONLINE_MAPS = ('preferences', 'online-maps', 0) @@ -281,6 +283,7 @@ default_value = { OWNER_WARN : False, EXPORT_NO_PRIVATE : True, EXPORT_RESTRICT : True, + EXPORT_NO_UNLINKED : True, DATE_BEFORE_RANGE : 10, DATE_AFTER_RANGE : 10, DATE_ABOUT_RANGE : 10, diff --git a/src/ExportOptions.py b/src/ExportOptions.py index f0fc066db..70a490508 100644 --- a/src/ExportOptions.py +++ b/src/ExportOptions.py @@ -2,6 +2,7 @@ # Gramps - a GTK+/GNOME based genealogy program # # Copyright (C) 2007-2008 Donald N. Allingham +# Copyright (C) 2008 Gary Burton # # 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 @@ -57,11 +58,12 @@ class WriterOptionBox: self.cfilter = None self.restrict_check = None self.private_check = None + self.unlinked_check = None self.filter_obj = None def get_option_box(self): """Build up a gtk.Table that contains the standard options.""" - table = gtk.Table(3, 2) + table = gtk.Table(4, 2) self.filter_obj = gtk.ComboBox() label = gtk.Label(_('Filt_er')) @@ -72,9 +74,12 @@ class WriterOptionBox: _('_Do not include records marked private')) self.restrict_check = gtk.CheckButton( _('_Restrict data on living people')) + self.unlinked_check = gtk.CheckButton( + _('_Do not include unlinked records')) self.private_check.set_active(Config.get(Config.EXPORT_NO_PRIVATE)) self.restrict_check.set_active(Config.get(Config.EXPORT_RESTRICT)) + self.unlinked_check.set_active(Config.get(Config.EXPORT_NO_UNLINKED)) table.set_border_width(12) table.set_row_spacings(6) @@ -83,6 +88,7 @@ class WriterOptionBox: table.attach(self.filter_obj, 1, 2, 0, 1, yoptions=0) table.attach(self.private_check, 1, 2, 1, 2, yoptions=0) table.attach(self.restrict_check, 1, 2, 2, 3, yoptions=0) + table.attach(self.unlinked_check, 1, 2, 3, 4, yoptions=0) entire_db = GenericFilter() entire_db.set_name(_("Entire Database")) @@ -138,13 +144,16 @@ class WriterOptionBox: private = privacy requested restrict = restrict information on living peoplel cfitler = return the GenericFilter selected + unlinked = restrict unlinked records """ self.restrict = self.restrict_check.get_active() self.private = self.private_check.get_active() + self.unlinked = self.unlinked_check.get_active() Config.set(Config.EXPORT_NO_PRIVATE, self.private) Config.set(Config.EXPORT_RESTRICT, self.restrict) + Config.set(Config.EXPORT_NO_UNLINKED, self.unlinked) Config.sync() model = self.filter_obj.get_model() diff --git a/src/GrampsDbUtils/_WriteGedcom.py b/src/GrampsDbUtils/_WriteGedcom.py index 989fee50c..8af9c3d3d 100644 --- a/src/GrampsDbUtils/_WriteGedcom.py +++ b/src/GrampsDbUtils/_WriteGedcom.py @@ -314,6 +314,10 @@ class GedcomWriter(BasicUtils.UpdateCallback): self.cmd_line = cmd_line self.dirname = None self.gedcom_file = None + + # The number of different stages other than any of the optional filters + # which the write_gedcom_file method will call. + self.progress_cnt = 5 self.setup(option_box) @@ -324,15 +328,36 @@ class GedcomWriter(BasicUtils.UpdateCallback): to apply proxy databases. """ if option_box: - option_box.parse_options() + # Increment the progress count for each filter type chosen + if option_box.private: + self.progress_cnt += 1 + + if option_box.restrict: + self.progress_cnt += 1 + + if not option_box.cfilter.is_empty(): + self.progress_cnt += 1 + + if option_box.unlinked: + self.progress_cnt += 1 + + self.set_total(self.progress_cnt) + self.progress_cnt = 0 + # If the private flag is set, apply the PrivateProxyDb if option_box.private: + self.reset(_("Filtering private data")) + self.progress_cnt += 1 + self.update(self.progress_cnt) self.dbase = gen.proxy.PrivateProxyDb(self.dbase) # If the restrict flag is set, apply the LivingProxyDb if option_box.restrict: + self.reset(_("Filtering living persons")) + self.progress_cnt += 1 + self.update(self.progress_cnt) self.dbase = gen.proxy.LivingProxyDb( self.dbase, gen.proxy.LivingProxyDb.MODE_INCLUDE_LAST_NAME_ONLY) @@ -340,13 +365,18 @@ class GedcomWriter(BasicUtils.UpdateCallback): # If the filter returned by cfilter is not empty, apply the # FilterProxyDb if not option_box.cfilter.is_empty(): + self.reset(_("Applying selected filter")) + self.progress_cnt += 1 + self.update(self.progress_cnt) self.dbase = gen.proxy.FilterProxyDb( self.dbase, option_box.cfilter) # Apply the ReferencedProxyDb to remove any objects not referenced # after any of the other proxies have been applied - if option_box.private or option_box.restrict \ - or not option_box.cfilter.is_empty(): + if option_box.unlinked: + self.reset(_("Filtering unlinked records")) + self.progress_cnt += 1 + self.update(self.progress_cnt) self.dbase = gen.proxy.ReferencedProxyDb(self.dbase) def write_gedcom_file(self, filename): @@ -514,25 +544,20 @@ class GedcomWriter(BasicUtils.UpdateCallback): people will be confused when the progress bar is idle. """ + self.reset(_("Writing individuals")) + self.progress_cnt += 1 + self.update(self.progress_cnt) phandles = self.dbase.get_person_handles() - hcnt = len(phandles) - - self.reset(_("Sorting")) - self.set_total(hcnt) sorted_list = [] for handle in phandles: person = self.dbase.get_person_from_handle(handle) data = (person.get_gramps_id(), handle) sorted_list.append(data) - self.update() sorted_list.sort() - self.set_total(hcnt + len(self.dbase.get_family_handles())) - self.reset(_("Writing")) for data in sorted_list: self.__person(self.dbase.get_person_from_handle(data[1])) - self.update() def __person(self, person): """ @@ -861,7 +886,9 @@ class GedcomWriter(BasicUtils.UpdateCallback): """ Write out the list of families, sorting by GRAMPS ID. """ - + self.reset(_("Writing families")) + self.progress_cnt += 1 + self.update(self.progress_cnt) # generate a list of (GRAMPS_ID, HANDLE) pairs. This list # can then be sorted by the sort routine, which will use the # first value of the tuple as the sort key. @@ -901,7 +928,6 @@ class GedcomWriter(BasicUtils.UpdateCallback): self.__photos(family.get_media_list(), 1) self.__note_references(family.get_note_list(), 1) self.__change(family.get_change_time(), 1) - self.update() def __family_child_list(self, child_ref_list): """ @@ -1023,6 +1049,9 @@ class GedcomWriter(BasicUtils.UpdateCallback): """ Write out the list of sources, sorting by GRAMPS ID. """ + self.reset(_("Writing sources")) + self.progress_cnt += 1 + self.update(self.progress_cnt) sorted_list = sort_handles_by_id(self.dbase.get_source_handles(), self.dbase.get_source_from_handle) @@ -1054,6 +1083,9 @@ class GedcomWriter(BasicUtils.UpdateCallback): """ Write out the list of notes, sorting by GRAMPS ID. """ + self.reset(_("Writing notes")) + self.progress_cnt += 1 + self.update(self.progress_cnt) sorted_list = sort_handles_by_id(self.dbase.get_note_handles(), self.dbase.get_note_from_handle) @@ -1088,6 +1120,9 @@ class GedcomWriter(BasicUtils.UpdateCallback): +1 RIN {0:1} +1 <> {0:1} """ + self.reset(_("Writing repositories")) + self.progress_cnt += 1 + self.update(self.progress_cnt) sorted_list = sort_handles_by_id(self.dbase.get_repository_handles(), self.dbase.get_repository_from_handle) @@ -1460,17 +1495,20 @@ def export_data(database, filename, person, option_box, callback=None): External interface used to register with the plugin system. """ ret = False - try: - ged_write = GedcomWriter(database, person, 0, - option_box, callback) - ret = ged_write.write_gedcom_file(filename) - except IOError, msg: - msg2 = _("Could not create %s") % filename - ErrorDialog(msg2, str(msg)) - except Errors.DatabaseError, msg: - ErrorDialog(_("Export failed"), str(msg)) - except: - ErrorDialog(_("Could not create %s") % filename) + ged_write = GedcomWriter(database, person, 0, + option_box, callback) + ret = ged_write.write_gedcom_file(filename) + #try: + # ged_write = GedcomWriter(database, person, 0, + # option_box, callback) + # ret = ged_write.write_gedcom_file(filename) + #except IOError, msg: + # msg2 = _("Could not create %s") % filename + # ErrorDialog(msg2, str(msg)) + #except Errors.DatabaseError, msg: + # ErrorDialog(_("Export failed"), str(msg)) + #except: + # ErrorDialog(_("Could not create %s") % filename) return ret #------------------------------------------------------------------------- diff --git a/src/GrampsDbUtils/_WriteXML.py b/src/GrampsDbUtils/_WriteXML.py index d5843e248..cc32ae5e9 100644 --- a/src/GrampsDbUtils/_WriteXML.py +++ b/src/GrampsDbUtils/_WriteXML.py @@ -81,13 +81,10 @@ def export_data(database, filename, person, option_box, callback=None): option_box.parse_options() - restrict = option_box.restrict - private = option_box.private - - if private: + if option_box.private: database = gen.proxy.PrivateProxyDb(database) - if restrict: + if option_box.restrict: database = gen.proxy.LivingProxyDb( database, gen.proxy.LivingProxyDb.MODE_INCLUDE_LAST_NAME_ONLY) @@ -96,8 +93,7 @@ def export_data(database, filename, person, option_box, callback=None): # Apply the ReferencedProxyDb to remove any objects not referenced # after any of the other proxies have been applied - if option_box.private or option_box.restrict \ - or not option_box.cfilter.is_empty(): + if option_box.unlinked: database = gen.proxy.ReferencedProxyDb(database) g = XmlWriter(database, callback, 0, compress) diff --git a/src/plugins/WritePkg.py b/src/plugins/WritePkg.py index f92c92f2a..314a75b40 100644 --- a/src/plugins/WritePkg.py +++ b/src/plugins/WritePkg.py @@ -3,6 +3,7 @@ # # Copyright (C) 2000-2008 Donald N. Allingham # Copyright (C) 2008 Brian G. Matherly +# Copyright (C) 2008 Gary Burton # # 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 @@ -70,19 +71,21 @@ import Utils def writeData(database, filename, person, option_box, callback=None): option_box.parse_options() - restrict = option_box.restrict - private = option_box.private - - if private: + if option_box.private: database = gen.proxy.PrivateProxyDb(database) - if restrict: + if option_box.restrict: database = gen.proxy.LivingProxyDb( database, gen.proxy.LivingProxyDb.MODE_INCLUDE_LAST_NAME_ONLY) if not option_box.cfilter.is_empty(): database = gen.proxy.FilterProxyDb(database, option_box.cfilter) + # Apply the ReferencedProxyDb to remove any objects not referenced + # after any of the other proxies have been applied + if option_box.unlinked: + database = gen.proxy.ReferencedProxyDb(database) + writer = PackageWriter(database, filename, callback) return writer.export()