2002-10-20 19:55:16 +05:30
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000 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
#
2003-04-14 08:22:12 +05:30
#
# Modified by Alex Roitman to enable translation of warnings and errors.
#
2002-10-20 19:55:16 +05:30
" View/Verify "
#------------------------------------------------------------------------
#
# standard python modules
#
#------------------------------------------------------------------------
import os
#------------------------------------------------------------------------
#
# GNOME/GTK modules
#
#------------------------------------------------------------------------
from gnome . ui import *
import gtk
import gtk . glade
#------------------------------------------------------------------------
#
# GRAMPS modules
#
#------------------------------------------------------------------------
2003-01-10 19:22:32 +05:30
import RelLib
2002-10-20 19:55:16 +05:30
import Utils
2002-11-25 10:00:36 +05:30
from intl import gettext as _
2002-10-20 19:55:16 +05:30
db = None
glade_file = None
verifySettings = None
# returns the year of an event or 0 if no event==None or no year specified in the event
def get_year ( event ) :
year = 0
if event != None :
dateObj = event . getDateObj ( )
if dateObj != None :
year = dateObj . getYear ( )
return year
def runTool ( database , active_person , callback ) :
global glade_file
global db
global verifySettings
db = database
base = os . path . dirname ( __file__ )
glade_file = base + os . sep + " verify.glade "
verifySettings = gtk . glade . XML ( glade_file , " verify_settings " )
verifySettings . signal_autoconnect ( {
" destroy_passed_object " : Utils . destroy_passed_object ,
" on_verify_ok_clicked " : on_apply_clicked
} )
2003-03-19 09:57:34 +05:30
Utils . set_titles ( verifySettings . get_widget ( ' verify_settings ' ) ,
verifySettings . get_widget ( ' title ' ) ,
_ ( ' Database Verify ' ) )
2002-10-20 19:55:16 +05:30
def on_apply_clicked ( obj ) :
global db
global verifySettings
personList = db . getPersonMap ( ) . values ( )
oldage = int ( verifySettings . get_widget ( " oldage " ) . get_text ( ) )
yngmar = int ( verifySettings . get_widget ( " yngmar " ) . get_text ( ) )
oldmar = int ( verifySettings . get_widget ( " oldmar " ) . get_text ( ) )
oldmom = int ( verifySettings . get_widget ( " oldmom " ) . get_text ( ) )
yngmom = int ( verifySettings . get_widget ( " yngmom " ) . get_text ( ) )
olddad = int ( verifySettings . get_widget ( " olddad " ) . get_text ( ) )
yngdad = int ( verifySettings . get_widget ( " yngdad " ) . get_text ( ) )
wedder = int ( verifySettings . get_widget ( " wedder " ) . get_text ( ) )
lngwdw = int ( verifySettings . get_widget ( " lngwdw " ) . get_text ( ) )
oldunm = 99 # maximum age at death for unmarried person
error = " "
warn = " "
for person in personList :
2003-04-14 09:18:24 +05:30
idstr = person . getPrimaryName ( ) . getName ( ) + " ( " + person . getId ( ) + " ) "
2002-10-20 19:55:16 +05:30
# individual checks
byear = get_year ( person . getBirth ( ) )
bapyear = 0
dyear = get_year ( person . getDeath ( ) )
buryear = 0
if byear > 0 and bapyear > 0 :
if byear > bapyear :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Baptized before birth: %s born %d , baptized %d . \n " ) % ( idstr , byear , bapyear )
2002-10-20 19:55:16 +05:30
if byear < bapyear :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Baptized late: %s born %d , baptized %d . \n " ) % ( idstr , byear , bapyear )
2002-10-20 19:55:16 +05:30
if dyear > 0 and buryear > 0 :
if dyear > buryear :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Buried before death: %s died %d , buried %d . \n " ) % ( idstr , dyear , buryear )
2002-10-20 19:55:16 +05:30
if dyear < buryear :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Buried late: %s died %d , buried %d . \n " ) % ( idstr , dyear , buryear )
2002-10-20 19:55:16 +05:30
if dyear > 0 and ( byear > dyear ) :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Died before birth: %s born %d , died %d . \n " ) % ( idstr , byear , dyear )
2002-10-20 19:55:16 +05:30
if dyear > 0 and ( bapyear > dyear ) :
2003-04-15 02:04:52 +05:30
error = error + _ ( " Died before baptism: %s baptized %d , died %d . \n " ) % ( idstr , bapyear , dyear )
2002-10-20 19:55:16 +05:30
if buryear > 0 and ( byear > buryear ) :
2003-04-15 02:04:52 +05:30
error = error + _ ( " Buried before birth: %s born %d , buried %d . \n " ) % ( idstr , byear , buryear )
2002-10-20 19:55:16 +05:30
if buryear > 0 and ( bapyear > buryear ) :
2003-04-15 02:04:52 +05:30
error = error + _ ( " Buried before birth: %s baptized %d , buried %d . \n " ) % ( idstr , bapyear , buryear )
2002-10-20 19:55:16 +05:30
if byear == 0 :
byear = bapyear # guess baptism = birth
if dyear == 0 :
dyear = buryear # guess burial = death
if byear > 0 and dyear > 0 :
ageatdeath = dyear - byear
else :
ageatdeath = 0
if ageatdeath > oldage :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Old age: %s born %d , died %d , at the age of %d . \n " ) % ( idstr , byear , dyear , ageatdeath )
2002-10-20 19:55:16 +05:30
# gender checks
2003-01-10 19:22:32 +05:30
if person . getGender ( ) == RelLib . Person . female :
2003-04-14 08:22:12 +05:30
parstr = _ ( " mother " )
2002-10-20 19:55:16 +05:30
oldpar = oldmom
yngpar = yngmom
2003-04-14 08:22:12 +05:30
waswidstr = _ ( " was a widow " )
2003-01-10 19:22:32 +05:30
if person . getGender ( ) == RelLib . Person . male :
2003-04-14 08:22:12 +05:30
parstr = _ ( " father " )
2002-10-20 19:55:16 +05:30
oldpar = olddad
yngpar = yngdad
2003-04-14 08:22:12 +05:30
waswidstr = _ ( " was a widower " )
2003-01-10 19:22:32 +05:30
if ( person . getGender ( ) != RelLib . Person . female ) and ( person . getGender ( ) != RelLib . Person . male ) :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Unknown gender for %s . \n " ) % idstr
2003-04-14 08:22:12 +05:30
parstr = _ ( " parent " )
2002-10-20 19:55:16 +05:30
oldpar = olddad
yngpar = yngdad
2003-04-14 08:22:12 +05:30
waswidstr = _ ( " was a widow " )
2003-01-10 19:22:32 +05:30
if ( person . getGender ( ) == RelLib . Person . female ) and ( person . getGender ( ) == RelLib . Person . male ) :
2003-04-15 02:04:52 +05:30
error = error + _ ( " Ambigous gender for %s . \n " ) % idstr
2003-04-14 08:22:12 +05:30
parstr = _ ( " parent " )
2002-10-20 19:55:16 +05:30
oldpar = olddad
yngpar = yngdad
2003-04-14 08:22:12 +05:30
waswidstr = _ ( " was a widow " )
2002-10-20 19:55:16 +05:30
# multiple parentage check
if ( len ( person . getParentList ( ) ) > 1 ) :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Multiple parentage for %s . \n " ) % idstr
2002-10-20 19:55:16 +05:30
# marriage checks
nkids = 0
nfam = len ( person . getFamilyList ( ) )
if nfam > wedder :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Married often: %s married %d times. \n " ) % ( idstr , nfam )
2002-10-20 19:55:16 +05:30
if ageatdeath > oldunm and nfam == 0 :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Old and unmarried: %s died unmarried, at the age of %d years. \n " ) % ( idstr , ageatdeath )
2002-10-20 19:55:16 +05:30
first_cbyear = 99999
last_cbyear = 0
prev_cbyear = 0
prev_maryear = 0
prev_sdyear = 0
fnum = 0
for family in person . getFamilyList ( ) :
fnum = fnum + 1
mother = family . getMother ( )
father = family . getFather ( )
if mother != None and father != None :
if mother . getGender ( ) == father . getGender ( ) :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Homosexual marriage: %s in family %s . \n " ) % ( idstr , family . getId ( ) )
2003-01-10 19:22:32 +05:30
if family . getFather ( ) == person and person . getGender ( ) == RelLib . Person . female :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Female husband: %s in family %s . \n " ) % ( idstr , family . getId ( ) )
2003-01-10 19:22:32 +05:30
if family . getMother ( ) == person and person . getGender ( ) == RelLib . Person . male :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Male wife: %s in family %s . \n " ) % ( idstr , family . getId ( ) )
2002-10-20 19:55:16 +05:30
if family . getFather ( ) == person :
spouse = family . getMother ( )
else :
spouse = family . getFather ( )
if spouse != None :
2003-01-10 19:22:32 +05:30
if person . getGender ( ) == RelLib . Person . male and \
2002-10-20 19:55:16 +05:30
person . getPrimaryName ( ) . getSurname ( ) == spouse . getPrimaryName ( ) . getSurname ( ) :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Husband and wife with the same surname: %s in family %s , and %s . \n " ) % ( idstr , family . getId ( ) , spouse . getPrimaryName ( ) . getName ( ) )
2002-10-20 19:55:16 +05:30
sdyear = get_year ( spouse . getDeath ( ) )
if sdyear == 0 :
sdyear = 0 # burial year
maryear = get_year ( family . getMarriage ( ) )
if maryear == 0 : # estimate marriage year
cnum = 0
for child in family . getChildList ( ) :
cnum = cnum + 1
if maryear == 0 :
birthyear = get_year ( child . getBirth ( ) )
if birthyear > 0 :
maryear = birthyear - cnum
if maryear > 0 :
if byear > 0 :
marage = maryear - byear
if marage < 0 :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Married before birth: %s born %d , married %d to %s . \n " ) % ( idstr , byear , maryear , spouse . getPrimaryName ( ) . getName ( ) )
2002-10-20 19:55:16 +05:30
else :
if marage < yngmar :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Young marriage: %s married at age %d to %s . \n " ) % ( idstr , marage , spouse . getPrimaryName ( ) . getName ( ) )
2002-10-20 19:55:16 +05:30
if marage > oldmar :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Old marriage: %s married at age %d to %s . \n " ) % ( idstr , marage , spouse . getPrimaryName ( ) . getName ( ) )
2002-10-20 19:55:16 +05:30
if dyear > 0 and maryear > dyear :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Married after death: %s died %d , married %d to %s . \n " ) % ( idstr , dyear , maryear , spouse . getPrimaryName ( ) . getName ( ) )
2002-10-20 19:55:16 +05:30
if prev_cbyear > maryear :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Marriage before birth from previous family: %s married %d to %s , previous birth %d . \n " ) % ( idstr , maryear , spouse . getPrimaryName ( ) . getName ( ) , prev_cbyear )
2002-10-20 19:55:16 +05:30
prev_maryear = maryear
else :
maryear = prev_maryear
if maryear > 0 and prev_sdyear > 0 :
wdwyear = maryear - prev_sdyear
if wdwyear > lngwdw :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Long widowhood: %s %s %d years before, family %s . \n " ) % ( idstr , waswidstr , wdwyear , family . getId ( ) )
2002-10-20 19:55:16 +05:30
if fnum == nfam and dyear > 0 and sdyear > 0 :
wdwyear = dyear - sdyear
if wdwyear > lngwdw :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Long widowhood: %s %s %d years. \n " ) % ( idstr , waswidstr , wdwyear )
2002-10-20 19:55:16 +05:30
nkids = 0
for child in family . getChildList ( ) :
nkids = nkids + 1
cbyear = get_year ( child . getBirth ( ) )
if cbyear > 0 and cbyear < first_cbyear :
first_cbyear = cbyear
if cbyear > last_cbyear :
last_cbyear = cbyear
# parentage checks
if byear > 0 and cbyear > 0 :
bage = cbyear - byear
if bage > oldpar :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Old %s : %s at age of %d in family %s had a child %s . \n " ) % ( parstr , idstr , bage , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) )
2002-10-20 19:55:16 +05:30
if bage < 0 :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Unborn %s : %s born %d , in family %s had a child %s born %d . \n " ) % ( parstr , idstr , byear , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) , cbyear )
2002-10-20 19:55:16 +05:30
else :
if bage < yngpar :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Young %s : %s at the age of %d in family %s had a child %s . \n " ) % ( parstr , idstr , bage , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) )
2002-10-20 19:55:16 +05:30
if dyear > 0 and cbyear > dyear :
2003-01-10 19:22:32 +05:30
if person . getGender ( ) == RelLib . Person . male :
2002-10-20 19:55:16 +05:30
if cbyear - 1 > dyear :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Dead %s : %s died %d , but in family %s had a child %s born %d . \n " ) % ( parstr , idstr , dyear , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) , cbyear )
2002-10-20 19:55:16 +05:30
else :
2003-04-14 09:18:24 +05:30
warn = warn + _ ( " Dead %s : %s died %d , but in family %s had a child %s born %d . \n " ) % ( parstr , idstr , dyear , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) , cbyear )
2002-10-20 19:55:16 +05:30
else :
2003-04-14 09:18:24 +05:30
error = error + _ ( " Dead %s : %s died %d , but in family %s had a child %s born %d . \n " ) % ( parstr , idstr , dyear , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) , cbyear )
2002-10-20 19:55:16 +05:30
text = " "
if error != " " :
2003-04-14 08:22:12 +05:30
text = _ ( " ERRORS: \n " ) + error + " \n "
2002-10-20 19:55:16 +05:30
if warn != " " :
2003-04-14 08:22:12 +05:30
text = _ ( " WARNINGS: \n " ) + warn
2002-10-20 19:55:16 +05:30
verifyResult = gtk . glade . XML ( glade_file , " verify_result " )
2003-03-19 09:57:34 +05:30
Utils . set_titles ( verifyResult . get_widget ( ' verify_result ' ) ,
verifyResult . get_widget ( ' title ' ) ,
_ ( ' Database Verify ' ) )
2002-10-20 19:55:16 +05:30
verifyResult . signal_autoconnect ( {
" destroy_passed_object " : Utils . destroy_passed_object ,
} )
top = verifyResult . get_widget ( " verify_result " )
textwindow = verifyResult . get_widget ( " textwindow " )
2003-02-16 04:33:48 +05:30
textwindow . get_buffer ( ) . set_text ( text )
2002-10-20 19:55:16 +05:30
top . show ( )
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
from Plugins import register_tool
register_tool (
runTool ,
_ ( " Verify the database " ) ,
category = _ ( " Utilities " ) ,
description = _ ( " List exceptions to assertions or checks about the database " )
)