1. Implement iter_<object> methods in proxybase.

2. Change include_object to include_media_object to avoid confusion
3. Make _validated_id_prefix method in read.py a staticmethod
4. Use new iter_<objects> methods in Records.py, StatsgGramplet.py, GivenNameGramplet.py, ExtractCity.py and _IsSiblingOfFilterMatch.py as examples

svn: r13151
This commit is contained in:
Gerald Britton 2009-09-02 20:10:45 +00:00
parent c22e47eba1
commit 3564b04584
10 changed files with 112 additions and 73 deletions

View File

@ -52,8 +52,7 @@ class IsSiblingOfFilterMatch(MatchesFilter):
self.map = {} self.map = {}
filt = MatchesFilter(self.list) filt = MatchesFilter(self.list)
filt.prepare(db) filt.prepare(db)
for person_handle in db.iter_person_handles(): for person in db.iter_people():
person = db.get_person_from_handle( person_handle)
if filt.apply (db, person): if filt.apply (db, person):
self.init_list (person) self.init_list (person)
filt.reset() filt.reset()

View File

@ -850,7 +850,8 @@ class GrampsDbRead(GrampsDbBase, Callback):
person = self.get_person_from_gramps_id(min(the_ids)) person = self.get_person_from_gramps_id(min(the_ids))
return person return person
def _validated_id_prefix(self, val, default): @staticmethod
def _validated_id_prefix(val, default):
if isinstance(val, basestring) and val: if isinstance(val, basestring) and val:
try: try:
str_ = val % 1 str_ = val % 1
@ -1558,3 +1559,8 @@ class GrampsDbRead(GrampsDbBase, Callback):
""" """
return self._bm_changes > 0 return self._bm_changes > 0
if __name__ == '__main__':
x = GrampsDbRead()
x.person_prefix = 'foo %s bar'
print x.person_prefix

View File

@ -50,26 +50,18 @@ class FilterProxyDb(ProxyDbBase):
self.person_filter = person_filter self.person_filter = person_filter
if person_filter: if person_filter:
#self.plist = set(person_filter.apply(
# self.db, self.db.iter_person_handles()))
self.plist = dict((h, 1) for h in person_filter.apply( self.plist = dict((h, 1) for h in person_filter.apply(
self.db, self.db.iter_person_handles())) self.db, self.db.iter_person_handles()))
else: else:
#self.plist = self.db.get_person_handles()
self.plist = dict((h, 1) for h in self.db.iter_person_handles()) self.plist = dict((h, 1) for h in self.db.iter_person_handles())
if event_filter: if event_filter:
#self.elist = set(event_filter.apply(
# self.db, self.db.iter_event_handles()))
self.elist = dict((h, 1) for h in event_filter.apply( self.elist = dict((h, 1) for h in event_filter.apply(
self.db, self.db.iter_event_handles())) self.db, self.db.iter_event_handles()))
else: else:
#self.elist = self.db.get_event_handles()
self.elist = dict((h, 1) for h in self.db.iter_event_handles()) self.elist = dict((h, 1) for h in self.db.iter_event_handles())
if note_filter: if note_filter:
#self.nlist = set(note_filter.apply(
# self.db, self.db.iter_note_handles()))
self.nlist = dict((h, 1) for h in note_filter.apply( self.nlist = dict((h, 1) for h in note_filter.apply(
self.db, self.db.iter_note_handles())) self.db, self.db.iter_note_handles()))
else: else:

View File

@ -250,7 +250,7 @@ class PrivateProxyDb(ProxyDbBase):
obj = self.get_unfiltered_place(handle) obj = self.get_unfiltered_place(handle)
return obj and not obj.get_privacy() return obj and not obj.get_privacy()
def include_object(self, handle): def include_media_object(self, handle):
""" """
Predicate returning True if object is to be included, else False Predicate returning True if object is to be included, else False
""" """

View File

