From 1625a4f41fa6727e41b0546687d72a3101b2b2bf Mon Sep 17 00:00:00 2001 From: mathieui Date: Tue, 31 Jul 2012 23:40:53 +0200 Subject: Add a roster_sort option to sort the contacts inside the roster groups - defaults to jid_show (which means that they are sorted into sub-groups by show and are sorted by JID inside those) - See the default config file or the documentation for details --- src/roster.py | 61 +++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 18 deletions(-) (limited to 'src/roster.py') diff --git a/src/roster.py b/src/roster.py index 56c65d8f..84771678 100644 --- a/src/roster.py +++ b/src/roster.py @@ -198,12 +198,37 @@ class Roster(object): except IOError: return -PRESENCE_PRIORITY = {'unavailable': 0, - 'xa': 1, - 'away': 2, - 'dnd': 3, - '': 4, - 'available': 4} +PRESENCE_PRIORITY = {'unavailable': 5, + 'xa': 4, + 'away': 3, + 'dnd': 2, + '': 1, + 'available': 1} + +def sort_jid(contact): + return contact.bare_jid + +def sort_show(contact): + res = contact.get_highest_priority_resource() + if not res: + return 0 + show = res.presence + if show not in PRESENCE_PRIORITY: + return 0 + return PRESENCE_PRIORITY[show] + +def sort_resource_nb(contact): + return - len(contact) + +def sort_name(contact): + return contact.name.lower() or contact.bare_jid + +SORTING_METHODS = { + 'jid': sort_jid, + 'show': sort_show, + 'resource': sort_resource_nb, + 'name': sort_name, +} class RosterGroup(object): """ @@ -244,20 +269,19 @@ class RosterGroup(object): if contact in self.contacts: self.contacts.remove(contact) - def get_contacts(self, contact_filter): + def get_contacts(self, contact_filter=None, sort=''): """Return the group contacts, filtered and sorted""" - def compare_contact(a): - res = a.get_highest_priority_resource() - if not res: - return 0 - show = res.presence - if show not in PRESENCE_PRIORITY: - return 5 - return PRESENCE_PRIORITY[show] - contact_list = self.contacts if not contact_filter\ + contact_list = self.contacts.copy() if not contact_filter\ else [contact for contact in self.contacts.copy() if contact_filter[0](contact, contact_filter[1])] - contact_list = sorted(contact_list, key=lambda x: x.bare_jid) - return sorted(contact_list, key=compare_contact, reverse=True) + + for sorting in sort.split('_'): + method = SORTING_METHODS.get(sorting, lambda x: 0) + if sorting == 'reverse': + contact_list = list(reversed(contact_list)) + else: + contact_list = sorted(contact_list, key=method) + return contact_list + def toggle_folded(self): """Fold/unfold the group in the roster""" @@ -273,5 +297,6 @@ class RosterGroup(object): """Return the number of connected contacts""" return len([1 for contact in self.contacts if contact.resources]) + # Shared roster object roster = Roster() -- cgit v1.2.3