analytics: Use user IDs to get user activity summaries.

Using user IDs instead of emails is more reliable since users can
have arbitrarily complex emails that are hard to encode in a URL.
This has led to NoReverseMatch exceptions in the past.
This commit is contained in:
Eeshan Garg
2021-10-13 15:16:34 -04:00
committed by Tim Abbott
parent 1e5157b66c
commit 1dec97c925
5 changed files with 25 additions and 23 deletions

View File

@@ -11,13 +11,13 @@ from analytics.views.activity_common import (
make_table,
)
from zerver.decorator import require_server_admin
from zerver.models import UserActivity
from zerver.models import UserActivity, UserProfile, get_user_profile_by_id
if settings.BILLING_ENABLED:
pass
def get_user_activity_records_for_email(email: str) -> List[QuerySet]:
def get_user_activity_records(user_profile: UserProfile) -> List[QuerySet]:
fields = [
"user_profile__full_name",
"query",
@@ -27,7 +27,7 @@ def get_user_activity_records_for_email(email: str) -> List[QuerySet]:
]
records = UserActivity.objects.filter(
user_profile__delivery_email=email,
user_profile=user_profile,
)
records = records.order_by("-last_visit")
records = records.select_related("user_profile", "client").only(*fields)
@@ -58,7 +58,7 @@ def raw_user_activity_table(records: List[QuerySet]) -> str:
def user_activity_summary_table(user_summary: Dict[str, Dict[str, Any]]) -> str:
rows = []
for k, v in user_summary.items():
if k == "name":
if k == "name" or k == "user_profile_id":
continue
client = k
count = v["count"]
@@ -83,8 +83,9 @@ def user_activity_summary_table(user_summary: Dict[str, Dict[str, Any]]) -> str:
@require_server_admin
def get_user_activity(request: HttpRequest, email: str) -> HttpResponse:
records = get_user_activity_records_for_email(email)
def get_user_activity(request: HttpRequest, user_profile_id: int) -> HttpResponse:
user_profile = get_user_profile_by_id(user_profile_id)
records = get_user_activity_records(user_profile)
data: List[Tuple[str, str]] = []
user_summary = get_user_activity_summary(records)
@@ -95,7 +96,7 @@ def get_user_activity(request: HttpRequest, email: str) -> HttpResponse:
content = raw_user_activity_table(records)
data += [("Info", content)]
title = email
title = user_profile.delivery_email
return render(
request,
"analytics/activity.html",