diff --git a/src/Sort.py b/src/Sort.py index 35d7d65e4..c5ce085cb 100644 --- a/src/Sort.py +++ b/src/Sort.py @@ -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) + diff --git a/src/plugins/drawreport/TimeLine.py b/src/plugins/drawreport/TimeLine.py index b4e227222..b5dc3e60c 100644 --- a/src/plugins/drawreport/TimeLine.py +++ b/src/plugins/drawreport/TimeLine.py @@ -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: diff --git a/src/plugins/textreport/PlaceReport.py b/src/plugins/textreport/PlaceReport.py index 318b19571..94cf3531e 100644 --- a/src/plugins/textreport/PlaceReport.py +++ b/src/plugins/textreport/PlaceReport.py @@ -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): """ diff --git a/src/plugins/tool/SortEvents.py b/src/plugins/tool/SortEvents.py index b61e80cac..dced3bae3 100644 --- a/src/plugins/tool/SortEvents.py +++ b/src/plugins/tool/SortEvents.py @@ -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) diff --git a/src/plugins/webreport/NarrativeWeb.py b/src/plugins/webreport/NarrativeWeb.py index 708a187c9..47dbcd181 100644 --- a/src/plugins/webreport/NarrativeWeb.py +++ b/src/plugins/webreport/NarrativeWeb.py @@ -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: diff --git a/src/widgets/monitoredwidgets.py b/src/widgets/monitoredwidgets.py index aca26a9a7..9f27021df 100644 --- a/src/widgets/monitoredwidgets.py +++ b/src/widgets/monitoredwidgets.py @@ -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