From 559795d8d0a76dccabd2c2e84e1f007b94ef560b Mon Sep 17 00:00:00 2001 From: Alex Roitman Date: Thu, 8 Jan 2004 05:18:27 +0000 Subject: [PATCH] * src/plugins/rel_de.py: Add to CVS. * src/plugins/Makefile.am: Ship rel_de.py. svn: r2606 --- ChangeLog | 2 + src/plugins/Makefile.am | 3 +- src/plugins/rel_de.py | 272 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 src/plugins/rel_de.py diff --git a/ChangeLog b/ChangeLog index 6a8bc4600..00a8b9070 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,8 @@ * src/plugins/IndivComplete.py (write_note): Typo. * src/plugins/DetDescendantReport.py: Correct image insertion. * src/plugins/DetAncestralReport.py: Correct image insertion. + * src/plugins/rel_de.py: Add to CVS. + * src/plugins/Makefile.am: Ship rel_de.py. 2004-01-06 Alex Roitman * doc/gramps-manual/ru/mainwin.xml: Update translation. diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index bcc8c7103..0cb3bdcfd 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -47,7 +47,8 @@ pkgpython_PYTHON = \ CustomBookText.py\ RelGraph.py\ rel_it.py\ - rel_hu.py + rel_hu.py\ + rel_de.py pkgpyexecdir = @pkgpyexecdir@/plugins pkgpythondir = @pkgpythondir@/plugins diff --git a/src/plugins/rel_de.py b/src/plugins/rel_de.py new file mode 100644 index 000000000..9f05bdee6 --- /dev/null +++ b/src/plugins/rel_de.py @@ -0,0 +1,272 @@ +# -*- coding: utf-8 -*- +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2003-2004 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 +# + +# +# Written by Alex Roitman, largely based on Relationship.py by Don Allingham. +# and on valuable input from Dr. Martin Senftleben +# + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- + +import RelLib +import GrampsCfg +from Relationship import apply_filter as getallancestors + +#------------------------------------------------------------------------- +# +# German-specific definitions of relationships +# +#------------------------------------------------------------------------- + +_cousin_level = [ + "", "", "Groß-", "Ur-Groß-", "Ur-Ur-Groß-", "Ur-Ur-Ur-Groß-", "Ur-Ur-Ur-Ur-Groß-", + "Ur-Ur-Ur-Ur-Ur-Groß-", "Ur-Ur-Ur-Ur-Ur-Ur-Groß-", "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", + "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", + "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", + "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", + "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", + "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", + "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-", + "Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Ur-Groß-" ] + +_removed_level = [ "", "ersten", "zweiten", "dritten", "vierten", "fünften", + "sechsten", "siebten", "achten", "neunten", "zehnten", "elften", "zwölften", + "dreizehnten", "vierzehnten", "fünfzehnten", "sechzehnten", "siebzehnten", + "achtzehnten", "neunzehnten", "zwanzigsten" ] + +_father_level = [ "", "Vater (Ebene 1)", "Großvater (Ebene 2)", "Urgroßvater (Ebene 3)", + "Altvater (Ebene 4)", "Altgroßvater (Ebene 5)", "Alturgroßvater (Ebene 6)", + "Obervater (Ebene 7)", "Obergroßvater (Ebene 8)", "Oberurgroßvater (Ebene 9)", + "Stammvater (Ebene 10)", "Stammgroßvater (Ebene 11)", "Stammurgroßvater (Ebene 12)", + "Ahnenvater (Ebene 13)", "Ahnengroßvater (Ebene 14)", "Ahnenurgroßvater (Ebene 15)", + "Urahnenvater (Ebene 16)", "Urahnengroßvater (Ebene 17)", "Urahnenurgroßvater (Ebene 18)", + "Erzvater (Ebene 19)", "Erzgroßvater (Ebene 20)", "Erzurgroßvater (Ebene 21)", + "Erzahnenvater (Ebene 22)", "Erzahnengroßvater (Ebene 23)", "Erzahnenurgroßvater (Ebene 24)" ] + +_mother_level = [ "", "Mutter (Ebene 1)", "Großmutter (Ebene 2)", "Urgroßmutter (Ebene 3)", + "Altmutter (Ebene 4)", "Altgroßmutter (Ebene 5)", "Alturgroßmutter (Ebene 6)", + "Obermutter (Ebene 7)", "Obergroßmutter (Ebene 8)", "Oberurgroßmutter (Ebene 9)", + "Stammmutter (Ebene 10)", "Stammgroßmutter (Ebene 11)", "Stammurgroßmutter (Ebene 12)", + "Ahnenmutter (Ebene 13)", "Ahnengroßmutter (Ebene 14)", "Ahnenurgroßmutter (Ebene 15)", + "Urahnenmutter (Ebene 16)", "Urahnengroßmutter (Ebene 17)", "Urahnenurgroßmutter (Ebene 18)", + "Erzmutter (Ebene 19)", "Erzgroßmutter (Ebene 20)", "Erzurgroßmutter (Ebene 21)", + "Erzahnenmutter (Ebene 22)", "Erzahnengroßmutter (Ebene 23)", "Erzahnenurgroßmutter (Ebene 24)" ] + +_son_level = [ "", "Sohn", "Enkel", "Urenkel", "Ururenkel", "Urururuenkel", "Urururururenkel" ] + +_daughter_level = [ "", "Tochter", "Enkelin", "Urenkelin", "Ururenkelin", "Urururuenkelin", + "Urururururenkelin" ] + +_sister_level = [ "", "Schwester", "Tante", "Großtante", "Urgroßtante", "Ururgroßtante", + "Urururgroßtante" ] + +_brother_level = [ "", "Bruder", "Onkel", "Großonkel", "Urgroßonkel", "Ururgroßonkel", + "Urururgroßonkel" ] + +_nephew_level = [ "", "Neffe", "Großneffe", "Urgroßneffe", "Ururgroßneffe", + "Urururgroßneffe", "Ururururgroßneffe" ] + +_niece_level = [ "", "Nichte", "Großnichte", "Urgroßnichte", "Ururgroßnichte", + "Urururgroßnichte", "Ururururgroßnichte" ] + +#------------------------------------------------------------------------- +# +# +# +#------------------------------------------------------------------------- + +def get_junior_male_cousin(level,removed): + if removed > len(_removed_level)-1 or level>len(_cousin_level)-1: + return "remote relative" + else: + return "%sCousin %s Grades" % (_cousin_level[level],_removed_level[removed]) + +def get_senior_male_cousin(level,removed): + if removed > len(_removed_level)-1 or level>len(_cousin_level)-1: + return "remote relative" + else: + return "%sOnkel %s Grades" % (_cousin_level[level],_removed_level[removed]) + +def get_junior_female_cousin(level,removed): + if removed > len(_removed_level)-1 or level>len(_cousin_level)-1: + return "remote relative" + else: + return "%sCousine %s Grades" % (_cousin_level[level],_removed_level[removed]) + +def get_senior_female_cousin(level,removed): + if removed > len(_removed_level)-1 or level>len(_cousin_level)-1: + return "remote relative" + else: + return "%sTante %s Grades" % (_cousin_level[level],_removed_level[removed]) + +def get_father(level): + if level>len(_father_level)-1: + return "remote ancestor" + else: + return _father_level[level] + +def get_son(level): + if level>len(_son_level)-1: + return "remote descendant" + else: + return _son_level[level] + +def get_mother(level): + if level>len(_mother_level)-1: + return "remote ancestor" + else: + return _mother_level[level] + +def get_daughter(level): + if level>len(_daughter_level)-1: + return "remote descendant" + else: + return _daughter_level[level] + +def get_aunt(level): + if level>len(_sister_level)-1: + return "remote ancestor" + else: + return _sister_level[level] + +def get_uncle(level): + if level>len(_brother_level)-1: + return "remote ancestor" + else: + return _brother_level[level] + +def get_nephew(level): + if level>len(_nephew_level)-1: + return "remote descendant" + else: + return _nephew_level[level] + +def get_niece(level): + if level>len(_niece_level)-1: + return "remote descendant" + else: + return _niece_level[level] + +def is_spouse(orig,other): + for f in orig.getFamilyList(): + if other == f.getFather() or other == f.getMother(): + return 1 + return 0 + +def get_relationship(orig_person,other_person): + """ + Returns a string representing the relationshp between the two people, + along with a list of common ancestors (typically father,mother) + + Special cases: relation strings "", "undefined" and "spouse". + """ + + firstMap = {} + firstList = [] + secondMap = {} + secondList = [] + common = [] + rank = 9999999 + + if orig_person == None: + return ("undefined",[]) + + firstName = orig_person.getPrimaryName().getRegularName() + secondName = other_person.getPrimaryName().getRegularName() + + if orig_person == other_person: + return ('', []) + if is_spouse(orig_person,other_person): + return ("spouse",[]) + + try: + getallancestors(orig_person,0,firstList,firstMap) + getallancestors(other_person,0,secondList,secondMap) + except RuntimeError,msg: + return (_("Relationship loop detected"),None) + + for person in firstList: + if person in secondList: + new_rank = firstMap[person.getId()] + if new_rank < rank: + rank = new_rank + common = [ person ] + elif new_rank == rank: + common.append(person) + + firstRel = -1 + secondRel = -1 + + if common: + person = common[0] + secondRel = firstMap[person.getId()] + firstRel = secondMap[person.getId()] + + if firstRel == -1: + return ("",[]) + elif firstRel == 0: + if secondRel == 0: + return ('',common) + elif other_person.getGender() == RelLib.Person.male: + return (get_father(secondRel),common) + else: + return (get_mother(secondRel),common) + elif secondRel == 0: + if other_person.getGender() == RelLib.Person.male: + return (get_son(firstRel),common) + else: + return (get_daughter(firstRel),common) + elif firstRel == 1: + if other_person.getGender() == RelLib.Person.male: + return (get_uncle(secondRel),common) + else: + return (get_aunt(secondRel),common) + elif secondRel == 1: + if other_person.getGender() == RelLib.Person.male: + return (get_nephew(firstRel-1),common) + else: + return (get_niece(firstRel-1),common) + elif secondRel > firstRel: + if other_person.getGender() == RelLib.Person.male: + return (get_senior_male_cousin(secondRel-firstRel,secondRel-1),common) + else: + return (get_senior_female_cousin(secondRel-firstRel,secondRel-1),common) + else: + if other_person.getGender() == RelLib.Person.male: + return (get_junior_male_cousin(secondRel-1,firstRel-1),common) + else: + return (get_junior_female_cousin(secondRel-1,firstRel-1),common) + + +#------------------------------------------------------------------------- +# +# Register this function with the Plugins system +# +#------------------------------------------------------------------------- +from Plugins import register_relcalc + +register_relcalc(get_relationship, + ["de","DE","de_DE","deutsch","Deutsch","de_DE.UTF8","de_DE@euro","de_DE.UTF8@euro", + "german","German"])