Files
upstream-zulip/corporate/views/user_activity.py
upstream-mirror 64898b2c79
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
2026-09-15 15:05:30 +05:00

86 lines
2.3 KiB
Python

from typing import Any
from django.db.models import QuerySet
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render
from corporate.lib.activity import (
ActivityHeaderEntry,
format_optional_datetime,
make_table,
user_activity_link,
user_support_link,
)
from zerver.decorator import require_server_admin
from zerver.models import UserActivity, UserProfile
from zerver.models.users import get_user_profile_by_id
def get_user_activity_records(
user_profile: UserProfile,
) -> QuerySet[UserActivity]:
fields = [
"query",
"client__name",
"count",
"last_visit",
]
records = (
UserActivity.objects.filter(
user_profile=user_profile,
)
.order_by("-last_visit")
.select_related("client")
.only(*fields)
)
return records
@require_server_admin
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)
title = f"{user_profile.full_name}"
cols = [
"Query",
"Client",
"Count",
"Last visit (UTC)",
]
def row(record: UserActivity) -> list[Any]:
return [
record.query,
record.client.name,
record.count,
format_optional_datetime(record.last_visit),
]
rows = list(map(row, records))
header_entries = []
header_entries.append(ActivityHeaderEntry(name="Email", value=user_profile.delivery_email))
header_entries.append(ActivityHeaderEntry(name="Realm", value=user_profile.realm.name))
if user_profile.is_bot and user_profile.bot_owner is not None:
bot_owner_link = user_activity_link(
user_profile.bot_owner.delivery_email, user_profile.bot_owner.id
)
header_entries.append(ActivityHeaderEntry(name="Bot owner", value=bot_owner_link))
user_support = user_support_link(user_profile.delivery_email)
content = make_table(title, cols, rows, header=header_entries, title_link=user_support)
return render(
request,
"corporate/activity/activity.html",
context=dict(
data=content,
title=title,
is_home=False,
),
)