Merge changes made between 2.0.3 and 2.0.5
svn: r4911
This commit is contained in:
parent
e8fbe69486
commit
895d7e1a53
@ -1,3 +1,6 @@
|
|||||||
|
2005-07-08 Alex Roitman <shura@gramps-project.org>
|
||||||
|
* various: merge changes made in gramps20 branch with main trunk.
|
||||||
|
|
||||||
2005-06-24 Martin Hawlisch <Martin.Hawlisch@gmx.de>
|
2005-06-24 Martin Hawlisch <Martin.Hawlisch@gmx.de>
|
||||||
* src/GrampsBSDDB.py (upgrade): Disable upgrade_7 until this is
|
* src/GrampsBSDDB.py (upgrade): Disable upgrade_7 until this is
|
||||||
properly working to not accidently destroy a database from gramps20
|
properly working to not accidently destroy a database from gramps20
|
||||||
|
17
NEWS
17
NEWS
@ -1,3 +1,20 @@
|
|||||||
|
Version 2.0.5 -- the "It's certainly uncontaminated by cheese" release
|
||||||
|
* New filters based on personal notes.
|
||||||
|
* New routine for checking and removing corrupted source references in
|
||||||
|
the Check and Repair tool.
|
||||||
|
* Bug fixes.
|
||||||
|
|
||||||
|
Version 2.0.4 -- the "That's enough music for now, lads." release
|
||||||
|
* Speedups for "select" dialogs in Family View.
|
||||||
|
* Filters are working in reports again.
|
||||||
|
* vCal and vCard plugins are back.
|
||||||
|
* Gender guessing is back for new people.
|
||||||
|
* GEDCOM export fixes.
|
||||||
|
* Other bug fixes.
|
||||||
|
|
||||||
|
Version 2.0.3 -- the "Mynd you, møøse bites Kan be pretty nasti..." release
|
||||||
|
* Fixed Date handler bug that would not allow dates to be updated.
|
||||||
|
|
||||||
Version 2.0.2 -- the "Little fermented curd will do the trick" release
|
Version 2.0.2 -- the "Little fermented curd will do the trick" release
|
||||||
* Updated German translation (Anton Huber).
|
* Updated German translation (Anton Huber).
|
||||||
* Usability improvements for large databases.
|
* Usability improvements for large databases.
|
||||||
|
@ -42,6 +42,7 @@ from gettext import gettext as _
|
|||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
import gtk.glade
|
import gtk.glade
|
||||||
import gnome
|
import gnome
|
||||||
|
import gobject
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -100,8 +101,6 @@ class AddSpouse:
|
|||||||
|
|
||||||
self.renderer = gtk.CellRendererText()
|
self.renderer = gtk.CellRendererText()
|
||||||
|
|
||||||
self.slist = PeopleModel.PeopleModel(self.db,self.filter)
|
|
||||||
self.spouse_list.set_model(self.slist)
|
|
||||||
self.selection = self.spouse_list.get_selection()
|
self.selection = self.spouse_list.get_selection()
|
||||||
self.selection.connect('changed',self.select_row)
|
self.selection.connect('changed',self.select_row)
|
||||||
self.add_columns(self.spouse_list)
|
self.add_columns(self.spouse_list)
|
||||||
@ -116,7 +115,7 @@ class AddSpouse:
|
|||||||
Utils.set_titles(self.window,
|
Utils.set_titles(self.window,
|
||||||
self.glade.get_widget('title'),title,
|
self.glade.get_widget('title'),title,
|
||||||
_('Choose Spouse/Partner'))
|
_('Choose Spouse/Partner'))
|
||||||
|
|
||||||
self.glade.signal_autoconnect({
|
self.glade.signal_autoconnect({
|
||||||
"on_select_spouse_clicked" : self.select_spouse_clicked,
|
"on_select_spouse_clicked" : self.select_spouse_clicked,
|
||||||
"on_spouse_help_clicked" : self.on_spouse_help_clicked,
|
"on_spouse_help_clicked" : self.on_spouse_help_clicked,
|
||||||
@ -130,22 +129,18 @@ class AddSpouse:
|
|||||||
RelLib.Family.CUSTOM,RelLib.Family.MARRIED)
|
RelLib.Family.CUSTOM,RelLib.Family.MARRIED)
|
||||||
|
|
||||||
self.set_gender()
|
self.set_gender()
|
||||||
self.update_data()
|
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||||
|
gobject.idle_add(self.update_data)
|
||||||
|
|
||||||
def build_all(self):
|
def build_all(self):
|
||||||
filt = GenericFilter.GenericFilter()
|
return None
|
||||||
filt.add_rule(GenericFilter.Everyone([]))
|
|
||||||
return filt
|
|
||||||
|
|
||||||
def build_likely(self,gender):
|
def build_likely(self,gender):
|
||||||
birth_ref = self.person.get_birth_ref()
|
birth_ref = self.person.get_birth_ref()
|
||||||
death_ref = self.person.get_death_ref()
|
death_ref = self.person.get_death_ref()
|
||||||
|
|
||||||
filt = GenericFilter.GenericFilter()
|
filt = GenericFilter.GenericFilter()
|
||||||
if gender == RelLib.Person.MALE:
|
filt.add_rule(LikelyFilter([self.person.handle,self.person.gender]))
|
||||||
filt.add_rule(GenericFilter.IsFemale([]))
|
|
||||||
else:
|
|
||||||
filt.add_rule(GenericFilter.IsMale([]))
|
|
||||||
|
|
||||||
if birth_ref:
|
if birth_ref:
|
||||||
birth = self.db.get_event_from_handle(birth_ref.ref)
|
birth = self.db.get_event_from_handle(birth_ref.ref)
|
||||||
@ -162,16 +157,13 @@ class AddSpouse:
|
|||||||
def add_columns(self,tree):
|
def add_columns(self,tree):
|
||||||
column = gtk.TreeViewColumn(_('Name'), self.renderer,text=0)
|
column = gtk.TreeViewColumn(_('Name'), self.renderer,text=0)
|
||||||
column.set_resizable(True)
|
column.set_resizable(True)
|
||||||
#column.set_clickable(True)
|
|
||||||
column.set_min_width(225)
|
column.set_min_width(225)
|
||||||
tree.append_column(column)
|
tree.append_column(column)
|
||||||
column = gtk.TreeViewColumn(_('ID'), self.renderer,text=1)
|
column = gtk.TreeViewColumn(_('ID'), self.renderer,text=1)
|
||||||
column.set_resizable(True)
|
column.set_resizable(True)
|
||||||
#column.set_clickable(True)
|
|
||||||
column.set_min_width(75)
|
column.set_min_width(75)
|
||||||
tree.append_column(column)
|
tree.append_column(column)
|
||||||
column = gtk.TreeViewColumn(_('Birth date'), self.renderer,text=3)
|
column = gtk.TreeViewColumn(_('Birth date'), self.renderer,text=3)
|
||||||
#column.set_resizable(True)
|
|
||||||
column.set_clickable(True)
|
column.set_clickable(True)
|
||||||
tree.append_column(column)
|
tree.append_column(column)
|
||||||
|
|
||||||
@ -194,9 +186,9 @@ class AddSpouse:
|
|||||||
"""
|
"""
|
||||||
idlist = self.get_selected_ids()
|
idlist = self.get_selected_ids()
|
||||||
if idlist and idlist[0]:
|
if idlist and idlist[0]:
|
||||||
self.ok.set_sensitive(1)
|
self.ok.set_sensitive(True)
|
||||||
else:
|
else:
|
||||||
self.ok.set_sensitive(0)
|
self.ok.set_sensitive(False)
|
||||||
|
|
||||||
def new_spouse_clicked(self,obj):
|
def new_spouse_clicked(self,obj):
|
||||||
"""
|
"""
|
||||||
@ -227,7 +219,7 @@ class AddSpouse:
|
|||||||
been closed.
|
been closed.
|
||||||
"""
|
"""
|
||||||
person = epo.person
|
person = epo.person
|
||||||
self.update_data(person.get_handle())
|
self.update_data()
|
||||||
|
|
||||||
self.slist = PeopleModel.PeopleModel(self.db,self.filter)
|
self.slist = PeopleModel.PeopleModel(self.db,self.filter)
|
||||||
self.slist.rebuild_data()
|
self.slist.rebuild_data()
|
||||||
@ -321,7 +313,7 @@ class AddSpouse:
|
|||||||
m.on_add_clicked()
|
m.on_add_clicked()
|
||||||
|
|
||||||
def relation_type_changed(self,obj):
|
def relation_type_changed(self,obj):
|
||||||
self.update_data()
|
gobject.idle_add(self.update_data)
|
||||||
|
|
||||||
def all_filter(self, person):
|
def all_filter(self, person):
|
||||||
return person.get_gender() != self.sgender
|
return person.get_gender() != self.sgender
|
||||||
@ -387,18 +379,61 @@ class AddSpouse:
|
|||||||
else:
|
else:
|
||||||
self.sgender = RelLib.Person.FEMALE
|
self.sgender = RelLib.Person.FEMALE
|
||||||
|
|
||||||
def update_data(self,person = None):
|
def update_data(self):
|
||||||
"""
|
"""
|
||||||
Called whenever the relationship type changes. Rebuilds the
|
Called whenever the relationship type changes. Rebuilds the
|
||||||
the potential spouse list.
|
the potential spouse list.
|
||||||
"""
|
"""
|
||||||
|
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||||
|
while(gtk.events_pending()):
|
||||||
|
gtk.main_iteration()
|
||||||
self.slist = PeopleModel.PeopleModel(self.db,self.filter)
|
self.slist = PeopleModel.PeopleModel(self.db,self.filter)
|
||||||
self.spouse_list.set_model(self.slist)
|
self.spouse_list.set_model(self.slist)
|
||||||
|
self.window.window.set_cursor(None)
|
||||||
|
|
||||||
def on_show_toggled(self,obj):
|
def on_show_toggled(self,obj):
|
||||||
if self.filter == self.likely:
|
if self.filter == self.likely:
|
||||||
self.filter = self.all
|
self.filter = self.all
|
||||||
else:
|
else:
|
||||||
self.filter = self.likely
|
self.filter = self.likely
|
||||||
self.update_data()
|
gobject.idle_add(self.update_data)
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Likely Filters
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class LikelyFilter(GenericFilter.Rule):
|
||||||
|
|
||||||
|
category = _('General filters')
|
||||||
|
|
||||||
|
def prepare(self,db):
|
||||||
|
person = db.get_person_from_handle(self.list[0])
|
||||||
|
if person.birth_handle:
|
||||||
|
birth = db.get_event_from_handle(person.birth_handle)
|
||||||
|
dateobj = Date.Date(birth.date)
|
||||||
|
year = dateobj.get_year()
|
||||||
|
dateobj.set_year(year+40)
|
||||||
|
self.lower = dateobj.sortval
|
||||||
|
dateobj.set_year(year-40)
|
||||||
|
self.upper = dateobj.sortval
|
||||||
|
else:
|
||||||
|
self.upper = None
|
||||||
|
self.lower = None
|
||||||
|
|
||||||
|
if person.gender == RelLib.Person.MALE:
|
||||||
|
self.gender = RelLib.Person.FEMALE
|
||||||
|
else:
|
||||||
|
self.gender = RelLib.Person.MALE
|
||||||
|
|
||||||
|
def apply(self,db,person):
|
||||||
|
if person.gender != self.gender:
|
||||||
|
return False
|
||||||
|
if not person.birth_handle or (self.upper == None and
|
||||||
|
self.lower == None):
|
||||||
|
return True
|
||||||
|
event = db.get_event_from_handle(person.birth_handle)
|
||||||
|
return (event.date == None or event.date.sortval == 0 or
|
||||||
|
self.lower > event.date.sortval > self.upper)
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@ from gettext import gettext as _
|
|||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
import gtk.glade
|
import gtk.glade
|
||||||
import gtk.gdk
|
import gtk.gdk
|
||||||
|
import gobject
|
||||||
import gnome
|
import gnome
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -107,19 +108,25 @@ class ChooseParents:
|
|||||||
self.parent_selected = 0
|
self.parent_selected = 0
|
||||||
self.renderer = gtk.CellRendererText()
|
self.renderer = gtk.CellRendererText()
|
||||||
|
|
||||||
db.connect('person-add', self.redraw)
|
db.connect('person-add', self.person_added)
|
||||||
db.connect('person-update', self.redraw)
|
db.connect('person-update', self.redraw)
|
||||||
db.connect('person-delete', self.redraw)
|
db.connect('person-delete', self.redraw)
|
||||||
db.connect('person-rebuild', self.redraw)
|
db.connect('person-rebuild', self.redraw_all)
|
||||||
|
|
||||||
# set default filters
|
# set default filters
|
||||||
self.all_males_filter = GenericFilter.GenericFilter()
|
self.all_males_filter = GenericFilter.GenericFilter()
|
||||||
self.all_males_filter.add_rule(GenericFilter.IsMale([]))
|
self.all_males_filter.add_rule(GenericFilter.IsMale([]))
|
||||||
self.likely_males_filter = self.build_likely(True)
|
|
||||||
|
|
||||||
self.all_females_filter = GenericFilter.GenericFilter()
|
self.all_females_filter = GenericFilter.GenericFilter()
|
||||||
self.all_females_filter.add_rule(GenericFilter.IsFemale([]))
|
self.all_females_filter.add_rule(GenericFilter.IsFemale([]))
|
||||||
self.likely_females_filter = self.build_likely(False)
|
|
||||||
|
bh = person.birth_handle
|
||||||
|
if bh and self.db.get_event_from_handle(bh).date.sortval != 0:
|
||||||
|
self.likely_females_filter = self.build_likely(False)
|
||||||
|
self.likely_males_filter = self.build_likely(True)
|
||||||
|
else:
|
||||||
|
self.likely_males_filter = self.all_males_filter
|
||||||
|
self.likely_females_filter = self.all_females_filter
|
||||||
|
|
||||||
self.father_filter = self.likely_males_filter
|
self.father_filter = self.likely_males_filter
|
||||||
self.mother_filter = self.likely_females_filter
|
self.mother_filter = self.likely_females_filter
|
||||||
@ -133,6 +140,11 @@ class ChooseParents:
|
|||||||
|
|
||||||
self.glade = gtk.glade.XML(const.gladeFile,"familyDialog","gramps")
|
self.glade = gtk.glade.XML(const.gladeFile,"familyDialog","gramps")
|
||||||
self.window = self.glade.get_widget("familyDialog")
|
self.window = self.glade.get_widget("familyDialog")
|
||||||
|
self.flabel = self.glade.get_widget("flabel")
|
||||||
|
self.mlabel = self.glade.get_widget("mlabel")
|
||||||
|
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||||
|
self.mlabel.set_label("<i>%s</i>" % _("Loading..."))
|
||||||
|
self.flabel.set_label("<i>%s</i>" % _("Loading..."))
|
||||||
|
|
||||||
name = NameDisplay.displayer.display(self.person)
|
name = NameDisplay.displayer.display(self.person)
|
||||||
self.title_text = _("Choose the Parents of %s") % name
|
self.title_text = _("Choose the Parents of %s") % name
|
||||||
@ -145,14 +157,11 @@ class ChooseParents:
|
|||||||
self.title = self.glade.get_widget("chooseTitle")
|
self.title = self.glade.get_widget("chooseTitle")
|
||||||
self.father_list = self.glade.get_widget("father_list")
|
self.father_list = self.glade.get_widget("father_list")
|
||||||
self.mother_list = self.glade.get_widget("mother_list")
|
self.mother_list = self.glade.get_widget("mother_list")
|
||||||
self.flabel = self.glade.get_widget("flabel")
|
|
||||||
self.mlabel = self.glade.get_widget("mlabel")
|
|
||||||
self.showallf = self.glade.get_widget('showallf')
|
self.showallf = self.glade.get_widget('showallf')
|
||||||
self.showallm = self.glade.get_widget('showallm')
|
self.showallm = self.glade.get_widget('showallm')
|
||||||
self.add_itself_to_menu()
|
self.add_itself_to_menu()
|
||||||
|
|
||||||
self.build_father_list()
|
gobject.idle_add(self.draw_list)
|
||||||
self.build_mother_list()
|
|
||||||
|
|
||||||
if gtk.gdk.screen_height() > 700:
|
if gtk.gdk.screen_height() > 700:
|
||||||
self.father_list.set_size_request(-1,150)
|
self.father_list.set_size_request(-1,150)
|
||||||
@ -201,7 +210,20 @@ class ChooseParents:
|
|||||||
|
|
||||||
self.window.show()
|
self.window.show()
|
||||||
|
|
||||||
|
def draw_list(self):
|
||||||
|
self.build_father_list()
|
||||||
|
self.build_mother_list()
|
||||||
|
self.window.window.set_cursor(None)
|
||||||
|
|
||||||
def build_likely(self,is_male):
|
def build_likely(self,is_male):
|
||||||
|
filt = GenericFilter.GenericFilter()
|
||||||
|
if is_male:
|
||||||
|
filt.add_rule(LikelyFather([self.person.handle]))
|
||||||
|
else:
|
||||||
|
filt.add_rule(LikelyMother([self.person.handle]))
|
||||||
|
return filt
|
||||||
|
|
||||||
|
def build_likely2(self,is_male):
|
||||||
birth_ref = self.person.get_birth_ref()
|
birth_ref = self.person.get_birth_ref()
|
||||||
|
|
||||||
filt = GenericFilter.GenericFilter()
|
filt = GenericFilter.GenericFilter()
|
||||||
@ -242,21 +264,32 @@ class ChooseParents:
|
|||||||
self.redrawm()
|
self.redrawm()
|
||||||
|
|
||||||
def add_columns(self,tree):
|
def add_columns(self,tree):
|
||||||
|
|
||||||
column = gtk.TreeViewColumn(_('Name'), self.renderer,text=0)
|
column = gtk.TreeViewColumn(_('Name'), self.renderer,text=0)
|
||||||
column.set_resizable(True)
|
column.set_resizable(True)
|
||||||
column.set_clickable(True)
|
column.set_clickable(True)
|
||||||
column.set_sort_column_id(0)
|
column.set_sort_column_id(0)
|
||||||
column.set_min_width(225)
|
|
||||||
|
column.set_fixed_width(255)
|
||||||
|
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
||||||
|
|
||||||
tree.append_column(column)
|
tree.append_column(column)
|
||||||
column = gtk.TreeViewColumn(_('ID'), self.renderer,text=1)
|
column = gtk.TreeViewColumn(_('ID'), self.renderer,text=1)
|
||||||
column.set_resizable(True)
|
column.set_resizable(True)
|
||||||
column.set_clickable(True)
|
column.set_clickable(True)
|
||||||
column.set_sort_column_id(1)
|
column.set_sort_column_id(1)
|
||||||
column.set_min_width(75)
|
|
||||||
|
column.set_fixed_width(75)
|
||||||
|
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
||||||
|
#column.set_min_width(75)
|
||||||
|
|
||||||
tree.append_column(column)
|
tree.append_column(column)
|
||||||
column = gtk.TreeViewColumn(_('Birth date'), self.renderer,text=3)
|
column = gtk.TreeViewColumn(_('Birth date'), self.renderer,text=3)
|
||||||
#column.set_resizable(True)
|
#column.set_resizable(True)
|
||||||
column.set_clickable(True)
|
column.set_clickable(True)
|
||||||
|
column.set_fixed_width(150)
|
||||||
|
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
||||||
|
|
||||||
tree.append_column(column)
|
tree.append_column(column)
|
||||||
|
|
||||||
def on_delete_event(self,obj,b):
|
def on_delete_event(self,obj,b):
|
||||||
@ -298,10 +331,48 @@ class ChooseParents:
|
|||||||
"""Display the relevant portion of GRAMPS manual"""
|
"""Display the relevant portion of GRAMPS manual"""
|
||||||
gnome.help_display('gramps-manual','gramps-edit-quick')
|
gnome.help_display('gramps-manual','gramps-edit-quick')
|
||||||
|
|
||||||
|
def person_added(self,handle_list):
|
||||||
|
update_father = False
|
||||||
|
update_mother = False
|
||||||
|
|
||||||
|
for handle in handle_list:
|
||||||
|
person = self.db.get_person_from_handle(handle)
|
||||||
|
if person.get_gender() == RelLib.Person.MALE:
|
||||||
|
update_father = True
|
||||||
|
elif person.get_gender() == RelLib.Person.FEMALE:
|
||||||
|
update_mother = True
|
||||||
|
|
||||||
|
if update_father:
|
||||||
|
self.person_added_base(handle_list,self.father_model,
|
||||||
|
self.father_filter)
|
||||||
|
if update_mother:
|
||||||
|
self.person_added_base(handle_list,self.mother_model,
|
||||||
|
self.mother_filter)
|
||||||
|
|
||||||
|
def person_added_base(self,handle_list,model,data_filter):
|
||||||
|
for node in handle_list:
|
||||||
|
person = self.db.get_person_from_handle(node)
|
||||||
|
top = person.get_primary_name().get_group_name()
|
||||||
|
model.rebuild_data(data_filter)
|
||||||
|
if not model.is_visable(node):
|
||||||
|
continue
|
||||||
|
if (not model.sname_sub.has_key(top) or
|
||||||
|
len(model.sname_sub[top]) == 1):
|
||||||
|
path = model.on_get_path(top)
|
||||||
|
pnode = model.get_iter(path)
|
||||||
|
model.row_inserted(path,pnode)
|
||||||
|
path = model.on_get_path(node)
|
||||||
|
pnode = model.get_iter(path)
|
||||||
|
model.row_inserted(path,pnode)
|
||||||
|
|
||||||
def redraw(self,handle_list):
|
def redraw(self,handle_list):
|
||||||
self.redrawf()
|
self.redrawf()
|
||||||
self.redrawm()
|
self.redrawm()
|
||||||
|
|
||||||
|
def redraw_all(self):
|
||||||
|
self.redrawf()
|
||||||
|
self.redrawm()
|
||||||
|
|
||||||
def redrawf(self):
|
def redrawf(self):
|
||||||
"""Redraws the potential father list"""
|
"""Redraws the potential father list"""
|
||||||
self.father_model = PeopleModel.PeopleModel(self.db,self.father_filter)
|
self.father_model = PeopleModel.PeopleModel(self.db,self.father_filter)
|
||||||
@ -315,8 +386,8 @@ class ChooseParents:
|
|||||||
def redrawm(self):
|
def redrawm(self):
|
||||||
"""Redraws the potential mother list"""
|
"""Redraws the potential mother list"""
|
||||||
self.mother_model = PeopleModel.PeopleModel(self.db,self.mother_filter)
|
self.mother_model = PeopleModel.PeopleModel(self.db,self.mother_filter)
|
||||||
self.mother_list.set_model(self.mother_model)
|
|
||||||
|
|
||||||
|
self.mother_list.set_model(self.mother_model)
|
||||||
if self.type[0] == RelLib.Family.CIVIL_UNION:
|
if self.type[0] == RelLib.Family.CIVIL_UNION:
|
||||||
self.mlabel.set_label("<b>%s</b>" % _("Pa_rent"))
|
self.mlabel.set_label("<b>%s</b>" % _("Pa_rent"))
|
||||||
else:
|
else:
|
||||||
@ -537,7 +608,7 @@ class ChooseParents:
|
|||||||
self.father_list.scroll_to_cell(path,None,1,0.5,0)
|
self.father_list.scroll_to_cell(path,None,1,0.5,0)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
self.father_filter = self.all_males_filter
|
self.father_filter = self.all_males_filter
|
||||||
self.showallf_toggled(None)
|
self.redrawf()
|
||||||
path = self.father_model.on_get_path(handle)
|
path = self.father_model.on_get_path(handle)
|
||||||
top_path = self.father_model.on_get_path(name)
|
top_path = self.father_model.on_get_path(name)
|
||||||
self.father_list.expand_row(top_path,0)
|
self.father_list.expand_row(top_path,0)
|
||||||
@ -552,7 +623,7 @@ class ChooseParents:
|
|||||||
self.mother_list.scroll_to_cell(path,None,1,0.5,0)
|
self.mother_list.scroll_to_cell(path,None,1,0.5,0)
|
||||||
except:
|
except:
|
||||||
self.mother_filter = self.all_females_filter
|
self.mother_filter = self.all_females_filter
|
||||||
self.showallm_toggled(None)
|
self.redrawm()
|
||||||
path = self.mother_model.on_get_path(handle)
|
path = self.mother_model.on_get_path(handle)
|
||||||
top_path = self.mother_model.on_get_path(name)
|
top_path = self.mother_model.on_get_path(name)
|
||||||
self.mother_list.expand_row(top_path,0)
|
self.mother_list.expand_row(top_path,0)
|
||||||
@ -743,3 +814,51 @@ class ModifyParents:
|
|||||||
trans = self.db.transaction_begin()
|
trans = self.db.transaction_begin()
|
||||||
self.db.commit_person(self.person,trans)
|
self.db.commit_person(self.person,trans)
|
||||||
self.db.transaction_commit(trans,_("Modify Parents"))
|
self.db.transaction_commit(trans,_("Modify Parents"))
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Likely Filters
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class LikelyFilter(GenericFilter.Rule):
|
||||||
|
|
||||||
|
category = _('General filters')
|
||||||
|
|
||||||
|
def prepare(self,db):
|
||||||
|
person = db.get_person_from_handle(self.list[0])
|
||||||
|
birth = db.get_event_from_handle(person.birth_handle)
|
||||||
|
dateobj = Date.Date(birth.date)
|
||||||
|
year = dateobj.get_year()
|
||||||
|
dateobj.set_year(year-10)
|
||||||
|
self.lower = dateobj.sortval
|
||||||
|
dateobj.set_year(year-70)
|
||||||
|
self.upper = dateobj.sortval
|
||||||
|
|
||||||
|
def apply(self,db,person):
|
||||||
|
if person.gender != self.gender:
|
||||||
|
return False
|
||||||
|
if not person.birth_handle:
|
||||||
|
return True
|
||||||
|
event = db.get_event_from_handle(person.birth_handle)
|
||||||
|
return (event.date == None or event.date.sortval == 0 or
|
||||||
|
self.lower > event.date.sortval > self.upper)
|
||||||
|
|
||||||
|
class LikelyFather(LikelyFilter):
|
||||||
|
|
||||||
|
name = _('Likely Father')
|
||||||
|
description = _('Matches likely fathers')
|
||||||
|
|
||||||
|
def __init__(self,data_list):
|
||||||
|
GenericFilter.Rule.__init__(self,data_list)
|
||||||
|
self.gender = RelLib.Person.MALE
|
||||||
|
|
||||||
|
|
||||||
|
class LikelyMother(LikelyFilter):
|
||||||
|
|
||||||
|
name = _('Likely Mother')
|
||||||
|
description = _('Matches likely mothers')
|
||||||
|
|
||||||
|
def __init__(self,data_list):
|
||||||
|
GenericFilter.Rule.__init__(self,data_list)
|
||||||
|
self.gender = RelLib.Person.FEMALE
|
||||||
|
|
||||||
|
11
src/Date.py
11
src/Date.py
@ -156,12 +156,12 @@ class Date:
|
|||||||
instance IN ALL REGARDS. Needed, because the __cmp__ only looks
|
instance IN ALL REGARDS. Needed, because the __cmp__ only looks
|
||||||
at the sorting value, and ignores the modifiers/comments.
|
at the sorting value, and ignores the modifiers/comments.
|
||||||
"""
|
"""
|
||||||
|
if self.modifier == other.modifier and self.modifier == MOD_TEXTONLY:
|
||||||
|
return self.text == other.text
|
||||||
return (self.calendar == other.calendar and
|
return (self.calendar == other.calendar and
|
||||||
self.modifier == other.modifier and
|
self.modifier == other.modifier and
|
||||||
self.quality == other.quality and
|
self.quality == other.quality and
|
||||||
self.dateval == other.dateval and
|
self.dateval == other.dateval and
|
||||||
self.text == other.text and
|
|
||||||
self.sortval == other.sortval)
|
self.sortval == other.sortval)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@ -340,6 +340,7 @@ class Date:
|
|||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
self.dateval = self.dateval[0:2] + (year,) + self.dateval[3:]
|
self.dateval = self.dateval[0:2] + (year,) + self.dateval[3:]
|
||||||
|
self.calc_sort_value()
|
||||||
|
|
||||||
def get_year_valid(self):
|
def get_year_valid(self):
|
||||||
return self._get_low_item_valid(_POS_YR)
|
return self._get_low_item_valid(_POS_YR)
|
||||||
@ -458,6 +459,12 @@ class Date:
|
|||||||
if text:
|
if text:
|
||||||
self.text = text
|
self.text = text
|
||||||
|
|
||||||
|
def calc_sort_value(self):
|
||||||
|
year = max(self.dateval[_POS_YR],1)
|
||||||
|
month = max(self.dateval[_POS_MON],1)
|
||||||
|
day = max(self.dateval[_POS_DAY],1)
|
||||||
|
self.sortval = _calendar_convert[self.calendar](year,month,day)
|
||||||
|
|
||||||
def convert_calendar(self,calendar):
|
def convert_calendar(self,calendar):
|
||||||
"""
|
"""
|
||||||
Converts the date from the current calendar to the specified
|
Converts the date from the current calendar to the specified
|
||||||
|
@ -95,12 +95,17 @@ class EditPerson:
|
|||||||
|
|
||||||
self.dp = DateHandler.parser
|
self.dp = DateHandler.parser
|
||||||
self.dd = DateHandler.displayer
|
self.dd = DateHandler.displayer
|
||||||
|
self.orig_handle = person.get_handle()
|
||||||
|
# UGLY HACK to refresh person object from handle if that exists
|
||||||
|
# done to ensure that the person object is not stale, as it could
|
||||||
|
# have been changed by something external (merge, tool, etc).
|
||||||
|
if self.orig_handle:
|
||||||
|
person = db.get_person_from_handle(self.orig_handle)
|
||||||
self.person = person
|
self.person = person
|
||||||
self.orig_surname = person.get_primary_name().get_group_name()
|
self.orig_surname = self.person.get_primary_name().get_group_name()
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.orig_handle = self.person.get_handle()
|
|
||||||
if self.parent.child_windows.has_key(self.orig_handle):
|
if self.parent.child_windows.has_key(self.orig_handle):
|
||||||
self.parent.child_windows[self.person.get_handle()].present(None)
|
self.parent.child_windows[self.orig_handle].present(None)
|
||||||
return
|
return
|
||||||
self.db = db
|
self.db = db
|
||||||
self.callback = callback
|
self.callback = callback
|
||||||
|
@ -247,11 +247,25 @@ class EditPlace:
|
|||||||
self.add_itself_to_menu()
|
self.add_itself_to_menu()
|
||||||
self.top_window.get_widget('ok').set_sensitive(not self.db.readonly)
|
self.top_window.get_widget('ok').set_sensitive(not self.db.readonly)
|
||||||
self.top.show()
|
self.top.show()
|
||||||
|
|
||||||
|
self.pdmap = {}
|
||||||
|
self.build_pdmap()
|
||||||
|
|
||||||
if self.ref_not_loaded:
|
if self.ref_not_loaded:
|
||||||
Utils.temp_label(self.refs_label,self.top)
|
Utils.temp_label(self.refs_label,self.top)
|
||||||
gobject.idle_add(self.display_references)
|
gobject.idle_add(self.display_references)
|
||||||
self.ref_not_loaded = 0
|
self.ref_not_loaded = 0
|
||||||
|
|
||||||
|
def build_pdmap(self):
|
||||||
|
self.pdmap.clear()
|
||||||
|
cursor = self.db.get_place_cursor()
|
||||||
|
data = cursor.next()
|
||||||
|
while data:
|
||||||
|
if data[1][2]:
|
||||||
|
self.pdmap[data[1][2]] = data[0]
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
def on_delete_event(self,obj,b):
|
def on_delete_event(self,obj,b):
|
||||||
self.glry.close()
|
self.glry.close()
|
||||||
self.close_child_windows()
|
self.close_child_windows()
|
||||||
@ -375,6 +389,15 @@ class EditPlace:
|
|||||||
format = self.preform.get_active()
|
format = self.preform.get_active()
|
||||||
mloc = self.place.get_main_location()
|
mloc = self.place.get_main_location()
|
||||||
|
|
||||||
|
title = self.title.get_text()
|
||||||
|
if self.pdmap.has_key(title) and self.pdmap[title] != self.place.handle:
|
||||||
|
import QuestionDialog
|
||||||
|
QuestionDialog.ErrorDialog(_("Place title is already in use"),
|
||||||
|
_("Each place must have a unique title, and "
|
||||||
|
"title you have selected is already used by "
|
||||||
|
"another place"))
|
||||||
|
return
|
||||||
|
|
||||||
self.set(self.city,mloc.get_city,mloc.set_city)
|
self.set(self.city,mloc.get_city,mloc.set_city)
|
||||||
self.set(self.parish,mloc.get_parish,mloc.set_parish)
|
self.set(self.parish,mloc.get_parish,mloc.set_parish)
|
||||||
self.set(self.state,mloc.get_state,mloc.set_state)
|
self.set(self.state,mloc.get_state,mloc.set_state)
|
||||||
|
@ -818,28 +818,45 @@ class FamilyView:
|
|||||||
|
|
||||||
family = self.family
|
family = self.family
|
||||||
|
|
||||||
|
# determine the child
|
||||||
model, node = self.child_selection.get_selected()
|
model, node = self.child_selection.get_selected()
|
||||||
if not node:
|
if not node:
|
||||||
return
|
return
|
||||||
|
|
||||||
handle = self.child_model.get_value(node,_HANDLE_COL)
|
handle = self.child_model.get_value(node,_HANDLE_COL)
|
||||||
child = self.parent.db.get_person_from_handle(handle)
|
child = self.parent.db.get_person_from_handle(handle)
|
||||||
|
|
||||||
trans = self.parent.db.transaction_begin()
|
# remove the child from the family and the family from the child
|
||||||
|
|
||||||
family.remove_child_handle(child.get_handle())
|
family.remove_child_handle(child.get_handle())
|
||||||
child.remove_parent_family_handle(family.get_handle())
|
child.remove_parent_family_handle(family.get_handle())
|
||||||
|
|
||||||
if len(family.get_child_handle_list()) == 0:
|
# begin transaction
|
||||||
if family.get_father_handle() == None:
|
trans = self.parent.db.transaction_begin()
|
||||||
self.delete_family_from(family.get_mother_handle(),trans)
|
|
||||||
elif family.get_mother_handle() == None:
|
|
||||||
self.delete_family_from(family.get_father_handle(),trans)
|
|
||||||
|
|
||||||
|
# if there are no children left, and the spouse is empty, delete the
|
||||||
|
# family
|
||||||
|
mother_handle = family.get_mother_handle()
|
||||||
|
father_handle = family.get_father_handle()
|
||||||
|
no_of_kids = len(family.get_child_handle_list())
|
||||||
|
|
||||||
|
self.parent.db.disable_all_signals()
|
||||||
|
|
||||||
|
if no_of_kids == 0 and (mother_handle == None or father_handle == None):
|
||||||
|
if family.get_father_handle() == None:
|
||||||
|
temp = self.parent.db.get_person_from_handle(family.get_mother_handle())
|
||||||
|
temp.get_family_handle_list().remove(family.get_handle())
|
||||||
|
elif family.get_mother_handle() == None:
|
||||||
|
temp = self.parent.db.get_person_from_handle(family.get_father_handle())
|
||||||
|
temp.get_family_handle_list().remove(family.get_handle())
|
||||||
|
self.parent.db.remove_family(family.get_handle(),trans)
|
||||||
|
else:
|
||||||
|
self.parent.db.commit_family(family,trans)
|
||||||
|
|
||||||
|
# commit the transaction
|
||||||
self.parent.db.commit_person(child,trans)
|
self.parent.db.commit_person(child,trans)
|
||||||
self.parent.db.commit_family(family,trans)
|
|
||||||
n = child.get_primary_name().get_regular_name()
|
n = child.get_primary_name().get_regular_name()
|
||||||
self.parent.db.transaction_commit(trans,_("Remove Child (%s)") % n)
|
self.parent.db.transaction_commit(trans,_("Remove Child (%s)") % n)
|
||||||
|
self.parent.db.enable_all_signals()
|
||||||
|
self.parent.db.emit('family-update',([family.get_handle()],))
|
||||||
|
|
||||||
def remove_spouse(self,obj):
|
def remove_spouse(self,obj):
|
||||||
if self.selected_spouse:
|
if self.selected_spouse:
|
||||||
@ -863,32 +880,27 @@ class FamilyView:
|
|||||||
cur_spouse = self.selected_spouse
|
cur_spouse = self.selected_spouse
|
||||||
cur_family = self.family
|
cur_family = self.family
|
||||||
|
|
||||||
|
# Remove spouse from the family
|
||||||
if cur_spouse.get_handle() == cur_family.get_father_handle():
|
if cur_spouse.get_handle() == cur_family.get_father_handle():
|
||||||
cur_family.set_father_handle(None)
|
cur_family.set_father_handle(None)
|
||||||
else:
|
else:
|
||||||
cur_family.set_mother_handle(None)
|
cur_family.set_mother_handle(None)
|
||||||
|
|
||||||
trans = self.parent.db.transaction_begin()
|
trans = self.parent.db.transaction_begin()
|
||||||
|
|
||||||
|
#If the spouse is defined, remove the family from the spouse
|
||||||
if cur_spouse:
|
if cur_spouse:
|
||||||
cur_spouse.remove_family_handle(cur_family.get_handle())
|
cur_spouse.remove_family_handle(cur_family.get_handle())
|
||||||
self.parent.db.commit_person(cur_spouse,trans)
|
self.parent.db.commit_person(cur_spouse,trans)
|
||||||
|
|
||||||
self.parent.db.commit_family(cur_family,trans)
|
# if there are no children, remove it from the current person
|
||||||
|
# and delete the family
|
||||||
if len(cur_family.get_child_handle_list()) == 0:
|
if len(cur_family.get_child_handle_list()) == 0:
|
||||||
mother_id = cur_family.get_mother_handle()
|
cur_person.remove_family_handle(cur_family.get_handle())
|
||||||
father_id = cur_family.get_father_handle()
|
self.parent.db.commit_person(cur_person,trans)
|
||||||
|
self.parent.db.remove_family(cur_family.get_handle(),trans)
|
||||||
for handle in [father_id, mother_id]:
|
else:
|
||||||
if handle:
|
self.parent.db.commit_family(cur_family,trans)
|
||||||
p = self.parent.db.get_person_from_handle(handle)
|
|
||||||
p.remove_family_handle(cur_family.get_handle())
|
|
||||||
self.parent.db.commit_person(p,trans)
|
|
||||||
|
|
||||||
# if len(cur_person.get_family_handle_list()) > 0:
|
|
||||||
# handle = cur_person.get_family_handle_list()[0]
|
|
||||||
# family = self.parent.db.find_family_from_handle(handle,trans)
|
|
||||||
|
|
||||||
person_id = cur_person.get_handle()
|
person_id = cur_person.get_handle()
|
||||||
self.person = self.parent.db.get_person_from_handle(person_id)
|
self.person = self.parent.db.get_person_from_handle(person_id)
|
||||||
@ -1142,16 +1154,6 @@ class FamilyView:
|
|||||||
else:
|
else:
|
||||||
return _("%s: unknown") % (l)
|
return _("%s: unknown") % (l)
|
||||||
|
|
||||||
def delete_family_from(self,person_handle,trans):
|
|
||||||
person = self.parent.db.get_person_from_handle(person_handle)
|
|
||||||
person.remove_family_handle(self.family.get_handle())
|
|
||||||
self.parent.db.remove_family(self.family.get_handle(),trans)
|
|
||||||
flist = self.person.get_family_handle_list()
|
|
||||||
if len(flist) > 0:
|
|
||||||
self.family = self.parent.db.get_family_from_handle(flist[0])
|
|
||||||
else:
|
|
||||||
self.family = None
|
|
||||||
|
|
||||||
def display_marriage(self,family):
|
def display_marriage(self,family):
|
||||||
if not family:
|
if not family:
|
||||||
self.family = None
|
self.family = None
|
||||||
@ -1160,6 +1162,7 @@ class FamilyView:
|
|||||||
return
|
return
|
||||||
|
|
||||||
hlist = family.get_child_handle_list()
|
hlist = family.get_child_handle_list()
|
||||||
|
|
||||||
self.child_model = DisplayModels.ChildModel(hlist,self.parent.db)
|
self.child_model = DisplayModels.ChildModel(hlist,self.parent.db)
|
||||||
self.child_list.set_model(self.child_model)
|
self.child_list.set_model(self.child_model)
|
||||||
self.family = self.parent.db.get_family_from_handle(family.get_handle())
|
self.family = self.parent.db.get_family_from_handle(family.get_handle())
|
||||||
@ -1572,10 +1575,10 @@ class FamilyView:
|
|||||||
pname = self.person.get_primary_name()
|
pname = self.person.get_primary_name()
|
||||||
return (pname.get_surname_prefix(),pname.get_surname())
|
return (pname.get_surname_prefix(),pname.get_surname())
|
||||||
elif self.family:
|
elif self.family:
|
||||||
fid = self.family.get_father_handle()
|
father_handle = self.family.get_father_handle()
|
||||||
f = self.parent.db.get_family_from_handle(fid)
|
if father_handle:
|
||||||
if f:
|
father = self.parent.db.get_person_from_handle(father_handle)
|
||||||
pname = f.get_primary_name()
|
pname = father.get_primary_name()
|
||||||
return (pname.get_surname_prefix(),pname.get_surname())
|
return (pname.get_surname_prefix(),pname.get_surname())
|
||||||
return ("","")
|
return ("","")
|
||||||
|
|
||||||
@ -1584,10 +1587,12 @@ class FamilyView:
|
|||||||
|
|
||||||
def latin_american(self,val):
|
def latin_american(self,val):
|
||||||
if self.family:
|
if self.family:
|
||||||
father = self.family.get_father_handle()
|
father_handle = self.family.get_father_handle()
|
||||||
mother = self.family.get_mother_handle()
|
mother_handle = self.family.get_mother_handle()
|
||||||
if not father or not mother:
|
if not father_handle or not mother_handle:
|
||||||
return ("","")
|
return ("","")
|
||||||
|
father = self.parent.db.get_person_from_handle(father_handle)
|
||||||
|
mother = self.parent.db.get_person_from_handle(mother_handle)
|
||||||
fsn = father.get_primary_name().get_surname()
|
fsn = father.get_primary_name().get_surname()
|
||||||
msn = mother.get_primary_name().get_surname()
|
msn = mother.get_primary_name().get_surname()
|
||||||
if not father or not mother:
|
if not father or not mother:
|
||||||
@ -1604,9 +1609,10 @@ class FamilyView:
|
|||||||
if self.person.get_gender() == RelLib.Person.MALE:
|
if self.person.get_gender() == RelLib.Person.MALE:
|
||||||
fname = self.person.get_primary_name().get_first_name()
|
fname = self.person.get_primary_name().get_first_name()
|
||||||
elif self.family:
|
elif self.family:
|
||||||
f = self.family.get_father_handle()
|
father_handle = self.family.get_father_handle()
|
||||||
if f:
|
if father_handle:
|
||||||
fname = f.get_primary_name().get_first_name()
|
father = self.parent.db.get_person_from_handle(father_handle)
|
||||||
|
fname = father.get_primary_name().get_first_name()
|
||||||
if fname:
|
if fname:
|
||||||
fname = fname.split()[0]
|
fname = fname.split()[0]
|
||||||
if val == 0:
|
if val == 0:
|
||||||
|
@ -37,6 +37,7 @@ from xml.sax import make_parser,handler,SAXParseException
|
|||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
import os
|
import os
|
||||||
|
import sets
|
||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -266,7 +267,7 @@ class HasIdOf(Rule):
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# HasIdOf
|
# IsDefaultPerson
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class IsDefaultPerson(Rule):
|
class IsDefaultPerson(Rule):
|
||||||
@ -276,11 +277,16 @@ class IsDefaultPerson(Rule):
|
|||||||
category = _('General filters')
|
category = _('General filters')
|
||||||
description = _("Matches the default person")
|
description = _("Matches the default person")
|
||||||
|
|
||||||
def apply(self,db,person):
|
def prepare(self,db):
|
||||||
def_person = db.get_default_person()
|
p = db.get_default_person()
|
||||||
if def_person:
|
if p:
|
||||||
return person.handle == def_person.handle
|
self.def_handle = p.get_handle()
|
||||||
return False
|
self.apply = self.apply_real
|
||||||
|
else:
|
||||||
|
self.apply = lambda db,p: False
|
||||||
|
|
||||||
|
def apply_real(self,db,person):
|
||||||
|
return person.handle == self.def_handle
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -294,10 +300,16 @@ class IsBookmarked(Rule):
|
|||||||
category = _('General filters')
|
category = _('General filters')
|
||||||
description = _("Matches the people on the bookmark list")
|
description = _("Matches the people on the bookmark list")
|
||||||
|
|
||||||
def apply(self,db,person):
|
def prepare(self,db):
|
||||||
if person.handle in db.get_bookmarks():
|
bookmarks = db.get_bookmarks()
|
||||||
return True
|
if len(bookmarks) == 0:
|
||||||
return False
|
self.apply = lambda db,p : False
|
||||||
|
else:
|
||||||
|
self.bookmarks = sets.Set(bookmarks)
|
||||||
|
self.apply = self.apply_real
|
||||||
|
|
||||||
|
def apply_real(self,db,person):
|
||||||
|
return person.handle in self.bookmarks
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -342,7 +354,7 @@ class HasUnknownGender(Rule):
|
|||||||
description = _('Matches all people with unknown gender')
|
description = _('Matches all people with unknown gender')
|
||||||
|
|
||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
return person.get_gender() == RelLib.Person.UNKNOWN
|
return person.gender == RelLib.Person.UNKNOWN
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -369,8 +381,8 @@ class IsDescendantOf(Rule):
|
|||||||
except IndexError:
|
except IndexError:
|
||||||
first = True
|
first = True
|
||||||
try:
|
try:
|
||||||
root_handle = db.get_person_from_gramps_id(self.list[0]).get_handle()
|
root_person = db.get_person_from_gramps_id(self.list[0])
|
||||||
self.init_list(root_handle,first)
|
self.init_list(root_person,first)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -380,18 +392,17 @@ class IsDescendantOf(Rule):
|
|||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
return self.map.has_key(person.handle)
|
return self.map.has_key(person.handle)
|
||||||
|
|
||||||
def init_list(self,handle,first):
|
def init_list(self,person,first):
|
||||||
if not handle:
|
if not person:
|
||||||
return
|
return
|
||||||
if not first:
|
if not first:
|
||||||
self.map[handle] = 1
|
self.map[person.handle] = 1
|
||||||
|
|
||||||
p = self.db.get_person_from_handle(handle)
|
for fam_id in person.get_family_handle_list():
|
||||||
for fam_id in p.get_family_handle_list():
|
|
||||||
fam = self.db.get_family_from_handle(fam_id)
|
fam = self.db.get_family_from_handle(fam_id)
|
||||||
if fam:
|
if fam:
|
||||||
for child_handle in fam.get_child_handle_list():
|
for child_handle in fam.get_child_handle_list():
|
||||||
self.init_list(child_handle,0)
|
self.init_list(self.db.get_person_from_handle(child_handle),0)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -408,8 +419,8 @@ class IsDescendantOfFilterMatch(IsDescendantOf):
|
|||||||
description = _("Matches people that are descendants of anybody matched by a filter")
|
description = _("Matches people that are descendants of anybody matched by a filter")
|
||||||
|
|
||||||
|
|
||||||
def __init__(self,list):
|
# def __init__(self,list):
|
||||||
IsDescendantOf.__init__(self,list)
|
# IsDescendantOf.__init__(self,list)
|
||||||
|
|
||||||
def prepare(self,db):
|
def prepare(self,db):
|
||||||
self.db = db
|
self.db = db
|
||||||
@ -425,8 +436,9 @@ class IsDescendantOfFilterMatch(IsDescendantOf):
|
|||||||
filt = MatchesFilter(self.list)
|
filt = MatchesFilter(self.list)
|
||||||
filt.prepare(db)
|
filt.prepare(db)
|
||||||
for person_handle in db.get_person_handles(sort_handles=False):
|
for person_handle in db.get_person_handles(sort_handles=False):
|
||||||
if filt.apply (db, person_handle):
|
person = db.get_person_from_handle( person_handle)
|
||||||
self.init_list (person_handle,first)
|
if filt.apply (db, person):
|
||||||
|
self.init_list (person,first)
|
||||||
filt.reset()
|
filt.reset()
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
@ -454,8 +466,8 @@ class IsLessThanNthGenerationDescendantOf(Rule):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.map = {}
|
self.map = {}
|
||||||
try:
|
try:
|
||||||
root_handle = db.get_person_from_gramps_id(self.list[0]).get_handle()
|
root_person = db.get_person_from_gramps_id(self.list[0])
|
||||||
self.init_list(root_handle,0)
|
self.init_list(root_person,0)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -465,19 +477,18 @@ class IsLessThanNthGenerationDescendantOf(Rule):
|
|||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
return self.map.has_key(person.handle)
|
return self.map.has_key(person.handle)
|
||||||
|
|
||||||
def init_list(self,handle,gen):
|
def init_list(self,person,gen):
|
||||||
if not handle:
|
if not person:
|
||||||
return
|
return
|
||||||
if gen:
|
if gen:
|
||||||
self.map[handle] = 1
|
self.map[person.handle] = 1
|
||||||
if gen >= int(self.list[1]):
|
if gen >= int(self.list[1]):
|
||||||
return
|
return
|
||||||
|
|
||||||
p = self.db.get_person_from_handle(handle)
|
for fam_id in person.get_family_handle_list():
|
||||||
for fam_id in p.get_family_handle_list():
|
|
||||||
fam = self.db.get_family_from_handle(fam_id)
|
fam = self.db.get_family_from_handle(fam_id)
|
||||||
for child_handle in fam.get_child_handle_list():
|
for child_handle in fam.get_child_handle_list():
|
||||||
self.init_list(child_handle,gen+1)
|
self.init_list(self.db.get_person_from_handle(child_handle),gen+1)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -499,8 +510,8 @@ class IsMoreThanNthGenerationDescendantOf(Rule):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.map = {}
|
self.map = {}
|
||||||
try:
|
try:
|
||||||
root_handle = db.get_person_from_gramps_id(self.list[0]).get_handle()
|
root_person = db.get_person_from_gramps_id(self.list[0])
|
||||||
self.init_list(root_handle,0)
|
self.init_list(root_person,0)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -510,17 +521,16 @@ class IsMoreThanNthGenerationDescendantOf(Rule):
|
|||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
return self.map.has_key(person.handle)
|
return self.map.has_key(person.handle)
|
||||||
|
|
||||||
def init_list(self,handle,gen):
|
def init_list(self,person,gen):
|
||||||
if not handle:
|
if not person:
|
||||||
return
|
return
|
||||||
if gen >= int(self.list[1]):
|
if gen >= int(self.list[1]):
|
||||||
self.map[handle] = 1
|
self.map[person.handle] = 1
|
||||||
|
|
||||||
p = self.db.get_person_from_handle(handle)
|
for fam_id in person.get_family_handle_list():
|
||||||
for fam_id in p.get_family_handle_list():
|
|
||||||
fam = self.db.get_family_from_handle(fam_id)
|
fam = self.db.get_family_from_handle(fam_id)
|
||||||
for child_handle in fam.get_child_handle_list():
|
for child_handle in fam.get_child_handle_list():
|
||||||
self.init_list(child_handle,gen+1)
|
self.init_list(self.db.get_person_from_handle(child_handle),gen+1)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -542,8 +552,9 @@ class IsChildOfFilterMatch(Rule):
|
|||||||
filt = MatchesFilter(self.list)
|
filt = MatchesFilter(self.list)
|
||||||
filt.prepare(db)
|
filt.prepare(db)
|
||||||
for person_handle in db.get_person_handles(sort_handles=False):
|
for person_handle in db.get_person_handles(sort_handles=False):
|
||||||
if filt.apply (db, person_handle):
|
person = db.get_person_from_handle( person_handle)
|
||||||
self.init_list (person_handle)
|
if filt.apply (db, person):
|
||||||
|
self.init_list (person)
|
||||||
filt.reset()
|
filt.reset()
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
@ -552,11 +563,10 @@ class IsChildOfFilterMatch(Rule):
|
|||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
return self.map.has_key(person.handle)
|
return self.map.has_key(person.handle)
|
||||||
|
|
||||||
def init_list(self,handle):
|
def init_list(self,person):
|
||||||
if not handle:
|
if not person:
|
||||||
return
|
return
|
||||||
p = self.db.get_person_from_handle(handle)
|
for fam_id in person.get_family_handle_list():
|
||||||
for fam_id in p.get_family_handle_list():
|
|
||||||
fam = self.db.get_family_from_handle(fam_id)
|
fam = self.db.get_family_from_handle(fam_id)
|
||||||
for child_handle in fam.get_child_handle_list():
|
for child_handle in fam.get_child_handle_list():
|
||||||
self.map[child_handle] = 1
|
self.map[child_handle] = 1
|
||||||
@ -580,8 +590,9 @@ class IsSiblingOfFilterMatch(Rule):
|
|||||||
filt = MatchesFilter(self.list)
|
filt = MatchesFilter(self.list)
|
||||||
filt.prepare(db)
|
filt.prepare(db)
|
||||||
for person_handle in db.get_person_handles(sort_handles=False):
|
for person_handle in db.get_person_handles(sort_handles=False):
|
||||||
if filt.apply (db, person_handle):
|
person = db.get_person_from_handle( person_handle)
|
||||||
self.init_list (person_handle)
|
if filt.apply (db, person):
|
||||||
|
self.init_list (person)
|
||||||
filt.reset()
|
filt.reset()
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
@ -590,11 +601,10 @@ class IsSiblingOfFilterMatch(Rule):
|
|||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
return self.map.has_key(person.handle)
|
return self.map.has_key(person.handle)
|
||||||
|
|
||||||
def init_list(self,handle):
|
def init_list(self,person):
|
||||||
if not handle:
|
if not person:
|
||||||
return
|
return
|
||||||
p = self.db.get_person_from_handle(handle)
|
fam_id = person.get_main_parents_family_handle()
|
||||||
fam_id = p.get_main_parents_family_handle()
|
|
||||||
fam = self.db.get_family_from_handle(fam_id)
|
fam = self.db.get_family_from_handle(fam_id)
|
||||||
if fam:
|
if fam:
|
||||||
for child_handle in fam.get_child_handle_list():
|
for child_handle in fam.get_child_handle_list():
|
||||||
@ -614,13 +624,13 @@ class IsDescendantFamilyOf(Rule):
|
|||||||
name = _('Descendant family members of <person>')
|
name = _('Descendant family members of <person>')
|
||||||
category = _('Descendant filters')
|
category = _('Descendant filters')
|
||||||
description = _("Matches people that are descendants or the spouse "
|
description = _("Matches people that are descendants or the spouse "
|
||||||
"of a descendant of a specified person")
|
"of a descendant of a specified person")
|
||||||
|
|
||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
self.map = {}
|
self.map = {}
|
||||||
self.orig_handle = person.handle
|
self.orig_handle = person.handle
|
||||||
self.db = db
|
self.db = db
|
||||||
return self.search(handle,1)
|
return self.search(person.handle,1)
|
||||||
|
|
||||||
def search(self,handle,val):
|
def search(self,handle,val):
|
||||||
try:
|
try:
|
||||||
@ -674,8 +684,8 @@ class IsAncestorOf(Rule):
|
|||||||
except IndexError:
|
except IndexError:
|
||||||
first = 1
|
first = 1
|
||||||
try:
|
try:
|
||||||
root_handle = db.get_person_from_gramps_id(self.list[0]).get_handle()
|
root_person = db.get_person_from_gramps_id(self.list[0])
|
||||||
self.init_ancestor_list(db,root_handle,first)
|
self.init_ancestor_list(db,root_person,first)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -685,23 +695,22 @@ class IsAncestorOf(Rule):
|
|||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
return self.map.has_key(person.handle)
|
return self.map.has_key(person.handle)
|
||||||
|
|
||||||
def init_ancestor_list(self,db,handle,first):
|
def init_ancestor_list(self,db,person,first):
|
||||||
if not handle:
|
if not person:
|
||||||
return
|
return
|
||||||
if not first:
|
if not first:
|
||||||
self.map[handle] = 1
|
self.map[person.handle] = 1
|
||||||
|
|
||||||
p = db.get_person_from_handle(handle)
|
fam_id = person.get_main_parents_family_handle()
|
||||||
fam_id = p.get_main_parents_family_handle()
|
|
||||||
fam = db.get_family_from_handle(fam_id)
|
fam = db.get_family_from_handle(fam_id)
|
||||||
if fam:
|
if fam:
|
||||||
f_id = fam.get_father_handle()
|
f_id = fam.get_father_handle()
|
||||||
m_id = fam.get_mother_handle()
|
m_id = fam.get_mother_handle()
|
||||||
|
|
||||||
if f_id:
|
if f_id:
|
||||||
self.init_ancestor_list(db,f_id,0)
|
self.init_ancestor_list(db,db.get_person_from_handle(f_id),0)
|
||||||
if m_id:
|
if m_id:
|
||||||
self.init_ancestor_list(db,m_id,0)
|
self.init_ancestor_list(db,db.get_person_from_handle(m_id),0)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -736,8 +745,9 @@ class IsAncestorOfFilterMatch(IsAncestorOf):
|
|||||||
filt = MatchesFilter(self.list)
|
filt = MatchesFilter(self.list)
|
||||||
filt.prepare(db)
|
filt.prepare(db)
|
||||||
for person_handle in db.get_person_handles(sort_handles=False):
|
for person_handle in db.get_person_handles(sort_handles=False):
|
||||||
if filt.apply (db, person_handle):
|
person = db.get_person_from_handle( person_handle)
|
||||||
self.init_ancestor_list (db,person_handle,first)
|
if filt.apply (db, person):
|
||||||
|
self.init_ancestor_list (db,person,first)
|
||||||
filt.reset()
|
filt.reset()
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
@ -868,8 +878,9 @@ class IsParentOfFilterMatch(Rule):
|
|||||||
filt = MatchesFilter(self.list)
|
filt = MatchesFilter(self.list)
|
||||||
filt.prepare(db)
|
filt.prepare(db)
|
||||||
for person_handle in db.get_person_handles(sort_handles=False):
|
for person_handle in db.get_person_handles(sort_handles=False):
|
||||||
if filt.apply (db, person_handle):
|
person = db.get_person_from_handle(person_handle)
|
||||||
self.init_list (person_handle)
|
if filt.apply (db, person):
|
||||||
|
self.init_list (person)
|
||||||
filt.reset()
|
filt.reset()
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
@ -878,9 +889,8 @@ class IsParentOfFilterMatch(Rule):
|
|||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
return self.map.has_key(person.handle)
|
return self.map.has_key(person.handle)
|
||||||
|
|
||||||
def init_list(self,handle):
|
def init_list(self,person):
|
||||||
p = self.db.get_person_from_handle(handle)
|
for fam_id,frel,mrel in person.get_parent_family_handle_list():
|
||||||
for fam_id,frel,mrel in p.get_parent_family_handle_list():
|
|
||||||
fam = self.db.get_family_from_handle(fam_id)
|
fam = self.db.get_family_from_handle(fam_id)
|
||||||
for parent_id in [fam.get_father_handle (), fam.get_mother_handle ()]:
|
for parent_id in [fam.get_father_handle (), fam.get_mother_handle ()]:
|
||||||
if parent_id:
|
if parent_id:
|
||||||
@ -946,6 +956,7 @@ class HasCommonAncestorWithFilterMatch(HasCommonAncestorWith):
|
|||||||
|
|
||||||
def __init__(self,list):
|
def __init__(self,list):
|
||||||
HasCommonAncestorWith.__init__(self,list)
|
HasCommonAncestorWith.__init__(self,list)
|
||||||
|
self.ancestor_cache = {}
|
||||||
|
|
||||||
def init_ancestor_cache(self,db):
|
def init_ancestor_cache(self,db):
|
||||||
filt = MatchesFilter(self.list)
|
filt = MatchesFilter(self.list)
|
||||||
@ -953,7 +964,7 @@ class HasCommonAncestorWithFilterMatch(HasCommonAncestorWith):
|
|||||||
def init(self,h): self.ancestor_cache[h] = 1
|
def init(self,h): self.ancestor_cache[h] = 1
|
||||||
for handle in db.get_person_handles(sort_handles=False):
|
for handle in db.get_person_handles(sort_handles=False):
|
||||||
if (not self.ancestor_cache.has_key (handle)
|
if (not self.ancestor_cache.has_key (handle)
|
||||||
and filt.apply (db, handle)):
|
and filt.apply (db, db.get_person_from_handle(handle))):
|
||||||
for_each_ancestor(db,[handle],init,self)
|
for_each_ancestor(db,[handle],init,self)
|
||||||
filt.reset()
|
filt.reset()
|
||||||
|
|
||||||
@ -1297,10 +1308,9 @@ class SearchName(Rule):
|
|||||||
description = _("Matches people with a specified (partial) name")
|
description = _("Matches people with a specified (partial) name")
|
||||||
category = _('General filters')
|
category = _('General filters')
|
||||||
|
|
||||||
def apply(self,db,handle):
|
def apply(self,db,person):
|
||||||
self.f = self.list[0]
|
self.f = self.list[0]
|
||||||
p = db.get_person_from_handle(handle)
|
n = NameDisplay.displayer.display(person)
|
||||||
n = NameDisplay.displayer.display(p)
|
|
||||||
return self.f and n.upper().find(self.f.upper()) != -1
|
return self.f and n.upper().find(self.f.upper()) != -1
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -1356,13 +1366,13 @@ class MatchesFilter(Rule):
|
|||||||
for rule in filt.flist:
|
for rule in filt.flist:
|
||||||
rule.reset()
|
rule.reset()
|
||||||
|
|
||||||
def apply(self,db,handle):
|
def apply(self,db,person):
|
||||||
for filt in SystemFilters.get_filters():
|
for filt in SystemFilters.get_filters():
|
||||||
if filt.get_name() == self.list[0]:
|
if filt.get_name() == self.list[0]:
|
||||||
return filt.check(handle)
|
return filt.check(person.handle)
|
||||||
for filt in CustomFilters.get_filters():
|
for filt in CustomFilters.get_filters():
|
||||||
if filt.get_name() == self.list[0]:
|
if filt.get_name() == self.list[0]:
|
||||||
return filt.check(db,handle)
|
return filt.check(db,person.handle)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -1386,9 +1396,9 @@ class IsSpouseOfFilterMatch(Rule):
|
|||||||
for spouse_id in [family.get_father_handle (), family.get_mother_handle ()]:
|
for spouse_id in [family.get_father_handle (), family.get_mother_handle ()]:
|
||||||
if not spouse_id:
|
if not spouse_id:
|
||||||
continue
|
continue
|
||||||
if spouse_id == handle:
|
if spouse_id == person.handle:
|
||||||
continue
|
continue
|
||||||
if filt.apply (db, spouse_id):
|
if filt.apply (db, db.get_person_from_handle( spouse_id)):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -1404,7 +1414,8 @@ class HaveAltFamilies(Rule):
|
|||||||
|
|
||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
for (fam,rel1,rel2) in person.get_parent_family_handle_list():
|
for (fam,rel1,rel2) in person.get_parent_family_handle_list():
|
||||||
if rel1 == RelLib.Person.CHILD_ADOPTED or rel2 == RelLib.Person.CHILD_ADOPTED:
|
if rel1 == RelLib.Person.CHILD_ADOPTED \
|
||||||
|
or rel2 == RelLib.Person.CHILD_ADOPTED:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -1816,6 +1827,36 @@ class HasSourceOf(Rule):
|
|||||||
return False
|
return False
|
||||||
return person.has_source_reference( self.source_handle)
|
return person.has_source_reference( self.source_handle)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
# "People having notes"
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class HasNote(Rule):
|
||||||
|
"""People having notes"""
|
||||||
|
|
||||||
|
name = _('People having notes')
|
||||||
|
description = _("Matches people that have a note")
|
||||||
|
category = _('General filters')
|
||||||
|
|
||||||
|
def apply(self,db,person):
|
||||||
|
return bool(person.get_note())
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
# "People having notes that contain a substring"
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class HasNoteMatchingSubstringOf(Rule):
|
||||||
|
"""People having notes containing <subtring>"""
|
||||||
|
|
||||||
|
labels = [ _('Substring:')]
|
||||||
|
name = _('People having notes containing <subtring>')
|
||||||
|
description = _("Matches people whose notes contain text matching a substring")
|
||||||
|
category = _('General filters')
|
||||||
|
|
||||||
|
def apply(self,db,person):
|
||||||
|
n = person.get_note()
|
||||||
|
if n:
|
||||||
|
return n.find(self.list[0]) != -1
|
||||||
|
return False
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# GenericFilter
|
# GenericFilter
|
||||||
@ -1892,6 +1933,7 @@ class GenericFilter:
|
|||||||
person.unserialize(data[1])
|
person.unserialize(data[1])
|
||||||
if self.invert ^ task(db,person):
|
if self.invert ^ task(db,person):
|
||||||
final_list.append(data[0])
|
final_list.append(data[0])
|
||||||
|
data = cursor.next()
|
||||||
else:
|
else:
|
||||||
for handle in id_list:
|
for handle in id_list:
|
||||||
person = db.get_person_from_handle(handle)
|
person = db.get_person_from_handle(handle)
|
||||||
@ -1903,7 +1945,33 @@ class GenericFilter:
|
|||||||
return self.check_func(db,id_list,self.or_test)
|
return self.check_func(db,id_list,self.or_test)
|
||||||
|
|
||||||
def check_and(self,db,id_list):
|
def check_and(self,db,id_list):
|
||||||
return self.check_func(db,id_list,self.and_test)
|
final_list = []
|
||||||
|
flist = self.flist
|
||||||
|
invert = self.invert
|
||||||
|
if id_list == None:
|
||||||
|
cursor = db.get_person_cursor()
|
||||||
|
data = cursor.next()
|
||||||
|
p = RelLib.Person
|
||||||
|
while data:
|
||||||
|
person = p(data[1])
|
||||||
|
val = True
|
||||||
|
for rule in flist:
|
||||||
|
if not rule.apply(db,person):
|
||||||
|
val = False
|
||||||
|
break
|
||||||
|
if invert ^ val:
|
||||||
|
final_list.append(data[0])
|
||||||
|
data = cursor.next()
|
||||||
|
else:
|
||||||
|
for handle in id_list:
|
||||||
|
person = db.get_person_from_handle(handle)
|
||||||
|
val = True
|
||||||
|
for rule in flist:
|
||||||
|
if not rule.apply(db,person):
|
||||||
|
val = False
|
||||||
|
if invert ^ val:
|
||||||
|
final_list.append(handle)
|
||||||
|
return final_list
|
||||||
|
|
||||||
def check_one(self,db,id_list):
|
def check_one(self,db,id_list):
|
||||||
return self.check_func(db,id_list,self.one_test)
|
return self.check_func(db,id_list,self.one_test)
|
||||||
@ -1917,12 +1985,6 @@ class GenericFilter:
|
|||||||
test = test ^ rule.apply(db,handle)
|
test = test ^ rule.apply(db,handle)
|
||||||
return test
|
return test
|
||||||
|
|
||||||
def and_test(self,db,person):
|
|
||||||
for rule in self.flist:
|
|
||||||
if not rule.apply(db,person):
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def one_test(self,db,person):
|
def one_test(self,db,person):
|
||||||
count = 0
|
count = 0
|
||||||
for rule in self.flist:
|
for rule in self.flist:
|
||||||
@ -1932,7 +1994,7 @@ class GenericFilter:
|
|||||||
count += 1
|
count += 1
|
||||||
return count != 1
|
return count != 1
|
||||||
|
|
||||||
def and_or(self,db,person):
|
def or_test(self,db,person):
|
||||||
for rule in self.flist:
|
for rule in self.flist:
|
||||||
if rule.apply(db,person):
|
if rule.apply(db,person):
|
||||||
return True
|
return True
|
||||||
@ -1946,7 +2008,7 @@ class GenericFilter:
|
|||||||
return m
|
return m
|
||||||
|
|
||||||
def check(self,db,handle):
|
def check(self,db,handle):
|
||||||
return self.get_check_func()(db,handle)
|
return self.get_check_func()(db,[handle])
|
||||||
|
|
||||||
def apply(self,db,id_list=None):
|
def apply(self,db,id_list=None):
|
||||||
m = self.get_check_func()
|
m = self.get_check_func()
|
||||||
@ -1957,7 +2019,6 @@ class GenericFilter:
|
|||||||
rule.reset()
|
rule.reset()
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Name to class mappings
|
# Name to class mappings
|
||||||
@ -2068,6 +2129,8 @@ editor_rule_list = [
|
|||||||
IsSiblingOfFilterMatch,
|
IsSiblingOfFilterMatch,
|
||||||
RelationshipPathBetween,
|
RelationshipPathBetween,
|
||||||
HasTextMatchingSubstringOf,
|
HasTextMatchingSubstringOf,
|
||||||
|
HasNote,
|
||||||
|
HasNoteMatchingSubstringOf
|
||||||
]
|
]
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -2222,7 +2285,7 @@ class ParamFilter(GenericFilter):
|
|||||||
def set_parameter(self,param):
|
def set_parameter(self,param):
|
||||||
self.param_list = [param]
|
self.param_list = [param]
|
||||||
|
|
||||||
def apply(self,db,id_list):
|
def apply(self,db,id_list=None):
|
||||||
for rule in self.flist:
|
for rule in self.flist:
|
||||||
rule.set_list(self.param_list)
|
rule.set_list(self.param_list)
|
||||||
for rule in self.flist:
|
for rule in self.flist:
|
||||||
@ -2278,14 +2341,14 @@ class GrampsFilterComboBox(gtk.ComboBox):
|
|||||||
cnt += 1
|
cnt += 1
|
||||||
|
|
||||||
for filt in SystemFilters.get_filters():
|
for filt in SystemFilters.get_filters():
|
||||||
self.store.append(row=[_(filt.get_name())])
|
self.store.append(row=[filt.get_name()])
|
||||||
self.map[filt.get_name()] = filt
|
self.map[filt.get_name()] = filt
|
||||||
if default != "" and default == filt.get_name():
|
if default != "" and default == filt.get_name():
|
||||||
active = cnt
|
active = cnt
|
||||||
cnt += 1
|
cnt += 1
|
||||||
|
|
||||||
for filt in CustomFilters.get_filters():
|
for filt in CustomFilters.get_filters():
|
||||||
self.store.append(row=[_(filt.get_name())])
|
self.store.append(row=[filt.get_name()])
|
||||||
self.map[filt.get_name()] = filt
|
self.map[filt.get_name()] = filt
|
||||||
if default != "" and default == filt.get_name():
|
if default != "" and default == filt.get_name():
|
||||||
active = cnt
|
active = cnt
|
||||||
@ -2306,7 +2369,7 @@ class GrampsFilterComboBox(gtk.ComboBox):
|
|||||||
active = self.get_active()
|
active = self.get_active()
|
||||||
if active < 0:
|
if active < 0:
|
||||||
return None
|
return None
|
||||||
key = self.store[active][0]
|
key = unicode(self.store[active][0])
|
||||||
return self.map[key]
|
return self.map[key]
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ from bsddb import dbshelve, db
|
|||||||
from RelLib import *
|
from RelLib import *
|
||||||
from GrampsDbBase import *
|
from GrampsDbBase import *
|
||||||
|
|
||||||
_DBVERSION = 7
|
_DBVERSION = 8
|
||||||
|
|
||||||
def find_surname(key,data):
|
def find_surname(key,data):
|
||||||
return str(data[3].get_surname())
|
return str(data[3].get_surname())
|
||||||
@ -516,12 +516,14 @@ class GrampsBSDDB(GrampsDbBase):
|
|||||||
self.upgrade_5()
|
self.upgrade_5()
|
||||||
if version < 6:
|
if version < 6:
|
||||||
self.upgrade_6()
|
self.upgrade_6()
|
||||||
self.metadata['version'] = _DBVERSION
|
|
||||||
if version < 7:
|
if version < 7:
|
||||||
|
self.upgrade_7()
|
||||||
|
if version < 8:
|
||||||
#self.upgrade_7()
|
#self.upgrade_7()
|
||||||
raise Exception("Currently there is no database upgrade available")
|
raise Exception("Currently there is no database upgrade available")
|
||||||
else:
|
else:
|
||||||
print 'Successfully finished all upgrades'
|
print 'Successfully finished all upgrades'
|
||||||
|
self.metadata['version'] = _DBVERSION
|
||||||
|
|
||||||
def upgrade_2(self,child_rel_notrans):
|
def upgrade_2(self,child_rel_notrans):
|
||||||
print "Upgrading to DB version 2"
|
print "Upgrading to DB version 2"
|
||||||
@ -851,6 +853,19 @@ class GrampsBSDDB(GrampsDbBase):
|
|||||||
|
|
||||||
def upgrade_7(self):
|
def upgrade_7(self):
|
||||||
print "Upgrading to DB version 7"
|
print "Upgrading to DB version 7"
|
||||||
|
|
||||||
|
self.genderStats = GenderStats()
|
||||||
|
cursor = self.get_person_cursor()
|
||||||
|
data = cursor.first()
|
||||||
|
while data:
|
||||||
|
handle,val = data
|
||||||
|
p = Person(val)
|
||||||
|
self.genderStats.count_person(p,self)
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
|
def upgrade_8(self):
|
||||||
|
print "Upgrading to DB version 8"
|
||||||
# First, make sure the stored default person handle is str, not unicode
|
# First, make sure the stored default person handle is str, not unicode
|
||||||
try:
|
try:
|
||||||
handle = self.metadata['default']
|
handle = self.metadata['default']
|
||||||
|
@ -311,7 +311,17 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
|
|||||||
update_list.append((handle,obj.serialize()))
|
update_list.append((handle,obj.serialize()))
|
||||||
else:
|
else:
|
||||||
add_list.append((handle,obj.serialize()))
|
add_list.append((handle,obj.serialize()))
|
||||||
|
|
||||||
|
# committing person, do gender stats here
|
||||||
|
if old_data and key == PERSON_KEY:
|
||||||
|
old_person = Person(old_data)
|
||||||
|
if (old_data[2] != person.gender or
|
||||||
|
old_data[3].first_name != obj.primary_name.first_name):
|
||||||
|
self.genderStats.uncount_person(old_person)
|
||||||
|
self.genderStats.count_person(obj,self)
|
||||||
|
else:
|
||||||
|
self.genderStats.count_person(obj,self)
|
||||||
|
|
||||||
def commit_person(self,person,transaction,change_time=None):
|
def commit_person(self,person,transaction,change_time=None):
|
||||||
"""
|
"""
|
||||||
Commits the specified Person to the database, storing the changes
|
Commits the specified Person to the database, storing the changes
|
||||||
@ -632,27 +642,25 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
|
|||||||
"""
|
"""
|
||||||
assert False, "Needs to be overridden in the derived class"
|
assert False, "Needs to be overridden in the derived class"
|
||||||
|
|
||||||
def add_person(self,person,transaction):
|
|
||||||
"""
|
|
||||||
Adds a Person to the database, assigning internal IDs if they have
|
|
||||||
not already been defined.
|
|
||||||
"""
|
|
||||||
if not person.gramps_id:
|
|
||||||
person.gramps_id = self.find_next_person_gramps_id()
|
|
||||||
if not person.handle:
|
|
||||||
person.handle = self.create_id()
|
|
||||||
self.commit_person(person,transaction)
|
|
||||||
self.genderStats.count_person (person, self)
|
|
||||||
return person.handle
|
|
||||||
|
|
||||||
def _add_object(self,obj,transaction,find_next_func,commit_func):
|
def _add_object(self,obj,transaction,find_next_func,commit_func):
|
||||||
if not obj.gramps_id:
|
if not obj.gramps_id:
|
||||||
obj.gramps_id = find_next_func()
|
obj.gramps_id = find_next_func()
|
||||||
if not obj.handle:
|
if not obj.handle:
|
||||||
obj.handle = self.create_id()
|
obj.handle = self.create_id()
|
||||||
commit_func(obj,transaction)
|
commit_func(obj,transaction)
|
||||||
|
if obj.__class__.__name__ == 'Person':
|
||||||
|
self.genderStats.count_person (person, self)
|
||||||
return obj.handle
|
return obj.handle
|
||||||
|
|
||||||
|
def add_person(self,person,transaction):
|
||||||
|
"""
|
||||||
|
Adds a Person to the database, assigning internal IDs if they have
|
||||||
|
not already been defined.
|
||||||
|
"""
|
||||||
|
return self._add_object(person,transaction,
|
||||||
|
self.find_next_person_gramps_id,
|
||||||
|
self.commit_person)
|
||||||
|
|
||||||
def add_family(self,family,transaction):
|
def add_family(self,family,transaction):
|
||||||
"""
|
"""
|
||||||
Adds a Family to the database, assigning internal IDs if they have
|
Adds a Family to the database, assigning internal IDs if they have
|
||||||
|
@ -1170,6 +1170,8 @@ class GlobalMediaProperties:
|
|||||||
text = unicode(t.get_text(t.get_start_iter(),t.get_end_iter(),False))
|
text = unicode(t.get_text(t.get_start_iter(),t.get_end_iter(),False))
|
||||||
desc = unicode(self.descr_window.get_text())
|
desc = unicode(self.descr_window.get_text())
|
||||||
note = self.obj.get_note()
|
note = self.obj.get_note()
|
||||||
|
path = self.change_dialog.get_widget('path').get_text()
|
||||||
|
self.obj.set_path(path)
|
||||||
|
|
||||||
if not self.date_object.is_equal(self.obj.get_date_object()):
|
if not self.date_object.is_equal(self.obj.get_date_object()):
|
||||||
self.obj.set_date_object(self.date_object)
|
self.obj.set_date_object(self.date_object)
|
||||||
|
@ -80,10 +80,16 @@ class Marriage:
|
|||||||
|
|
||||||
def __init__(self,parent,family,db):
|
def __init__(self,parent,family,db):
|
||||||
"""Initializes the Marriage class, and displays the window"""
|
"""Initializes the Marriage class, and displays the window"""
|
||||||
|
family_handle = family.get_handle()
|
||||||
|
# UGLY HACK to refresh faimly object from handle if that exists
|
||||||
|
# done to ensure that the family object is not stale, as it could
|
||||||
|
# have been changed by something external (merge, tool, etc).
|
||||||
|
if family_handle:
|
||||||
|
family = db.get_family_from_handle(family_handle)
|
||||||
self.family = family
|
self.family = family
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
if self.parent.child_windows.has_key(family.get_handle()):
|
if self.parent.child_windows.has_key(family_handle):
|
||||||
self.parent.child_windows[family.get_handle()].present(None)
|
self.parent.child_windows[family_handle].present(None)
|
||||||
return
|
return
|
||||||
self.child_windows = {}
|
self.child_windows = {}
|
||||||
self.db = db
|
self.db = db
|
||||||
|
@ -361,7 +361,6 @@ class PedigreeView:
|
|||||||
return True
|
return True
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def on_show_child_menu(self,obj):
|
def on_show_child_menu(self,obj):
|
||||||
"""User clicked button to move to child of active person"""
|
"""User clicked button to move to child of active person"""
|
||||||
|
|
||||||
|
@ -105,11 +105,12 @@ class PeopleModel(gtk.GenericTreeModel):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if data_filter:
|
if data_filter:
|
||||||
handle_list = self.db.get_person_handles(sort_handles=False)
|
keys = data_filter.apply(self.db)
|
||||||
keys = data_filter.apply(self.db,handle_list)
|
|
||||||
if self.invert_result:
|
if self.invert_result:
|
||||||
|
handle_list = self.db.get_person_handles(sort_handles=False)
|
||||||
|
#TODO: Could be optimized by using a cursor
|
||||||
keys = [k for k in handle_list if k not in keys]
|
keys = [k for k in handle_list if k not in keys]
|
||||||
del handle_list
|
del handle_list
|
||||||
else:
|
else:
|
||||||
keys = self.db.get_person_handles(sort_handles=False)
|
keys = self.db.get_person_handles(sort_handles=False)
|
||||||
|
|
||||||
|
@ -211,7 +211,12 @@ class PeopleView:
|
|||||||
"""Remove the selected person from the list. A person object is
|
"""Remove the selected person from the list. A person object is
|
||||||
expected, not an ID"""
|
expected, not an ID"""
|
||||||
path = self.person_model.on_get_path(person.get_handle())
|
path = self.person_model.on_get_path(person.get_handle())
|
||||||
self.person_model.row_deleted(path)
|
#self.person_model.row_deleted(path)
|
||||||
|
(col,row) = path
|
||||||
|
if row > 0:
|
||||||
|
self.person_selection.select_path((col,row-1))
|
||||||
|
elif row == 0 and self.person_model.on_get_iter(path):
|
||||||
|
self.person_selection.select_path(path)
|
||||||
|
|
||||||
def remove_from_history(self,person_handle,old_id=None):
|
def remove_from_history(self,person_handle,old_id=None):
|
||||||
"""Removes a person from the history list"""
|
"""Removes a person from the history list"""
|
||||||
@ -289,7 +294,7 @@ class PeopleView:
|
|||||||
entries = [
|
entries = [
|
||||||
(gtk.STOCK_GO_BACK,self.parent.back_clicked,back_sensitivity),
|
(gtk.STOCK_GO_BACK,self.parent.back_clicked,back_sensitivity),
|
||||||
(gtk.STOCK_GO_FORWARD,self.parent.fwd_clicked,fwd_sensitivity),
|
(gtk.STOCK_GO_FORWARD,self.parent.fwd_clicked,fwd_sensitivity),
|
||||||
(gtk.STOCK_HOME,self.parent.on_home_clicked,1),
|
(_("Home"),self.parent.on_home_clicked,1),
|
||||||
(_("Add Bookmark"),self.parent.on_add_bookmark_activate,sel_sensitivity),
|
(_("Add Bookmark"),self.parent.on_add_bookmark_activate,sel_sensitivity),
|
||||||
(None,None,0),
|
(None,None,0),
|
||||||
(gtk.STOCK_ADD, self.parent.add_button_clicked,1),
|
(gtk.STOCK_ADD, self.parent.add_button_clicked,1),
|
||||||
|
@ -98,18 +98,19 @@ class PlaceView:
|
|||||||
order = gtk.SORT_DESCENDING
|
order = gtk.SORT_DESCENDING
|
||||||
self.sort_col = data
|
self.sort_col = data
|
||||||
handle = self.first_selected()
|
handle = self.first_selected()
|
||||||
|
colmap = self.parent.db.get_place_column_order()
|
||||||
|
|
||||||
self.model = DisplayModels.PlaceModel(self.parent.db,
|
self.model = DisplayModels.PlaceModel(self.parent.db,
|
||||||
self.sort_col,order)
|
self.scol_map[self.sort_col],order)
|
||||||
self.list.set_model(self.model)
|
self.list.set_model(self.model)
|
||||||
|
|
||||||
colmap = self.parent.db.get_place_column_order()
|
|
||||||
|
|
||||||
if handle:
|
if handle:
|
||||||
path = self.model.on_get_path(handle)
|
path = self.model.on_get_path(handle)
|
||||||
self.selection.select_path(path)
|
self.selection.select_path(path)
|
||||||
self.list.scroll_to_cell(path,None,1,0.5,0)
|
self.list.scroll_to_cell(path,None,1,0.5,0)
|
||||||
for i in range(0,len(self.columns)):
|
for i in range(0,len(self.columns)):
|
||||||
self.columns[i].set_sort_indicator(i==colmap[data][1]-1)
|
self.columns[i].set_sort_indicator(i==self.sort_col)
|
||||||
self.columns[self.sort_col].set_sort_order(order)
|
self.columns[self.sort_col].set_sort_order(order)
|
||||||
|
|
||||||
def build_columns(self):
|
def build_columns(self):
|
||||||
@ -122,12 +123,14 @@ class PlaceView:
|
|||||||
column.connect('clicked',self.column_clicked,0)
|
column.connect('clicked',self.column_clicked,0)
|
||||||
column.set_clickable(True)
|
column.set_clickable(True)
|
||||||
self.list.append_column(column)
|
self.list.append_column(column)
|
||||||
|
self.scol_map = [0]
|
||||||
self.columns = [column]
|
self.columns = [column]
|
||||||
|
|
||||||
index = 1
|
index = 1
|
||||||
for pair in self.parent.db.get_place_column_order():
|
for pair in self.parent.db.get_place_column_order():
|
||||||
if not pair[0]:
|
if not pair[0]:
|
||||||
continue
|
continue
|
||||||
|
self.scol_map.append(pair[1])
|
||||||
name = column_names[pair[1]]
|
name = column_names[pair[1]]
|
||||||
column = gtk.TreeViewColumn(name, self.renderer, text=pair[1])
|
column = gtk.TreeViewColumn(name, self.renderer, text=pair[1])
|
||||||
column.set_resizable(True)
|
column.set_resizable(True)
|
||||||
|
@ -32,6 +32,7 @@ import re
|
|||||||
import string
|
import string
|
||||||
import const
|
import const
|
||||||
import time
|
import time
|
||||||
|
import sets
|
||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -279,6 +280,15 @@ class GedcomParser:
|
|||||||
self.lid2id = {}
|
self.lid2id = {}
|
||||||
self.fid2id = {}
|
self.fid2id = {}
|
||||||
|
|
||||||
|
self.place_names = sets.Set()
|
||||||
|
cursor = dbase.get_place_cursor()
|
||||||
|
data = cursor.next()
|
||||||
|
while data:
|
||||||
|
(handle,val) = data
|
||||||
|
self.place_names.add(val[2])
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
self.f = open(filename,"rU")
|
self.f = open(filename,"rU")
|
||||||
self.filename = filename
|
self.filename = filename
|
||||||
self.index = 0
|
self.index = 0
|
||||||
@ -742,18 +752,37 @@ class GedcomParser:
|
|||||||
self.sid2id[gramps_id] = intid
|
self.sid2id[gramps_id] = intid
|
||||||
return source
|
return source
|
||||||
|
|
||||||
def find_or_create_place(self,gramps_id):
|
def find_or_create_place(self,title):
|
||||||
place = RelLib.Place()
|
place = RelLib.Place()
|
||||||
intid = self.lid2id.get(gramps_id)
|
|
||||||
|
# check to see if we've encountered this name before
|
||||||
|
# if we haven't we need to get a new GRAMPS ID
|
||||||
|
intid = self.lid2id.get(title)
|
||||||
|
if intid == None:
|
||||||
|
new_id = self.db.find_next_place_gramps_id()
|
||||||
|
else:
|
||||||
|
new_id = None
|
||||||
|
|
||||||
|
# check to see if the name already existed in the database
|
||||||
|
# if it does, create a new name by appending the GRAMPS ID.
|
||||||
|
# generate a GRAMPS ID if needed
|
||||||
|
|
||||||
|
if title in self.place_names:
|
||||||
|
if not new_id:
|
||||||
|
new_id = self.db.find_next_place_gramps_id()
|
||||||
|
pname = "%s [%s]" % (title,new_id)
|
||||||
|
else:
|
||||||
|
pname = title
|
||||||
|
|
||||||
if self.db.place_map.has_key(intid):
|
if self.db.place_map.has_key(intid):
|
||||||
place.unserialize(self.db.place_map.get(intid))
|
place.unserialize(self.db.place_map.get(intid))
|
||||||
else:
|
else:
|
||||||
intid = create_id()
|
intid = create_id()
|
||||||
place.set_handle(intid)
|
place.set_handle(intid)
|
||||||
place.set_title(gramps_id)
|
place.set_title(pname)
|
||||||
place.set_gramps_id(self.db.find_next_place_gramps_id())
|
place.set_gramps_id(new_id)
|
||||||
self.db.add_place(place,self.trans)
|
self.db.add_place(place,self.trans)
|
||||||
self.lid2id[gramps_id] = intid
|
self.lid2id[title] = intid
|
||||||
return place
|
return place
|
||||||
|
|
||||||
def parse_cause(self,event,level):
|
def parse_cause(self,event,level):
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
import os
|
import os
|
||||||
|
import sets
|
||||||
import gtk
|
import gtk
|
||||||
import shutil
|
import shutil
|
||||||
from xml.parsers.expat import ExpatError, ParserCreate
|
from xml.parsers.expat import ExpatError, ParserCreate
|
||||||
@ -184,87 +185,6 @@ def importData(database, filename, callback=None,cl=0,use_trans=True):
|
|||||||
database.commit_media_object(mobject,None,change)
|
database.commit_media_object(mobject,None,change)
|
||||||
except (IOError,OSError),msg:
|
except (IOError,OSError),msg:
|
||||||
ErrorDialog(_('Could not copy file'),str(msg))
|
ErrorDialog(_('Could not copy file'),str(msg))
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
# def remove_clicked():
|
|
||||||
# # File is lost => remove all references and the object itself
|
|
||||||
# mobj = database.find_object_from_handle(NewMediaID)
|
|
||||||
# for fid in database.get_family_handles():
|
|
||||||
# p = database.get_family_from_handle(fid)
|
|
||||||
# nl = p.get_media_list()
|
|
||||||
# for o in nl:
|
|
||||||
# if o.get_reference() == mobj:
|
|
||||||
# nl.remove(o)
|
|
||||||
# p.set_media_list(nl)
|
|
||||||
# for key in database.get_person_handles(sort_handles=False):
|
|
||||||
# p = database.find_person_from_handle(key)
|
|
||||||
# nl = p.get_media_list()
|
|
||||||
# for o in nl:
|
|
||||||
# if o.get_reference_handle() == mobj.get_handle():
|
|
||||||
# nl.remove(o)
|
|
||||||
# p.set_media_list(nl)
|
|
||||||
# for key in database.get_source_handles():
|
|
||||||
# p = database.find_source_from_handle(key)
|
|
||||||
# nl = p.get_media_list()
|
|
||||||
# for o in nl:
|
|
||||||
# if o.get_reference_handle() == mobj.get_handle():
|
|
||||||
# nl.remove(o)
|
|
||||||
# p.set_media_list(nl)
|
|
||||||
# for key in database.get_place_handles():
|
|
||||||
# p = database.find_place_from_handle(key)
|
|
||||||
# nl = p.get_media_list()
|
|
||||||
# for o in nl:
|
|
||||||
# if o.get_reference() == mobj:
|
|
||||||
# nl.remove(o)
|
|
||||||
# p.set_media_list(nl)
|
|
||||||
# database.remove_object(NewMediaID)
|
|
||||||
|
|
||||||
|
|
||||||
# def leave_clicked():
|
|
||||||
# # File is lost => do nothing, leave as is
|
|
||||||
# pass
|
|
||||||
|
|
||||||
# def select_clicked():
|
|
||||||
# # File is lost => select a file to replace the lost one
|
|
||||||
# def fs_close_window(obj):
|
|
||||||
# pass
|
|
||||||
|
|
||||||
# def fs_ok_clicked(obj):
|
|
||||||
# name = fs_top.get_filename()
|
|
||||||
# if os.path.isfile(name):
|
|
||||||
# shutil.copyfile(name,newfile)
|
|
||||||
# try:
|
|
||||||
# shutil.copystat(name,newfile)
|
|
||||||
# except:
|
|
||||||
# pass
|
|
||||||
|
|
||||||
# choose = gtk.FileChooserDialog('Select file',
|
|
||||||
# None,
|
|
||||||
# gtk.FILE_CHOOSER_ACTION_OPEN,
|
|
||||||
# (gtk.STOCK_CANCEL,
|
|
||||||
# gtk.RESPONSE_CANCEL,
|
|
||||||
# gtk.STOCK_OPEN,
|
|
||||||
# gtk.RESPONSE_OK))
|
|
||||||
|
|
||||||
# filter = gtk.FileFilter()
|
|
||||||
# filter.set_name(_('All files'))
|
|
||||||
# filter.add_pattern('*')
|
|
||||||
# choose.add_filter(filter)
|
|
||||||
|
|
||||||
# response = choose.run()
|
|
||||||
# if response == gtk.RESPONSE_OK:
|
|
||||||
# name = fs_top.get_filename()
|
|
||||||
# if os.path.isfile(name):
|
|
||||||
# shutil.copyfile(name,newfile)
|
|
||||||
# try:
|
|
||||||
# shutil.copystat(name,newfile)
|
|
||||||
# except:
|
|
||||||
# pass
|
|
||||||
# choose.destroy()
|
|
||||||
|
|
||||||
# del parser
|
|
||||||
# return 1
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -299,7 +219,6 @@ class GrampsParser:
|
|||||||
self.gid2sid = {}
|
self.gid2sid = {}
|
||||||
self.change = change
|
self.change = change
|
||||||
self.dp = DateHandler.parser
|
self.dp = DateHandler.parser
|
||||||
|
|
||||||
self.child_relmap = {
|
self.child_relmap = {
|
||||||
"None" : RelLib.Person.CHILD_NONE,
|
"None" : RelLib.Person.CHILD_NONE,
|
||||||
"Birth" : RelLib.Person.CHILD_BIRTH,
|
"Birth" : RelLib.Person.CHILD_BIRTH,
|
||||||
@ -309,6 +228,14 @@ class GrampsParser:
|
|||||||
"Foster" : RelLib.Person.CHILD_FOSTER,
|
"Foster" : RelLib.Person.CHILD_FOSTER,
|
||||||
"Unknown" : RelLib.Person.CHILD_UNKNOWN,
|
"Unknown" : RelLib.Person.CHILD_UNKNOWN,
|
||||||
}
|
}
|
||||||
|
self.place_names = sets.Set()
|
||||||
|
cursor = database.get_place_cursor()
|
||||||
|
data = cursor.next()
|
||||||
|
while data:
|
||||||
|
(handle,val) = data
|
||||||
|
self.place_names.add(val[2])
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
self.ord = None
|
self.ord = None
|
||||||
self.objref = None
|
self.objref = None
|
||||||
@ -686,6 +613,7 @@ class GrampsParser:
|
|||||||
title = attrs['title']
|
title = attrs['title']
|
||||||
if title == "":
|
if title == "":
|
||||||
title = attrs['id']
|
title = attrs['id']
|
||||||
|
|
||||||
self.placeobj.set_title(title)
|
self.placeobj.set_title(title)
|
||||||
self.locations = 0
|
self.locations = 0
|
||||||
if self.callback != None and self.count % self.increment == 0:
|
if self.callback != None and self.count % self.increment == 0:
|
||||||
@ -1242,6 +1170,11 @@ class GrampsParser:
|
|||||||
if self.placeobj.get_title() == "":
|
if self.placeobj.get_title() == "":
|
||||||
loc = self.placeobj.get_main_location()
|
loc = self.placeobj.get_main_location()
|
||||||
self.placeobj.set_title(build_place_title(loc))
|
self.placeobj.set_title(build_place_title(loc))
|
||||||
|
|
||||||
|
title = self.placeobj.get_title()
|
||||||
|
if title in self.place_names:
|
||||||
|
self.placeobj.set_title(title + " [%s]" % self.placeobj.get_gramps_id())
|
||||||
|
|
||||||
self.db.commit_place(self.placeobj,self.trans,self.change)
|
self.db.commit_place(self.placeobj,self.trans,self.change)
|
||||||
self.placeobj = None
|
self.placeobj = None
|
||||||
|
|
||||||
|
@ -524,7 +524,7 @@ class SourceNote(BaseObject,NoteBase):
|
|||||||
for ix_replace in xrange(n_replace):
|
for ix_replace in xrange(n_replace):
|
||||||
ix = refs_list.index(old_handle)
|
ix = refs_list.index(old_handle)
|
||||||
self.source_list[ix].ref = new_handle
|
self.source_list[ix].ref = new_handle
|
||||||
refs_list.pop(ix)
|
refs_list[ix] = new_handle
|
||||||
|
|
||||||
for item in self.get_sourcref_child_list():
|
for item in self.get_sourcref_child_list():
|
||||||
item.replace_source_references(old_handle,new_handle)
|
item.replace_source_references(old_handle,new_handle)
|
||||||
@ -624,7 +624,7 @@ class MediaBase:
|
|||||||
for ix_replace in xrange(n_replace):
|
for ix_replace in xrange(n_replace):
|
||||||
ix = refs_list.index(old_handle)
|
ix = refs_list.index(old_handle)
|
||||||
self.media_list[ix].ref = new_handle
|
self.media_list[ix].ref = new_handle
|
||||||
refs_list.pop(ix)
|
refs_list[ix] = new_handle
|
||||||
|
|
||||||
class DateBase:
|
class DateBase:
|
||||||
"""
|
"""
|
||||||
@ -903,36 +903,38 @@ class Person(PrimaryObject,PrivateSourceNote,MediaBase,AttributeBase):
|
|||||||
CHILD_UNKNOWN = 6
|
CHILD_UNKNOWN = 6
|
||||||
CHILD_CUSTOM = 7
|
CHILD_CUSTOM = 7
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self,data=None):
|
||||||
"""
|
"""
|
||||||
Creates a new Person instance. After initialization, most
|
Creates a new Person instance. After initialization, most
|
||||||
data items have empty or null values, including the database
|
data items have empty or null values, including the database
|
||||||
handle.
|
handle.
|
||||||
"""
|
"""
|
||||||
PrimaryObject.__init__(self)
|
if data:
|
||||||
PrivateSourceNote.__init__(self)
|
self.unserialize(data)
|
||||||
MediaBase.__init__(self)
|
else:
|
||||||
AttributeBase.__init__(self)
|
PrimaryObject.__init__(self)
|
||||||
self.primary_name = Name()
|
PrivateSourceNote.__init__(self)
|
||||||
self.event_ref_list = []
|
MediaBase.__init__(self)
|
||||||
self.family_list = []
|
AttributeBase.__init__(self)
|
||||||
self.parent_family_list = []
|
self.primary_name = Name()
|
||||||
self.nickname = ""
|
self.event_ref_list = []
|
||||||
self.alternate_names = []
|
self.family_list = []
|
||||||
self.gender = Person.UNKNOWN
|
self.parent_family_list = []
|
||||||
self.death_ref = None
|
self.nickname = ""
|
||||||
self.birth_ref = None
|
self.alternate_names = []
|
||||||
self.address_list = []
|
self.gender = Person.UNKNOWN
|
||||||
self.urls = []
|
self.death_ref = None
|
||||||
self.lds_bapt = None
|
self.birth_ref = None
|
||||||
self.lds_endow = None
|
self.address_list = []
|
||||||
self.lds_seal = None
|
self.urls = []
|
||||||
self.complete = False
|
self.lds_bapt = None
|
||||||
|
self.lds_endow = None
|
||||||
|
self.lds_seal = None
|
||||||
|
self.complete = False
|
||||||
|
|
||||||
# We hold a reference to the GrampsDB so that we can maintain
|
# We hold a reference to the GrampsDB so that we can maintain
|
||||||
# its genderStats. It doesn't get set here, but from
|
# its genderStats. It doesn't get set here, but from
|
||||||
# GenderStats.count_person.
|
# GenderStats.count_person.
|
||||||
self.db = None
|
|
||||||
|
|
||||||
def serialize(self):
|
def serialize(self):
|
||||||
"""
|
"""
|
||||||
@ -1128,12 +1130,7 @@ class Person(PrimaryObject,PrivateSourceNote,MediaBase,AttributeBase):
|
|||||||
@param name: L{Name} to be assigned to the person
|
@param name: L{Name} to be assigned to the person
|
||||||
@type name: L{Name}
|
@type name: L{Name}
|
||||||
"""
|
"""
|
||||||
db = self.db
|
|
||||||
if db:
|
|
||||||
db.genderStats.uncount_person (self)
|
|
||||||
self.primary_name = name
|
self.primary_name = name
|
||||||
if db:
|
|
||||||
db.genderStats.count_person (self, db)
|
|
||||||
|
|
||||||
def get_primary_name(self):
|
def get_primary_name(self):
|
||||||
"""
|
"""
|
||||||
@ -1227,13 +1224,7 @@ class Person(PrimaryObject,PrivateSourceNote,MediaBase,AttributeBase):
|
|||||||
Person.UNKNOWN
|
Person.UNKNOWN
|
||||||
@type gender: int
|
@type gender: int
|
||||||
"""
|
"""
|
||||||
# if the db object has been assigned, update the
|
|
||||||
# genderStats of the database
|
|
||||||
if self.db:
|
|
||||||
self.db.genderStats.uncount_person (self)
|
|
||||||
self.gender = gender
|
self.gender = gender
|
||||||
if self.db:
|
|
||||||
self.db.genderStats.count_person (self, self.db)
|
|
||||||
|
|
||||||
def get_gender(self) :
|
def get_gender(self) :
|
||||||
"""
|
"""
|
||||||
@ -1922,7 +1913,7 @@ class Family(PrimaryObject,SourceNote,MediaBase,AttributeBase):
|
|||||||
@return: Returns the list of objects refereincing primary objects.
|
@return: Returns the list of objects refereincing primary objects.
|
||||||
@rtype: list
|
@rtype: list
|
||||||
"""
|
"""
|
||||||
return get_sourcref_child_list() + self.source_list
|
return self.get_sourcref_child_list() + self.source_list
|
||||||
|
|
||||||
def set_complete_flag(self,val):
|
def set_complete_flag(self,val):
|
||||||
"""
|
"""
|
||||||
@ -4352,7 +4343,6 @@ class GenderStats:
|
|||||||
if not person:
|
if not person:
|
||||||
return
|
return
|
||||||
# Let the Person do their own counting later
|
# Let the Person do their own counting later
|
||||||
person.db = db
|
|
||||||
|
|
||||||
name = self._get_key (person)
|
name = self._get_key (person)
|
||||||
if not name:
|
if not name:
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -29,6 +29,7 @@
|
|||||||
import RelLib
|
import RelLib
|
||||||
import types
|
import types
|
||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
|
from Utils import strip_context as __
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -43,7 +44,7 @@ _level_name = [ "", "first", "second", "third", "fourth", "fifth", "sixth",
|
|||||||
|
|
||||||
_removed_level = [ "", " once removed", " twice removed", " three times removed",
|
_removed_level = [ "", " once removed", " twice removed", " three times removed",
|
||||||
" four times removed", " five times removed", " six times removed",
|
" four times removed", " five times removed", " six times removed",
|
||||||
" sevent times removed", " eight times removed", " nine times removed",
|
" sevent times removed", " eight times removed", " nine times removed",
|
||||||
" ten times removed", " eleven times removed", " twelve times removed",
|
" ten times removed", " eleven times removed", " twelve times removed",
|
||||||
" thirteen times removed", " fourteen times removed", " fifteen times removed",
|
" thirteen times removed", " fourteen times removed", " fifteen times removed",
|
||||||
" sixteen times removed", " seventeen times removed", " eighteen times removed",
|
" sixteen times removed", " seventeen times removed", " eighteen times removed",
|
||||||
@ -240,12 +241,59 @@ class RelationshipCalculator:
|
|||||||
def is_spouse(self,orig,other):
|
def is_spouse(self,orig,other):
|
||||||
for f in orig.get_family_handle_list():
|
for f in orig.get_family_handle_list():
|
||||||
family = self.db.get_family_from_handle(f)
|
family = self.db.get_family_from_handle(f)
|
||||||
if family:
|
if family and other.get_handle() in [family.get_father_handle(),
|
||||||
if other.get_handle() == family.get_father_handle() or other.get_handle() == family.get_mother_handle():
|
family.get_mother_handle()]:
|
||||||
return 1
|
family_rel = family.get_relationship()
|
||||||
|
# Determine person's gender
|
||||||
|
if other.get_gender() == RelLib.Person.MALE:
|
||||||
|
gender = RelLib.Person.MALE
|
||||||
|
elif other.get_gender() == RelLib.Person.FEMALE:
|
||||||
|
gender = RelLib.Person.FEMALE
|
||||||
|
# Person's gender is unknown, try guessing from spouse's
|
||||||
|
elif orig.get_gender() == RelLib.Person.MALE:
|
||||||
|
if family_rel == RelLib.Family.CIVIL_UNION:
|
||||||
|
gender = RelLib.Person.MALE
|
||||||
|
else:
|
||||||
|
gender = RelLib.Person.FEMALE
|
||||||
|
elif orig.get_gender() == RelLib.Person.FEMALE:
|
||||||
|
if family_rel == RelLib.Family.CIVIL_UNION:
|
||||||
|
gender = RelLib.Person.FEMALE
|
||||||
|
else:
|
||||||
|
gender = RelLib.Person.MALE
|
||||||
|
else:
|
||||||
|
gender = RelLib.Person.UNKNOWN
|
||||||
|
|
||||||
|
if family_rel == RelLib.Family.MARRIED:
|
||||||
|
if gender == RelLib.Person.MALE:
|
||||||
|
return _("husband")
|
||||||
|
elif gender == RelLib.Person.FEMALE:
|
||||||
|
return _("wife")
|
||||||
|
else:
|
||||||
|
return __("gender unknown|spouse")
|
||||||
|
elif family_rel == RelLib.Family.UNMARRIED:
|
||||||
|
if gender == RelLib.Person.MALE:
|
||||||
|
return __("unmarried|husband")
|
||||||
|
elif gender == RelLib.Person.FEMALE:
|
||||||
|
return __("unmarried|wife")
|
||||||
|
else:
|
||||||
|
return __("gender unknown,unmarried|spouse")
|
||||||
|
elif family_rel == RelLib.Family.CIVIL_UNION:
|
||||||
|
if gender == RelLib.Person.MALE:
|
||||||
|
return __("male,civil union|partner")
|
||||||
|
elif gender == RelLib.Person.FEMALE:
|
||||||
|
return __("female,civil union|partner")
|
||||||
|
else:
|
||||||
|
return __("gender unknown,civil union|partner")
|
||||||
|
else:
|
||||||
|
if gender == RelLib.Person.MALE:
|
||||||
|
return __("male,unknown relation|partner")
|
||||||
|
elif gender == RelLib.Person.FEMALE:
|
||||||
|
return __("female,unknown relation|partner")
|
||||||
|
else:
|
||||||
|
return __("gender unknown,unknown relation|partner")
|
||||||
else:
|
else:
|
||||||
return 0
|
return None
|
||||||
return 0
|
return None
|
||||||
|
|
||||||
def get_relationship_distance(self,orig_person,other_person):
|
def get_relationship_distance(self,orig_person,other_person):
|
||||||
"""
|
"""
|
||||||
@ -304,8 +352,9 @@ class RelationshipCalculator:
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
return ("spouse",[])
|
if is_spouse:
|
||||||
|
return (is_spouse,[])
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
@ -1677,7 +1677,7 @@ class CommandLineReport:
|
|||||||
for paper in PaperMenu.paper_sizes:
|
for paper in PaperMenu.paper_sizes:
|
||||||
if paper.get_name() == self.options_dict['papers']:
|
if paper.get_name() == self.options_dict['papers']:
|
||||||
self.paper = paper
|
self.paper = paper
|
||||||
self.option_class.handler.set_paper(self.paper)
|
self.option_class.handler.set_paper(self.paper)
|
||||||
self.options_help['papers'].append(
|
self.options_help['papers'].append(
|
||||||
[ paper.get_name() for paper in PaperMenu.paper_sizes
|
[ paper.get_name() for paper in PaperMenu.paper_sizes
|
||||||
if paper.get_name() != 'Custom Size' ] )
|
if paper.get_name() != 'Custom Size' ] )
|
||||||
|
@ -401,6 +401,7 @@ def place_name(db,place_handle):
|
|||||||
place = db.get_place_from_handle(place_handle).get_title()
|
place = db.get_place_from_handle(place_handle).get_title()
|
||||||
else:
|
else:
|
||||||
place = ""
|
place = ""
|
||||||
|
return place
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
@ -35,6 +35,7 @@ from gettext import gettext as _
|
|||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
import gtk.glade
|
import gtk.glade
|
||||||
import gnome
|
import gnome
|
||||||
|
import gobject
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -48,6 +49,8 @@ import PeopleModel
|
|||||||
import NameDisplay
|
import NameDisplay
|
||||||
import AutoComp
|
import AutoComp
|
||||||
from QuestionDialog import ErrorDialog
|
from QuestionDialog import ErrorDialog
|
||||||
|
import GenericFilter
|
||||||
|
import Date
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -116,10 +119,12 @@ class SelectChild:
|
|||||||
else:
|
else:
|
||||||
self.frel.set_sensitive(False)
|
self.frel.set_sensitive(False)
|
||||||
|
|
||||||
self.refmodel = PeopleModel.PeopleModel(self.db)
|
self.likely_filter = GenericFilter.GenericFilter()
|
||||||
|
self.likely_filter.add_rule(LikelyFilter([self.person.handle]))
|
||||||
|
self.active_filter = self.likely_filter
|
||||||
|
|
||||||
self.add_child.set_model(self.refmodel)
|
self.top.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||||
self.redraw_child_list(2)
|
gobject.idle_add(self.redraw_child_list)
|
||||||
self.add_itself_to_menu()
|
self.add_itself_to_menu()
|
||||||
self.add_columns(self.add_child)
|
self.add_columns(self.add_child)
|
||||||
self.top.show()
|
self.top.show()
|
||||||
@ -176,110 +181,10 @@ class SelectChild:
|
|||||||
"""Display the relevant portion of GRAMPS manual"""
|
"""Display the relevant portion of GRAMPS manual"""
|
||||||
gnome.help_display('gramps-manual','gramps-edit-quick')
|
gnome.help_display('gramps-manual','gramps-edit-quick')
|
||||||
|
|
||||||
def redraw_child_list(self,filter):
|
def redraw_child_list(self):
|
||||||
return
|
self.refmodel = PeopleModel.PeopleModel(self.db,self.active_filter)
|
||||||
|
self.add_child.set_model(self.refmodel)
|
||||||
birth = self.db.get_event_from_handle(self.person.get_birth_handle())
|
self.top.window.set_cursor(None)
|
||||||
death = self.db.get_event_from_handle(self.person.get_death_handle())
|
|
||||||
if birth:
|
|
||||||
bday = birth.get_date_object()
|
|
||||||
else:
|
|
||||||
bday = None
|
|
||||||
if death:
|
|
||||||
dday = death.get_date_object()
|
|
||||||
else:
|
|
||||||
dday = None
|
|
||||||
|
|
||||||
slist = {}
|
|
||||||
for f in self.person.get_parent_family_handle_list():
|
|
||||||
if f:
|
|
||||||
family = self.db.get_family_from_handle(f[0])
|
|
||||||
if family.get_father_handle():
|
|
||||||
slist[family.get_father_handle()] = 1
|
|
||||||
elif family.get_mother_handle():
|
|
||||||
slist[family.get_mother_handle()] = 1
|
|
||||||
for c in family.get_child_handle_list():
|
|
||||||
slist[c] = 1
|
|
||||||
|
|
||||||
person_list = []
|
|
||||||
for key in self.db.get_person_handles(sort_handles=True):
|
|
||||||
person = self.db.get_person_from_handle(key)
|
|
||||||
if filter:
|
|
||||||
if slist.has_key(key) or person.get_main_parents_family_handle():
|
|
||||||
continue
|
|
||||||
|
|
||||||
birth_event = self.db.get_event_from_handle(person.get_birth_handle())
|
|
||||||
if birth_event:
|
|
||||||
pbday = birth_event.get_date_object()
|
|
||||||
else:
|
|
||||||
pbday = None
|
|
||||||
|
|
||||||
death_event = self.db.get_event_from_handle(person.get_death_handle())
|
|
||||||
if death_event:
|
|
||||||
pdday = death_event.get_date_object()
|
|
||||||
else:
|
|
||||||
pdday = None
|
|
||||||
|
|
||||||
if bday and bday.getYearValid():
|
|
||||||
if pbday and pbday.getYearValid():
|
|
||||||
# reject if child birthdate < parents birthdate + 10
|
|
||||||
if pbday.getLowYear() < bday.getHighYear()+10:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# reject if child birthdate > parents birthdate + 90
|
|
||||||
if pbday.getLowYear() > bday.getHighYear()+90:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if pdday and pdday.getYearValid():
|
|
||||||
# reject if child deathdate < parents birthdate+ 10
|
|
||||||
if pdday.getLowYear() < bday.getHighYear()+10:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if dday and dday.getYearValid():
|
|
||||||
if pbday and pbday.getYearValid():
|
|
||||||
# reject if childs birth date > parents deathday + 3
|
|
||||||
if pbday.getLowYear() > dday.getHighYear()+3:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if pdday and pdday.getYearValid():
|
|
||||||
# reject if childs death date > parents deathday + 150
|
|
||||||
if pdday.getLowYear() > dday.getHighYear() + 150:
|
|
||||||
continue
|
|
||||||
|
|
||||||
person_list.append(person.get_handle())
|
|
||||||
|
|
||||||
node = None
|
|
||||||
for idval in person_list:
|
|
||||||
person = self.db.get_person_from_handle(idval)
|
|
||||||
name = NameDisplay.displayer.display(person)
|
|
||||||
if person.gender == RelLib.Person.MALE:
|
|
||||||
gender = _("male")
|
|
||||||
elif person.gender == RelLib.Person.FEMALE:
|
|
||||||
gender = _("female")
|
|
||||||
else:
|
|
||||||
gender = _("unknown")
|
|
||||||
|
|
||||||
bh = person.get_birth_handle()
|
|
||||||
dh = person.get_death_handle()
|
|
||||||
if bh:
|
|
||||||
bdate = self.db.get_event_from_handle(bh).get_date()
|
|
||||||
else:
|
|
||||||
bdate = ""
|
|
||||||
if dh:
|
|
||||||
ddate = self.db.get_event_from_handle(bh).get_date()
|
|
||||||
else:
|
|
||||||
ddate = ""
|
|
||||||
|
|
||||||
rdata = [name,person.get_gramps_id(),gender,bdate,ddate]
|
|
||||||
node = self.refmodel.add(rdata)
|
|
||||||
|
|
||||||
self.refmodel.connect_model()
|
|
||||||
|
|
||||||
if node:
|
|
||||||
self.refmodel.selection.select_iter(node)
|
|
||||||
path = self.refmodel.model.get_path(node)
|
|
||||||
col = self.add_child.get_column(0)
|
|
||||||
self.add_child.scroll_to_cell(path,col,1,0.5,0.0)
|
|
||||||
|
|
||||||
def select_function(self,store,path,node,id_list):
|
def select_function(self,store,path,node,id_list):
|
||||||
id_list.append(self.refmodel.get_value(node,PeopleModel.COLUMN_INT_ID))
|
id_list.append(self.refmodel.get_value(node,PeopleModel.COLUMN_INT_ID))
|
||||||
@ -349,7 +254,14 @@ class SelectChild:
|
|||||||
self.callback()
|
self.callback()
|
||||||
|
|
||||||
def on_show_toggled(self,obj):
|
def on_show_toggled(self,obj):
|
||||||
self.redraw_child_list(not obj.get_active())
|
if obj.get_active():
|
||||||
|
self.active_filter = None
|
||||||
|
else:
|
||||||
|
self.active_filter = self.likely_filter
|
||||||
|
self.top.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||||
|
while(gtk.events_pending()):
|
||||||
|
gtk.main_iteration()
|
||||||
|
self.redraw_child_list()
|
||||||
|
|
||||||
def north_american(self,val):
|
def north_american(self,val):
|
||||||
if self.person.get_gender() == RelLib.Person.MALE:
|
if self.person.get_gender() == RelLib.Person.MALE:
|
||||||
@ -397,3 +309,35 @@ class SelectChild:
|
|||||||
return ("","%sdóttir" % fname)
|
return ("","%sdóttir" % fname)
|
||||||
else:
|
else:
|
||||||
return ("","")
|
return ("","")
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Likely Filters
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class LikelyFilter(GenericFilter.Rule):
|
||||||
|
|
||||||
|
category = _('General filters')
|
||||||
|
|
||||||
|
def prepare(self,db):
|
||||||
|
person = db.get_person_from_handle(self.list[0])
|
||||||
|
if person.birth_handle:
|
||||||
|
birth = db.get_event_from_handle(person.birth_handle)
|
||||||
|
dateobj = Date.Date(birth.date)
|
||||||
|
year = dateobj.get_year()
|
||||||
|
dateobj.set_year(year+10)
|
||||||
|
self.lower = dateobj.sortval
|
||||||
|
dateobj.set_year(year+70)
|
||||||
|
self.upper = dateobj.sortval
|
||||||
|
else:
|
||||||
|
self.lower = None
|
||||||
|
self.upper = None
|
||||||
|
|
||||||
|
def apply(self,db,person):
|
||||||
|
if not person.birth_handle or (self.upper == None and
|
||||||
|
self.lower == None):
|
||||||
|
return True
|
||||||
|
event = db.get_event_from_handle(person.birth_handle)
|
||||||
|
return (event.date == None or event.date.sortval == 0 or
|
||||||
|
self.lower < event.date.sortval < self.upper)
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ column_names = [
|
|||||||
_HANDLE_COL = len(column_names)
|
_HANDLE_COL = len(column_names)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# SouceView
|
# SouceView
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@ -97,7 +97,7 @@ class SourceView:
|
|||||||
self.sort_col = data
|
self.sort_col = data
|
||||||
handle = self.first_selected()
|
handle = self.first_selected()
|
||||||
self.model = DisplayModels.SourceModel(self.parent.db,
|
self.model = DisplayModels.SourceModel(self.parent.db,
|
||||||
self.sort_col,order)
|
self.scol_map[self.sort_col],order)
|
||||||
self.list.set_model(self.model)
|
self.list.set_model(self.model)
|
||||||
colmap = self.parent.db.get_place_column_order()
|
colmap = self.parent.db.get_place_column_order()
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ class SourceView:
|
|||||||
self.selection.select_path(path)
|
self.selection.select_path(path)
|
||||||
self.list.scroll_to_cell(path,None,1,0.5,0)
|
self.list.scroll_to_cell(path,None,1,0.5,0)
|
||||||
for i in range(0,len(self.columns)):
|
for i in range(0,len(self.columns)):
|
||||||
self.columns[i].set_sort_indicator(i==colmap[data][1]-1)
|
self.columns[i].set_sort_indicator(i==self.sort_col)
|
||||||
self.columns[self.sort_col].set_sort_order(order)
|
self.columns[self.sort_col].set_sort_order(order)
|
||||||
|
|
||||||
def build_columns(self):
|
def build_columns(self):
|
||||||
@ -119,12 +119,14 @@ class SourceView:
|
|||||||
column.set_clickable(True)
|
column.set_clickable(True)
|
||||||
column.connect('clicked',self.column_clicked,0)
|
column.connect('clicked',self.column_clicked,0)
|
||||||
self.list.append_column(column)
|
self.list.append_column(column)
|
||||||
|
self.scol_map = [0]
|
||||||
self.columns = [column]
|
self.columns = [column]
|
||||||
|
|
||||||
index = 1
|
index = 1
|
||||||
for pair in self.parent.db.get_source_column_order():
|
for pair in self.parent.db.get_source_column_order():
|
||||||
if not pair[0]:
|
if not pair[0]:
|
||||||
continue
|
continue
|
||||||
|
self.scol_map.append(pair[1])
|
||||||
name = column_names[pair[1]]
|
name = column_names[pair[1]]
|
||||||
column = gtk.TreeViewColumn(name, self.renderer, text=pair[1])
|
column = gtk.TreeViewColumn(name, self.renderer, text=pair[1])
|
||||||
column.connect('clicked',self.column_clicked,index)
|
column.connect('clicked',self.column_clicked,index)
|
||||||
|
@ -111,7 +111,7 @@ class ReadTarFile:
|
|||||||
if filename == None:
|
if filename == None:
|
||||||
return data
|
return data
|
||||||
self.f.read(24) # modes
|
self.f.read(24) # modes
|
||||||
l = self.f.read(12)(chr(0),' ')
|
l = self.f.read(12).replace(chr(0),' ')
|
||||||
length = int(l,8)
|
length = int(l,8)
|
||||||
self.f.read(12)
|
self.f.read(12)
|
||||||
self.f.read(6)
|
self.f.read(6)
|
||||||
|
25
src/Utils.py
25
src/Utils.py
@ -643,7 +643,7 @@ def search_for(name):
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Change label apperance
|
# Change label appearance
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
def bold_label(label,widget=None):
|
def bold_label(label,widget=None):
|
||||||
@ -1028,3 +1028,26 @@ def get_type_converter_by_name(val_str):
|
|||||||
elif val_str in ('str','unicode'):
|
elif val_str in ('str','unicode'):
|
||||||
return unicode
|
return unicode
|
||||||
return unicode
|
return unicode
|
||||||
|
|
||||||
|
def strip_context(msgid,sep='|'):
|
||||||
|
"""
|
||||||
|
Strip the context used for resolving translation ambiguities.
|
||||||
|
|
||||||
|
The translation of msgid is returned unless the translation is
|
||||||
|
not available and the msgid contains the separator. In that case,
|
||||||
|
the returned value is the portion of msgid following the last
|
||||||
|
separator. Default separator is '|'.
|
||||||
|
|
||||||
|
@param msgid: The string to translated.
|
||||||
|
@type msgid: unicode
|
||||||
|
@param sep: The separator marking the context.
|
||||||
|
@type sep: unicode
|
||||||
|
@return: Translation or the original with context stripped.
|
||||||
|
@rtype: unicode
|
||||||
|
|
||||||
|
"""
|
||||||
|
msgval = _(msgid)
|
||||||
|
sep_idx = msgid.rfind(sep)
|
||||||
|
if msgval == msgid and sep_idx != -1:
|
||||||
|
msgval = msgid[sep_idx+1:]
|
||||||
|
return msgval
|
||||||
|
@ -120,8 +120,8 @@ def add_familys_sources(db,family_handle,slist,private):
|
|||||||
continue
|
continue
|
||||||
for source_ref in attr.get_source_references():
|
for source_ref in attr.get_source_references():
|
||||||
sbase = source_ref.get_base_handle()
|
sbase = source_ref.get_base_handle()
|
||||||
if sbase != None and not slist.has_key(sbase.get_handle()):
|
if sbase != None and not slist.has_key(sbase):
|
||||||
slist[sbase.get_handle()] = 1
|
slist[sbase] = 1
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -329,20 +329,28 @@ class GedcomWriterOptionBox:
|
|||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
all.add_rule(GenericFilter.Everyone([]))
|
all.add_rule(GenericFilter.Everyone([]))
|
||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
if self.person:
|
||||||
des.set_name(_("Descendants of %s") % NameDisplay.displayer.display(self.person))
|
des = GenericFilter.GenericFilter()
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([self.person.get_handle(),1]))
|
des.set_name(_("Descendants of %s") %
|
||||||
|
NameDisplay.displayer.display(self.person))
|
||||||
|
des.add_rule(GenericFilter.IsDescendantOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
ans = GenericFilter.GenericFilter()
|
||||||
ans.set_name(_("Ancestors of %s") % NameDisplay.displayer.display(self.person))
|
ans.set_name(_("Ancestors of %s")
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([self.person.get_handle(),1]))
|
% NameDisplay.displayer.display(self.person))
|
||||||
|
ans.add_rule(GenericFilter.IsAncestorOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
com = GenericFilter.GenericFilter()
|
||||||
com.set_name(_("People with common ancestor with %s") %
|
com.set_name(_("People with common ancestor with %s") %
|
||||||
NameDisplay.displayer.display(self.person))
|
NameDisplay.displayer.display(self.person))
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([self.person.get_handle()]))
|
com.add_rule(GenericFilter.HasCommonAncestorWith(
|
||||||
|
[self.person.get_gramps_id()]))
|
||||||
|
|
||||||
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
|
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
|
||||||
|
else:
|
||||||
|
self.filter_menu = GenericFilter.build_filter_menu([all])
|
||||||
filter_obj.set_menu(self.filter_menu)
|
filter_obj.set_menu(self.filter_menu)
|
||||||
|
|
||||||
gedmap = GedcomInfo.GedcomInfoDB()
|
gedmap = GedcomInfo.GedcomInfoDB()
|
||||||
@ -734,16 +742,19 @@ class GedcomWriter:
|
|||||||
self.writeln('2 _STAT %s' % f[2])
|
self.writeln('2 _STAT %s' % f[2])
|
||||||
break
|
break
|
||||||
|
|
||||||
|
for srcref in family.get_source_references():
|
||||||
|
self.write_source_ref(1,srcref)
|
||||||
|
|
||||||
self.write_change(1,family.get_change_time())
|
self.write_change(1,family.get_change_time())
|
||||||
|
|
||||||
def write_sources(self):
|
def write_sources(self):
|
||||||
index = 0.0
|
index = 0.0
|
||||||
sorted = []
|
sorted = []
|
||||||
for key in self.slist.keys():
|
for handle in self.slist.keys():
|
||||||
source = self.db.get_source_from_handle(key)
|
source = self.db.get_source_from_handle(handle)
|
||||||
if not source:
|
if not source:
|
||||||
continue
|
continue
|
||||||
data = (self.sid (source.get_gramps_id ()), source)
|
data = (self.sid(handle), source)
|
||||||
sorted.append (data)
|
sorted.append (data)
|
||||||
sorted.sort ()
|
sorted.sort ()
|
||||||
for (source_id, source) in sorted:
|
for (source_id, source) in sorted:
|
||||||
@ -896,12 +907,19 @@ class GedcomWriter:
|
|||||||
val = Utils.personalConstantAttributes[name]
|
val = Utils.personalConstantAttributes[name]
|
||||||
else:
|
else:
|
||||||
val = ""
|
val = ""
|
||||||
if val :
|
value = self.cnvtxt(attr.get_value()).replace('\r',' ')
|
||||||
self.writeln("1 %s" % val)
|
if val:
|
||||||
|
if value:
|
||||||
|
self.writeln("1 %s %s" % (val, value))
|
||||||
|
else:
|
||||||
|
self.writeln("1 %s" % val)
|
||||||
else:
|
else:
|
||||||
self.writeln("1 EVEN")
|
self.writeln("1 EVEN")
|
||||||
self.writeln("2 TYPE %s" % self.cnvtxt(name))
|
if value:
|
||||||
self.writeln("2 PLAC %s" % self.cnvtxt(attr.get_value()).replace('\r',' '))
|
self.writeln("2 TYPE %s %s" % (self.cnvtxt(name), value
|
||||||
|
))
|
||||||
|
else:
|
||||||
|
self.writeln("2 TYPE %s" % self.cnvtxt(name))
|
||||||
if attr.get_note():
|
if attr.get_note():
|
||||||
self.write_long_text("NOTE",2,self.cnvtxt(attr.get_note()))
|
self.write_long_text("NOTE",2,self.cnvtxt(attr.get_note()))
|
||||||
for srcref in attr.get_source_references():
|
for srcref in attr.get_source_references():
|
||||||
@ -944,6 +962,8 @@ class GedcomWriter:
|
|||||||
photos = []
|
photos = []
|
||||||
|
|
||||||
for photo in photos:
|
for photo in photos:
|
||||||
|
if self.private and photo.get_privacy():
|
||||||
|
continue
|
||||||
photo_obj_id = photo.get_reference_handle()
|
photo_obj_id = photo.get_reference_handle()
|
||||||
photo_obj = self.db.get_object_from_handle(photo_obj_id)
|
photo_obj = self.db.get_object_from_handle(photo_obj_id)
|
||||||
if photo_obj and photo_obj.get_mime_type() == "image/jpeg":
|
if photo_obj and photo_obj.get_mime_type() == "image/jpeg":
|
||||||
@ -975,14 +995,19 @@ class GedcomWriter:
|
|||||||
if self.adopt == GedcomInfo.ADOPT_PEDI:
|
if self.adopt == GedcomInfo.ADOPT_PEDI:
|
||||||
if family[1] == RelLib.Person.CHILD_ADOPTED:
|
if family[1] == RelLib.Person.CHILD_ADOPTED:
|
||||||
self.writeln("2 PEDI Adopted")
|
self.writeln("2 PEDI Adopted")
|
||||||
|
|
||||||
for family_handle in person.get_family_handle_list():
|
for family_handle in person.get_family_handle_list():
|
||||||
if family_handle != None and self.flist.has_key(family_handle):
|
if family_handle != None and self.flist.has_key(family_handle):
|
||||||
self.writeln("1 FAMS @%s@" % self.fid(family_handle))
|
self.writeln("1 FAMS @%s@" % self.fid(family_handle))
|
||||||
|
|
||||||
|
for srcref in person.get_source_references():
|
||||||
|
self.write_source_ref(1,srcref)
|
||||||
|
|
||||||
if not restricted:
|
if not restricted:
|
||||||
if self.obje:
|
if self.obje:
|
||||||
for url in person.get_url_list():
|
for url in person.get_url_list():
|
||||||
|
if self.private and url.get_privacy():
|
||||||
|
continue
|
||||||
self.writeln('1 OBJE')
|
self.writeln('1 OBJE')
|
||||||
self.writeln('2 FORM URL')
|
self.writeln('2 FORM URL')
|
||||||
if url.get_description():
|
if url.get_description():
|
||||||
@ -1105,10 +1130,7 @@ class GedcomWriter:
|
|||||||
|
|
||||||
def print_date(self,prefix,date):
|
def print_date(self,prefix,date):
|
||||||
start = date.get_start_date()
|
start = date.get_start_date()
|
||||||
val = date.get_text()
|
if start != Date.EMPTY:
|
||||||
if val:
|
|
||||||
self.writeln("%s %s" % (prefix,self.cnvtxt(val)))
|
|
||||||
elif not date.is_empty ():
|
|
||||||
cal = date.get_calendar()
|
cal = date.get_calendar()
|
||||||
mod = date.get_modifier()
|
mod = date.get_modifier()
|
||||||
if date.get_modifier() == Date.MOD_SPAN:
|
if date.get_modifier() == Date.MOD_SPAN:
|
||||||
@ -1120,6 +1142,8 @@ class GedcomWriter:
|
|||||||
else:
|
else:
|
||||||
val = make_date(start,cal,mod)
|
val = make_date(start,cal,mod)
|
||||||
self.writeln("%s %s" % (prefix,val))
|
self.writeln("%s %s" % (prefix,val))
|
||||||
|
elif date.get_text():
|
||||||
|
self.writeln("%s %s" % (prefix,self.cnvtxt(date.get_text())))
|
||||||
|
|
||||||
def write_person_name(self,name,nick):
|
def write_person_name(self,name,nick):
|
||||||
firstName = self.cnvtxt(name.get_first_name())
|
firstName = self.cnvtxt(name.get_first_name())
|
||||||
@ -1220,14 +1244,9 @@ class GedcomWriter:
|
|||||||
if match:
|
if match:
|
||||||
self.writeln('1 REFN %d' % int(match.groups()[0]))
|
self.writeln('1 REFN %d' % int(match.groups()[0]))
|
||||||
|
|
||||||
def sid(self,id):
|
def sid(self,handle):
|
||||||
if self.sidmap.has_key(id):
|
source = self.db.get_source_from_handle(handle)
|
||||||
return self.sidmap[id]
|
return source.get_gramps_id()
|
||||||
else:
|
|
||||||
val = "S%05d" % self.sidval
|
|
||||||
self.sidval = self.sidval + 1
|
|
||||||
self.sidmap[id] = val
|
|
||||||
return val
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
@ -211,6 +211,61 @@ longopts = [
|
|||||||
|
|
||||||
shortopts = "O:i:o:f:a:p:?"
|
shortopts = "O:i:o:f:a:p:?"
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Constants
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
child_rel_list = [
|
||||||
|
_("None"), _("Birth"), _("Adopted"), _("Stepchild"),
|
||||||
|
_("Sponsored"), _("Foster"), _("Unknown"), _("Other"), ]
|
||||||
|
|
||||||
|
child_rel_notrans = [
|
||||||
|
"None", "Birth", "Adopted", "Stepchild",
|
||||||
|
"Sponsored", "Foster", "Unknown", "Other", ]
|
||||||
|
|
||||||
|
child_relations = TransTable( {
|
||||||
|
_("Birth") : "Birth",
|
||||||
|
_("Adopted") : "Adopted",
|
||||||
|
_("Stepchild") : "Stepchild",
|
||||||
|
_("Sponsored") : "Sponsored",
|
||||||
|
_("Foster") : "Foster",
|
||||||
|
_("None") : "None",
|
||||||
|
_("Unknown") : "Unknown",
|
||||||
|
_("Other") : "Other",
|
||||||
|
})
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Confidence
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
confidence = [
|
||||||
|
_("Very Low"),
|
||||||
|
_("Low"),
|
||||||
|
_("Normal"),
|
||||||
|
_("High"),
|
||||||
|
_("Very High"),
|
||||||
|
]
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Family event string mappings
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
familyConstantEvents = {
|
||||||
|
"Annulment" : "ANUL",
|
||||||
|
"Divorce Filing" : "DIVF",
|
||||||
|
"Divorce" : "DIV",
|
||||||
|
"Engagement" : "ENGA",
|
||||||
|
"Marriage Banns" : "MARB",
|
||||||
|
"Marriage Contract" : "MARC",
|
||||||
|
"Marriage License" : "MARL",
|
||||||
|
"Marriage Settlement" : "MARS",
|
||||||
|
"Marriage" : "MARR"
|
||||||
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2000-2004 Donald N. Allingham
|
# Copyright (C) 2000-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -30,7 +30,6 @@ Provides a BaseDoc based interface to the AbiWord document format.
|
|||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
import base64
|
import base64
|
||||||
import string
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
import BaseDoc
|
import BaseDoc
|
||||||
@ -59,8 +58,7 @@ class AbiWordDoc(BaseDoc.BaseDoc):
|
|||||||
self.level = 0
|
self.level = 0
|
||||||
self.new_page = 0
|
self.new_page = 0
|
||||||
self.in_table = 0
|
self.in_table = 0
|
||||||
self.icount = 0;
|
self.in_paragraph = 0
|
||||||
self.imap = {}
|
|
||||||
|
|
||||||
def open(self,filename):
|
def open(self,filename):
|
||||||
"""Opens the document, writing the necessary header information.
|
"""Opens the document, writing the necessary header information.
|
||||||
@ -161,15 +159,16 @@ class AbiWordDoc(BaseDoc.BaseDoc):
|
|||||||
def close(self):
|
def close(self):
|
||||||
"""Write the trailing information and closes the file"""
|
"""Write the trailing information and closes the file"""
|
||||||
self.f.write('</section>\n')
|
self.f.write('</section>\n')
|
||||||
if len(self.media_list) > 0:
|
if self.media_list:
|
||||||
self.f.write('<data>\n')
|
self.f.write('<data>\n')
|
||||||
for file_tuple in self.media_list:
|
for tag_number in range(len(self.media_list)):
|
||||||
tag = self.imap[file_tuple[0]]
|
name = self.media_list[tag_number]
|
||||||
|
img = ImgManip.ImgManip(name)
|
||||||
img = ImgManip.ImgManip(file_tuple[0])
|
|
||||||
buf = img.png_data()
|
buf = img.png_data()
|
||||||
|
|
||||||
self.f.write('<d name="%s" mime-type="image/png" base64="yes">\n' % tag)
|
self.f.write(
|
||||||
|
'<d name="image%d" mime-type="image/png" base64="yes">\n'
|
||||||
|
% tag_number)
|
||||||
self.f.write(base64.encodestring(buf))
|
self.f.write(base64.encodestring(buf))
|
||||||
self.f.write('</d>\n')
|
self.f.write('</d>\n')
|
||||||
self.f.write('</data>\n')
|
self.f.write('</data>\n')
|
||||||
@ -206,14 +205,21 @@ class AbiWordDoc(BaseDoc.BaseDoc):
|
|||||||
act_height = y_cm
|
act_height = y_cm
|
||||||
act_width = x_cm*aspect_ratio
|
act_width = x_cm*aspect_ratio
|
||||||
|
|
||||||
self.media_list.append((name,act_width,act_height))
|
if name in self.media_list:
|
||||||
|
tag_number = self.media_list.index(name)
|
||||||
|
else:
|
||||||
|
tag_number = len(self.media_list)
|
||||||
|
self.media_list.append(name)
|
||||||
|
|
||||||
tag = "image%d" % self.icount
|
if self.in_paragraph: # We cannot insert photo
|
||||||
|
start_p = end_p = '' # outside text paragraph.
|
||||||
|
else: # So if not in paragraph, insert one.
|
||||||
|
start_p = '<p>'
|
||||||
|
end_p = '</p>'
|
||||||
|
|
||||||
self.f.write('<image dataid="%s" props="width:%.3fcm; ' % (tag, x_cm))
|
self.f.write('%s<image dataid="image%d" '
|
||||||
self.f.write('height:%.3fcm"/>' % y_cm)
|
'props="height:%.3fcm; width:%.3fcm"/>%s '
|
||||||
self.imap[name] = tag
|
% (start_p,tag_number,act_height,act_width,end_p))
|
||||||
self.icount += 1
|
|
||||||
|
|
||||||
def start_superscript(self):
|
def start_superscript(self):
|
||||||
self.text = self.text + '<c props="text-position:superscript">'
|
self.text = self.text + '<c props="text-position:superscript">'
|
||||||
@ -222,6 +228,7 @@ class AbiWordDoc(BaseDoc.BaseDoc):
|
|||||||
self.text = self.text + '</c>'
|
self.text = self.text + '</c>'
|
||||||
|
|
||||||
def start_paragraph(self,style_name,leader=None):
|
def start_paragraph(self,style_name,leader=None):
|
||||||
|
self.in_paragraph = 1
|
||||||
style = self.style_list[style_name]
|
style = self.style_list[style_name]
|
||||||
self.current_style = style
|
self.current_style = style
|
||||||
self.f.write('<p style="%s">' % style_name)
|
self.f.write('<p style="%s">' % style_name)
|
||||||
@ -236,6 +243,7 @@ class AbiWordDoc(BaseDoc.BaseDoc):
|
|||||||
self.new_page = 1
|
self.new_page = 1
|
||||||
|
|
||||||
def end_paragraph(self):
|
def end_paragraph(self):
|
||||||
|
self.in_paragraph = 0
|
||||||
self.f.write('</p>\n')
|
self.f.write('</p>\n')
|
||||||
|
|
||||||
def write_note(self,text,format,style_name):
|
def write_note(self,text,format,style_name):
|
||||||
@ -249,7 +257,7 @@ class AbiWordDoc(BaseDoc.BaseDoc):
|
|||||||
for line in text.split('\n\n'):
|
for line in text.split('\n\n'):
|
||||||
self.start_paragraph(style_name)
|
self.start_paragraph(style_name)
|
||||||
line = line.replace('\n',' ')
|
line = line.replace('\n',' ')
|
||||||
line = string.join(string.split(line))
|
line = ' '.join(line.split())
|
||||||
self.write_text(line)
|
self.write_text(line)
|
||||||
self.end_paragraph()
|
self.end_paragraph()
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ except ImportError:
|
|||||||
def _(s): return s
|
def _(s): return s
|
||||||
|
|
||||||
__version__ = '1.4'
|
__version__ = '1.4'
|
||||||
default_keywords = ['_']
|
default_keywords = ['_','__']
|
||||||
EMPTYSTRING = ''
|
EMPTYSTRING = ''
|
||||||
|
|
||||||
|
|
||||||
|
147
src/gramps.glade
147
src/gramps.glade
@ -4891,7 +4891,7 @@ tories</b></property>
|
|||||||
<property name="spacing">0</property>
|
<property name="spacing">0</property>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkTable" id="table40">
|
<widget class="GtkTable" id="container">
|
||||||
<property name="border_width">12</property>
|
<property name="border_width">12</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="n_rows">10</property>
|
<property name="n_rows">10</property>
|
||||||
@ -15821,7 +15821,7 @@ tories</b></property>
|
|||||||
<child>
|
<child>
|
||||||
<widget class="GtkLabel" id="label247">
|
<widget class="GtkLabel" id="label247">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="label" translatable="yes">C_ounty:</property>
|
<property name="label" translatable="yes">Co_unty:</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="use_markup">False</property>
|
<property name="use_markup">False</property>
|
||||||
<property name="justify">GTK_JUSTIFY_CENTER</property>
|
<property name="justify">GTK_JUSTIFY_CENTER</property>
|
||||||
@ -15853,7 +15853,7 @@ tories</b></property>
|
|||||||
<child>
|
<child>
|
||||||
<widget class="GtkLabel" id="label248">
|
<widget class="GtkLabel" id="label248">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="label" translatable="yes">Co_untry:</property>
|
<property name="label" translatable="yes">Count_ry:</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="use_markup">False</property>
|
<property name="use_markup">False</property>
|
||||||
<property name="justify">GTK_JUSTIFY_CENTER</property>
|
<property name="justify">GTK_JUSTIFY_CENTER</property>
|
||||||
@ -16229,7 +16229,7 @@ tories</b></property>
|
|||||||
<child>
|
<child>
|
||||||
<widget class="GtkLabel" id="label291">
|
<widget class="GtkLabel" id="label291">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="label" translatable="yes">P_hone:</property>
|
<property name="label" translatable="yes">Phon_e:</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="use_markup">False</property>
|
<property name="use_markup">False</property>
|
||||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||||
@ -25317,40 +25317,12 @@ Very High</property>
|
|||||||
<widget class="GtkTable" id="table8">
|
<widget class="GtkTable" id="table8">
|
||||||
<property name="border_width">12</property>
|
<property name="border_width">12</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="n_rows">3</property>
|
<property name="n_rows">2</property>
|
||||||
<property name="n_columns">2</property>
|
<property name="n_columns">2</property>
|
||||||
<property name="homogeneous">False</property>
|
<property name="homogeneous">False</property>
|
||||||
<property name="row_spacing">6</property>
|
<property name="row_spacing">6</property>
|
||||||
<property name="column_spacing">12</property>
|
<property name="column_spacing">12</property>
|
||||||
|
|
||||||
<child>
|
|
||||||
<widget class="GtkLabel" id="label180">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="label" translatable="yes">Path:</property>
|
|
||||||
<property name="use_underline">False</property>
|
|
||||||
<property name="use_markup">False</property>
|
|
||||||
<property name="justify">GTK_JUSTIFY_CENTER</property>
|
|
||||||
<property name="wrap">False</property>
|
|
||||||
<property name="selectable">False</property>
|
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0.5</property>
|
|
||||||
<property name="xpad">0</property>
|
|
||||||
<property name="ypad">0</property>
|
|
||||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
|
||||||
<property name="width_chars">-1</property>
|
|
||||||
<property name="single_line_mode">False</property>
|
|
||||||
<property name="angle">0</property>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">0</property>
|
|
||||||
<property name="right_attach">1</property>
|
|
||||||
<property name="top_attach">1</property>
|
|
||||||
<property name="bottom_attach">2</property>
|
|
||||||
<property name="x_options">fill</property>
|
|
||||||
<property name="y_options"></property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkLabel" id="label181">
|
<widget class="GtkLabel" id="label181">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -25400,8 +25372,8 @@ Very High</property>
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
<property name="right_attach">1</property>
|
<property name="right_attach">1</property>
|
||||||
<property name="top_attach">2</property>
|
<property name="top_attach">1</property>
|
||||||
<property name="bottom_attach">3</property>
|
<property name="bottom_attach">2</property>
|
||||||
<property name="x_options">fill</property>
|
<property name="x_options">fill</property>
|
||||||
<property name="y_options"></property>
|
<property name="y_options"></property>
|
||||||
</packing>
|
</packing>
|
||||||
@ -25435,7 +25407,7 @@ Very High</property>
|
|||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkLabel" id="path">
|
<widget class="GtkLabel" id="type">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="label" translatable="yes"></property>
|
<property name="label" translatable="yes"></property>
|
||||||
<property name="use_underline">False</property>
|
<property name="use_underline">False</property>
|
||||||
@ -25461,34 +25433,6 @@ Very High</property>
|
|||||||
<property name="y_options"></property>
|
<property name="y_options"></property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
|
||||||
<widget class="GtkLabel" id="type">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="label" translatable="yes"></property>
|
|
||||||
<property name="use_underline">False</property>
|
|
||||||
<property name="use_markup">False</property>
|
|
||||||
<property name="justify">GTK_JUSTIFY_CENTER</property>
|
|
||||||
<property name="wrap">False</property>
|
|
||||||
<property name="selectable">False</property>
|
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0.5</property>
|
|
||||||
<property name="xpad">0</property>
|
|
||||||
<property name="ypad">0</property>
|
|
||||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
|
||||||
<property name="width_chars">-1</property>
|
|
||||||
<property name="single_line_mode">False</property>
|
|
||||||
<property name="angle">0</property>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">1</property>
|
|
||||||
<property name="right_attach">2</property>
|
|
||||||
<property name="top_attach">2</property>
|
|
||||||
<property name="bottom_attach">3</property>
|
|
||||||
<property name="x_options">fill</property>
|
|
||||||
<property name="y_options"></property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="padding">0</property>
|
<property name="padding">0</property>
|
||||||
@ -25525,8 +25469,8 @@ Very High</property>
|
|||||||
<widget class="GtkTable" id="table49">
|
<widget class="GtkTable" id="table49">
|
||||||
<property name="border_width">12</property>
|
<property name="border_width">12</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="n_rows">2</property>
|
<property name="n_rows">3</property>
|
||||||
<property name="n_columns">3</property>
|
<property name="n_columns">2</property>
|
||||||
<property name="homogeneous">False</property>
|
<property name="homogeneous">False</property>
|
||||||
<property name="row_spacing">6</property>
|
<property name="row_spacing">6</property>
|
||||||
<property name="column_spacing">6</property>
|
<property name="column_spacing">6</property>
|
||||||
@ -25551,8 +25495,8 @@ Very High</property>
|
|||||||
<property name="angle">0</property>
|
<property name="angle">0</property>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">0</property>
|
||||||
<property name="right_attach">2</property>
|
<property name="right_attach">1</property>
|
||||||
<property name="top_attach">0</property>
|
<property name="top_attach">0</property>
|
||||||
<property name="bottom_attach">1</property>
|
<property name="bottom_attach">1</property>
|
||||||
<property name="x_options">fill</property>
|
<property name="x_options">fill</property>
|
||||||
@ -25573,8 +25517,8 @@ Very High</property>
|
|||||||
<property name="activates_default">False</property>
|
<property name="activates_default">False</property>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">2</property>
|
<property name="left_attach">1</property>
|
||||||
<property name="right_attach">3</property>
|
<property name="right_attach">2</property>
|
||||||
<property name="top_attach">0</property>
|
<property name="top_attach">0</property>
|
||||||
<property name="bottom_attach">1</property>
|
<property name="bottom_attach">1</property>
|
||||||
<property name="y_options"></property>
|
<property name="y_options"></property>
|
||||||
@ -25600,10 +25544,10 @@ Very High</property>
|
|||||||
<property name="angle">0</property>
|
<property name="angle">0</property>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">0</property>
|
||||||
<property name="right_attach">2</property>
|
<property name="right_attach">1</property>
|
||||||
<property name="top_attach">1</property>
|
<property name="top_attach">2</property>
|
||||||
<property name="bottom_attach">2</property>
|
<property name="bottom_attach">3</property>
|
||||||
<property name="x_options">fill</property>
|
<property name="x_options">fill</property>
|
||||||
<property name="y_options"></property>
|
<property name="y_options"></property>
|
||||||
</packing>
|
</packing>
|
||||||
@ -25660,12 +25604,61 @@ Very High</property>
|
|||||||
</child>
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">2</property>
|
<property name="left_attach">1</property>
|
||||||
<property name="right_attach">3</property>
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">2</property>
|
||||||
|
<property name="bottom_attach">3</property>
|
||||||
|
<property name="x_options">fill</property>
|
||||||
|
<property name="y_options">fill</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkLabel" id="label180">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label" translatable="yes">Path:</property>
|
||||||
|
<property name="use_underline">False</property>
|
||||||
|
<property name="use_markup">False</property>
|
||||||
|
<property name="justify">GTK_JUSTIFY_CENTER</property>
|
||||||
|
<property name="wrap">False</property>
|
||||||
|
<property name="selectable">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="yalign">0.5</property>
|
||||||
|
<property name="xpad">0</property>
|
||||||
|
<property name="ypad">0</property>
|
||||||
|
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||||
|
<property name="width_chars">-1</property>
|
||||||
|
<property name="single_line_mode">False</property>
|
||||||
|
<property name="angle">0</property>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="right_attach">1</property>
|
||||||
<property name="top_attach">1</property>
|
<property name="top_attach">1</property>
|
||||||
<property name="bottom_attach">2</property>
|
<property name="bottom_attach">2</property>
|
||||||
<property name="x_options">fill</property>
|
<property name="x_options">fill</property>
|
||||||
<property name="y_options">fill</property>
|
<property name="y_options"></property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkEntry" id="path">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="editable">True</property>
|
||||||
|
<property name="visibility">True</property>
|
||||||
|
<property name="max_length">0</property>
|
||||||
|
<property name="text" translatable="yes"></property>
|
||||||
|
<property name="has_frame">True</property>
|
||||||
|
<property name="invisible_char">*</property>
|
||||||
|
<property name="activates_default">False</property>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">1</property>
|
||||||
|
<property name="bottom_attach">2</property>
|
||||||
|
<property name="y_options"></property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -1086,6 +1086,16 @@ class Gramps(GrampsDBCallback.GrampsDBCallback):
|
|||||||
all.add_rule(GenericFilter.HasTextMatchingRegexpOf([]))
|
all.add_rule(GenericFilter.HasTextMatchingRegexpOf([]))
|
||||||
filter_list.append(all)
|
filter_list.append(all)
|
||||||
|
|
||||||
|
all = GenericFilter.GenericFilter()
|
||||||
|
all.set_name(_("People with notes"))
|
||||||
|
all.add_rule(GenericFilter.HasNote([]))
|
||||||
|
filter_list.append(all)
|
||||||
|
|
||||||
|
all = GenericFilter.ParamFilter()
|
||||||
|
all.set_name(_("People with notes containing..."))
|
||||||
|
all.add_rule(GenericFilter.HasNoteMatchingSubstringOf([]))
|
||||||
|
filter_list.append(all)
|
||||||
|
|
||||||
self.filter_model = GenericFilter.FilterStore(filter_list)
|
self.filter_model = GenericFilter.FilterStore(filter_list)
|
||||||
self.filter_list.set_model(self.filter_model)
|
self.filter_list.set_model(self.filter_model)
|
||||||
self.filter_list.set_active(self.filter_model.default_index())
|
self.filter_list.set_active(self.filter_model.default_index())
|
||||||
@ -1118,7 +1128,14 @@ class Gramps(GrampsDBCallback.GrampsDBCallback):
|
|||||||
import MergePeople
|
import MergePeople
|
||||||
p1 = self.db.get_person_from_handle(mlist[0])
|
p1 = self.db.get_person_from_handle(mlist[0])
|
||||||
p2 = self.db.get_person_from_handle(mlist[1])
|
p2 = self.db.get_person_from_handle(mlist[1])
|
||||||
merger = MergePeople.MergePeopleUI(self.db,p1,p2,self.merge_update)
|
if p1 and p2:
|
||||||
|
merger = MergePeople.MergePeopleUI(self.db,p1,p2,self.merge_update)
|
||||||
|
else:
|
||||||
|
msg = _("Cannot merge people.")
|
||||||
|
msg2 = _("Exactly two people must be selected to perform a merge. "
|
||||||
|
"A second person can be selected by holding down the "
|
||||||
|
"control key while clicking on the desired person.")
|
||||||
|
ErrorDialog(msg,msg2)
|
||||||
elif page == PLACE_VIEW:
|
elif page == PLACE_VIEW:
|
||||||
self.place_view.merge()
|
self.place_view.merge()
|
||||||
elif page == SOURCE_VIEW:
|
elif page == SOURCE_VIEW:
|
||||||
@ -1141,7 +1158,14 @@ class Gramps(GrampsDBCallback.GrampsDBCallback):
|
|||||||
import MergePeople
|
import MergePeople
|
||||||
p1 = self.db.get_person_from_handle(mlist[0])
|
p1 = self.db.get_person_from_handle(mlist[0])
|
||||||
p2 = self.db.get_person_from_handle(mlist[1])
|
p2 = self.db.get_person_from_handle(mlist[1])
|
||||||
merger = MergePeople.Compare(self.db,p1,p2,self.merge_update)
|
if p1 and p2:
|
||||||
|
merger = MergePeople.Compare(self.db,p1,p2,self.merge_update)
|
||||||
|
else:
|
||||||
|
msg = _("Cannot merge people.")
|
||||||
|
msg2 = _("Exactly two people must be selected to perform a merge. "
|
||||||
|
"A second person can be selected by holding down the "
|
||||||
|
"control key while clicking on the desired person.")
|
||||||
|
ErrorDialog(msg,msg2)
|
||||||
elif page == PLACE_VIEW:
|
elif page == PLACE_VIEW:
|
||||||
self.place_view.merge()
|
self.place_view.merge()
|
||||||
elif page == SOURCE_VIEW:
|
elif page == SOURCE_VIEW:
|
||||||
|
@ -82,6 +82,7 @@ def runTool(database,active_person,callback,parent=None):
|
|||||||
|
|
||||||
checker.check_events()
|
checker.check_events()
|
||||||
checker.check_place_references()
|
checker.check_place_references()
|
||||||
|
checker.check_source_references()
|
||||||
database.transaction_commit(trans, _("Check Integrity"))
|
database.transaction_commit(trans, _("Check Integrity"))
|
||||||
database.enable_signals()
|
database.enable_signals()
|
||||||
database.request_rebuild()
|
database.request_rebuild()
|
||||||
@ -115,6 +116,7 @@ class CheckIntegrity:
|
|||||||
self.invalid_birth_events = []
|
self.invalid_birth_events = []
|
||||||
self.invalid_death_events = []
|
self.invalid_death_events = []
|
||||||
self.invalid_place_references = []
|
self.invalid_place_references = []
|
||||||
|
self.invalid_source_references = []
|
||||||
|
|
||||||
def family_errors(self):
|
def family_errors(self):
|
||||||
return len(self.broken_parent_links) + len(self.broken_links) + len(self.empty_family)
|
return len(self.broken_parent_links) + len(self.broken_links) + len(self.empty_family)
|
||||||
@ -429,6 +431,123 @@ class CheckIntegrity:
|
|||||||
self.db.commit_event(event,self.trans)
|
self.db.commit_event(event,self.trans)
|
||||||
self.invalid_place_references.append(key)
|
self.invalid_place_references.append(key)
|
||||||
|
|
||||||
|
def check_source_references(self):
|
||||||
|
known_handles = self.db.get_source_handles()
|
||||||
|
|
||||||
|
cursor = self.db.get_person_cursor()
|
||||||
|
data = cursor.first()
|
||||||
|
while data:
|
||||||
|
handle,info = data
|
||||||
|
person = RelLib.Person()
|
||||||
|
person.unserialize(info)
|
||||||
|
handle_list = person.get_referenced_handles_recursively()
|
||||||
|
bad_handles = [ item[1] for item in handle_list
|
||||||
|
if item[0] == 'Source' and
|
||||||
|
item[1] not in known_handles ]
|
||||||
|
if bad_handles:
|
||||||
|
person.remove_source_references(bad_handles)
|
||||||
|
self.db.commit_person(person,self.trans)
|
||||||
|
new_bad_handles = [handle for handle in bad_handles if handle
|
||||||
|
not in self.invalid_source_references]
|
||||||
|
self.invalid_source_references += new_bad_handles
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
|
cursor = self.db.get_family_cursor()
|
||||||
|
data = cursor.first()
|
||||||
|
while data:
|
||||||
|
handle,info = data
|
||||||
|
family = RelLib.Family()
|
||||||
|
family.unserialize(info)
|
||||||
|
handle_list = family.get_referenced_handles_recursively()
|
||||||
|
bad_handles = [ item[1] for item in handle_list
|
||||||
|
if item[0] == 'Source' and
|
||||||
|
item[1] not in known_handles ]
|
||||||
|
if bad_handles:
|
||||||
|
family.remove_source_references(bad_handles)
|
||||||
|
self.db.commit_family(family,self.trans)
|
||||||
|
new_bad_handles = [handle for handle in bad_handles if handle
|
||||||
|
not in self.invalid_source_references]
|
||||||
|
self.invalid_source_references += new_bad_handles
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
|
cursor = self.db.get_place_cursor()
|
||||||
|
data = cursor.first()
|
||||||
|
while data:
|
||||||
|
handle,info = data
|
||||||
|
place = RelLib.Place()
|
||||||
|
place.unserialize(info)
|
||||||
|
handle_list = place.get_referenced_handles_recursively()
|
||||||
|
bad_handles = [ item[1] for item in handle_list
|
||||||
|
if item[0] == 'Source' and
|
||||||
|
item[1] not in known_handles ]
|
||||||
|
if bad_handles:
|
||||||
|
place.remove_source_references(bad_handles)
|
||||||
|
self.db.commit_family(place,self.trans)
|
||||||
|
new_bad_handles = [handle for handle in bad_handles if handle
|
||||||
|
not in self.invalid_source_references]
|
||||||
|
self.invalid_source_references += new_bad_handles
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
|
cursor = self.db.get_source_cursor()
|
||||||
|
data = cursor.first()
|
||||||
|
while data:
|
||||||
|
handle,info = data
|
||||||
|
source = RelLib.Source()
|
||||||
|
source.unserialize(info)
|
||||||
|
handle_list = source.get_referenced_handles_recursively()
|
||||||
|
bad_handles = [ item[1] for item in handle_list
|
||||||
|
if item[0] == 'Source' and
|
||||||
|
item[1] not in known_handles ]
|
||||||
|
if bad_handles:
|
||||||
|
source.remove_source_references(bad_handles)
|
||||||
|
self.db.commit_source(source,self.trans)
|
||||||
|
new_bad_handles = [handle for handle in bad_handles if handle
|
||||||
|
not in self.invalid_source_references]
|
||||||
|
self.invalid_source_references += new_bad_handles
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
|
cursor = self.db.get_media_cursor()
|
||||||
|
data = cursor.first()
|
||||||
|
while data:
|
||||||
|
handle,info = data
|
||||||
|
obj = RelLib.MediaObject()
|
||||||
|
obj.unserialize(info)
|
||||||
|
handle_list = obj.get_referenced_handles_recursively()
|
||||||
|
bad_handles = [ item[1] for item in handle_list
|
||||||
|
if item[0] == 'Source' and
|
||||||
|
item[1] not in known_handles ]
|
||||||
|
if bad_handles:
|
||||||
|
obj.remove_source_references(bad_handles)
|
||||||
|
self.db.commit_object(obj,self.trans)
|
||||||
|
new_bad_handles = [handle for handle in bad_handles if handle
|
||||||
|
not in self.invalid_source_references]
|
||||||
|
self.invalid_source_references += new_bad_handles
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
|
cursor = self.db.get_event_cursor()
|
||||||
|
data = cursor.first()
|
||||||
|
while data:
|
||||||
|
handle,info = data
|
||||||
|
event = RelLib.Event()
|
||||||
|
event.unserialize(info)
|
||||||
|
handle_list = event.get_referenced_handles_recursively()
|
||||||
|
bad_handles = [ item[1] for item in handle_list
|
||||||
|
if item[0] == 'Source' and
|
||||||
|
item[1] not in known_handles ]
|
||||||
|
if bad_handles:
|
||||||
|
event.remove_source_references(bad_handles)
|
||||||
|
self.db.commit_event(event,self.trans)
|
||||||
|
new_bad_handles = [handle for handle in bad_handles if handle
|
||||||
|
not in self.invalid_source_references]
|
||||||
|
self.invalid_source_references += new_bad_handles
|
||||||
|
data = cursor.next()
|
||||||
|
cursor.close()
|
||||||
|
|
||||||
def build_report(self,cl=0):
|
def build_report(self,cl=0):
|
||||||
bad_photos = len(self.bad_photo)
|
bad_photos = len(self.bad_photo)
|
||||||
replaced_photos = len(self.replaced_photo)
|
replaced_photos = len(self.replaced_photo)
|
||||||
@ -443,8 +562,10 @@ class CheckIntegrity:
|
|||||||
death_invalid = len(self.invalid_death_events)
|
death_invalid = len(self.invalid_death_events)
|
||||||
person = birth_invalid + death_invalid
|
person = birth_invalid + death_invalid
|
||||||
place_references = len(self.invalid_place_references)
|
place_references = len(self.invalid_place_references)
|
||||||
|
source_references = len(self.invalid_source_references)
|
||||||
|
|
||||||
errors = blink + efam + photos + rel + person + event_invalid + place_references
|
errors = blink + efam + photos + rel + person \
|
||||||
|
+ event_invalid + place_references + source_references
|
||||||
|
|
||||||
if errors == 0:
|
if errors == 0:
|
||||||
if cl:
|
if cl:
|
||||||
@ -534,6 +655,10 @@ class CheckIntegrity:
|
|||||||
self.text.write(_("1 place was referenced but not found\n"))
|
self.text.write(_("1 place was referenced but not found\n"))
|
||||||
elif place_references > 1:
|
elif place_references > 1:
|
||||||
self.text.write(_("%d places were referenced, but not found\n") % place_references)
|
self.text.write(_("%d places were referenced, but not found\n") % place_references)
|
||||||
|
if source_references == 1:
|
||||||
|
self.text.write(_("1 source was referenced but not found\n"))
|
||||||
|
elif source_references > 1:
|
||||||
|
self.text.write(_("%d sources were referenced, but not found\n") % source_references)
|
||||||
|
|
||||||
return errors
|
return errors
|
||||||
|
|
||||||
|
65
src/plugins/DumpGenderStats.py
Normal file
65
src/plugins/DumpGenderStats.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2000-2005 Martin Hawlisch, 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
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
"Dump gender stats"
|
||||||
|
|
||||||
|
import gtk
|
||||||
|
import ListModel
|
||||||
|
_GENDER = [ _(u'female'), _(u'male'), _(u'unknown') ]
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def DumpGenderStatsPlugin(database,active_person,callback,parent=None):
|
||||||
|
stats_list = []
|
||||||
|
for name in database.genderStats.stats.keys():
|
||||||
|
stats_list.append((name,)+database.genderStats.stats[name]+(_GENDER[database.genderStats.guess_gender(name)],))
|
||||||
|
|
||||||
|
titles = [(_('Name'),1,100), (_('Male'),2,70),
|
||||||
|
(_('Female'),3,70), ('Unknown',4,70), (_('Guess'),5,70) ]
|
||||||
|
treeview = gtk.TreeView()
|
||||||
|
model = ListModel.ListModel(treeview,titles)
|
||||||
|
for entry in stats_list:
|
||||||
|
model.add(entry,entry[0])
|
||||||
|
w = gtk.Window()
|
||||||
|
w.set_position(gtk.WIN_POS_MOUSE)
|
||||||
|
w.set_default_size(400,300)
|
||||||
|
s=gtk.ScrolledWindow()
|
||||||
|
s.add(treeview)
|
||||||
|
w.add(s)
|
||||||
|
w.show_all()
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from PluginMgr import register_tool
|
||||||
|
|
||||||
|
register_tool(
|
||||||
|
DumpGenderStatsPlugin,
|
||||||
|
_("Dumps gender statistics"),
|
||||||
|
category=_("Debug"),
|
||||||
|
description=_("Will dump the statistics for the gender guessing from the first name.")
|
||||||
|
)
|
@ -2,6 +2,7 @@
|
|||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2004 Martin Hawlisch
|
# Copyright (C) 2004 Martin Hawlisch
|
||||||
|
# Copyright (C) 2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -81,20 +82,29 @@ class CalendarWriterOptionBox:
|
|||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
all.add_rule(GenericFilter.Everyone([]))
|
all.add_rule(GenericFilter.Everyone([]))
|
||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
if person:
|
||||||
des.set_name(_("Descendants of %s") % self.person.get_primary_name().get_name())
|
des = GenericFilter.GenericFilter()
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([self.person.get_handle(),1]))
|
des.set_name(_("Descendants of %s") %
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
|
||||||
ans.set_name(_("Ancestors of %s") % self.person.get_primary_name().get_name())
|
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([self.person.get_handle(),1]))
|
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
|
||||||
com.set_name(_("People with common ancestor with %s") %
|
|
||||||
self.person.get_primary_name().get_name())
|
self.person.get_primary_name().get_name())
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([self.person.get_handle()]))
|
des.add_rule(GenericFilter.IsDescendantOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
|
ans = GenericFilter.GenericFilter()
|
||||||
|
ans.set_name(_("Ancestors of %s") %
|
||||||
|
self.person.get_primary_name().get_name())
|
||||||
|
ans.add_rule(GenericFilter.IsAncestorOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
|
com = GenericFilter.GenericFilter()
|
||||||
|
com.set_name(_("People with common ancestor with %s") %
|
||||||
|
self.person.get_primary_name().get_name())
|
||||||
|
com.add_rule(GenericFilter.HasCommonAncestorWith(
|
||||||
|
[self.person.get_gramps_id()]))
|
||||||
|
|
||||||
|
self.filter_menu = GenericFilter.build_filter_menu(
|
||||||
|
[all,des,ans,com])
|
||||||
|
else:
|
||||||
|
self.filter_menu = GenericFilter.build_filter_menu([all])
|
||||||
filter_obj.set_menu(self.filter_menu)
|
filter_obj.set_menu(self.filter_menu)
|
||||||
|
|
||||||
the_box = self.topDialog.get_widget('vbox1')
|
the_box = self.topDialog.get_widget('vbox1')
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2004 Martin Hawlisch
|
# Copyright (C) 2004 Martin Hawlisch
|
||||||
|
# Copyright (C) 2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -27,7 +28,6 @@
|
|||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
import os
|
import os
|
||||||
import string
|
|
||||||
import time
|
import time
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@ -84,20 +84,29 @@ class CardWriterOptionBox:
|
|||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
all.add_rule(GenericFilter.Everyone([]))
|
all.add_rule(GenericFilter.Everyone([]))
|
||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
if self.person:
|
||||||
des.set_name(_("Descendants of %s") % self.person.get_primary_name().get_name())
|
des = GenericFilter.GenericFilter()
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([self.person.get_handle(),1]))
|
des.set_name(_("Descendants of %s") %
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
|
||||||
ans.set_name(_("Ancestors of %s") % self.person.get_primary_name().get_name())
|
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([self.person.get_handle(),1]))
|
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
|
||||||
com.set_name(_("People with common ancestor with %s") %
|
|
||||||
self.person.get_primary_name().get_name())
|
self.person.get_primary_name().get_name())
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([self.person.get_handle()]))
|
des.add_rule(GenericFilter.IsDescendantOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
|
ans = GenericFilter.GenericFilter()
|
||||||
|
ans.set_name(_("Ancestors of %s") %
|
||||||
|
self.person.get_primary_name().get_name())
|
||||||
|
ans.add_rule(GenericFilter.IsAncestorOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
|
com = GenericFilter.GenericFilter()
|
||||||
|
com.set_name(_("People with common ancestor with %s") %
|
||||||
|
self.person.get_primary_name().get_name())
|
||||||
|
com.add_rule(GenericFilter.HasCommonAncestorWith(
|
||||||
|
[self.person.get_gramps_id()]))
|
||||||
|
|
||||||
|
self.filter_menu = GenericFilter.build_filter_menu(
|
||||||
|
[all,des,ans,com])
|
||||||
|
else:
|
||||||
|
self.filter_menu = GenericFilter.build_filter_menu([all])
|
||||||
filter_obj.set_menu(self.filter_menu)
|
filter_obj.set_menu(self.filter_menu)
|
||||||
|
|
||||||
the_box = self.topDialog.get_widget('vbox1')
|
the_box = self.topDialog.get_widget('vbox1')
|
||||||
|
@ -48,6 +48,7 @@ import Report
|
|||||||
import ReportOptions
|
import ReportOptions
|
||||||
import GenericFilter
|
import GenericFilter
|
||||||
import const
|
import const
|
||||||
|
import RelLib
|
||||||
from BaseDoc import PAPER_LANDSCAPE
|
from BaseDoc import PAPER_LANDSCAPE
|
||||||
from latin_utf8 import utf8_to_latin
|
from latin_utf8 import utf8_to_latin
|
||||||
from QuestionDialog import ErrorDialog
|
from QuestionDialog import ErrorDialog
|
||||||
@ -233,8 +234,8 @@ class GraphViz:
|
|||||||
family = self.database.get_family_from_handle(family_handle)
|
family = self.database.get_family_from_handle(family_handle)
|
||||||
father_handle = family.get_father_handle()
|
father_handle = family.get_father_handle()
|
||||||
mother_handle = family.get_mother_handle()
|
mother_handle = family.get_mother_handle()
|
||||||
fadopted = frel != _("Birth")
|
fadopted = frel != RelLib.Person.CHILD_REL_BIRTH
|
||||||
madopted = mrel != _("Birth")
|
madopted = mrel != RelLib.Person.CHILD_REL_BIRTH
|
||||||
famid = family.get_gramps_id().replace('-','_')
|
famid = family.get_gramps_id().replace('-','_')
|
||||||
if (self.show_families and
|
if (self.show_families and
|
||||||
(father_handle and person_dict.has_key(father_handle) or
|
(father_handle and person_dict.has_key(father_handle) or
|
||||||
@ -504,10 +505,10 @@ class GraphVizOptions(ReportOptions.ReportOptions):
|
|||||||
"""Set up the list of possible content filters."""
|
"""Set up the list of possible content filters."""
|
||||||
if person:
|
if person:
|
||||||
name = person.get_primary_name().get_name()
|
name = person.get_primary_name().get_name()
|
||||||
handle = person.get_handle()
|
gramps_id = person.get_gramps_id()
|
||||||
else:
|
else:
|
||||||
name = 'PERSON'
|
name = 'PERSON'
|
||||||
handle = ''
|
gramps_id = ''
|
||||||
|
|
||||||
all = GenericFilter.GenericFilter()
|
all = GenericFilter.GenericFilter()
|
||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
@ -515,15 +516,15 @@ class GraphVizOptions(ReportOptions.ReportOptions):
|
|||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
des = GenericFilter.GenericFilter()
|
||||||
des.set_name(_("Descendants of %s") % name)
|
des.set_name(_("Descendants of %s") % name)
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([handle,1]))
|
des.add_rule(GenericFilter.IsDescendantOf([gramps_id,1]))
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
ans = GenericFilter.GenericFilter()
|
||||||
ans.set_name(_("Ancestors of %s") % name)
|
ans.set_name(_("Ancestors of %s") % name)
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([handle,1]))
|
ans.add_rule(GenericFilter.IsAncestorOf([gramps_id,1]))
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
com = GenericFilter.GenericFilter()
|
||||||
com.set_name(_("People with common ancestor with %s") % name)
|
com.set_name(_("People with common ancestor with %s") % name)
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([handle]))
|
com.add_rule(GenericFilter.HasCommonAncestorWith([gramps_id]))
|
||||||
|
|
||||||
return [all,des,ans,com]
|
return [all,des,ans,com]
|
||||||
|
|
||||||
|
@ -497,14 +497,14 @@ class IndivCompleteOptions(ReportOptions.ReportOptions):
|
|||||||
"""Set up the list of possible content filters."""
|
"""Set up the list of possible content filters."""
|
||||||
if person:
|
if person:
|
||||||
name = person.get_primary_name().get_name()
|
name = person.get_primary_name().get_name()
|
||||||
handle = person.get_handle()
|
gramps_id = person.get_gramps_id()
|
||||||
else:
|
else:
|
||||||
name = 'PERSON'
|
name = 'PERSON'
|
||||||
handle = ''
|
gramps_id = ''
|
||||||
|
|
||||||
filt_id = GenericFilter.GenericFilter()
|
filt_id = GenericFilter.GenericFilter()
|
||||||
filt_id.set_name(name)
|
filt_id.set_name(name)
|
||||||
filt_id.add_rule(GenericFilter.HasIdOf([handle]))
|
filt_id.add_rule(GenericFilter.HasIdOf([gramps_id]))
|
||||||
|
|
||||||
all = GenericFilter.GenericFilter()
|
all = GenericFilter.GenericFilter()
|
||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
@ -512,15 +512,15 @@ class IndivCompleteOptions(ReportOptions.ReportOptions):
|
|||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
des = GenericFilter.GenericFilter()
|
||||||
des.set_name(_("Descendants of %s") % name)
|
des.set_name(_("Descendants of %s") % name)
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([handle,1]))
|
des.add_rule(GenericFilter.IsDescendantOf([gramps_id,1]))
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
ans = GenericFilter.GenericFilter()
|
||||||
ans.set_name(_("Ancestors of %s") % name)
|
ans.set_name(_("Ancestors of %s") % name)
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([handle,1]))
|
ans.add_rule(GenericFilter.IsAncestorOf([gramps_id,1]))
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
com = GenericFilter.GenericFilter()
|
||||||
com.set_name(_("People with common ancestor with %s") % name)
|
com.set_name(_("People with common ancestor with %s") % name)
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([handle]))
|
com.add_rule(GenericFilter.HasCommonAncestorWith([gramps_id]))
|
||||||
|
|
||||||
return [filt_id,all,des,ans,com]
|
return [filt_id,all,des,ans,com]
|
||||||
|
|
||||||
|
@ -21,6 +21,8 @@ pkgdata_PYTHON = \
|
|||||||
DetAncestralReport.py\
|
DetAncestralReport.py\
|
||||||
DetDescendantReport.py\
|
DetDescendantReport.py\
|
||||||
EventCmp.py\
|
EventCmp.py\
|
||||||
|
ExportVCalendar.py\
|
||||||
|
ExportVCard.py\
|
||||||
FamilyGroup.py\
|
FamilyGroup.py\
|
||||||
FanChart.py\
|
FanChart.py\
|
||||||
FtmStyleAncestors.py\
|
FtmStyleAncestors.py\
|
||||||
@ -29,6 +31,7 @@ pkgdata_PYTHON = \
|
|||||||
GraphViz.py\
|
GraphViz.py\
|
||||||
IndivComplete.py\
|
IndivComplete.py\
|
||||||
IndivSummary.py\
|
IndivSummary.py\
|
||||||
|
ImportvCard.py\
|
||||||
Merge.py\
|
Merge.py\
|
||||||
PatchNames.py\
|
PatchNames.py\
|
||||||
ReadPkg.py\
|
ReadPkg.py\
|
||||||
@ -81,7 +84,9 @@ GLADEFILES = \
|
|||||||
book.glade\
|
book.glade\
|
||||||
writeftree.glade\
|
writeftree.glade\
|
||||||
genewebexport.glade\
|
genewebexport.glade\
|
||||||
scratchpad.glade
|
scratchpad.glade\
|
||||||
|
vcardexport.glade\
|
||||||
|
vcalendarexport.glade
|
||||||
|
|
||||||
GRAPHICS = \
|
GRAPHICS = \
|
||||||
stock_link.png
|
stock_link.png
|
||||||
|
@ -135,7 +135,7 @@ class BasePage:
|
|||||||
of.write('<br>\n')
|
of.write('<br>\n')
|
||||||
of.write('<br>\n')
|
of.write('<br>\n')
|
||||||
of.write('<hr>\n')
|
of.write('<hr>\n')
|
||||||
of.write('<div class="footer">Generated by ')
|
of.write('<div class="footer">%s ' % _('Generated by'))
|
||||||
of.write('<a href="http://gramps.sourceforge.net">GRAMPS</a> ')
|
of.write('<a href="http://gramps.sourceforge.net">GRAMPS</a> ')
|
||||||
of.write('on 13 December 2004.')
|
of.write('on 13 December 2004.')
|
||||||
of.write('</div>\n')
|
of.write('</div>\n')
|
||||||
@ -159,14 +159,14 @@ class BasePage:
|
|||||||
of.write(' <h1 class="navtitle">%s</h1>\n' % self.title_str)
|
of.write(' <h1 class="navtitle">%s</h1>\n' % self.title_str)
|
||||||
of.write(' <hr>\n')
|
of.write(' <hr>\n')
|
||||||
of.write(' <div class="nav">\n')
|
of.write(' <div class="nav">\n')
|
||||||
of.write(' <a href="index.html">Home</a> \n')
|
of.write(' <a href="index.html">%s</a> \n' % _('Home'))
|
||||||
of.write(' <a href="introduction.html">Introduction</a> \n')
|
of.write(' <a href="introduction.html">%s</a> \n' % _('Introduction'))
|
||||||
of.write(' <a href="surnames.html">Surnames</a> \n')
|
of.write(' <a href="surnames.html">%s</a> \n' % _('Surnames'))
|
||||||
of.write(' <a href="individuals.html">Individuals</a> \n')
|
of.write(' <a href="individuals.html">%s</a> \n' % _('Individuals'))
|
||||||
of.write(' <a href="sources.html">Sources</a> \n')
|
of.write(' <a href="sources.html">%s</a> \n' % _('Sources'))
|
||||||
of.write(' <a href="places.html">Places</a> \n')
|
of.write(' <a href="places.html">%s</a> \n' % _('Places'))
|
||||||
of.write(' <a href="download.html">Download</a> \n')
|
of.write(' <a href="download.html">%s</a> \n' % _('Download'))
|
||||||
of.write(' <a href="contact.html">Contact</a> \n')
|
of.write(' <a href="contact.html">%s</a> \n' % _('Contact'))
|
||||||
of.write(' </div>\n')
|
of.write(' </div>\n')
|
||||||
of.write(' </div>\n')
|
of.write(' </div>\n')
|
||||||
|
|
||||||
@ -255,9 +255,9 @@ class PlaceListPage(BasePage):
|
|||||||
|
|
||||||
for handle in handle_list:
|
for handle in handle_list:
|
||||||
place = db.get_place_from_handle(handle)
|
place = db.get_place_from_handle(handle)
|
||||||
n = place.title
|
n = ReportUtils.place_name(db,handle)
|
||||||
|
|
||||||
if len(n) == 0:
|
if not n or len(n) == 0:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if n[0] != last_letter:
|
if n[0] != last_letter:
|
||||||
@ -274,7 +274,7 @@ class PlaceListPage(BasePage):
|
|||||||
of.write('<tr><td class="category"> </td>')
|
of.write('<tr><td class="category"> </td>')
|
||||||
of.write('<td class="data">')
|
of.write('<td class="data">')
|
||||||
of.write(n)
|
of.write(n)
|
||||||
of.write(' <sup><a href="%s">' % place.gramps_id)
|
of.write(' <sup><a href="%s.html">' % place.gramps_id)
|
||||||
of.write('[%s]' % place.gramps_id)
|
of.write('[%s]' % place.gramps_id)
|
||||||
of.write('</a></sup></td></tr>')
|
of.write('</a></sup></td></tr>')
|
||||||
|
|
||||||
@ -282,6 +282,58 @@ class PlaceListPage(BasePage):
|
|||||||
self.display_footer(of)
|
self.display_footer(of)
|
||||||
of.close()
|
of.close()
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#------------------------------------------------------------------------
|
||||||
|
class PlacePage(BasePage):
|
||||||
|
|
||||||
|
def __init__(self, db, title, place_handle, html_dir, src_list):
|
||||||
|
place = db.get_place_from_handle( place_handle)
|
||||||
|
BasePage.__init__(self,title)
|
||||||
|
page_name = os.path.join(html_dir,place.get_gramps_id()+".html")
|
||||||
|
of = open(page_name, "w")
|
||||||
|
place_name = ReportUtils.place_name(db,place_handle)
|
||||||
|
self.display_header(of,place_name,
|
||||||
|
db.get_researcher().get_name())
|
||||||
|
of.write('<h3>%s</h3>\n' % place_name)
|
||||||
|
|
||||||
|
photolist = place.get_media_list()
|
||||||
|
if photolist:
|
||||||
|
photo_handle = photolist[0].get_reference_handle()
|
||||||
|
photo = db.get_object_from_handle(photo_handle)
|
||||||
|
|
||||||
|
try:
|
||||||
|
newpath = photo.gramps_id + os.path.splitext(photo.get_path())[1]
|
||||||
|
shutil.copyfile(photo.get_path(),os.path.join(html_dir,newpath))
|
||||||
|
of.write('<div class="snapshot">\n')
|
||||||
|
of.write('<a href="%s">' % newpath)
|
||||||
|
of.write('<img class="thumbnail" border="0" src="%s" ' % newpath)
|
||||||
|
of.write('height="100"></a>')
|
||||||
|
of.write('</div>\n')
|
||||||
|
except (IOError,OSError),msg:
|
||||||
|
ErrorDialog(str(msg))
|
||||||
|
|
||||||
|
# TODO: Add more information
|
||||||
|
|
||||||
|
of.write('<h4>%s</h4>\n' % _('Narrative'))
|
||||||
|
of.write('<hr>\n')
|
||||||
|
|
||||||
|
noteobj = place.get_note_object()
|
||||||
|
if noteobj:
|
||||||
|
format = noteobj.get_format()
|
||||||
|
text = noteobj.get()
|
||||||
|
|
||||||
|
if format:
|
||||||
|
text = "<pre>" + "<br>".join(text.split("\n"))
|
||||||
|
else:
|
||||||
|
text = "</p><p>".join(text.split("\n"))
|
||||||
|
of.write('<p>%s</p>\n' % text)
|
||||||
|
|
||||||
|
self.display_footer(of)
|
||||||
|
of.close()
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@ -403,13 +455,16 @@ class HomePage(BasePage):
|
|||||||
else:
|
else:
|
||||||
mime_type = obj.get_mime_type()
|
mime_type = obj.get_mime_type()
|
||||||
if mime_type and mime_type.startswith("image"):
|
if mime_type and mime_type.startswith("image"):
|
||||||
newpath = obj.gramps_id + os.path.splitext(obj.get_path())[1]
|
try:
|
||||||
shutil.copyfile(obj.get_path(),
|
newpath = obj.gramps_id + os.path.splitext(obj.get_path())[1]
|
||||||
os.path.join(html_dir,newpath))
|
shutil.copyfile(obj.get_path(),
|
||||||
of.write('<div align="center">\n')
|
os.path.join(html_dir,newpath))
|
||||||
of.write('<img border="0" ')
|
of.write('<div align="center">\n')
|
||||||
of.write('src="%s" />' % newpath)
|
of.write('<img border="0" ')
|
||||||
of.write('</div>\n')
|
of.write('src="%s" />' % newpath)
|
||||||
|
of.write('</div>\n')
|
||||||
|
except (IOError,OSError),msg:
|
||||||
|
ErrorDialog(str(msg))
|
||||||
|
|
||||||
note_obj = obj.get_note_object()
|
note_obj = obj.get_note_object()
|
||||||
if note_obj:
|
if note_obj:
|
||||||
@ -447,9 +502,12 @@ class SourcesPage(BasePage):
|
|||||||
|
|
||||||
index = 1
|
index = 1
|
||||||
for handle in handle_list:
|
for handle in handle_list:
|
||||||
|
source = db.get_source_from_handle(handle)
|
||||||
of.write('<tr><td class="category">%d.</td>\n' % index)
|
of.write('<tr><td class="category">%d.</td>\n' % index)
|
||||||
of.write('<td class="data">')
|
of.write('<td class="data">')
|
||||||
|
of.write(source.get_title())
|
||||||
of.write('</td></tr>\n')
|
of.write('</td></tr>\n')
|
||||||
|
index += 1
|
||||||
|
|
||||||
of.write('</table>\n<blockquote>\n')
|
of.write('</table>\n<blockquote>\n')
|
||||||
|
|
||||||
@ -615,13 +673,16 @@ class IndividualPage(BasePage):
|
|||||||
photo_handle = photolist[0].get_reference_handle()
|
photo_handle = photolist[0].get_reference_handle()
|
||||||
photo = self.db.get_object_from_handle(photo_handle)
|
photo = self.db.get_object_from_handle(photo_handle)
|
||||||
|
|
||||||
newpath = self.person.gramps_id + os.path.splitext(photo.get_path())[1]
|
try:
|
||||||
shutil.copyfile(photo.get_path(),os.path.join(self.dirpath,newpath))
|
newpath = self.person.gramps_id + os.path.splitext(photo.get_path())[1]
|
||||||
of.write('<div class="snapshot">\n')
|
shutil.copyfile(photo.get_path(),os.path.join(self.dirpath,newpath))
|
||||||
of.write('<a href="%s">' % newpath)
|
of.write('<div class="snapshot">\n')
|
||||||
of.write('<img class="thumbnail" border="0" src="%s" ' % newpath)
|
of.write('<a href="%s">' % newpath)
|
||||||
of.write('height="100"></a>')
|
of.write('<img class="thumbnail" border="0" src="%s" ' % newpath)
|
||||||
of.write('</div>\n')
|
of.write('height="100"></a>')
|
||||||
|
of.write('</div>\n')
|
||||||
|
except (IOError,OSError),msg:
|
||||||
|
ErrorDialog(str(msg))
|
||||||
|
|
||||||
of.write('<div class="summaryarea">\n')
|
of.write('<div class="summaryarea">\n')
|
||||||
of.write('<h3>%s</h3>\n' % self.sort_name)
|
of.write('<h3>%s</h3>\n' % self.sort_name)
|
||||||
@ -819,6 +880,8 @@ class IndividualPage(BasePage):
|
|||||||
of.write('</blockquote>\n')
|
of.write('</blockquote>\n')
|
||||||
|
|
||||||
def format_event(self,event):
|
def format_event(self,event):
|
||||||
|
for sref in event.get_source_references():
|
||||||
|
self.src_list.add(sref.get_base_handle())
|
||||||
descr = event.get_description()
|
descr = event.get_description()
|
||||||
place_handle = event.get_place_handle()
|
place_handle = event.get_place_handle()
|
||||||
if place_handle:
|
if place_handle:
|
||||||
@ -994,6 +1057,11 @@ class WebReport(Report.Report):
|
|||||||
|
|
||||||
PlaceListPage(self.database, self.title, place_list,
|
PlaceListPage(self.database, self.title, place_list,
|
||||||
dir_name, source_list)
|
dir_name, source_list)
|
||||||
|
|
||||||
|
for place in place_list:
|
||||||
|
print place
|
||||||
|
PlacePage(self.database, self.title, place, dir_name, source_list)
|
||||||
|
|
||||||
SourcesPage(self.database,self.title, source_list, dir_name)
|
SourcesPage(self.database,self.title, source_list, dir_name)
|
||||||
self.progress_bar_done()
|
self.progress_bar_done()
|
||||||
|
|
||||||
@ -1031,7 +1099,7 @@ class WebReportOptions(ReportOptions.ReportOptions):
|
|||||||
'HTMLsplita' : 0,
|
'HTMLsplita' : 0,
|
||||||
'HTMLshorttree' : 1,
|
'HTMLshorttree' : 1,
|
||||||
'HTMLimagedir' : 'images',
|
'HTMLimagedir' : 'images',
|
||||||
'HTMLtitle' : 'My Family Tree',
|
'HTMLtitle' : _('My Family Tree'),
|
||||||
'HTMLincid' : 0,
|
'HTMLincid' : 0,
|
||||||
'HTMLidurl' : '',
|
'HTMLidurl' : '',
|
||||||
'HTMLlinktidx' : 1,
|
'HTMLlinktidx' : 1,
|
||||||
@ -1058,10 +1126,10 @@ class WebReportOptions(ReportOptions.ReportOptions):
|
|||||||
"""Set up the list of possible content filters."""
|
"""Set up the list of possible content filters."""
|
||||||
if person:
|
if person:
|
||||||
name = person.get_primary_name().get_name()
|
name = person.get_primary_name().get_name()
|
||||||
handle = person.get_handle()
|
gramps_id = person.get_gramps_id()
|
||||||
else:
|
else:
|
||||||
name = 'PERSON'
|
name = 'PERSON'
|
||||||
handle = ''
|
gramps_is = ''
|
||||||
|
|
||||||
all = GenericFilter.GenericFilter()
|
all = GenericFilter.GenericFilter()
|
||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
@ -1069,19 +1137,19 @@ class WebReportOptions(ReportOptions.ReportOptions):
|
|||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
des = GenericFilter.GenericFilter()
|
||||||
des.set_name(_("Descendants of %s") % name)
|
des.set_name(_("Descendants of %s") % name)
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([handle,1]))
|
des.add_rule(GenericFilter.IsDescendantOf([gramps_id,1]))
|
||||||
|
|
||||||
df = GenericFilter.GenericFilter()
|
df = GenericFilter.GenericFilter()
|
||||||
df.set_name(_("Descendant Families of %s") % name)
|
df.set_name(_("Descendant Families of %s") % name)
|
||||||
df.add_rule(GenericFilter.IsDescendantFamilyOf([handle]))
|
df.add_rule(GenericFilter.IsDescendantFamilyOf([gramps_id]))
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
ans = GenericFilter.GenericFilter()
|
||||||
ans.set_name(_("Ancestors of %s") % name)
|
ans.set_name(_("Ancestors of %s") % name)
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([handle,1]))
|
ans.add_rule(GenericFilter.IsAncestorOf([gramps_id,1]))
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
com = GenericFilter.GenericFilter()
|
||||||
com.set_name(_("People with common ancestor with %s") % name)
|
com.set_name(_("People with common ancestor with %s") % name)
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([handle]))
|
com.add_rule(GenericFilter.HasCommonAncestorWith([gramps_id]))
|
||||||
|
|
||||||
return [all,des,df,ans,com]
|
return [all,des,df,ans,com]
|
||||||
|
|
||||||
|
@ -818,10 +818,10 @@ class StatisticsChartOptions(ReportOptions.ReportOptions):
|
|||||||
|
|
||||||
if person:
|
if person:
|
||||||
name = person.get_primary_name().get_name()
|
name = person.get_primary_name().get_name()
|
||||||
handle = person.get_handle()
|
gramps_id = person.get_gramps_id()
|
||||||
else:
|
else:
|
||||||
name = 'PERSON'
|
name = 'PERSON'
|
||||||
handle = ''
|
gramps_id = ''
|
||||||
|
|
||||||
all = GenericFilter.GenericFilter()
|
all = GenericFilter.GenericFilter()
|
||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
@ -829,15 +829,15 @@ class StatisticsChartOptions(ReportOptions.ReportOptions):
|
|||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
des = GenericFilter.GenericFilter()
|
||||||
des.set_name(_("Descendants of %s") % name)
|
des.set_name(_("Descendants of %s") % name)
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([handle, 1]))
|
des.add_rule(GenericFilter.IsDescendantOf([gramps_id, 1]))
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
ans = GenericFilter.GenericFilter()
|
||||||
ans.set_name(_("Ancestors of %s") % name)
|
ans.set_name(_("Ancestors of %s") % name)
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([handle, 1]))
|
ans.add_rule(GenericFilter.IsAncestorOf([gramps_id, 1]))
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
com = GenericFilter.GenericFilter()
|
||||||
com.set_name(_("People with common ancestor with %s") % name)
|
com.set_name(_("People with common ancestor with %s") % name)
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([handle]))
|
com.add_rule(GenericFilter.HasCommonAncestorWith([gramps_id]))
|
||||||
|
|
||||||
return [all, des, ans, com]
|
return [all, des, ans, com]
|
||||||
|
|
||||||
@ -865,10 +865,14 @@ class StatisticsChartOptions(ReportOptions.ReportOptions):
|
|||||||
self.reverse.show()
|
self.reverse.show()
|
||||||
|
|
||||||
# year range
|
# year range
|
||||||
self.from_box = gtk.Entry(4)
|
from_adj = gtk.Adjustment(value=self.options_dict['year_from'],
|
||||||
self.from_box.set_text(str(self.options_dict['year_from']))
|
lower=1, upper=time.localtime()[0],
|
||||||
self.to_box = gtk.Entry(4)
|
step_incr=1, page_incr=100)
|
||||||
self.to_box.set_text(str(self.options_dict['year_to']))
|
self.from_box = gtk.SpinButton(adjustment=from_adj, digits=0)
|
||||||
|
to_adj = gtk.Adjustment(value=self.options_dict['year_to'],
|
||||||
|
lower=1, upper=time.localtime()[0],
|
||||||
|
step_incr=1, page_incr=100)
|
||||||
|
self.to_box = gtk.SpinButton(adjustment=to_adj, digits=0)
|
||||||
|
|
||||||
box = gtk.HBox()
|
box = gtk.HBox()
|
||||||
box.add(self.from_box)
|
box.add(self.from_box)
|
||||||
@ -897,8 +901,9 @@ class StatisticsChartOptions(ReportOptions.ReportOptions):
|
|||||||
|
|
||||||
# max. pie item selection
|
# max. pie item selection
|
||||||
tip = _("With fewer items pie chart and legend will be used instead of a bar chart.")
|
tip = _("With fewer items pie chart and legend will be used instead of a bar chart.")
|
||||||
self.bar_items = gtk.Entry(2)
|
pie_adj = gtk.Adjustment(value=self.options_dict['bar_items'],
|
||||||
self.bar_items.set_text(str(self.options_dict['bar_items']))
|
lower=0, upper=20, step_incr=1)
|
||||||
|
self.bar_items = gtk.SpinButton(adjustment=pie_adj, digits=0)
|
||||||
dialog.add_option(_("Max. items for a pie"), self.bar_items, tip)
|
dialog.add_option(_("Max. items for a pie"), self.bar_items, tip)
|
||||||
|
|
||||||
# -------------------------------------------------
|
# -------------------------------------------------
|
||||||
@ -933,11 +938,11 @@ class StatisticsChartOptions(ReportOptions.ReportOptions):
|
|||||||
"""
|
"""
|
||||||
self.options_dict['sortby'] = _options.sorts[self.sort_menu.get_active()][0]
|
self.options_dict['sortby'] = _options.sorts[self.sort_menu.get_active()][0]
|
||||||
self.options_dict['reverse'] = int(self.reverse.get_active())
|
self.options_dict['reverse'] = int(self.reverse.get_active())
|
||||||
self.options_dict['year_to'] = int(self.to_box.get_text())
|
self.options_dict['year_to'] = int(self.to_box.get_value_as_int())
|
||||||
self.options_dict['year_from'] = int(self.from_box.get_text())
|
self.options_dict['year_from'] = int(self.from_box.get_value_as_int())
|
||||||
self.options_dict['no_years'] = int(self.no_years.get_active())
|
self.options_dict['no_years'] = int(self.no_years.get_active())
|
||||||
self.options_dict['gender'] = _options.genders[self.gender_menu.get_active()][0]
|
self.options_dict['gender'] = _options.genders[self.gender_menu.get_active()][0]
|
||||||
self.options_dict['bar_items'] = int(self.bar_items.get_text())
|
self.options_dict['bar_items'] = int(self.bar_items.get_value_as_int())
|
||||||
for key in _Extract.extractors:
|
for key in _Extract.extractors:
|
||||||
self.options_dict[key] = int(self.charts[key].get_active())
|
self.options_dict[key] = int(self.charts[key].get_active())
|
||||||
|
|
||||||
|
@ -402,10 +402,10 @@ class TimeLineOptions(ReportOptions.ReportOptions):
|
|||||||
"""Set up the list of possible content filters."""
|
"""Set up the list of possible content filters."""
|
||||||
if person:
|
if person:
|
||||||
name = person.get_primary_name().get_name()
|
name = person.get_primary_name().get_name()
|
||||||
handle = person.get_handle()
|
gramps_id = person.get_gramps_id()
|
||||||
else:
|
else:
|
||||||
name = 'PERSON'
|
name = 'PERSON'
|
||||||
handle = ''
|
gramps_id = ''
|
||||||
|
|
||||||
all = GenericFilter.GenericFilter()
|
all = GenericFilter.GenericFilter()
|
||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
@ -413,15 +413,15 @@ class TimeLineOptions(ReportOptions.ReportOptions):
|
|||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
des = GenericFilter.GenericFilter()
|
||||||
des.set_name(_("Descendants of %s") % name)
|
des.set_name(_("Descendants of %s") % name)
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([handle,1]))
|
des.add_rule(GenericFilter.IsDescendantOf([gramps_id,1]))
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
ans = GenericFilter.GenericFilter()
|
||||||
ans.set_name(_("Ancestors of %s") % name)
|
ans.set_name(_("Ancestors of %s") % name)
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([handle,1]))
|
ans.add_rule(GenericFilter.IsAncestorOf([gramps_id,1]))
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
com = GenericFilter.GenericFilter()
|
||||||
com.set_name(_("People with common ancestor with %s") % name)
|
com.set_name(_("People with common ancestor with %s") % name)
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([handle]))
|
com.add_rule(GenericFilter.HasCommonAncestorWith([gramps_id]))
|
||||||
|
|
||||||
return [all,des,ans,com]
|
return [all,des,ans,com]
|
||||||
|
|
||||||
|
@ -715,12 +715,24 @@ class IndividualPage:
|
|||||||
self.doc.write_text(_("Siblings"))
|
self.doc.write_text(_("Siblings"))
|
||||||
self.doc.end_paragraph()
|
self.doc.end_paragraph()
|
||||||
|
|
||||||
self.doc.start_table("three","IndTable")
|
self.doc.start_table("four","IndTable")
|
||||||
|
self.doc.start_row()
|
||||||
|
self.doc.start_cell("NormalCell")
|
||||||
|
self.doc.start_paragraph("Label")
|
||||||
|
self.doc.write_text(_("Siblings"))
|
||||||
|
self.doc.end_paragraph()
|
||||||
|
self.doc.end_cell()
|
||||||
|
|
||||||
|
self.doc.start_cell("NormalCell")
|
||||||
|
first = True
|
||||||
for child_handle in all_sisters:
|
for child_handle in all_sisters:
|
||||||
child = self.db.get_person_from_handle(child_handle)
|
child = self.db.get_person_from_handle(child_handle)
|
||||||
self.doc.start_paragraph("Data")
|
|
||||||
name = child.get_primary_name().get_regular_name()
|
name = child.get_primary_name().get_regular_name()
|
||||||
|
if first:
|
||||||
|
self.doc.start_paragraph("Data")
|
||||||
|
first = False
|
||||||
|
else:
|
||||||
|
self.doc.write_text('\n')
|
||||||
if self.person.get_handle() == child_handle:
|
if self.person.get_handle() == child_handle:
|
||||||
self.doc.write_text(name)
|
self.doc.write_text(name)
|
||||||
elif self.list.has_key(child_handle):
|
elif self.list.has_key(child_handle):
|
||||||
@ -729,8 +741,12 @@ class IndividualPage:
|
|||||||
self.doc.end_link()
|
self.doc.end_link()
|
||||||
else:
|
else:
|
||||||
self.doc.write_text(name)
|
self.doc.write_text(name)
|
||||||
|
if not first:
|
||||||
self.doc.end_paragraph()
|
self.doc.end_paragraph()
|
||||||
|
|
||||||
|
self.doc.end_cell()
|
||||||
|
self.doc.end_row()
|
||||||
|
self.doc.end_table()
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -1093,7 +1109,7 @@ class WebReport(Report.Report):
|
|||||||
|
|
||||||
def write_report(self):
|
def write_report(self):
|
||||||
dir_name = self.target_path
|
dir_name = self.target_path
|
||||||
if dir_name == None:
|
if not dir_name:
|
||||||
dir_name = os.getcwd()
|
dir_name = os.getcwd()
|
||||||
elif not os.path.isdir(dir_name):
|
elif not os.path.isdir(dir_name):
|
||||||
parent_dir = os.path.dirname(dir_name)
|
parent_dir = os.path.dirname(dir_name)
|
||||||
@ -1256,10 +1272,10 @@ class WebReportOptions(ReportOptions.ReportOptions):
|
|||||||
"""Set up the list of possible content filters."""
|
"""Set up the list of possible content filters."""
|
||||||
if person:
|
if person:
|
||||||
name = person.get_primary_name().get_name()
|
name = person.get_primary_name().get_name()
|
||||||
handle = person.get_handle()
|
gramps_id = person.get_gramps_id()
|
||||||
else:
|
else:
|
||||||
name = 'PERSON'
|
name = 'PERSON'
|
||||||
handle = ''
|
gramps_id = ''
|
||||||
|
|
||||||
all = GenericFilter.GenericFilter()
|
all = GenericFilter.GenericFilter()
|
||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
@ -1267,19 +1283,19 @@ class WebReportOptions(ReportOptions.ReportOptions):
|
|||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
des = GenericFilter.GenericFilter()
|
||||||
des.set_name(_("Descendants of %s") % name)
|
des.set_name(_("Descendants of %s") % name)
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([handle,1]))
|
des.add_rule(GenericFilter.IsDescendantOf([gramps_id,1]))
|
||||||
|
|
||||||
df = GenericFilter.GenericFilter()
|
df = GenericFilter.GenericFilter()
|
||||||
df.set_name(_("Descendant Families of %s") % name)
|
df.set_name(_("Descendant Families of %s") % name)
|
||||||
df.add_rule(GenericFilter.IsDescendantFamilyOf([handle]))
|
df.add_rule(GenericFilter.IsDescendantFamilyOf([gramps_id]))
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
ans = GenericFilter.GenericFilter()
|
||||||
ans.set_name(_("Ancestors of %s") % name)
|
ans.set_name(_("Ancestors of %s") % name)
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([handle,1]))
|
ans.add_rule(GenericFilter.IsAncestorOf([gramps_id,1]))
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
com = GenericFilter.GenericFilter()
|
||||||
com.set_name(_("People with common ancestor with %s") % name)
|
com.set_name(_("People with common ancestor with %s") % name)
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([handle]))
|
com.add_rule(GenericFilter.HasCommonAncestorWith([gramps_id]))
|
||||||
|
|
||||||
return [all,des,df,ans,com]
|
return [all,des,df,ans,com]
|
||||||
|
|
||||||
|
@ -86,20 +86,28 @@ class FtreeWriterOptionBox:
|
|||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
all.add_rule(GenericFilter.Everyone([]))
|
all.add_rule(GenericFilter.Everyone([]))
|
||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
if self.person:
|
||||||
des.set_name(_("Descendants of %s") % self.person.get_primary_name().get_name())
|
des = GenericFilter.GenericFilter()
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([self.person.get_handle(),1]))
|
des.set_name(_("Descendants of %s") %
|
||||||
|
self.person.get_primary_name().get_name())
|
||||||
|
des.add_rule(GenericFilter.IsDescendantOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
ans = GenericFilter.GenericFilter()
|
||||||
ans.set_name(_("Ancestors of %s") % self.person.get_primary_name().get_name())
|
ans.set_name(_("Ancestors of %s")
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([self.person.get_handle(),1]))
|
% self.person.get_primary_name().get_name())
|
||||||
|
ans.add_rule(GenericFilter.IsAncestorOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
com = GenericFilter.GenericFilter()
|
||||||
com.set_name(_("People with common ancestor with %s") %
|
com.set_name(_("People with common ancestor with %s") %
|
||||||
self.person.get_primary_name().get_name())
|
self.person.get_primary_name().get_name())
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([self.person.get_handle()]))
|
com.add_rule(GenericFilter.HasCommonAncestorWith(
|
||||||
|
[self.person.get_gramps_id()]))
|
||||||
|
|
||||||
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
|
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
|
||||||
|
else:
|
||||||
|
self.filter_menu = GenericFilter.build_filter_menu([all])
|
||||||
filter_obj.set_menu(self.filter_menu)
|
filter_obj.set_menu(self.filter_menu)
|
||||||
|
|
||||||
the_box = self.top.get_widget("vbox1")
|
the_box = self.top.get_widget("vbox1")
|
||||||
|
@ -87,20 +87,29 @@ class GeneWebWriterOptionBox:
|
|||||||
all.set_name(_("Entire Database"))
|
all.set_name(_("Entire Database"))
|
||||||
all.add_rule(GenericFilter.Everyone([]))
|
all.add_rule(GenericFilter.Everyone([]))
|
||||||
|
|
||||||
des = GenericFilter.GenericFilter()
|
if self.person:
|
||||||
des.set_name(_("Descendants of %s") % self.person.get_primary_name().get_name())
|
des = GenericFilter.GenericFilter()
|
||||||
des.add_rule(GenericFilter.IsDescendantOf([self.person.get_handle(),1]))
|
des.set_name(_("Descendants of %s") %
|
||||||
|
|
||||||
ans = GenericFilter.GenericFilter()
|
|
||||||
ans.set_name(_("Ancestors of %s") % self.person.get_primary_name().get_name())
|
|
||||||
ans.add_rule(GenericFilter.IsAncestorOf([self.person.get_handle(),1]))
|
|
||||||
|
|
||||||
com = GenericFilter.GenericFilter()
|
|
||||||
com.set_name(_("People with common ancestor with %s") %
|
|
||||||
self.person.get_primary_name().get_name())
|
self.person.get_primary_name().get_name())
|
||||||
com.add_rule(GenericFilter.HasCommonAncestorWith([self.person.get_handle()]))
|
des.add_rule(GenericFilter.IsDescendantOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
|
ans = GenericFilter.GenericFilter()
|
||||||
|
ans.set_name(_("Ancestors of %s") %
|
||||||
|
self.person.get_primary_name().get_name())
|
||||||
|
ans.add_rule(GenericFilter.IsAncestorOf(
|
||||||
|
[self.person.get_gramps_id(),1]))
|
||||||
|
|
||||||
|
com = GenericFilter.GenericFilter()
|
||||||
|
com.set_name(_("People with common ancestor with %s") %
|
||||||
|
self.person.get_primary_name().get_name())
|
||||||
|
com.add_rule(GenericFilter.HasCommonAncestorWith(
|
||||||
|
[self.person.get_gramps_id()]))
|
||||||
|
|
||||||
|
self.filter_menu = GenericFilter.build_filter_menu(
|
||||||
|
[all,des,ans,com])
|
||||||
|
else:
|
||||||
|
self.filter_menu = GenericFilter.build_filter_menu([all])
|
||||||
filter_obj.set_menu(self.filter_menu)
|
filter_obj.set_menu(self.filter_menu)
|
||||||
|
|
||||||
the_box = self.topDialog.get_widget('vbox1')
|
the_box = self.topDialog.get_widget('vbox1')
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -147,11 +147,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
if other_person.get_gender() == RelLib.Person.MALE:
|
if is_spouse:
|
||||||
return ("ægtefælle",[])
|
return (is_spouse,[])
|
||||||
else:
|
|
||||||
return ("hustru",[])
|
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -338,8 +338,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
return ("spouse",[])
|
if is_spouse:
|
||||||
|
return (is_spouse,[])
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -254,11 +254,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
if other_person.get_gender() == RelLib.Person.MALE:
|
if is_spouse:
|
||||||
return ("marido",[])
|
return (is_spouse,[])
|
||||||
else:
|
|
||||||
return ("mujer",[])
|
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -182,8 +182,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
return ("puoliso",[])
|
if is_spouse:
|
||||||
|
return (is_spouse,[])
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -39,28 +39,30 @@ from gettext import gettext as _
|
|||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
_level_name = [ "", "premier", "deuxième", "troisième", "quatrième", "cinquième", "sixième",
|
_level_name = [ "", "premier", "deuxième", "troisième", "quatrième", "cinquième", "sixième",
|
||||||
"septième", "huitième", "neuvième", "dicième", "onzième", "douzième",
|
"septième", "huitième", "neuvième", "dixième", "onzième", "douzième",
|
||||||
"treizième", "quatorzième", "quinzième", "seizième",
|
"treizième", "quatorzième", "quinzième", "seizième",
|
||||||
"dix-septième", "dix-huitième", "dix_neuvième", "vingtième", ]
|
"dix-septième", "dix-huitième", "dix-neuvième", "vingtième", "vingt-et-unième", "vingt-deuxième",
|
||||||
|
"vingt-deuxième", "vingt-troisième","vingt-quatrième","vingt-sixième","vingt-septième",
|
||||||
|
"vingt-huitième","vingt-neuvième","trentième" ]
|
||||||
|
|
||||||
_parents_level = [ "", "les parents", "les grand-parents", "les arrières grand-parents",
|
_parents_level = [ "", "les parents", "les grand-parents", "les arrière-grand-parents",
|
||||||
"les trisaïeux", ]
|
"les trisaïeux", ]
|
||||||
|
|
||||||
_father_level = [ "", "le père", "le grand-père", "l'arrière grand-père", "le trisaïeul", ]
|
_father_level = [ "", "le père", "le grand-père paternel", "l'arrière-grand-père paternel", "le trisaïeul paternel", ]
|
||||||
|
|
||||||
_mother_level = [ "", "la mère", "la grand-mère", "l'arrière grand-mère", "la trisaïeule", ]
|
_mother_level = [ "", "la mère", "la grand-mère maternelle", "l'arrière-grand-mère maternelle", "la trisaïeule maternelle", ]
|
||||||
|
|
||||||
_son_level = [ "", "le fils", "le petits-fils", "l'arrière petit-fils", ]
|
_son_level = [ "", "le fils", "le petit-fils", "l'arrière-petit-fils", ]
|
||||||
|
|
||||||
_daughter_level = [ "", "la fille", "la petite-fille", "l'arrière petite-fille", ]
|
_daughter_level = [ "", "la fille", "la petite-fille", "l'arrière-petite-fille", ]
|
||||||
|
|
||||||
_sister_level = [ "", "la soeur", "la tante", "la grande-tante", "l'arrière grande-tante", ]
|
_sister_level = [ "", "la soeur", "la tante", "la grand-tante", "l'arrière-grand-tante", ]
|
||||||
|
|
||||||
_brother_level = [ "", "le frère", "l'oncle", "le grand-oncle", "l'arrière grand-oncle", ]
|
_brother_level = [ "", "le frère", "l'oncle", "le grand-oncle", "l'arrière-grand-oncle", ]
|
||||||
|
|
||||||
_nephew_level = [ "", "le neveu", "le petit-neveu", "l'arrière petit-neveu", ]
|
_nephew_level = [ "", "le neveu", "le petit-neveu", "l'arrière-petit-neveu", ]
|
||||||
|
|
||||||
_niece_level = [ "", "la nièce", "la petite-nièce", "l'arrière petite-nièce", ]
|
_niece_level = [ "", "la nièce", "la petite-nièce", "l'arrière-petite-nièce", ]
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -73,10 +75,16 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
Relationship.RelationshipCalculator.__init__(self,db)
|
Relationship.RelationshipCalculator.__init__(self,db)
|
||||||
|
|
||||||
def get_male_cousin(self,level):
|
def get_male_cousin(self,level):
|
||||||
return "le cousin au %s degré" % (_level_name[level])
|
if level>len(_level_name)-1:
|
||||||
|
return "le parent lointain"
|
||||||
|
else:
|
||||||
|
return "le cousin au %s degré" % (_level_name[level])
|
||||||
|
|
||||||
def get_female_cousin(self,level):
|
def get_female_cousin(self,level):
|
||||||
return "la cousine au %s degré" % (_level_name[level])
|
if level>len(_level_name)-1:
|
||||||
|
return "la parente lointaine"
|
||||||
|
else:
|
||||||
|
return "la cousine au %s degré" % (_level_name[level])
|
||||||
|
|
||||||
def get_parents(self,level):
|
def get_parents(self,level):
|
||||||
if level>len(_parents_level)-1:
|
if level>len(_parents_level)-1:
|
||||||
@ -146,11 +154,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
if other_person.get_gender() == RelLib.Person.MALE:
|
if is_spouse:
|
||||||
return ("le mari",[])
|
return (is_spouse,[])
|
||||||
else:
|
|
||||||
return ("la femme",[])
|
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -268,13 +268,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
if other_person.get_gender() == RelLib.Person.MALE:
|
if is_spouse:
|
||||||
#FIXME: husband
|
return (is_spouse,[])
|
||||||
return ("spouse",[])
|
|
||||||
else:
|
|
||||||
#FIXME: wife
|
|
||||||
return ("spouse",[])
|
|
||||||
|
|
||||||
if self.is_fathermother_in_law(other_person,orig_person):
|
if self.is_fathermother_in_law(other_person,orig_person):
|
||||||
if other_person.getGender() == RelLib.Person.MALE:
|
if other_person.getGender() == RelLib.Person.MALE:
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -151,8 +151,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
return ("coniuge",[])
|
if is_spouse:
|
||||||
|
return (is_spouse,[])
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -232,15 +232,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
return ('spouse', [])
|
if is_spouse:
|
||||||
# FIXME: need Norwegian term for spouse. If gender-specific, use the code below.
|
return (is_spouse,[])
|
||||||
# UPDATE by Frode: unsure about how it's included in the finished code, so I need
|
|
||||||
# to see this running to know if it is the right words to use.
|
|
||||||
# if other_person.get_gender() == RelLib.Person.MALE:
|
|
||||||
# return ("ektemann",[])
|
|
||||||
# else:
|
|
||||||
# return ("hustru",[])
|
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -206,8 +206,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
return ("spouse",[])
|
if is_spouse:
|
||||||
|
return (is_spouse,[])
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Gramps - a GTK+/GNOME based genealogy program
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2004 Donald N. Allingham
|
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -187,11 +187,9 @@ class RelationshipCalculator(Relationship.RelationshipCalculator):
|
|||||||
if orig_person.get_handle() == other_person.get_handle():
|
if orig_person.get_handle() == other_person.get_handle():
|
||||||
return ('', [])
|
return ('', [])
|
||||||
|
|
||||||
if self.is_spouse(orig_person,other_person):
|
is_spouse = self.is_spouse(orig_person,other_person)
|
||||||
if other_person.get_gender() == RelLib.Person.MALE:
|
if is_spouse:
|
||||||
return ("make",[])
|
return (is_spouse,[])
|
||||||
else:
|
|
||||||
return ("maka",[])
|
|
||||||
|
|
||||||
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
(firstRel,secondRel,common) = self.get_relationship_distance(orig_person,other_person)
|
||||||
|
|
||||||
|
2326
src/po/de.po
2326
src/po/de.po
File diff suppressed because it is too large
Load Diff
2578
src/po/es.po
2578
src/po/es.po
File diff suppressed because it is too large
Load Diff
2384
src/po/fi.po
2384
src/po/fi.po
File diff suppressed because it is too large
Load Diff
4777
src/po/fr.po
4777
src/po/fr.po
File diff suppressed because it is too large
Load Diff
2349
src/po/nb.po
2349
src/po/nb.po
File diff suppressed because it is too large
Load Diff
2349
src/po/no.po
2349
src/po/no.po
File diff suppressed because it is too large
Load Diff
2248
src/po/ru.po
2248
src/po/ru.po
File diff suppressed because it is too large
Load Diff
2192
src/po/template.po
2192
src/po/template.po
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,3 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<filters>
|
<filters>
|
||||||
<filter name="asfd" function="and">
|
|
||||||
<rule class="Is a male">
|
|
||||||
</rule>
|
|
||||||
</filter>
|
|
||||||
<filter name="asfasdfasdf" function="and">
|
|
||||||
</filter>
|
|
||||||
</filters>
|
</filters>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user