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
#
" 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 :
idstr = person . getId ( ) + " " + person . getPrimaryName ( ) . getName ( )
# 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 :
error = " %s Baptized before birth %s born %d baptized %d . \n " % ( error , idstr , byear , bapyear )
if byear < bapyear :
warn = " %s Baptized late %s born %d baptized %d . \n " % ( warn , idstr , byear , bapyear )
if dyear > 0 and buryear > 0 :
if dyear > buryear :
error = " %s Buried before death %s died %d buried %d . \n " % ( error , idstr , dyear , buryear )
if dyear < buryear :
warn = " %s Buried late %s died %d buried %d . \n " % ( warn , idstr , dyear , buryear )
if dyear > 0 and ( byear > dyear ) :
error = " %s Died before birth %s born %d died %d . \n " % ( error , idstr , byear , dyear )
if dyear > 0 and ( bapyear > dyear ) :
error = " %s Died before birth %s baptized %d died %d . \n " % ( error , idstr , bapyear , dyear )
if buryear > 0 and ( byear > buryear ) :
error = " %s Buried before birth %s born %d died %d . \n " % ( error , idstr , byear , buryear )
if buryear > 0 and ( bapyear > buryear ) :
error = " %s Buried before birth %s baptized %d died %d . \n " % ( error , idstr , bapyear , buryear )
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 :
warn = " %s Old age %s born %d died %d age %d . \n " % ( warn , idstr , byear , dyear , ageatdeath )
# gender checks
2003-01-10 19:22:32 +05:30
if person . getGender ( ) == RelLib . Person . female :
2002-10-20 19:55:16 +05:30
parstr = " mother "
oldpar = oldmom
yngpar = yngmom
waswidstr = " was a widow "
2003-01-10 19:22:32 +05:30
if person . getGender ( ) == RelLib . Person . male :
2002-10-20 19:55:16 +05:30
parstr = " father "
oldpar = olddad
yngpar = yngdad
waswidstr = " was a widower "
2003-01-10 19:22:32 +05:30
if ( person . getGender ( ) != RelLib . Person . female ) and ( person . getGender ( ) != RelLib . Person . male ) :
2002-10-20 19:55:16 +05:30
warn = " %s Unknown gender %s . \n " % ( warn , idstr )
parstr = " parent "
oldpar = olddad
yngpar = yngdad
waswidstr = " was a widow "
2003-01-10 19:22:32 +05:30
if ( person . getGender ( ) == RelLib . Person . female ) and ( person . getGender ( ) == RelLib . Person . male ) :
2002-10-20 19:55:16 +05:30
error = " %s Ambigous gender %s . \n " % ( error , idstr )
parstr = " parent "
oldpar = olddad
yngpar = yngdad
waswidstr = " was a widow "
# multiple parentage check
if ( len ( person . getParentList ( ) ) > 1 ) :
warn = " %s Multiple parentage %s . \n " % ( warn , idstr )
# marriage checks
nkids = 0
nfam = len ( person . getFamilyList ( ) )
if nfam > wedder :
warn = " %s Married often %s married %d times. \n " % ( warn , idstr , nfam )
if ageatdeath > oldunm and nfam == 0 :
warn = " %s Old and unmarried %s died unmarried aged %d years. \n " % ( warn , idstr , ageatdeath )
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 ( ) :
warn = " %s Homosexual marriage %s family %s . \n " % ( error , idstr , family . getId ( ) )
2003-01-10 19:22:32 +05:30
if family . getFather ( ) == person and person . getGender ( ) == RelLib . Person . female :
2002-10-20 19:55:16 +05:30
error = " %s Female husband %s family %s . \n " % ( error , idstr , family . getId ( ) )
2003-01-10 19:22:32 +05:30
if family . getMother ( ) == person and person . getGender ( ) == RelLib . Person . male :
2002-10-20 19:55:16 +05:30
error = " %s Male wife %s family %s . \n " % ( error , idstr , family . getId ( ) )
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 ( ) :
warn = " %s Husband and wife with same surname %s family %s %s . \n " % ( warn , idstr , family . getId ( ) , spouse . getPrimaryName ( ) . getName ( ) )
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 :
error = " %s Married before birth %s born %d married %d to %s . \n " % ( error , idstr , byear , maryear , spouse . getPrimaryName ( ) . getName ( ) )
else :
if marage < yngmar :
warn = " %s Young marriage %s married at age %d to %s . \n " % ( warn , idstr , marage , spouse . getPrimaryName ( ) . getName ( ) )
if marage > oldmar :
warn = " %s Old marriage %s married at age %d to %s . \n " % ( warn , idstr , marage , spouse . getPrimaryName ( ) . getName ( ) )
if dyear > 0 and maryear > dyear :
error = " %s Married after death %s died %d married %d to %s . \n " % ( error , idstr , dyear , maryear , spouse . getPrimaryName ( ) . getName ( ) )
if prev_cbyear > maryear :
warn = " %s Marriage before birth from previous family %s married %d to %s previous birth %d . \n " % ( warn , idstr , maryear , spouse . getPrimaryName ( ) . getName ( ) , prev_cbyear )
prev_maryear = maryear
else :
maryear = prev_maryear
if maryear > 0 and prev_sdyear > 0 :
wdwyear = maryear - prev_sdyear
if wdwyear > lngwdw :
warn = " %s Long widowhood %s %s %d years before family %s . \n " % ( warn , idstr , waswidstr , wdwyear , family . getId ( ) )
if fnum == nfam and dyear > 0 and sdyear > 0 :
wdwyear = dyear - sdyear
if wdwyear > lngwdw :
warn = " %s Long widowhood %s %s %d years. \n " % ( warn , idstr , waswidstr , wdwyear )
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 :
warn = " %s Old %s %s age %d family %s child %s . \n " % ( warn , parstr , idstr , bage , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) )
if bage < 0 :
error = " %s Unborn %s %s born %d family %s child %s born %d . \n " % ( error , parstr , idstr , byear , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) , cbyear )
else :
if bage < yngpar :
warn = " %s Young %s %s age %d family %s child %s . \n " % ( warn , parstr , idstr , bage , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) )
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 :
error = " %s Dead %s %s died %d family %s child %s born %d . \n " % ( error , parstr , idstr , dyear , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) , cbyear )
else :
warn = " %s Dead %s %s died %d family %s child %s born %d . \n " % ( warn , parstr , idstr , dyear , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) , cbyear )
else :
error = " %s Dead %s %s died %d family %s child %s born %d . \n " % ( error , parstr , idstr , dyear , family . getId ( ) , child . getPrimaryName ( ) . getName ( ) , cbyear )
text = " "
if error != " " :
text = " ERRORS: \n " + error + " \n "
if warn != " " :
text = " WARNINGS: \n " + warn
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 " )
)