diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 81ca36d31..52ebe4d91 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,4 +1,8 @@ 2006-08-04 Alex Roitman <shura@gramps-project.org> + * src/FilterEditor/_EditFilter.py: Support invert attribute. + * src/Filters/_GenericFilter.py: Support invert attribute. + * src/Filters/_FilterList.py (save): Save invert attribute. + * src/Filters/_FilterParser.py (startElement): Parse invert attribute. * src/Filters/Rules/Family/__init__.py (editor_rule_list): Import and use new rule. * src/Filters/Rules/Family/Makefile.am (pkgdata_PYTHON): Ship new file. diff --git a/gramps2/src/FilterEditor/_EditFilter.py b/gramps2/src/FilterEditor/_EditFilter.py index ef4e8b2f4..6099bd603 100644 --- a/gramps2/src/FilterEditor/_EditFilter.py +++ b/gramps2/src/FilterEditor/_EditFilter.py @@ -86,6 +86,7 @@ class EditFilter(ManagedWindow.ManagedWindow): self.fname = self.get_widget('filter_name') self.logical = self.get_widget('rule_apply') + self.logical_not = self.get_widget('logical_not') self.comment = self.get_widget('comment') self.ok_btn = self.get_widget('ok') self.edit_btn = self.get_widget('edit') @@ -109,6 +110,7 @@ class EditFilter(ManagedWindow.ManagedWindow): self.logical.set_active(2) else: self.logical.set_active(0) + self.logical_not.set_active(self.filter.get_invert()) if self.filter.get_name(): self.fname.set_text(self.filter.get_name()) self.comment.set_text(self.filter.get_comment()) @@ -159,6 +161,7 @@ class EditFilter(ManagedWindow.ManagedWindow): else: op = 'and' self.filter.set_logical_op(op) + self.filter.set_invert(self.logical_not.get_active()) self.filterdb.add(self.space,self.filter) self.update() self.close() diff --git a/gramps2/src/Filters/_FilterList.py b/gramps2/src/Filters/_FilterList.py index f84acb816..9b5b9a8de 100644 --- a/gramps2/src/Filters/_FilterList.py +++ b/gramps2/src/Filters/_FilterList.py @@ -92,6 +92,8 @@ class FilterList: for the_filter in filter_list: f.write(' <filter name="%s"' %self.fix(the_filter.get_name())) f.write(' function="%s"' % the_filter.get_logical_op()) + if the_filter.invert: + f.write(' invert="1"') comment = the_filter.get_comment() if comment: f.write(' comment="%s"' % self.fix(comment)) diff --git a/gramps2/src/Filters/_FilterParser.py b/gramps2/src/Filters/_FilterParser.py index 7794232fd..7bf7a68db 100644 --- a/gramps2/src/Filters/_FilterParser.py +++ b/gramps2/src/Filters/_FilterParser.py @@ -73,6 +73,8 @@ class FilterParser(handler.ContentHandler): except ValueError: op = attrs['function'] self.f.set_logical_op(op) + if attrs.has_key('invert'): + self.f.set_invert(attrs['invert']) if attrs.has_key('comment'): self.f.set_comment(attrs['comment']) self.gfilter_list.add(self.namespace,self.f) diff --git a/gramps2/src/Filters/_GenericFilter.py b/gramps2/src/Filters/_GenericFilter.py index 0b27aa405..99d730819 100644 --- a/gramps2/src/Filters/_GenericFilter.py +++ b/gramps2/src/Filters/_GenericFilter.py @@ -42,12 +42,14 @@ class GenericFilter: self.name = source.name self.comment = source.comment self.logical_op = source.logical_op + self.invert = source.invert else: self.need_param = 0 self.flist = [] self.name = '' self.comment = '' self.logical_op = 'and' + self.invert = False def match(self,handle): return True @@ -64,6 +66,12 @@ class GenericFilter: def get_logical_op(self): return self.logical_op + def set_invert(self,val): + self.invert = bool(val) + + def get_invert(self): + return self.invert + def get_name(self): return self.name @@ -102,29 +110,27 @@ class GenericFilter: if id_list == None: cursor = self.get_cursor(db) - data = cursor.next() + data = cursor.first() while data: person = self.make_obj() person.unserialize(data[1]) - if task(db,person): + if task(db,person) != self.invert: final_list.append(data[0]) data = cursor.next() + cursor.close() else: for handle in id_list: person = self.find_from_handle(db, handle) - if task(db,person): + if task(db,person) != self.invert: final_list.append(handle) return final_list - def check_or(self,db,id_list): - return self.check_func(db,id_list,self.or_test) - def check_and(self,db,id_list): final_list = [] flist = self.flist if id_list == None: cursor = self.get_cursor(db) - data = cursor.next() + data = cursor.first() while data: person = self.make_obj() person.unserialize(data[1]) @@ -133,9 +139,10 @@ class GenericFilter: if not rule.apply(db,person): val = False break - if not val: + if val != self.invert: final_list.append(data[0]) data = cursor.next() + cursor.close() else: for handle in id_list: person = self.find_from_handle(db, handle) @@ -144,10 +151,13 @@ class GenericFilter: if not rule.apply(db,person): val = False break - if val: + if val != self.invert: final_list.append(handle) return final_list + def check_or(self,db,id_list): + return self.check_func(db,id_list,self.or_test) + def check_one(self,db,id_list): return self.check_func(db,id_list,self.one_test)