Replace locale.strcoll with locale.strxfmt for performance and Python 3.0 compliance

svn: r12739
This commit is contained in:
Gerald Britton
2009-06-30 14:05:57 +00:00
parent b1dd135363
commit d022d0187b
6 changed files with 109 additions and 15 deletions

View File

@ -76,6 +76,18 @@ class Sort(object):
else: else:
return locale.strcoll(fsn, ssn) return locale.strcoll(fsn, ssn)
def by_last_name_key(self, first_id):
"""Sort routine for comparing two last names. If last names are equal,
uses the given name and suffix"""
first = self.database.get_person_from_handle(first_id)
name1 = first.get_primary_name()
fsn = name1.get_surname()
ffn = name1.get_first_name()
fsu = name1.get_suffix()
return locale.strxfrm(fsn + ffn + fsu)
def by_sorted_name(self, first_id, second_id): def by_sorted_name(self, first_id, second_id):
""" """
Sort routine for comparing two displayed names. Sort routine for comparing two displayed names.
@ -89,6 +101,17 @@ class Sort(object):
return locale.strcoll(name1, name2) return locale.strcoll(name1, name2)
def by_sorted_name_key(self, first_id):
"""
Sort routine for comparing two displayed names.
"""
first = self.database.get_person_from_handle(first_id)
name1 = _nd.sorted(first)
return locale.strxfrm(name1)
def by_birthdate(self, first_id, second_id): def by_birthdate(self, first_id, second_id):
"""Sort routine for comparing two people by birth dates. If the birth dates """Sort routine for comparing two people by birth dates. If the birth dates
are equal, sorts by name""" are equal, sorts by name"""
@ -115,6 +138,20 @@ class Sort(object):
return self.by_last_name(first_id, second_id) return self.by_last_name(first_id, second_id)
return val return val
def by_birthdate_key(self, first_id):
"""Sort routine for comparing two people by birth dates. If the birth dates
are equal, sorts by name"""
first = self.database.get_person_from_handle(first_id)
birth1 = ReportUtils.get_birth_or_fallback(self.database, first)
if birth1:
date1 = birth1.get_date_object()
else:
date1 = Date()
dsv1 = date1.get_sort_value()
return "%08d" % dsv1 + self.by_last_name_key(first_id)
def by_date(self, a_id, b_id): def by_date(self, a_id, b_id):
"""Sort routine for comparing two events by their dates. """ """Sort routine for comparing two events by their dates. """
if not (a_id and b_id): if not (a_id and b_id):
@ -123,6 +160,13 @@ class Sort(object):
b_obj = self.database.get_event_from_handle(b_id) b_obj = self.database.get_event_from_handle(b_id)
return cmp(a_obj.get_date_object(), b_obj.get_date_object()) return cmp(a_obj.get_date_object(), b_obj.get_date_object())
def by_date_key(self, a_id):
"""Sort routine for comparing two events by their dates. """
if not a_id:
return 0
a_obj = self.database.get_event_from_handle(a_id)
return a_obj.get_date_object()
def by_place_title(self, a_id, b_id): def by_place_title(self, a_id, b_id):
"""Sort routine for comparing two places. """ """Sort routine for comparing two places. """
if not (a_id and b_id): if not (a_id and b_id):
@ -131,6 +175,13 @@ class Sort(object):
b_obj = self.database.get_place_from_handle(b_id) b_obj = self.database.get_place_from_handle(b_id)
return locale.strcoll(a_obj.title, b_obj.title) return locale.strcoll(a_obj.title, b_obj.title)
def by_place_title_key(self, a_id):
"""Sort routine for comparing two places. """
if not a_id:
return 0
a_obj = self.database.get_place_from_handle(a_id)
return locale.strxfrm(a_obj.title)
def by_event_place(self, a_id, b_id): def by_event_place(self, a_id, b_id):
"""Sort routine for comparing two events by their places. """ """Sort routine for comparing two events by their places. """
if not (a_id and b_id): if not (a_id and b_id):
@ -147,6 +198,15 @@ class Sort(object):
plc_b_title = plc_b.title plc_b_title = plc_b.title
return locale.strcoll(plc_a_title, plc_b_title) return locale.strcoll(plc_a_title, plc_b_title)
def by_event_place_key(self, a_id):
"""Sort routine for comparing two events by their places. """
if not a_id:
return 0
evt_a = self.database.get_event_from_handle(a_id)
plc_a = self.database.get_place_from_handle(evt_a.get_place_handle())
plc_a_title = plc_a.title if plc_a else ""
return locale.strxfrml(plc_a_title)
def by_event_description(self, a_id, b_id): def by_event_description(self, a_id, b_id):
"""Sort routine for comparing two events by their descriptions. """ """Sort routine for comparing two events by their descriptions. """
if not (a_id and b_id): if not (a_id and b_id):
@ -155,6 +215,13 @@ class Sort(object):
evt_b = self.database.get_event_from_handle(b_id) evt_b = self.database.get_event_from_handle(b_id)
return locale.strcoll(evt_a.get_description(), evt_b.get_description()) return locale.strcoll(evt_a.get_description(), evt_b.get_description())
def by_event_description_key(self, a_id):
"""Sort routine for comparing two events by their descriptions. """
if not a_id:
return 0
evt_a = self.database.get_event_from_handle(a_id)
return locale.strxfrm(evt_a.get_description())
def by_event_id(self, a_id, b_id): def by_event_id(self, a_id, b_id):
"""Sort routine for comparing two events by their ID. """ """Sort routine for comparing two events by their ID. """
if not (a_id and b_id): if not (a_id and b_id):
@ -163,6 +230,13 @@ class Sort(object):
evt_b = self.database.get_event_from_handle(b_id) evt_b = self.database.get_event_from_handle(b_id)
return locale.strcoll(evt_a.get_gramps_id(), evt_b.get_gramps_id()) return locale.strcoll(evt_a.get_gramps_id(), evt_b.get_gramps_id())
def by_event_id_key(self, a_id):
"""Sort routine for comparing two events by their ID. """
if not (a_id and b_id):
return 0
evt_a = self.database.get_event_from_handle(a_id)
return locale.strxfrm(evt_a.get_gramps_id())
def by_event_type(self, a_id, b_id): def by_event_type(self, a_id, b_id):
"""Sort routine for comparing two events by their type. """ """Sort routine for comparing two events by their type. """
if not (a_id and b_id): if not (a_id and b_id):
@ -170,6 +244,13 @@ class Sort(object):
evt_a = self.database.get_event_from_handle(a_id) evt_a = self.database.get_event_from_handle(a_id)
evt_b = self.database.get_event_from_handle(b_id) evt_b = self.database.get_event_from_handle(b_id)
return locale.strcoll(str(evt_a.get_type()), str(evt_b.get_type())) return locale.strcoll(str(evt_a.get_type()), str(evt_b.get_type()))
def by_event_type_key(self, a_id):
"""Sort routine for comparing two events by their type. """
if not a_id:
return 0
evt_a = self.database.get_event_from_handle(a_id)
return locale.strxfrm(str(evt_a.get_type()))
def by_media_title(self,a_id,b_id): def by_media_title(self,a_id,b_id):
"""Sort routine for comparing two media objects by their title. """ """Sort routine for comparing two media objects by their title. """
@ -179,3 +260,10 @@ class Sort(object):
b = self.database.get_object_from_handle(b_id) b = self.database.get_object_from_handle(b_id)
return locale.strcoll(a.desc, b.desc) return locale.strcoll(a.desc, b.desc)
def by_media_title_key(self, a_id):
"""Sort routine for comparing two media objects by their title. """
if not a_id:
return False
a = self.database.get_object_from_handle(a_id)
return locale.strxfrm(a.desc)

View File

@ -57,8 +57,8 @@ import gen.lib
#------------------------------------------------------------------------ #------------------------------------------------------------------------
def _get_sort_functions(sort): def _get_sort_functions(sort):
return [ return [
(_("Birth Date"),sort.by_birthdate), (_("Birth Date"),sort.by_birthdate_key),
(_("Name"),sort.by_last_name), (_("Name"),sort.by_last_name_key),
] ]
#------------------------------------------------------------------------ #------------------------------------------------------------------------
@ -134,7 +134,7 @@ class TimeLine(Report):
length = len(self.plist) length = len(self.plist)
self.progress.set_pass(_('Sorting dates...'), 1) self.progress.set_pass(_('Sorting dates...'), 1)
self.plist.sort(self.sort_func) self.plist.sort(key=self.sort_func)
self.progress.set_pass(_('Calculating timeline...'), len(self.plist)) self.progress.set_pass(_('Calculating timeline...'), len(self.plist))
for p_id in self.plist: for p_id in self.plist:

View File

@ -81,7 +81,7 @@ class PlaceReport(Report):
# Use the place handles selected without a filter # Use the place handles selected without a filter
self.place_handles = self.__get_place_handles(places) self.place_handles = self.__get_place_handles(places)
self.place_handles.sort(self.sort.by_place_title) self.place_handles.sort(key=self.sort.by_place_title_key)
def write_report(self): def write_report(self):
""" """

