* src/EditPlace.py: changed display_references to use find_backlink_handles

* src/EditRepository.py: modified to use  find_backlink_handles and fixed subtle bug
	* src/RelLib/_Source.py: added reporef_list to referent object lists so that backref
	are put in reference_map
	* test/GrampsDb/GrampsDbBase_Test.py: added unittest for source/reference backlinks
	* test/GrampsDb/GrampsDbTestBase.py: added unittest for source/reference backlinks


svn: r5616
This commit is contained in:
Richard Taylor
2005-12-22 12:02:06 +00:00
parent 18e3e8c5cf
commit e3d70bb4a2
6 changed files with 148 additions and 9 deletions

View File

@@ -28,6 +28,9 @@
import cPickle as pickle
import gc
from gettext import gettext as _
import sys
log = sys.stderr.write
#-------------------------------------------------------------------------
#
@@ -75,6 +78,7 @@ class EditPlace(DisplayState.ManagedWindow):
self.db = dbstate.db
self.path = dbstate.db.get_save_path()
self.not_loaded = True
self.model = None # becomes the model for back references.
self.lists_changed = 0
if place:
self.srcreflist = place.get_source_references()
@@ -165,8 +169,9 @@ class EditPlace(DisplayState.ManagedWindow):
self.country.set_text(mloc.get_country())
self.longitude.set_text(place.get_longitude())
self.latitude.set_text(place.get_latitude())
self.plist = self.top_window.get_widget("plist")
self.plist = self.top_window.get_widget("refinfo")
self.slist = self.top_window.get_widget("slist")
self.sources_label = self.top_window.get_widget("sourcesPlaceEdit")
self.names_label = self.top_window.get_widget("namesPlaceEdit")
self.notes_label = self.top_window.get_widget("notesPlaceEdit")
@@ -524,6 +529,104 @@ class EditPlace(DisplayState.ManagedWindow):
self,", ", event, None, 0, None, None, self.db.readonly)
def display_references(self):
if not self.model:
self.any_refs = False
place_handle = self.place.get_handle()
titles = [(_('Type'),0,150),(_('Name'),1,150),
(_('ID'),2,75),(_('Event Name'),3,150)]
self.model = ListModel.ListModel(self.plist,
titles,
event_func=self.button_press)
self.backlink_generator = self.db.find_backlink_handles(place_handle)
while True: # The loop is broken when the backlink_generator finishes
try:
reference = self.backlink_generator.next()
except StopIteration:
# Last reference reached.
break
cls_name,handle = reference
if cls_name == 'Person':
person = self.db.get_person_from_handle(handle)
for event_handle in [person.get_birth_handle(),
person.get_death_handle()] \
+ person.get_event_list():
event = self.db.get_event_from_handle(event_handle)
if event and event.get_place_handle() == place_handle:
pname = self.name_display(person)
gramps_id = person.get_gramps_id()
ename = event.get_name()
self.model.add(
[_("Personal Event"),pname,gramps_id,ename],
(0,event_handle))
self.any_refs = True
elif cls_name == 'Family':
family = self.db.get_family_from_handle(handle)
for event_handle in family.get_event_list():
event = self.db.get_event_from_handle(event_handle)
if event and event.get_place_handle() == place_handle:
father = family.get_father_handle()
mother = family.get_mother_handle()
if father and mother:
fname = _("%(father)s and %(mother)s") % {
"father" : self.name_display(
self.db.get_person_from_handle(father)),
"mother" : self.name_display(
self.db.get_person_from_handle(mother))
}
elif father:
fname = self.name_display(
self.db.get_person_from_handle(father))
else:
fname = self.name_display(
self.db.get_person_from_handle(mother))
gramps_id = family.get_gramps_id()
ename = event.get_name()
self.model.add(
[_("Family Event"),fname,gramps_id,ename],
(1,event_handle))
self.any_refs = True
elif cls_name == 'Event':
event = self.db.get_event_from_handle(handle)
ev_type = event.get_type()[1]
description = event.get_description()
gramps_id = event.get_gramps_id()
self.model.add([_("Event"),str(ev_type),gramps_id,description],(2,handle))
else:
# If we get here it means there is a new Primary object type
# that has been added to the database or that Place has started
# to be referenced by a different primary object. Print a warning
# to remind us that this code need updating.
log("WARNING: Unhandled Primary object type returned from "
"find_backlink_handles(): %s \n" % str(cls_name))
if gtk.events_pending():
return True
if self.any_refs:
Utils.bold_label(self.refs_label,self.top)
else:
Utils.unbold_label(self.refs_label,self.top)
self.ref_not_loaded = 0
self.backlink_generator = None
return False
place_handle = self.place.get_handle()
# Initialize things if we're entering this functioin
# for the first time