diff --git a/src/ExportOptions.py b/src/ExportOptions.py index 70a490508..f327fa19f 100644 --- a/src/ExportOptions.py +++ b/src/ExportOptions.py @@ -3,6 +3,7 @@ # # Copyright (C) 2007-2008 Donald N. Allingham # Copyright (C) 2008 Gary Burton +# Copyright (C) 2008 Robert Cheramy # # 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 @@ -55,20 +56,29 @@ class WriterOptionBox: self.person = person self.private = 0 self.restrict = 0 + self.unlinked = 0 self.cfilter = None + self.nfilter = None self.restrict_check = None self.private_check = None self.unlinked_check = None self.filter_obj = None + self.filter_note = None def get_option_box(self): """Build up a gtk.Table that contains the standard options.""" - table = gtk.Table(4, 2) + table = gtk.Table(5, 2) self.filter_obj = gtk.ComboBox() - label = gtk.Label(_('Filt_er')) + label = gtk.Label(_('_Person Filter')) label.set_use_underline(True) label.set_mnemonic_widget(self.filter_obj) + + # Objects for choosing a Note filter + self.filter_note = gtk.ComboBox() + label_note = gtk.Label(_('_Note Filter')) + label_note.set_use_underline(True) + label_note.set_mnemonic_widget(self.filter_note) self.private_check = gtk.CheckButton( _('_Do not include records marked private')) @@ -86,10 +96,13 @@ class WriterOptionBox: table.set_col_spacings(6) table.attach(label, 0, 1, 0, 1, xoptions=0, yoptions=0) 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) + table.attach(label_note, 0, 1, 1, 2, xoptions =0, yoptions=0) + table.attach(self.filter_note, 1, 2, 1, 2, yoptions=0) + table.attach(self.private_check, 1, 2, 2, 3, yoptions=0) + table.attach(self.restrict_check, 1, 2, 3, 4, yoptions=0) + table.attach(self.unlinked_check, 1, 2, 4, 5, yoptions=0) + # Populate the Person Filter entire_db = GenericFilter() entire_db.set_name(_("Entire Database")) the_filters = [entire_db] @@ -109,6 +122,19 @@ class WriterOptionBox: self.filter_obj.add_attribute(cell, 'text', 0) self.filter_obj.set_model(model) self.filter_obj.set_active(0) + + # Populate the Notes Filter + notes_filters = [entire_db] + + notes_filters.extend(CustomFilters.get_filters('Note')) + notes_model = gtk.ListStore(gobject.TYPE_STRING, object) + for item in notes_filters: + notes_model.append(row=[item.get_name(), item]) + notes_cell = gtk.CellRendererText() + self.filter_note.pack_start(notes_cell, True) + self.filter_note.add_attribute(notes_cell, 'text', 0) + self.filter_note.set_model(notes_model) + self.filter_note.set_active(0) table.show() return table @@ -144,7 +170,8 @@ class WriterOptionBox: private = privacy requested restrict = restrict information on living peoplel cfitler = return the GenericFilter selected - unlinked = restrict unlinked records + nfilter = return the NoteFilter selected + unlinked = restrict unlinked records """ self.restrict = self.restrict_check.get_active() @@ -159,4 +186,9 @@ class WriterOptionBox: model = self.filter_obj.get_model() node = self.filter_obj.get_active_iter() self.cfilter = model[node][1] + + model = self.filter_note.get_model() + node = self.filter_note.get_active_iter() + self.nfilter = model[node][1] + diff --git a/src/GrampsDbUtils/_WriteGedcom.py b/src/GrampsDbUtils/_WriteGedcom.py index 41926a704..0994e826c 100644 --- a/src/GrampsDbUtils/_WriteGedcom.py +++ b/src/GrampsDbUtils/_WriteGedcom.py @@ -4,6 +4,7 @@ # Copyright (C) 2000-2007 Donald N. Allingham # Copyright (C) 2008 Brian G. Matherly # Copyright (C) 2008 Gary Burton +# Copyright (C) 2008 Robert Cheramy # # 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 @@ -340,6 +341,9 @@ class GedcomWriter(BasicUtils.UpdateCallback): if not option_box.cfilter.is_empty(): self.progress_cnt += 1 + if not option_box.nfilter.is_empty(): + self.progress_cnt += 1 + if option_box.unlinked: self.progress_cnt += 1 @@ -363,13 +367,21 @@ class GedcomWriter(BasicUtils.UpdateCallback): gen.proxy.LivingProxyDb.MODE_INCLUDE_LAST_NAME_ONLY) # If the filter returned by cfilter is not empty, apply the - # FilterProxyDb + # FilterProxyDb (Person Filter) if not option_box.cfilter.is_empty(): - self.reset(_("Applying selected filter")) + self.reset(_("Applying selected person filter")) self.progress_cnt += 1 self.update(self.progress_cnt) self.dbase = gen.proxy.FilterProxyDb( self.dbase, option_box.cfilter) + + # Apply the Note Filter + if not option_box.nfilter.is_empty(): + self.reset(_("Applying selected note filter")) + self.progress_cnt += 1 + self.update(self.progress_cnt) + self.dbase = gen.proxy.FilterProxyDb( + self.dbase, note_filter=option_box.nfilter) # Apply the ReferencedProxyDb to remove any objects not referenced # after any of the other proxies have been applied diff --git a/src/GrampsDbUtils/_WriteXML.py b/src/GrampsDbUtils/_WriteXML.py index cc32ae5e9..6d4b6e679 100644 --- a/src/GrampsDbUtils/_WriteXML.py +++ b/src/GrampsDbUtils/_WriteXML.py @@ -4,6 +4,7 @@ # Copyright (C) 2000-2007 Donald N. Allingham # Copyright (C) 2008 Brian G. Matherly # Copyright (C) 2008 Gary Burton +# Copyright (C) 2008 Robert Cheramy # # 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 @@ -88,9 +89,15 @@ def export_data(database, filename, person, option_box, callback=None): database = gen.proxy.LivingProxyDb( database, gen.proxy.LivingProxyDb.MODE_INCLUDE_LAST_NAME_ONLY) + # Apply the Person Filter if not option_box.cfilter.is_empty(): database = gen.proxy.FilterProxyDb(database, option_box.cfilter) + # Apply the Note Filter + if not option_box.nfilter.is_empty(): + database = gen.proxy.FilterProxyDb( + database, note_filter=option_box.nfilter) + # Apply the ReferencedProxyDb to remove any objects not referenced # after any of the other proxies have been applied if option_box.unlinked: diff --git a/src/gen/proxy/filter.py b/src/gen/proxy/filter.py index 50b71b491..42669f13a 100644 --- a/src/gen/proxy/filter.py +++ b/src/gen/proxy/filter.py @@ -3,6 +3,7 @@ # # Copyright (C) 2007-2008 Brian G. Matherly # Copyright (C) 2008 Gary Burton +# Copyright (C) 2008 Robert Cheramy # # 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 @@ -40,7 +41,8 @@ class FilterProxyDb(ProxyDbBase): the user. """ - def __init__(self, db, person_filter=None, event_filter=None): + def __init__(self, db, person_filter=None, event_filter=None, + note_filter=None): """ Create a new PrivateProxyDb instance. """ @@ -58,6 +60,12 @@ class FilterProxyDb(ProxyDbBase): self.db, self.db.get_event_handles())) else: self.elist = self.db.get_event_handles() + + if note_filter: + self.nlist = set(note_filter.apply( + self.db, self.db.get_note_handles())) + else: + self.nlist = self.db.get_note_handles() self.flist = set() for handle in list(self.plist): @@ -97,7 +105,10 @@ class FilterProxyDb(ProxyDbBase): person.set_birth_ref(bref) if dref in new_eref_list: person.set_death_ref(dref) - + + # Filter notes out + self.sanitize_person(person) + return person else: return None @@ -107,21 +118,32 @@ class FilterProxyDb(ProxyDbBase): Finds a Source in the database from the passed gramps' ID. If no such Source exists, None is returned. """ - return self.db.get_source_from_handle(handle) + source = self.db.get_source_from_handle(handle) + # Filter notes out + self.sanitize_notebase(source) + return source def get_object_from_handle(self, handle): """ - Finds an Object in the database from the passed gramps' ID. + Finds a MediaObject in the database from the passed GRAMPS' handle. If no such Object exists, None is returned. """ - return self.db.get_object_from_handle(handle) + media = self.db.get_object_from_handle(handle) + # Filter notes out + self.sanitize_notebase(media) + self.sanitize_sourcebase(media) + return media def get_place_from_handle(self, handle): """ - Finds a Place in the database from the passed gramps' ID. + Finds a Place in the database from the passed GRAMPS' handle. If no such Place exists, None is returned. """ - return self.db.get_place_from_handle(handle) + place = self.db.get_place_from_handle(handle) + # Filter notes out + self.sanitize_notebase(place) + self.sanitize_sourcebase(place) + return place def get_event_from_handle(self, handle): """ @@ -129,7 +151,11 @@ class FilterProxyDb(ProxyDbBase): If no such Event exists, None is returned. """ if handle in self.elist: - return self.db.get_event_from_handle(handle) + event = self.db.get_event_from_handle(handle) + # Filter all notes out + self.sanitize_notebase(event) + self.sanitize_sourcebase(event) + return event else: return None @@ -154,6 +180,10 @@ class FilterProxyDb(ProxyDbBase): clist = [ cref for cref in family.get_child_ref_list() if cref.ref in self.plist ] family.set_child_ref_list(clist) + + # Filter notes out + self.sanitize_notebase(family) + self.sanitize_sourcebase(family) return family else: return None @@ -163,14 +193,21 @@ class FilterProxyDb(ProxyDbBase): Finds a Repository in the database from the passed gramps' ID. If no such Repository exists, None is returned. """ - return self.db.get_repository_from_handle(handle) + repository = self.db.get_repository_from_handle(handle) + # Filter notes out + self.sanitize_notebase(repository) + self.sanitize_addressbase(repository) + return repository def get_note_from_handle(self, handle): """ Finds a Note in the database from the passed gramps' ID. If no such Note exists, None is returned. """ - return self.db.get_note_from_handle(handle) + if handle in self.nlist: + return self.db.get_note_from_handle(handle) + else: + return None def get_person_from_gramps_id(self, val): """ @@ -178,17 +215,15 @@ class FilterProxyDb(ProxyDbBase): If no such Person exists, None is returned. """ person = self.db.get_person_from_gramps_id(val) - if person.get_handle() not in self.plist: - return None - else: - return person + return self.get_person_from_handle(person.get_handle()) def get_family_from_gramps_id(self, val): """ Finds a Family in the database from the passed GRAMPS ID. If no such Family exists, None is returned. """ - return self.db.get_family_from_gramps_id(val) + family = self.db.get_family_from_gramps_id(val) + return self.get_family_from_handle(family.get_handle()) def get_event_from_gramps_id(self, val): """ @@ -196,51 +231,54 @@ class FilterProxyDb(ProxyDbBase): If no such Event exists, None is returned. """ event = self.db.get_event_from_gramps_id(val) - if event.get_handle() not in self.elist: - return None - else: - return event + return self.get_event_from_handle(event.get_handle()) def get_place_from_gramps_id(self, val): """ Finds a Place in the database from the passed gramps' ID. If no such Place exists, None is returned. """ - return self.db.get_place_from_gramps_id(val) + place = self.db.get_place_from_gramps_id(val) + return self.get_place_from_handle(place.get_handle()) def get_source_from_gramps_id(self, val): """ Finds a Source in the database from the passed gramps' ID. If no such Source exists, None is returned. """ - return self.db.get_source_from_gramps_id(val) + source = self.db.get_source_from_gramps_id(val) + return self.get_source_from_handle(source.get_handle()) def get_object_from_gramps_id(self, val): """ Finds a MediaObject in the database from the passed gramps' ID. If no such MediaObject exists, None is returned. """ - return self.db.get_object_from_gramps_id(val) + media = self.db.get_object_from_gramps_id(val) + return self.get_object_from_handle(media.get_handle()) def get_repository_from_gramps_id(self, val): """ Finds a Repository in the database from the passed gramps' ID. If no such Repository exists, None is returned. """ - return self.db.get_repository_from_gramps_id(val) + repository = self.db.get_repository_from_gramps_id(val) + return self.get_repository_from_handle(repository.get_handle()) def get_note_from_gramps_id(self, val): """ Finds a Note in the database from the passed gramps' ID. If no such Note exists, None is returned. """ - return self.db.get_note_from_gramps_id(val) + note = self.db.get_note_from_gramps_id(val) + return self.get_note_from_handle(note.get_handle()) def get_person_handles(self, sort_handles=True): """ Return a list of database handles, one handle for each Person in the database. If sort_handles is True, the list is sorted by surnames """ + # FIXME: plist is not a sorted list of handles return list(self.plist) def get_place_handles(self, sort_handles=True): @@ -292,7 +330,7 @@ class FilterProxyDb(ProxyDbBase): Return a list of database handles, one handle for each Note in the database. """ - return self.db.get_note_handles() + return list(self.nlist) def get_researcher(self): """returns the Researcher instance, providing information about @@ -361,7 +399,7 @@ class FilterProxyDb(ProxyDbBase): """ returns True if the handle exists in the current Note database. """ - return self.db.has_note_handle(handle) + return handle in self.nlist def find_backlink_handles(self, handle, include_classes=None): """ @@ -384,4 +422,53 @@ class FilterProxyDb(ProxyDbBase): > result_list = [i for i in find_backlink_handles(handle)] """ + #FIXME: add a filter for returned handles (see private.py as an example) return self.db.find_backlink_handles(handle, include_classes) + + def sanitize_notebase(self, notebase): + """ + Filters notes out of the passed notebase object according to the Note Filter. + @param notebase: NoteBase object to clean + @type event: NoteBase + """ + note_list = notebase.get_note_list() + new_note_list = [ note for note in note_list if note in self.nlist ] + notebase.set_note_list(new_note_list) + + def sanitize_sourcebase(self, sourcebase): + """ + Filter notes out of an SourceBase object + @param event: SourceBase object to clean + @type event: SourceBase + """ + sources = sourcebase.get_source_references() + for source in sources: + self.sanitize_notebase(source) + + def sanitize_addressbase(self, addressbase): + addresses = addressbase.get_address_list() + for address in addresses: + self.sanitize_notebase(address) + self.sanitize_sourcebase(address) + + def sanitize_person(self, person): + """ + Cleans filtered notes out of the passed person + @param event: Person object to clean + @type event: Person + """ + # Filter note references + self.sanitize_notebase(person) + self.sanitize_sourcebase(person) + self.sanitize_addressbase(person) + + name = person.get_primary_name() + self.sanitize_notebase(name) + self.sanitize_sourcebase(name) + + altnames = person.get_alternate_names() + for name in altnames: + self.sanitize_notebase(name) + self.sanitize_sourcebase(name) + + self.sanitize_addressbase(person) diff --git a/src/plugins/WritePkg.py b/src/plugins/WritePkg.py index 314a75b40..558517614 100644 --- a/src/plugins/WritePkg.py +++ b/src/plugins/WritePkg.py @@ -4,6 +4,7 @@ # Copyright (C) 2000-2008 Donald N. Allingham # Copyright (C) 2008 Brian G. Matherly # Copyright (C) 2008 Gary Burton +# Copyright (C) 2008 Robert Cheramy # # 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 @@ -78,9 +79,15 @@ def writeData(database, filename, person, option_box, callback=None): database = gen.proxy.LivingProxyDb( database, gen.proxy.LivingProxyDb.MODE_INCLUDE_LAST_NAME_ONLY) + # Apply the Person Filter if not option_box.cfilter.is_empty(): database = gen.proxy.FilterProxyDb(database, option_box.cfilter) + # Apply the Note Filter + if not option_box.nfilter.is_empty(): + database = gen.proxy.FilterProxyDb( + database, note_filter=option_box.nfilter) + # Apply the ReferencedProxyDb to remove any objects not referenced # after any of the other proxies have been applied if option_box.unlinked: