Contribution from Robert Chéramy <robert@cheramy.net>. Adds note filters to the filter proxy. Also adds note filters to the exporters.
svn: r11016
This commit is contained in:
		| @@ -3,6 +3,7 @@ | ||||
| # | ||||
| # Copyright (C) 2007-2008 Donald N. Allingham | ||||
| # Copyright (C) 2008      Gary Burton  | ||||
| # Copyright (C) 2008      Robert Cheramy <robert@cheramy.net> | ||||
| # | ||||
| # 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] | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -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 <robert@cheramy.net> | ||||
| # | ||||
| # 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 | ||||
|   | ||||
| @@ -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 <robert@cheramy.net> | ||||
| # | ||||
| # 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: | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
| # | ||||
| # Copyright (C) 2007-2008       Brian G. Matherly | ||||
| # Copyright (C) 2008            Gary Burton | ||||
| # Copyright (C) 2008            Robert Cheramy <robert@cheramy.net> | ||||
| # | ||||
| # 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) | ||||
|   | ||||
| @@ -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 <robert@cheramy.net> | ||||
| # | ||||
| # 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: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user