2007-12-24 20:26:15 +05:30
from DataViews import register , Gadget
from BasicUtils import name_displayer
import DateHandler
import gen . lib
2007-12-25 03:56:30 +05:30
import sys
2007-12-25 01:41:11 +05:30
import os
import time
2007-12-25 03:56:30 +05:30
import string
2007-12-24 20:26:15 +05:30
#
# Hello World, in Gramps Gadgets
#
# First, you need a function or class that takes a single argument
# a GuiGadget:
2007-12-28 13:16:26 +05:30
#from DataViews import register
#def init(gui):
# gui.set_text("Hello world!")
2007-12-24 20:26:15 +05:30
# In this function, you can do some things to update the gadget,
# like set text of the main scroll window.
# Then, you need to register the gadget:
2007-12-28 13:16:26 +05:30
#register(type="gadget", # case in-senstitive keyword "gadget"
# name="Hello World Gadget", # gadget name, unique among gadgets
# height = 20,
# content = init, # function/class; takes guigadget
# title="Sample Gadget", # default title, user changeable
# )
2007-12-24 20:26:15 +05:30
# There are a number of arguments that you can provide, including:
2007-12-25 01:41:11 +05:30
# name, height, content, title, expand, state
2007-12-24 20:26:15 +05:30
2007-12-25 10:04:42 +05:30
# Here is a Gadget object. It has a number of method possibilities:
2007-12-24 20:26:15 +05:30
# init- run once, on construction
# active_changed- run when active-changed is triggered
2007-12-25 10:04:42 +05:30
# db_changed- run when db-changed is triggered
# main- run once per db change, main process (for fast code)
# background- run once per db change, main process (for slow code)
2007-12-24 20:26:15 +05:30
2007-12-25 10:04:42 +05:30
# You can also call update() to run main and background
2007-12-24 20:26:15 +05:30
2007-12-29 00:42:05 +05:30
class CalendarGadget ( Gadget ) :
def init ( self ) :
import gtk
self . gui . calendar = gtk . Calendar ( )
self . gui . calendar . connect ( ' day-selected-double-click ' , self . double_click )
2007-12-29 09:03:14 +05:30
self . gui . calendar . connect ( ' month-changed ' , self . refresh )
2007-12-29 00:42:05 +05:30
self . gui . scrolledwindow . remove ( self . gui . textview )
self . gui . scrolledwindow . add_with_viewport ( self . gui . calendar )
self . gui . calendar . show ( )
2007-12-29 09:03:14 +05:30
self . birthdays = True
self . dates = { }
2007-12-29 00:42:05 +05:30
2007-12-29 09:03:14 +05:30
def refresh ( self , * obj ) :
2007-12-29 00:42:05 +05:30
self . gui . calendar . freeze ( )
2007-12-29 09:03:14 +05:30
self . gui . calendar . clear_marks ( )
year , month , day = self . gui . calendar . get_date ( )
for date in self . dates :
if date [ 1 ] == month - 1 :
if date [ 2 ] > 0 and date [ 2 ] < = day :
self . gui . calendar . mark_day ( date [ 2 ] )
2007-12-29 00:42:05 +05:30
self . gui . calendar . thaw ( )
2007-12-29 09:03:14 +05:30
def background ( self ) :
self . dates = { }
# for each day in events
people = self . gui . dbstate . db . get_person_handles ( sort_handles = False )
cnt = 0
for person_handle in people :
if cnt % 350 == 0 :
yield True
person = self . gui . dbstate . db . get_person_from_handle ( person_handle )
birth_ref = person . get_birth_ref ( )
birth_date = None
if birth_ref :
birth_event = self . gui . dbstate . db . get_event_from_handle ( birth_ref . ref )
birth_date = birth_event . get_date_object ( )
if self . birthdays and birth_date != None :
year = birth_date . get_year ( )
month = birth_date . get_month ( )
day = birth_date . get_day ( )
#age = self.year - year
self . dates [ ( year , month , day ) ] = 1
cnt + = 1
self . refresh ( )
2007-12-29 00:42:05 +05:30
def double_click ( self , obj ) :
# bring up events on this day
pass
2007-12-24 20:26:15 +05:30
class LogGadget ( Gadget ) :
def db_changed ( self ) :
2007-12-25 10:04:42 +05:30
self . dbstate . db . connect ( ' person-add ' , self . log_person_add )
self . dbstate . db . connect ( ' person-delete ' , self . log_person_delete )
self . dbstate . db . connect ( ' person-update ' , self . log_person_update )
self . dbstate . db . connect ( ' family-add ' , self . log_family_add )
self . dbstate . db . connect ( ' family-delete ' , self . log_family_delete )
self . dbstate . db . connect ( ' family-update ' , self . log_family_update )
2007-12-24 20:26:15 +05:30
2007-12-28 13:16:26 +05:30
def on_load ( self ) :
if len ( self . gui . data ) > 0 :
self . show_duplicates = self . gui . data [ 0 ]
def on_save ( self ) :
self . gui . data = [ self . show_duplicates ]
2007-12-24 20:26:15 +05:30
def active_changed ( self , handle ) :
self . log_active_changed ( handle )
def init ( self ) :
self . set_text ( " Log for this Session \n -------------------- \n " )
2007-12-25 10:04:42 +05:30
self . history = { }
2007-12-24 20:26:15 +05:30
def log_person_add ( self , handles ) :
2007-12-25 10:04:42 +05:30
self . get_person ( handles , " person-add " )
2007-12-24 20:26:15 +05:30
def log_person_delete ( self , handles ) :
2007-12-25 10:04:42 +05:30
self . get_person ( handles , " person-delete " )
2007-12-24 20:26:15 +05:30
def log_person_update ( self , handles ) :
2007-12-25 10:04:42 +05:30
self . get_person ( handles , " person-update " )
2007-12-24 20:26:15 +05:30
def log_family_add ( self , handles ) :
self . append_text ( " family-add: %s " % handles )
def log_family_delete ( self , handles ) :
self . append_text ( " family-delete: %s " % handles )
def log_family_update ( self , handles ) :
self . append_text ( " family-update: %s " % handles )
def log_active_changed ( self , handles ) :
2007-12-25 10:04:42 +05:30
self . get_person ( [ handles ] , " active-changed " )
2007-12-24 20:26:15 +05:30
2007-12-25 10:04:42 +05:30
def get_person ( self , handles , ltype ) :
2007-12-24 20:26:15 +05:30
for person_handle in handles :
2007-12-28 13:16:26 +05:30
if ( ( self . show_duplicates == " no " and
ltype + " : " + person_handle not in self . history ) or
self . show_duplicates == " yes " ) :
2007-12-25 10:04:42 +05:30
self . append_text ( " %s : " % ltype )
self . history [ ltype + " : " + person_handle ] = 1
person = self . dbstate . db . get_person_from_handle ( person_handle )
if person :
self . link ( name_displayer . display ( person ) , person_handle )
else :
self . link ( " Unknown " , person_handle )
self . append_text ( " \n " )
2007-12-24 20:26:15 +05:30
class TopSurnamesGadget ( Gadget ) :
2007-12-27 04:44:13 +05:30
def init ( self ) :
2007-12-27 20:36:28 +05:30
self . top_size = 10 # will be overwritten in load
2007-12-27 04:44:13 +05:30
self . set_text ( " No Family Tree loaded. " )
2007-12-28 13:16:26 +05:30
def db_changed ( self ) :
self . dbstate . db . connect ( ' person-add ' , self . update )
self . dbstate . db . connect ( ' person-delete ' , self . update )
self . dbstate . db . connect ( ' person-update ' , self . update )
2007-12-27 20:36:28 +05:30
def on_load ( self ) :
if len ( self . gui . data ) > 0 :
self . top_size = int ( self . gui . data [ 0 ] )
def on_save ( self ) :
self . gui . data = [ self . top_size ]
2007-12-24 20:26:15 +05:30
def main ( self ) :
self . set_text ( " Processing... \n " )
def background ( self ) :
2007-12-25 10:04:42 +05:30
people = self . dbstate . db . get_person_handles ( sort_handles = False )
2007-12-24 20:26:15 +05:30
surnames = { }
cnt = 0
for person_handle in people :
2007-12-25 10:04:42 +05:30
person = self . dbstate . db . get_person_from_handle ( person_handle )
2007-12-24 20:26:15 +05:30
if person :
surname = person . get_primary_name ( ) . get_surname ( ) . strip ( )
surnames [ surname ] = surnames . get ( surname , 0 ) + 1
2007-12-27 04:44:13 +05:30
if cnt % 350 == 0 :
2007-12-24 20:26:15 +05:30
yield True
cnt + = 1
total_people = cnt
surname_sort = [ ]
total = 0
cnt = 0
for surname in surnames :
surname_sort . append ( ( surnames [ surname ] , surname ) )
total + = surnames [ surname ]
2007-12-27 04:44:13 +05:30
if cnt % 350 == 0 :
2007-12-24 20:26:15 +05:30
yield True
cnt + = 1
total_surnames = cnt
surname_sort . sort ( lambda a , b : - cmp ( a , b ) )
line = 0
### All done!
self . set_text ( " " )
for ( count , surname ) in surname_sort :
2007-12-26 13:56:33 +05:30
self . append_text ( " %d . %s , %d %% ( %d ) \n " %
( line + 1 , surname ,
int ( ( float ( count ) / total ) * 100 ) , count ) )
2007-12-24 20:26:15 +05:30
line + = 1
2007-12-27 20:36:28 +05:30
if line > = self . top_size :
2007-12-24 20:26:15 +05:30
break
self . append_text ( " \n Total unique surnames: %d \n " % total_surnames )
self . append_text ( " Total people: %d " % total_people )
class StatsGadget ( Gadget ) :
def db_changed ( self ) :
2007-12-25 10:04:42 +05:30
self . dbstate . db . connect ( ' person-add ' , self . update )
self . dbstate . db . connect ( ' person-delete ' , self . update )
self . dbstate . db . connect ( ' family-add ' , self . update )
self . dbstate . db . connect ( ' family-delete ' , self . update )
2007-12-24 20:26:15 +05:30
2007-12-27 04:44:13 +05:30
def init ( self ) :
self . set_text ( " No Family Tree loaded. " )
2007-12-24 20:26:15 +05:30
def background ( self ) :
self . set_text ( " Processing... " )
2007-12-25 10:04:42 +05:30
database = self . dbstate . db
2007-12-24 20:26:15 +05:30
personList = database . get_person_handles ( sort_handles = False )
familyList = database . get_family_handles ( )
with_photos = 0
total_photos = 0
incomp_names = 0
disconnected = 0
missing_bday = 0
males = 0
females = 0
unknowns = 0
bytes = 0
namelist = [ ]
notfound = [ ]
pobjects = len ( database . get_media_object_handles ( ) )
for photo_id in database . get_media_object_handles ( ) :
photo = database . get_object_from_handle ( photo_id )
try :
bytes = bytes + posixpath . getsize ( photo . get_path ( ) )
except :
notfound . append ( photo . get_path ( ) )
cnt = 0
for person_handle in personList :
person = database . get_person_from_handle ( person_handle )
if not person :
continue
length = len ( person . get_media_list ( ) )
if length > 0 :
with_photos = with_photos + 1
total_photos = total_photos + length
person = database . get_person_from_handle ( person_handle )
name = person . get_primary_name ( )
if name . get_first_name ( ) == " " or name . get_surname ( ) == " " :
incomp_names = incomp_names + 1
2007-12-27 04:44:13 +05:30
if ( ( not person . get_main_parents_family_handle ( ) ) and
( not len ( person . get_family_handle_list ( ) ) ) ) :
2007-12-24 20:26:15 +05:30
disconnected = disconnected + 1
birth_ref = person . get_birth_ref ( )
if birth_ref :
birth = database . get_event_from_handle ( birth_ref . ref )
if not DateHandler . get_date ( birth ) :
missing_bday = missing_bday + 1
else :
missing_bday = missing_bday + 1
if person . get_gender ( ) == gen . lib . Person . FEMALE :
females = females + 1
elif person . get_gender ( ) == gen . lib . Person . MALE :
males = males + 1
else :
unknowns + = 1
if name . get_surname ( ) not in namelist :
namelist . append ( name . get_surname ( ) )
2007-12-27 04:44:13 +05:30
if cnt % 200 == 0 :
2007-12-24 20:26:15 +05:30
yield True
cnt + = 1
text = _ ( " Individuals " ) + " \n "
text = text + " ---------------------------- \n "
text = text + " %s : %d \n " % ( _ ( " Number of individuals " ) , len ( personList ) )
text = text + " %s : %d \n " % ( _ ( " Males " ) , males )
text = text + " %s : %d \n " % ( _ ( " Females " ) , females )
text = text + " %s : %d \n " % ( _ ( " Individuals with unknown gender " ) , unknowns )
text = text + " %s : %d \n " % ( _ ( " Individuals with incomplete names " ) , incomp_names )
text = text + " %s : %d \n " % ( _ ( " Individuals missing birth dates " ) , missing_bday )
text = text + " %s : %d \n " % ( _ ( " Disconnected individuals " ) , disconnected )
text = text + " \n %s \n " % _ ( " Family Information " )
text = text + " ---------------------------- \n "
text = text + " %s : %d \n " % ( _ ( " Number of families " ) , len ( familyList ) )
text = text + " %s : %d \n " % ( _ ( " Unique surnames " ) , len ( namelist ) )
text = text + " \n %s \n " % _ ( " Media Objects " )
text = text + " ---------------------------- \n "
text = text + " %s : %d \n " % ( _ ( " Individuals with media objects " ) , with_photos )
text = text + " %s : %d \n " % ( _ ( " Total number of media object references " ) , total_photos )
text = text + " %s : %d \n " % ( _ ( " Number of unique media objects " ) , pobjects )
text = text + " %s : %d %s \n " % ( _ ( " Total size of media objects " ) , bytes , \
_ ( " bytes " ) )
if len ( notfound ) > 0 :
text = text + " \n %s \n " % _ ( " Missing Media Objects " )
text = text + " ---------------------------- \n "
for p in notfound :
text = text + " %s \n " % p
self . set_text ( text )
2007-12-25 03:11:13 +05:30
class PythonGadget ( Gadget ) :
def init ( self ) :
2007-12-25 03:56:30 +05:30
self . env = { " dbstate " : self . gui . dbstate ,
2007-12-25 05:06:11 +05:30
" uistate " : self . gui . uistate ,
2007-12-25 03:56:30 +05:30
" self " : self ,
}
2007-12-25 03:11:13 +05:30
# GUI setup:
self . gui . textview . set_editable ( True )
2007-12-25 23:21:37 +05:30
self . set_text ( " Python %s \n > " % sys . version )
2007-12-25 03:11:13 +05:30
self . gui . textview . connect ( ' key-press-event ' , self . on_enter )
2007-12-25 03:56:30 +05:30
def format_exception ( self , max_tb_level = 10 ) :
retval = ' '
cla , exc , trbk = sys . exc_info ( )
retval + = " ERROR: %s %s " % ( cla , exc )
return retval
2007-12-25 03:11:13 +05:30
def on_enter ( self , widget , event ) :
if event . keyval == 65293 : # enter, where to get this?
buffer = widget . get_buffer ( )
line_cnt = buffer . get_line_count ( )
start = buffer . get_iter_at_line ( line_cnt - 1 )
end = buffer . get_end_iter ( )
line = buffer . get_text ( start , end )
if line . startswith ( " > " ) :
self . append_text ( " \n " )
line = line [ 2 : ]
2007-12-25 05:06:11 +05:30
# update states, in case of change:
2007-12-25 03:56:30 +05:30
self . env [ " dbstate " ] = self . gui . dbstate
2007-12-25 05:06:11 +05:30
self . env [ " uistate " ] = self . gui . uistate
2007-12-25 03:59:39 +05:30
_retval = None
2007-12-25 03:56:30 +05:30
if " _retval " in self . env :
del self . env [ " _retval " ]
exp1 = """ _retval = """ + string . strip ( line )
exp2 = string . strip ( line )
try :
_retval = eval ( exp2 , self . env )
except :
try :
exec exp1 in self . env
except :
try :
exec exp2 in self . env
except :
_retval = self . format_exception ( )
if " _retval " in self . env :
_retval = self . env [ " _retval " ]
if _retval != None :
self . append_text ( " %s \n " % _retval )
2007-12-25 03:11:13 +05:30
self . append_text ( " > " )
else :
2007-12-25 03:56:30 +05:30
self . append_text ( " > " )
2007-12-25 03:11:13 +05:30
return True
return False
2007-12-25 10:04:42 +05:30
class TODOGadget ( Gadget ) :
def init ( self ) :
# GUI setup:
self . gui . textview . set_editable ( True )
2007-12-25 23:21:37 +05:30
self . append_text ( " Enter your TODO list here. " )
2007-12-25 10:04:42 +05:30
2007-12-27 20:36:28 +05:30
def on_load ( self ) :
self . load_data_to_text ( )
def on_save ( self ) :
self . gui . data = [ ] # clear out old data
self . save_text_to_data ( )
2007-12-27 00:02:09 +05:30
def make_welcome_content ( gui ) :
text = """
Welcome to GRAMPS !
GRAMPS is a software package designed for genealogical research . Although similar to other genealogical programs , GRAMPS offers some unique and powerful features .
GRAMPS is an Open Source Software package , which means you are free to make copies and distribute it to anyone you like . It ' s developed and maintained by a worldwide team of volunteers whose goal is to make GRAMPS powerful, yet easy to use.
Getting Started
The first thing you must do is to create a new Family Tree . To create a new Family Tree ( sometimes called a database ) select " Family Trees " from the menu . . . . TODO
You are currently reading from the " My Gramps " page , where you can add your own gadgets .
You can right - click on the background of this page to add additional gadgets and change the number of columns . You can also drag the Properties button to reposition the gadget on this page , and detach the gadget to float above GRAMPS . If you close GRAMPS with a gadget detached , it will re - opened detached the next time you start GRAMPS .
"""
gui . set_text ( text )
2007-12-24 20:26:15 +05:30
register ( type = " gadget " ,
name = " Top Surnames Gadget " ,
height = 230 ,
content = TopSurnamesGadget ,
2007-12-25 10:04:42 +05:30
title = " Top Surnames " ,
2007-12-24 20:26:15 +05:30
)
register ( type = " gadget " ,
name = " Stats Gadget " ,
height = 230 ,
2007-12-27 04:44:13 +05:30
expand = True ,
2007-12-24 20:26:15 +05:30
content = StatsGadget ,
title = " Stats " ,
)
register ( type = " gadget " ,
name = " Log Gadget " ,
height = 230 ,
2007-12-28 13:16:26 +05:30
data = [ ' no ' ] ,
2007-12-24 20:26:15 +05:30
content = LogGadget ,
title = " Session Log " ,
)
2007-12-25 03:11:13 +05:30
register ( type = " gadget " ,
name = " Python Gadget " ,
height = 250 ,
2007-12-25 03:56:30 +05:30
content = PythonGadget ,
2007-12-28 13:16:26 +05:30
title = " Python Shell " ,
2007-12-25 03:11:13 +05:30
)
2007-12-25 10:04:42 +05:30
register ( type = " gadget " ,
name = " TODO Gadget " ,
height = 300 ,
2007-12-27 04:44:13 +05:30
expand = True ,
2007-12-25 10:04:42 +05:30
content = TODOGadget ,
title = " TODO List " ,
)
2007-12-27 00:02:09 +05:30
register ( type = " gadget " ,
name = " Welcome Gadget " ,
height = 300 ,
expand = True ,
content = make_welcome_content ,
title = " Welcome to GRAMPS! " ,
)
2007-12-29 00:42:05 +05:30
register ( type = " gadget " ,
name = " Calendar Gadget " ,
height = 200 ,
content = CalendarGadget ,
title = " Calendar " ,
)