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:
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):
"""
Sort routine for comparing two displayed names.
@ -89,6 +101,17 @@ class Sort(object):
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):
"""Sort routine for comparing two people by birth dates. If the birth dates
are equal, sorts by name"""
@ -115,6 +138,20 @@ class Sort(object):
return self.by_last_name(first_id, second_id)
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):
"""Sort routine for comparing two events by their dates. """
if not (a_id and b_id):
@ -123,6 +160,13 @@ class Sort(object):
b_obj = self.database.get_event_from_handle(b_id)
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):
"""Sort routine for comparing two places. """
if not (a_id and b_id):
@ -131,6 +175,13 @@ class Sort(object):
b_obj = self.database.get_place_from_handle(b_id)
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):
"""Sort routine for comparing two events by their places. """
if not (a_id and b_id):
@ -147,6 +198,15 @@ class Sort(object):
plc_b_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):
"""Sort routine for comparing two events by their descriptions. """
if not (a_id and b_id):
@ -155,6 +215,13 @@ class Sort(object):
evt_b = self.database.get_event_from_handle(b_id)
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):
"""Sort routine for comparing two events by their 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)
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):
"""Sort routine for comparing two events by their type. """
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_b = self.database.get_event_from_handle(b_id)
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):
"""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)
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):
return [
(_("Birth Date"),sort.by_birthdate),
(_("Name"),sort.by_last_name),
(_("Birth Date"),sort.by_birthdate_key),
(_("Name"),sort.by_last_name_key),
]
#------------------------------------------------------------------------
@ -134,7 +134,7 @@ class TimeLine(Report):
length = len(self.plist)
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))
for p_id in self.plist:

View File

@ -81,7 +81,7 @@ class PlaceReport(Report):
# Use the place handles selected without a filter
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):
"""

View File

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

View File

@ -1380,7 +1380,7 @@ class PlaceListPage(BasePage):
thead += trow
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 = ''
# begin table body
@ -2301,7 +2301,7 @@ class MediaListPage(BasePage):
index = 1
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:
media = db.get_object_from_handle(handle)
@ -4305,7 +4305,7 @@ class NavWebReport(Report):
prev = None
total = len(self.photo_list)
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
for photo_handle in photo_keys:

View File

@ -531,7 +531,7 @@ class MonitoredComboSelectedEntry(object):
Fill combo with data
"""
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):
self.store.append(row=[key, self.mapping[key]])
@ -546,6 +546,12 @@ class MonitoredComboSelectedEntry(object):
svalue = self.mapping[second]
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):
"""
callback for change on the combo, change active iter, update