From d0b4fb94f365ae9351f19db19014a0d17e27f551 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Tue, 14 Dec 2010 13:47:10 +0000 Subject: [PATCH] 192: Pedigree collapse, inbreeding, kinship searcher module; added Filter IsDuplicatedAncestor by romjerome svn: r16281 --- po/POTFILES.in | 1 + src/Filters/Rules/Person/Makefile.am | 3 +- .../Rules/Person/_IsDuplicatedAncestorOf.py | 86 +++++++++++++++++++ src/Filters/Rules/Person/__init__.py | 2 + 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/Filters/Rules/Person/_IsDuplicatedAncestorOf.py diff --git a/po/POTFILES.in b/po/POTFILES.in index 3e73452e1..5beaab5b0 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -456,6 +456,7 @@ src/Filters/Rules/Person/_IsDefaultPerson.py src/Filters/Rules/Person/_IsDescendantFamilyOf.py src/Filters/Rules/Person/_IsDescendantOfFilterMatch.py src/Filters/Rules/Person/_IsDescendantOf.py +src/Filters/Rules/Person/_IsDuplicatedAncestorOf.py src/Filters/Rules/Person/_IsFemale.py src/Filters/Rules/Person/_IsLessThanNthGenerationAncestorOfBookmarked.py src/Filters/Rules/Person/_IsLessThanNthGenerationAncestorOfDefaultPerson.py diff --git a/src/Filters/Rules/Person/Makefile.am b/src/Filters/Rules/Person/Makefile.am index c22c06846..21bfaeda4 100644 --- a/src/Filters/Rules/Person/Makefile.am +++ b/src/Filters/Rules/Person/Makefile.am @@ -5,7 +5,7 @@ pkgdatadir = $(datadir)/@PACKAGE@/Filters/Rules/Person pkgdata_PYTHON = \ _ChangedSince.py\ _Disconnected.py \ - _DeepRelationshipPathBetween.py \ + _DeepRelationshipPathBetween.py \ _Everyone.py \ _FamilyWithIncompleteEvent.py \ _HasAttribute.py \ @@ -42,6 +42,7 @@ pkgdata_PYTHON = \ _IsDescendantFamilyOf.py \ _IsDescendantOf.py \ _IsDescendantOfFilterMatch.py \ + _IsDuplicatedAncestorOf.py \ _IsFemale.py \ _IsLessThanNthGenerationAncestorOf.py \ _IsLessThanNthGenerationAncestorOfBookmarked.py \ diff --git a/src/Filters/Rules/Person/_IsDuplicatedAncestorOf.py b/src/Filters/Rules/Person/_IsDuplicatedAncestorOf.py new file mode 100644 index 000000000..11f16d004 --- /dev/null +++ b/src/Filters/Rules/Person/_IsDuplicatedAncestorOf.py @@ -0,0 +1,86 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2002-2006 Donald N. Allingham +# +# 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 +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +#------------------------------------------------------------------------- +# +# Standard Python modules +# +#------------------------------------------------------------------------- +from gen.ggettext import gettext as _ + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- +from Filters.Rules._Rule import Rule + +#------------------------------------------------------------------------- +# +# IsDuplicatedAncestorOf +# +#------------------------------------------------------------------------- +class IsDuplicatedAncestorOf(Rule): + """Rule that checks for a person that is a duplicated ancestor of + a specified person""" + + labels = [ _('ID:')] + name = _('Duplicated ancestors of ') + category = _("Ancestral filters") + description = _("Matches people that are ancestors twice or more " + "of a specified person") + + def prepare(self, db): + self.db = db + self.map = set() + self.map2 = set() + root_person = db.get_person_from_gramps_id(self.list[0]) + if root_person: + self.init_ancestor_list(db,root_person) + + def reset(self): + self.map.clear() + self.map2.clear() + + def apply(self, db, person): + return person.handle in self.map2 + + def init_ancestor_list(self, db, person): + fam_id = person.get_main_parents_family_handle() + fam = db.get_family_from_handle(fam_id) + if fam: + f_id = fam.get_father_handle() + m_id = fam.get_mother_handle() + if m_id: + self.mother_side(db, db.get_person_from_handle(m_id)) + if f_id: + self.father_side(db, db.get_person_from_handle(f_id)) + + def mother_side(self, db, person): + if person and person.handle in self.map: + self.map2.add((person.handle)) + self.map.add((person.handle)) + self.init_ancestor_list(db, person) + + def father_side(self, db, person): + if person and person.handle in self.map: + self.map2.add((person.handle)) + self.map.add((person.handle)) + self.init_ancestor_list(db, person) diff --git a/src/Filters/Rules/Person/__init__.py b/src/Filters/Rules/Person/__init__.py index c653acec3..c27023d81 100644 --- a/src/Filters/Rules/Person/__init__.py +++ b/src/Filters/Rules/Person/__init__.py @@ -63,6 +63,7 @@ from _IsDefaultPerson import IsDefaultPerson from _IsDescendantFamilyOf import IsDescendantFamilyOf from _IsDescendantOf import IsDescendantOf from _IsDescendantOfFilterMatch import IsDescendantOfFilterMatch +from _IsDuplicatedAncestorOf import IsDuplicatedAncestorOf from _IsFemale import IsFemale from _IsLessThanNthGenerationAncestorOf import \ IsLessThanNthGenerationAncestorOf @@ -143,6 +144,7 @@ editor_rule_list = [ IsDescendantFamilyOf, IsLessThanNthGenerationAncestorOfDefaultPerson, IsDescendantOfFilterMatch, + IsDuplicatedAncestorOf, IsLessThanNthGenerationDescendantOf, IsMoreThanNthGenerationDescendantOf, IsAncestorOf,