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:
parent
6c05a92cbf
commit
0254a5177f
@ -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,21 +56,30 @@ 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'))
|
||||
self.restrict_check = gtk.CheckButton(
|
||||
@ -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]
|
||||
@ -110,6 +123,19 @@ class WriterOptionBox:
|
||||
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,6 +170,7 @@ class WriterOptionBox:
|
||||
private = privacy requested
|
||||
restrict = restrict information on living peoplel
|
||||
cfitler = return the GenericFilter selected
|
||||
nfilter = return the NoteFilter selected
|
||||
unlinked = restrict unlinked records
|
||||
|
||||
"""
|
||||
@ -160,3 +187,8 @@ class WriterOptionBox:
|
||||
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,14 +367,22 @@ 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
|
||||
if option_box.unlinked:
|
||||
|
@ -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.
|
||||
"""
|
||||
@ -59,6 +61,12 @@ class FilterProxyDb(ProxyDbBase):
|
||||
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):
|
||||
person = self.db.get_person_from_handle(handle)
|
||||
@ -98,6 +106,9 @@ class FilterProxyDb(ProxyDbBase):
|
||||
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.
|
||||
"""
|
||||
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:
|
||||
|
Loading…
Reference in New Issue
Block a user