@ -93,7 +93,7 @@ class ProxyDbBase(GrampsDbBase):
include_event = \ include_event = \
include_source = \ include_source = \
include_place = \ include_place = \
include_object = \ include_media_object = \
include_repository = \ include_repository = \
include_note = \ include_note = \
None None
@ -193,15 +193,6 @@ class ProxyDbBase(GrampsDbBase):
""" """
return ifilter(self.include_person, self.db.iter_person_handles()) return ifilter(self.include_person, self.db.iter_person_handles())
def iter_people(self):
"""
Return an iterator over handles and objects for Persons in the database
"""
for handle, person in self.db.iter_people():
if (self.include_person is None or
self.include_person(handle, person)):
yield handle, person
def iter_family_handles(self): def iter_family_handles(self):
""" """
Return an iterator over database handles, one handle for each Family in Return an iterator over database handles, one handle for each Family in
@ -235,7 +226,7 @@ class ProxyDbBase(GrampsDbBase):
Return an iterator over database handles, one handle for each Media Return an iterator over database handles, one handle for each Media
Object in the database. Object in the database.
""" """
return ifilter(self.include_object, self.db.iter_media_object_handles()) return ifilter(self.include_media_object, self.db.iter_media_object_handles())
def iter_repository_handles(self): def iter_repository_handles(self):
""" """
@ -251,6 +242,62 @@ class ProxyDbBase(GrampsDbBase):
""" """
return ifilter(self.include_note, self.db.iter_note_handles()) return ifilter(self.include_note, self.db.iter_note_handles())
@staticmethod
def __iter_object(filter, method):
""" Helper function to return an iterator over an object class """
return ifilter(lambda obj: (filter is None or filter(obj.handle)),
method())
def iter_people(self):
"""
Return an iterator over Person objects in the database
"""
return self.__iter_object(self.include_person, self.db.iter_people)
def iter_families(self):
"""
Return an iterator over Family objects in the database
"""
return self.__iter_object(self.include_family, self.db.iter_families)
def iter_events(self):
"""
Return an iterator over Event objects in the database
"""
return self.__iter_object(self.include_event, self.db.iter_events)
def iter_places(self):
"""
Return an iterator over Place objects in the database
"""
return self.__iter_object(self.include_place, self.db.iter_places)
def iter_sources(self):
"""
Return an iterator over Source objects in the database
"""
return self.__iter_object(self.include_source, self.db.iter_sources)
def iter_media_objects(self):
"""
Return an iterator over Media objects in the database
"""
return self.__iter_object(self.include_media_object,
self.db.iter_media_objects)
def iter_repositories(self):
"""
Return an iterator over Repositories objects in the database
"""
return self.__iter_object(self.include_repository,
self.db.iter_repositories)
def iter_notes(self):
"""
Return an iterator over Note objects in the database
"""
return self.__iter_object(self.include_note, self.db.iter_notes)
@staticmethod @staticmethod
def gfilter(predicate, obj): def gfilter(predicate, obj):
""" """
@ -274,6 +321,10 @@ class ProxyDbBase(GrampsDbBase):
setattr(self, name, attr) setattr(self, name, attr)
return attr return attr
# Default behaviour: lookup attribute in parent object
return getattr(self.db, name)
def get_person_from_handle(self, handle): def get_person_from_handle(self, handle):
""" """
Finds a Person in the database from the passed gramps handle. Finds a Person in the database from the passed gramps handle.
@ -319,7 +370,7 @@ class ProxyDbBase(GrampsDbBase):
Finds an Object in the database from the passed gramps handle. Finds an Object in the database from the passed gramps handle.
If no such Object exists, None is returned. If no such Object exists, None is returned.
""" """
return self.gfilter(self.include_object, return self.gfilter(self.include_media_object,
self.db.get_object_from_handle(handle)) self.db.get_object_from_handle(handle))
def get_repository_from_handle(self, handle): def get_repository_from_handle(self, handle):
@ -383,7 +434,7 @@ class ProxyDbBase(GrampsDbBase):
Finds a MediaObject in the database from the passed gramps' ID. Finds a MediaObject in the database from the passed gramps' ID.
If no such MediaObject exists, None is returned. If no such MediaObject exists, None is returned.
""" """
return self.gfilter(self.include_object, return self.gfilter(self.include_media_object,
self.db.get_object_from_gramps_id(val)) self.db.get_object_from_gramps_id(val))
def get_repository_from_gramps_id(self, val): def get_repository_from_gramps_id(self, val):
@ -604,7 +655,7 @@ class ProxyDbBase(GrampsDbBase):
""" """
returns True if the handle exists in the current MediaObjectdatabase. returns True if the handle exists in the current MediaObjectdatabase.
""" """
return self.gfilter(self.include_object, return self.gfilter(self.include_media_object,
self.db.get_object_from_gramps_id(val)) is not None self.db.get_object_from_gramps_id(val)) is not None
def has_repository_handle(self, handle): def has_repository_handle(self, handle):
@ -800,7 +851,7 @@ class ProxyDbBase(GrampsDbBase):
return self.db.get_gramps_ids(obj_key) return self.db.get_gramps_ids(obj_key)
def has_gramps_id(self, obj_key, gramps_id): def has_gramps_id(self, obj_key, gramps_id):
return self.db.has_gramps_ids(obj_key, gramps_id) return self.db.has_gramps_id(obj_key, gramps_id)
def get_bookmarks(self): def get_bookmarks(self):
"""returns the list of Person handles in the bookmarks""" """returns the list of Person handles in the bookmarks"""

View File

@ -59,7 +59,7 @@ class ReferencedProxyDb(ProxyDbBase):
""" """
return handle not in self.unreferenced_places return handle not in self.unreferenced_places
def include_object(self, handle): def include_media_object(self, handle):
""" """
Filter for media objects Filter for media objects
""" """

