jp: add command "roster stats"
This commit is contained in:
parent
bc371c5569
commit
8a920d41c0
1 changed files with 65 additions and 1 deletions
|
|
@ -22,6 +22,9 @@ import base
|
|||
from sat_frontends.jp.constants import Const as C
|
||||
from sat.core.i18n import _
|
||||
|
||||
from twisted.words.protocols.jabber import jid
|
||||
from collections import OrderedDict
|
||||
|
||||
__commands__ = ["Roster"]
|
||||
|
||||
|
||||
|
|
@ -76,8 +79,69 @@ class Purge(base.CommandBase):
|
|||
self.host.quit()
|
||||
|
||||
|
||||
class Stats(base.CommandBase):
|
||||
|
||||
def __init__(self, host):
|
||||
super(Stats, self).__init__(host, 'stats', help=_('Display show statistics about a roster'))
|
||||
|
||||
def add_parser_options(self):
|
||||
pass
|
||||
|
||||
def connected(self):
|
||||
self.need_loop = True
|
||||
super(Stats, self).connected()
|
||||
self.host.bridge.getContacts(profile_key=self.host.profile, callback=self.gotContacts, errback=self.error)
|
||||
|
||||
def error(self, failure):
|
||||
print (_("Error while retrieving the contacts [%s]") % failure)
|
||||
self.host.quit(1)
|
||||
|
||||
def gotContacts(self, contacts):
|
||||
"""Process the list of contacts.
|
||||
|
||||
@param contacts(list[tuple]): list of contacts with their attributes and groups
|
||||
"""
|
||||
hosts = {}
|
||||
no_subscription = 0
|
||||
no_from_subscription = 0
|
||||
no_to_subscription = 0
|
||||
no_group = 0
|
||||
total_group_subscription = 0
|
||||
for contact, attrs, groups in contacts:
|
||||
from_, to = C.bool(attrs["from"]), C.bool(attrs["to"])
|
||||
if not from_:
|
||||
if not to:
|
||||
no_subscription += 1
|
||||
else:
|
||||
no_from_subscription += 1
|
||||
elif not to:
|
||||
no_to_subscription += 1
|
||||
host = jid.JID(contact).host
|
||||
hosts.setdefault(host, 0)
|
||||
hosts[host] += 1
|
||||
if groups:
|
||||
total_group_subscription += len(groups)
|
||||
if not groups:
|
||||
no_group += 1
|
||||
hosts = OrderedDict(sorted(hosts.items(), key=lambda item:-item[1]))
|
||||
|
||||
print
|
||||
print "Total number of contacts: %d" % len(contacts)
|
||||
print
|
||||
for host, count in hosts.iteritems():
|
||||
print "Contacts on {host}: {count} ({rate:.1f}%)".format(host=host, count=count, rate=100 * float(count) / len(contacts))
|
||||
print
|
||||
print "Contacts with no 'from' subscription: %d" % no_from_subscription
|
||||
print "Contacts with no 'to' subscription: %d" % no_to_subscription
|
||||
print "Contacts with no subscription at all: %d" % no_subscription
|
||||
print
|
||||
print "Contacts not assigned to any group: %d" % no_group
|
||||
print "Average groups' subscriptions per contact: %.1f" % (float(total_group_subscription) / len(contacts))
|
||||
self.host.quit()
|
||||
|
||||
|
||||
class Roster(base.CommandBase):
|
||||
subcommands = (Purge,)
|
||||
subcommands = (Purge, Stats)
|
||||
|
||||
def __init__(self, host):
|
||||
super(Roster, self).__init__(host, 'roster', use_profile=True, help=_("Manage an entity's roster"))
|
||||
|
|
|
|||
Loading…
Reference in a new issue