mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 14:03:30 +00:00 
			
		
		
		
	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:
		@@ -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",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user