View File

@ -53,11 +53,11 @@ def _get_sort_functions(sort):
Define the types of sorting that is available Define the types of sorting that is available
""" """
return [ return [
(_("Date"), sort.by_date), (_("Date"), sort.by_date_key),
(_("Type"), sort.by_event_type), (_("Type"), sort.by_event_type_key),
(_("ID"), sort.by_event_id), (_("ID"), sort.by_event_id_key),
(_("Description"), sort.by_event_description), (_("Description"), sort.by_event_description_key),
(_("Place"), sort.by_event_place),] (_("Place"), sort.by_event_place_key),]
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -118,7 +118,7 @@ class SortEvents(PluginWindows.ToolManagedWindowBatch):
person = self.db.get_person_from_handle(handle) person = self.db.get_person_from_handle(handle)
self.progress.step() self.progress.step()
event_ref_list = person.get_event_ref_list() event_ref_list = person.get_event_ref_list()
event_ref_list.sort(lambda x, y: self.sort_func(x.ref, y.ref)) event_ref_list.sort(key=lambda x: self.sort_func(x.ref))
if self.sort_desc: if self.sort_desc:
event_ref_list.reverse() event_ref_list.reverse()
if self.fam_events: if self.fam_events:
@ -139,7 +139,7 @@ class SortEvents(PluginWindows.ToolManagedWindowBatch):
family = self.db.get_family_from_handle(handle) family = self.db.get_family_from_handle(handle)
self.progress.step() self.progress.step()
event_ref_list = family.get_event_ref_list() event_ref_list = family.get_event_ref_list()
event_ref_list.sort(lambda x, y: self.sort_func(x.ref, y.ref)) event_ref_list.sort(key=lambda x: self.sort_func(x.ref))
if self.sort_desc: if self.sort_desc:
event_ref_list.reverse() event_ref_list.reverse()
family.set_event_ref_list(event_ref_list) family.set_event_ref_list(event_ref_list)

View File

@ -1380,7 +1380,7 @@ class PlaceListPage(BasePage):
thead += trow thead += trow
sort = Sort.Sort(db) sort = Sort.Sort(db)
handle_list = sorted(place_handles, sort.by_place_title) handle_list = sorted(place_handles, key=sort.by_place_title_key)
last_letter = '' last_letter = ''
# begin table body # begin table body
@ -2301,7 +2301,7 @@ class MediaListPage(BasePage):
index = 1 index = 1
sort = Sort.Sort(db) sort = Sort.Sort(db)
mlist = sorted(self.report.photo_list, sort.by_media_title) mlist = sorted(self.report.photo_list, key=sort.by_media_title_key)
for handle in mlist: for handle in mlist:
media = db.get_object_from_handle(handle) media = db.get_object_from_handle(handle)
@ -4305,7 +4305,7 @@ class NavWebReport(Report):
prev = None prev = None
total = len(self.photo_list) total = len(self.photo_list)
sort = Sort.Sort(self.database) sort = Sort.Sort(self.database)
photo_keys = sorted(self.photo_list, sort.by_media_title) photo_keys = sorted(self.photo_list, key=sort.by_media_title_key)
index = 1 index = 1
for photo_handle in photo_keys: for photo_handle in photo_keys:

View File

@ -531,7 +531,7 @@ class MonitoredComboSelectedEntry(object):
Fill combo with data Fill combo with data
""" """
self.store = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING) self.store = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING)
keys = sorted(self.mapping.keys(), self.__by_value) keys = sorted(self.mapping.keys(), key=self.__by_value_key)
for index, key in enumerate(keys): for index, key in enumerate(keys):
self.store.append(row=[key, self.mapping[key]]) self.store.append(row=[key, self.mapping[key]])
@ -546,6 +546,12 @@ class MonitoredComboSelectedEntry(object):
svalue = self.mapping[second] svalue = self.mapping[second]
return locale.strcoll(fvalue, svalue) return locale.strcoll(fvalue, svalue)
def __by_value_key(self, first):
"""
Method for sorting keys based on the values.
"""
return locale.strxfrm(self.mapping[first])
def on_combochange(self, obj): def on_combochange(self, obj):
""" """
callback for change on the combo, change active iter, update callback for change on the combo, change active iter, update