remote-support: Add server data for last audit log update time.

This is useful in the support view in case the audit log data is
stale and user counts are not updated for billing.

Also, renames formatting function for optional datetimes that is
used in the support and activity views/charts. And instead of
showing these datetime strings in the eastern US timezone, we
now show and label them as UTC.
This commit is contained in:
Lauryn Menard
2024-02-05 19:07:13 +01:00
committed by Tim Abbott
parent 51542eb55e
commit 5479053a9f
7 changed files with 22 additions and 26 deletions

View File

@@ -1,4 +1,3 @@
import sys
from collections import defaultdict
from dataclasses import dataclass
from datetime import datetime
@@ -34,13 +33,6 @@ from zilencer.models import (
get_remote_customer_user_count,
)
if sys.version_info < (3, 9): # nocoverage
from backports import zoneinfo
else: # nocoverage
import zoneinfo
eastern_tz = zoneinfo.ZoneInfo("America/New_York")
@dataclass
class RemoteActivityPlanData:
@@ -100,9 +92,11 @@ def dictfetchall(cursor: CursorWrapper) -> List[Dict[str, Any]]:
return [dict(zip((col[0] for col in desc), row)) for row in cursor.fetchall()]
def format_date_for_activity_reports(date: Optional[datetime]) -> str:
def format_optional_datetime(date: Optional[datetime], display_none: bool = False) -> str:
if date:
return date.astimezone(eastern_tz).strftime("%Y-%m-%d %H:%M")
return date.strftime("%Y-%m-%d %H:%M")
elif display_none:
return "None"
else:
return ""

View File

@@ -15,7 +15,7 @@ from corporate.lib.activity import (
dictfetchall,
estimate_annual_recurring_revenue_by_realm,
fix_rows,
format_date_for_activity_reports,
format_optional_datetime,
get_query_data,
get_realms_with_default_discount_dict,
make_table,
@@ -331,15 +331,15 @@ def get_integrations_activity(request: HttpRequest) -> HttpResponse:
"Client",
"Realm",
"Hits",
"Last time",
"Last time (UTC)",
]
rows = get_query_data(query)
for i, col in enumerate(cols):
if col == "Realm":
fix_rows(rows, i, realm_activity_link)
elif col == "Last time":
fix_rows(rows, i, format_date_for_activity_reports)
elif col == "Last time (UTC)":
fix_rows(rows, i, format_optional_datetime)
content = make_table(title, cols, rows)
return render(

View File

@@ -11,7 +11,7 @@ from django.utils.timezone import now as timezone_now
from markupsafe import Markup
from corporate.lib.activity import (
format_date_for_activity_reports,
format_optional_datetime,
make_table,
realm_stats_link,
user_activity_link,
@@ -116,8 +116,8 @@ def realm_user_summary_table(
"Email",
"User type",
"Messages sent",
"Last heard from",
"Last message sent",
"Last heard from (UTC)",
"Last message sent (UTC)",
]
rows = []
@@ -129,8 +129,8 @@ def realm_user_summary_table(
user_summary.user_type,
user_summary.messages_sent,
]
cells.append(format_date_for_activity_reports(user_summary.last_heard_from))
cells.append(format_date_for_activity_reports(user_summary.last_message_sent))
cells.append(format_optional_datetime(user_summary.last_heard_from))
cells.append(format_optional_datetime(user_summary.last_message_sent))
row_class = ""
if user_summary.last_heard_from and is_recent(user_summary.last_heard_from):

View File

@@ -4,8 +4,8 @@ from psycopg2.sql import SQL
from corporate.lib.activity import (
fix_rows,
format_date_for_activity_reports,
format_none_as_zero,
format_optional_datetime,
get_plan_data_by_remote_realm,
get_plan_data_by_remote_server,
get_query_data,
@@ -85,7 +85,7 @@ def get_remote_server_activity(request: HttpRequest) -> HttpResponse:
"Realm host or server hostname",
"Server contact email",
"Server Zulip version",
"Server last audit log update",
"Server last audit log update (UTC)",
"Server mobile users",
"Server mobile pushes",
"Realm organization type",
@@ -199,7 +199,7 @@ def get_remote_server_activity(request: HttpRequest) -> HttpResponse:
# Format column data and add total row
for i, col in enumerate(cols):
if i == LAST_AUDIT_LOG_DATE:
fix_rows(rows, i, format_date_for_activity_reports)
fix_rows(rows, i, format_optional_datetime)
if i in [MOBILE_USER_COUNT, MOBILE_PUSH_COUNT]:
fix_rows(rows, i, format_none_as_zero)
if i == SERVER_AND_REALM_IDS:

View File

@@ -19,7 +19,7 @@ from django.utils.translation import gettext as _
from confirmation.models import Confirmation, confirmation_url
from confirmation.settings import STATUS_USED
from corporate.lib.activity import remote_installation_stats_link
from corporate.lib.activity import format_optional_datetime, remote_installation_stats_link
from corporate.lib.stripe import (
RealmBillingSession,
RemoteRealmBillingSession,
@@ -638,6 +638,7 @@ def remote_servers_support(
context["get_plan_type_name"] = get_plan_type_string
context["get_org_type_display_name"] = get_org_type_display_name
context["format_discount"] = format_discount_percentage
context["format_optional_datetime"] = format_optional_datetime
context["dollar_amount"] = cents_to_dollar_string
context["server_analytics_link"] = remote_installation_stats_link
context["REMOTE_PLAN_TIERS"] = get_remote_plan_tier_options()

View File

@@ -4,7 +4,7 @@ from django.db.models import QuerySet
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render
from corporate.lib.activity import format_date_for_activity_reports, make_table
from corporate.lib.activity import format_optional_datetime, make_table
from zerver.decorator import require_server_admin
from zerver.models import UserActivity, UserProfile
from zerver.models.users import get_user_profile_by_id
@@ -40,7 +40,7 @@ def get_user_activity(request: HttpRequest, user_profile_id: int) -> HttpRespons
"Query",
"Client",
"Count",
"Last visit",
"Last visit (UTC)",
]
def row(record: UserActivity) -> List[Any]:
@@ -48,7 +48,7 @@ def get_user_activity(request: HttpRequest, user_profile_id: int) -> HttpRespons
record.query,
record.client.name,
record.count,
format_date_for_activity_reports(record.last_visit),
format_optional_datetime(record.last_visit),
]
rows = list(map(row, records))

View File

@@ -55,6 +55,7 @@
<b>Has remote realms</b>: {{ remote_realms[remote_server.id] != [] }}<br />
<br />
<b>Max monthly messages</b>: {{ remote_server_to_max_monthly_messages[remote_server.id] }}<br />
<b>Last audit log update (UTC)</b>: {{ format_optional_datetime(remote_server.last_audit_log_update, True) }}<br />
<b>Plan type</b>: {{ get_plan_type_name(remote_server.plan_type) }}<br />
<b>Non-guest user count</b>: {{ remote_servers_support_data[remote_server.id].user_data.non_guest_user_count }}<br />
<b>Guest user count</b>: {{ remote_servers_support_data[remote_server.id].user_data.guest_user_count }}<br />