Add /user_activity page.

This page shows aggregate activity for a user on various
clients.  This allows Waseem to troubleshoot things like users
switching between website and desktop, etc.

This particular page probably won't be used too much, but some of the
logic is gonna be reused in the per-realm activity pages.

(imported from commit b8c1fad5bfa45daab40954f92319f6f89a3fa433)
This commit is contained in:
Steve Howell
2013-10-31 13:17:36 -04:00
parent 105380fcf1
commit 3577ba7585
2 changed files with 136 additions and 0 deletions

View File

@@ -2392,6 +2392,141 @@ def get_activity(request, realm=REQ(default=None)):
context_instance=RequestContext(request)
)
def get_user_activity_records_for_email(email):
fields = [
'query',
'client__name',
'count',
'last_visit'
]
records = UserActivity.objects.filter(
user_profile__email=email
)
records = records.order_by("-last_visit")
records = records.select_related('client').only(*fields)
return records
def raw_user_activity_table(records):
cols = [
'query',
'client',
'count',
'last_visit'
]
def row(record):
return [
record.query,
record.client.name,
record.count,
record.last_visit
]
rows = map(row, records)
title = 'Raw Data'
data = dict(
rows=rows,
cols=cols,
title=title
)
content = loader.render_to_string(
'zerver/ad_hoc_query.html',
dict(data=data)
)
return content
def get_user_activity_summary(records):
summary = {}
def update(action, record):
if action not in summary:
summary[action] = dict(
count=record.count,
last_visit=record.last_visit
)
else:
summary[action]['count'] += record.count
summary[action]['last_visit'] = max(
summary[action]['last_visit'],
record.last_visit
)
for record in records:
client = record.client.name
query = record.query
if client == 'website':
update('website', record)
if query == '/json/send_message':
update('send', record)
if query in ['/json/update_pointer', '/api/v1/update_pointer']:
update('pointer', record)
update(client, record)
return summary
def user_activity_summary_table(user_summary):
rows = []
for k, v in user_summary.items():
client = k
count = v['count']
last_visit = v['last_visit']
row = [
last_visit,
client,
count,
]
rows.append(row)
rows = sorted(rows, key=lambda r: r[0], reverse=True)
cols = [
'last_visit',
'client',
'count',
]
title = 'User Activity'
data = dict(
rows=rows,
cols=cols,
title=title
)
content = loader.render_to_string(
'zerver/ad_hoc_query.html',
dict(data=data)
)
return content
@zulip_internal
def get_user_activity(request, email):
records = get_user_activity_records_for_email(email)
data = []
user_summary = get_user_activity_summary(records)
content = user_activity_summary_table(user_summary)
user_content = dict(content=content)
data += [('Summary', user_content)]
content = raw_user_activity_table(records)
user_content = dict(content=content)
data += [('Info', user_content)]
realm = None
title = email
return render_to_response(
'zerver/activity.html',
dict(data=data, realm=realm, title=title),
context_instance=RequestContext(request)
)
def get_status_list(requesting_user_profile):
return {'presences': get_status_dict(requesting_user_profile),
'server_timestamp': time.time()}

View File

@@ -40,6 +40,7 @@ urlpatterns = patterns('',
url(r'^activity$', 'zerver.views.get_activity'),
url(r'^user_activity/(?P<email>[\S]+)/$', 'zerver.views.get_user_activity'),
# Registration views, require a confirmation ID.
url(r'^accounts/home/', 'zerver.views.accounts_home'),