View File

@ -196,8 +196,8 @@ def _find_records(db, filter, callname):
family_shortest = [] family_shortest = []
family_longest = [] family_longest = []
for family_handle in db.iter_family_handles(): for family in db.iter_families():
family = db.get_family_from_handle(family_handle) #family = db.get_family_from_handle(family_handle)
father_handle = family.get_father_handle() father_handle = family.get_father_handle()
if not father_handle: if not father_handle:
@ -220,7 +220,7 @@ def _find_records(db, filter, callname):
_record(None, family_mostchildren, _record(None, family_mostchildren,
len(family.get_child_ref_list()), len(family.get_child_ref_list()),
name, 'Family', family_handle) name, 'Family', family.handle)
marriage_date = None marriage_date = None
divorce_date = None divorce_date = None
@ -243,7 +243,7 @@ def _find_records(db, filter, callname):
if probably_alive(father, db) and probably_alive(mother, db): if probably_alive(father, db) and probably_alive(mother, db):
_record(family_youngestmarried, family_oldestmarried, _record(family_youngestmarried, family_oldestmarried,
today_date - marriage_date, today_date - marriage_date,
name, 'Family', family_handle) name, 'Family', family.handle)
elif (_good_date(divorce_date) or elif (_good_date(divorce_date) or
_good_date(father_death_date) or _good_date(father_death_date) or
_good_date(mother_death_date)): _good_date(mother_death_date)):
@ -262,7 +262,7 @@ def _find_records(db, filter, callname):
duration = end - marriage_date duration = end - marriage_date
_record(family_shortest, family_longest, _record(family_shortest, family_longest,
duration, name, 'Family', family_handle) duration, name, 'Family', family.handle)
return [(text, varname, locals()[varname]) for (text, varname, default) in RECORDS] return [(text, varname, locals()[varname]) for (text, varname, default) in RECORDS]

View File

@ -58,21 +58,18 @@ class GivenNameCloudGramplet(Gramplet):
def main(self): def main(self):
self.set_text(_("Processing...") + "\n") self.set_text(_("Processing...") + "\n")
yield True yield True
people = self.dbstate.db.iter_person_handles()
givensubnames = {} givensubnames = {}
representative_handle = {} representative_handle = {}
cnt = 0 cnt = 0
for person_handle in people: for person in self.dbstate.db.iter_people():
person = self.dbstate.db.get_person_from_handle(person_handle) allnames = [person.get_primary_name()] + person.get_alternate_names()
if person: allnames = set(name.get_first_name().strip() for name in allnames)
cnt += 1 for givenname in allnames:
allnames = [person.get_primary_name()] + person.get_alternate_names() for givensubname in givenname.split():
allnames = set([name.get_first_name().strip() for name in allnames]) givensubnames[givensubname] = givensubnames.get(givensubname, 0) + 1
for givenname in allnames: representative_handle[givensubname] = person.handle
for givensubname in givenname.split(): cnt += 1
givensubnames[givensubname] = givensubnames.get(givensubname, 0) + 1
representative_handle[givensubname] = person_handle
if not cnt % _YIELD_INTERVAL: if not cnt % _YIELD_INTERVAL:
yield True yield True
@ -83,22 +80,21 @@ class GivenNameCloudGramplet(Gramplet):
for givensubname in givensubnames: for givensubname in givensubnames:
givensubname_sort.append( (givensubnames[givensubname], givensubname) ) givensubname_sort.append( (givensubnames[givensubname], givensubname) )
total += givensubnames[givensubname] total += givensubnames[givensubname]
cnt += 1
if not cnt % _YIELD_INTERVAL: if not cnt % _YIELD_INTERVAL:
yield True yield True
cnt += 1
total_givensubnames = cnt total_givensubnames = cnt
givensubname_sort.sort(reverse=True) givensubname_sort.sort(reverse=True)
cloud_names = [] cloud_names = []
cloud_values = [] cloud_values = []
for cnt, (count, givensubname) in enumerate(givensubname_sort): for count, givensubname in givensubname_sort:
cloud_names.append( (count, givensubname) ) cloud_names.append( (count, givensubname) )
cloud_values.append( count ) cloud_values.append( count )
cloud_names.sort(key=lambda k: k[1]) cloud_names.sort(key=lambda k: k[1])
counts = list(set(cloud_values)) counts = sorted(set(cloud_values), reverse=True)
counts.sort(reverse=True)
line = 0 line = 0
### All done! ### All done!
# Now, find out how many we can display without going over top_size: # Now, find out how many we can display without going over top_size:

View File

