mirror of
https://github.com/gramps-project/gramps
synced 2025-10-05 23:52:46 +02:00
Sort handles without using SQL
This commit is contained in:
@@ -31,6 +31,7 @@ Proxy class for a Gramps database.
|
||||
# -------------------------------------------------------------------------
|
||||
import types
|
||||
import functools
|
||||
import locale
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
#
|
||||
@@ -78,6 +79,22 @@ class ProxyDbBase:
|
||||
def __getattr__(self, name):
|
||||
return getattr(self.db, name)
|
||||
|
||||
def locale_sort(self, class_name, collation):
|
||||
old_locale = locale.getlocale()
|
||||
try:
|
||||
locale.setlocale(locale.LC_ALL, collation)
|
||||
return sorted(
|
||||
self.proxy_map[class_name],
|
||||
key=lambda item: locale.strxfrm(
|
||||
self.proxy_map[class_name][item]["surname"]
|
||||
),
|
||||
)
|
||||
except locale.Error:
|
||||
# TODO: LOG.warning()
|
||||
return list(self.proxy_map[class_name].keys())
|
||||
finally:
|
||||
locale.setlocale(locale.LC_ALL, old_locale)
|
||||
|
||||
def get_person_map(self):
|
||||
# Get a map from map[handle] = {"surname": "Name"}
|
||||
map = {}
|
||||
@@ -138,6 +155,15 @@ class ProxyDbBase:
|
||||
else:
|
||||
None
|
||||
|
||||
def get_person_handles(self, sort_handles=False, locale=glocale):
|
||||
if sort_handles:
|
||||
sorted_handles = self.locale_sort("Person", locale.collation)
|
||||
for handle in sorted_handles:
|
||||
yield handle
|
||||
else:
|
||||
for handle in self.proxy_map["Person"]:
|
||||
yield handle
|
||||
|
||||
@functools.cache
|
||||
def get_family_from_handle(self, handle):
|
||||
family = self.db.get_family_from_handle(handle)
|
||||
@@ -377,6 +403,22 @@ class FilterProxyDb(ProxyDbBase):
|
||||
else:
|
||||
return super().get_person_map()
|
||||
|
||||
def get_event_map(self):
|
||||
if self.event_filter:
|
||||
return self.event_filter.apply(
|
||||
self.db, self.db.iter_event_handles(), user=self.user
|
||||
)
|
||||
else:
|
||||
return super().get_event_map()
|
||||
|
||||
def get_note_map(self):
|
||||
if self.note_filter:
|
||||
return self.note_filter.apply(
|
||||
self.db, self.db.iter_note_handles(), user=self.user
|
||||
)
|
||||
else:
|
||||
return super().get_note_map()
|
||||
|
||||
|
||||
class ReferencedBySelectionProxyDb(ProxyDbBase):
|
||||
"""
|
||||
|
Reference in New Issue
Block a user