2007-06-19 Alex Roitman <shura@phy.ucsf.edu>

* src/FilterEditor/_FilterEditor.py (_find_dependent_filters):
	Add method to first find all filters fo deletion.



svn: r8603
This commit is contained in:
Alex Roitman 2007-06-20 01:44:26 +00:00
parent 8278778e65
commit 542bbd9404
2 changed files with 23 additions and 11 deletions

View File

@ -1,3 +1,7 @@
2007-06-19 Alex Roitman <shura@phy.ucsf.edu>
* src/FilterEditor/_FilterEditor.py (_find_dependent_filters):
Add method to first find all filters fo deletion.
2007-06-19 Alex Roitman <shura@gramps-project.org>
* src/FilterEditor/_FilterEditor.py (_do_delete_filter): Use a
copy for iteration over the filters.

View File

@ -206,26 +206,34 @@ class FilterEditor(ManagedWindow.ManagedWindow):
self.draw_filters()
def _do_delete_filter(self,space,gfilter):
"""
This method recursively calls itself to delete all dependent filters
before removing this filter. Otherwise when A is 'matches B'
and C is 'matches D' the removal of D leads to two broken filter
being left behind.
"""
# Use the copy of the filter list to iterate over, so that
# the removal of filters does not screw up the iteration
filters = self.filterdb.get_filters(space)[:]
# Find everything we need to remove
filter_set = set()
self._find_dependent_filters(space,gfilter,filter_set)
# Remove what we found
filters = self.filterdb.get_filters(space)
for the_filter in filter_set:
filters.remove(the_filter)
def _find_dependent_filters(self,space,gfilter,filter_set):
"""
This method recursively calls itself to find all filters that
depend on the given filter, either directly through one of the rules,
or through the chain of dependencies.
The filter_set is amended with the found filters.
"""
filters = self.filterdb.get_filters(space)
name = gfilter.get_name()
for the_filter in filters:
for rule in the_filter.get_rules():
values = rule.values()
if issubclass(rule.__class__,MatchesFilterBase) \
and (name in values):
self._do_delete_filter(space,the_filter)
self._find_dependent_filters(space,the_filter,filter_set)
break
# The actual removal is from the real filter list, not a copy.
self.filterdb.get_filters(space).remove(gfilter)
# Add itself to the filter_set
filter_set.add(gfilter)
def get_all_handles(self):
if self.space == 'Person':