@ -66,8 +66,7 @@ class StatsGramplet(Gramplet):
def main(self): def main(self):
self.set_text(_("Processing...")) self.set_text(_("Processing..."))
database = self.dbstate.db database = self.dbstate.db
personList = database.iter_person_handles() personList = database.iter_people()
familyList = database.iter_family_handles()
with_photos = 0 with_photos = 0
total_photos = 0 total_photos = 0
@ -90,38 +89,35 @@ class StatsGramplet(Gramplet):
except: except:
notfound.append(photo.get_path()) notfound.append(photo.get_path())
for cnt, person_handle in enumerate(personList): for cnt, person in enumerate(personList):
person = database.get_person_from_handle(person_handle)
if not person:
continue
length = len(person.get_media_list()) length = len(person.get_media_list())
if length > 0: if length > 0:
with_photos = with_photos + 1 with_photos += 1
total_photos = total_photos + length total_photos += length
names = [person.get_primary_name()] + person.get_alternate_names() names = [person.get_primary_name()] + person.get_alternate_names()
for name in names: for name in names:
if name.get_first_name() == "" or name.get_group_name() == "": if name.get_first_name() == "" or name.get_group_name() == "":
incomp_names = incomp_names + 1 incomp_names += 1
if name.get_group_name() not in namelist: if name.get_group_name() not in namelist:
namelist.append(name.get_group_name()) namelist.append(name.get_group_name())
if ((not person.get_main_parents_family_handle()) and if (not person.get_main_parents_family_handle() and
(not len(person.get_family_handle_list()))): not len(person.get_family_handle_list())):
disconnected = disconnected + 1 disconnected += 1
birth_ref = person.get_birth_ref() birth_ref = person.get_birth_ref()
if birth_ref: if birth_ref:
birth = database.get_event_from_handle(birth_ref.ref) birth = database.get_event_from_handle(birth_ref.ref)
if not DateHandler.get_date(birth): if not DateHandler.get_date(birth):
missing_bday = missing_bday + 1 missing_bday += 1
else: else:
missing_bday = missing_bday + 1 missing_bday += 1
if person.get_gender() == gen.lib.Person.FEMALE: if person.get_gender() == gen.lib.Person.FEMALE:
females = females + 1 females += 1
elif person.get_gender() == gen.lib.Person.MALE: elif person.get_gender() == gen.lib.Person.MALE:
males = males + 1 males += 1
else: else:
unknowns += 1 unknowns += 1
if not cnt % _YIELD_INTERVAL: if not cnt % _YIELD_INTERVAL:

View File

@ -434,8 +434,7 @@ class ExtractCity(Tool.BatchTool, ManagedWindow.ManagedWindow):
self.name_list = [] self.name_list = []
for handle in db.iter_place_handles(): for place in db.iter_places():
place = db.get_place_from_handle(handle)
descr = place.get_title() descr = place.get_title()
loc = place.get_main_location() loc = place.get_main_location()
self.progress.step() self.progress.step()
@ -455,7 +454,7 @@ class ExtractCity(Tool.BatchTool, ManagedWindow.ManagedWindow):
new_state = STATE_MAP.get(val.upper()) new_state = STATE_MAP.get(val.upper())
if new_state: if new_state:
self.name_list.append( self.name_list.append(
(handle, (city, new_state[0], postal, (place.handle, (city, new_state[0], postal,
COUNTRY[new_state[1]]))) COUNTRY[new_state[1]])))
continue continue
@ -471,7 +470,7 @@ class ExtractCity(Tool.BatchTool, ManagedWindow.ManagedWindow):
new_state = STATE_MAP.get(val.upper()) new_state = STATE_MAP.get(val.upper())
if new_state: if new_state:
self.name_list.append( self.name_list.append(
(handle, (city, new_state[0], postal, (place.handle, (city, new_state[0], postal,
COUNTRY[new_state[1]]))) COUNTRY[new_state[1]])))
continue continue
match = CITY_STATE.match(descr.strip()) match = CITY_STATE.match(descr.strip())
@ -490,7 +489,7 @@ class ExtractCity(Tool.BatchTool, ManagedWindow.ManagedWindow):
new_state = STATE_MAP.get(val.upper()) new_state = STATE_MAP.get(val.upper())
if new_state: if new_state:
self.name_list.append( self.name_list.append(
(handle, (city, new_state[0], postal, (place.handle, (city, new_state[0], postal,
COUNTRY[new_state[1]]))) COUNTRY[new_state[1]])))
continue continue
@ -498,7 +497,7 @@ class ExtractCity(Tool.BatchTool, ManagedWindow.ManagedWindow):
new_state = STATE_MAP.get(val) new_state = STATE_MAP.get(val)
if new_state: if new_state:
self.name_list.append( self.name_list.append(
(handle, (None, new_state[0], None, (place.handle, (None, new_state[0], None,
COUNTRY[new_state[1]]))) COUNTRY[new_state[1]])))
self.progress.close() self.progress.close()