2013-04-23 18:51:17 +02:00
|
|
|
from __future__ import absolute_import
|
2015-11-01 17:11:06 +01:00
|
|
|
from __future__ import print_function
|
2013-04-23 18:51:17 +02:00
|
|
|
|
2016-06-04 16:52:18 +02:00
|
|
|
from typing import Any
|
|
|
|
|
2013-01-29 00:34:32 +01:00
|
|
|
from optparse import make_option
|
2016-11-03 10:22:19 +01:00
|
|
|
from django.core.management.base import BaseCommand, CommandParser
|
2013-07-29 23:03:31 +02:00
|
|
|
from zerver.models import Recipient, Message
|
|
|
|
from zerver.lib.timestamp import timestamp_to_datetime
|
2013-01-29 00:34:32 +01:00
|
|
|
import datetime
|
|
|
|
import time
|
|
|
|
import logging
|
|
|
|
|
|
|
|
def compute_stats(log_level):
|
2016-06-04 16:52:18 +02:00
|
|
|
# type: (int) -> None
|
2013-01-29 00:34:32 +01:00
|
|
|
logger = logging.getLogger()
|
|
|
|
logger.setLevel(log_level)
|
|
|
|
|
|
|
|
one_week_ago = timestamp_to_datetime(time.time()) - datetime.timedelta(weeks=1)
|
|
|
|
mit_query = Message.objects.filter(sender__realm__domain="mit.edu",
|
|
|
|
recipient__type=Recipient.STREAM,
|
|
|
|
pub_date__gt=one_week_ago)
|
|
|
|
for bot_sender_start in ["imap.", "rcmd.", "sys."]:
|
2013-03-28 20:43:34 +01:00
|
|
|
mit_query = mit_query.exclude(sender__email__startswith=(bot_sender_start))
|
2013-01-29 00:34:32 +01:00
|
|
|
# Filtering for "/" covers tabbott/extra@ and all the daemon/foo bots.
|
2013-03-28 20:43:34 +01:00
|
|
|
mit_query = mit_query.exclude(sender__email__contains=("/"))
|
|
|
|
mit_query = mit_query.exclude(sender__email__contains=("aim.com"))
|
2013-01-29 00:34:32 +01:00
|
|
|
mit_query = mit_query.exclude(
|
2013-03-28 20:43:34 +01:00
|
|
|
sender__email__in=["rss@mit.edu", "bash@mit.edu", "apache@mit.edu",
|
|
|
|
"bitcoin@mit.edu", "lp@mit.edu", "clocks@mit.edu",
|
|
|
|
"root@mit.edu", "nagios@mit.edu",
|
|
|
|
"www-data|local-realm@mit.edu"])
|
2016-01-26 02:44:57 +01:00
|
|
|
user_counts = {} # type: Dict[str, Dict[str, int]]
|
2013-03-28 20:43:34 +01:00
|
|
|
for m in mit_query.select_related("sending_client", "sender"):
|
|
|
|
email = m.sender.email
|
2013-01-29 00:34:32 +01:00
|
|
|
user_counts.setdefault(email, {})
|
|
|
|
user_counts[email].setdefault(m.sending_client.name, 0)
|
|
|
|
user_counts[email][m.sending_client.name] += 1
|
|
|
|
|
2016-01-26 02:44:57 +01:00
|
|
|
total_counts = {} # type: Dict[str, int]
|
|
|
|
total_user_counts = {} # type: Dict[str, int]
|
2013-01-29 00:34:32 +01:00
|
|
|
for email, counts in user_counts.items():
|
|
|
|
total_user_counts.setdefault(email, 0)
|
|
|
|
for client_name, count in counts.items():
|
|
|
|
total_counts.setdefault(client_name, 0)
|
|
|
|
total_counts[client_name] += count
|
|
|
|
total_user_counts[email] += count
|
|
|
|
|
2013-08-06 21:32:15 +02:00
|
|
|
logging.debug("%40s | %10s | %s" % ("User", "Messages", "Percentage Zulip"))
|
2016-01-26 02:44:57 +01:00
|
|
|
top_percents = {} # type: Dict[int, float]
|
2013-01-29 00:34:32 +01:00
|
|
|
for size in [10, 25, 50, 100, 200, len(total_user_counts.keys())]:
|
2016-01-26 04:08:05 +01:00
|
|
|
top_percents[size] = 0.0
|
2013-01-29 00:34:32 +01:00
|
|
|
for i, email in enumerate(sorted(total_user_counts.keys(),
|
|
|
|
key=lambda x: -total_user_counts[x])):
|
2013-08-06 22:20:02 +02:00
|
|
|
percent_zulip = round(100 - (user_counts[email].get("zephyr_mirror", 0)) * 100. /
|
2013-01-29 00:34:32 +01:00
|
|
|
total_user_counts[email], 1)
|
|
|
|
for size in top_percents.keys():
|
|
|
|
top_percents.setdefault(size, 0)
|
|
|
|
if i < size:
|
2013-08-06 22:20:02 +02:00
|
|
|
top_percents[size] += (percent_zulip * 1.0 / size)
|
2013-01-29 00:34:32 +01:00
|
|
|
|
|
|
|
logging.debug("%40s | %10s | %s%%" % (email, total_user_counts[email],
|
2013-08-06 22:20:02 +02:00
|
|
|
percent_zulip))
|
2013-01-29 00:34:32 +01:00
|
|
|
|
|
|
|
logging.info("")
|
|
|
|
for size in sorted(top_percents.keys()):
|
|
|
|
logging.info("Top %6s | %s%%" % (size, round(top_percents[size], 1)))
|
|
|
|
|
|
|
|
grand_total = sum(total_counts.values())
|
2015-11-01 17:11:06 +01:00
|
|
|
print(grand_total)
|
2013-01-29 00:34:32 +01:00
|
|
|
logging.info("%15s | %s" % ("Client", "Percentage"))
|
|
|
|
for client in total_counts.keys():
|
|
|
|
logging.info("%15s | %s%%" % (client, round(100. * total_counts[client] / grand_total, 1)))
|
|
|
|
|
|
|
|
class Command(BaseCommand):
|
|
|
|
help = "Compute statistics on MIT Zephyr usage."
|
|
|
|
|
2016-11-03 10:22:19 +01:00
|
|
|
def add_arguments(self, parser):
|
|
|
|
# type: (CommandParser) -> None
|
|
|
|
parser.add_argument('--verbose', default=False, action='store_true')
|
|
|
|
|
2013-01-29 00:34:32 +01:00
|
|
|
def handle(self, *args, **options):
|
2016-06-04 16:52:18 +02:00
|
|
|
# type: (*Any, **Any) -> None
|
2013-01-29 00:34:32 +01:00
|
|
|
level = logging.INFO
|
|
|
|
if options["verbose"]:
|
|
|
|
level = logging.DEBUG
|
|
|
|
compute_stats(level)
|