diff --git a/corporate/lib/activity.py b/corporate/lib/activity.py index b1111cfbbe..29db65cbfb 100644 --- a/corporate/lib/activity.py +++ b/corporate/lib/activity.py @@ -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 "" diff --git a/corporate/views/installation_activity.py b/corporate/views/installation_activity.py index 491cef1e3c..a9bc5a00b8 100644 --- a/corporate/views/installation_activity.py +++ b/corporate/views/installation_activity.py @@ -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( diff --git a/corporate/views/realm_activity.py b/corporate/views/realm_activity.py index 0ef67e3816..648a369bb3 100644 --- a/corporate/views/realm_activity.py +++ b/corporate/views/realm_activity.py @@ -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): diff --git a/corporate/views/remote_activity.py b/corporate/views/remote_activity.py index 3023c8d933..917cada65a 100644 --- a/corporate/views/remote_activity.py +++ b/corporate/views/remote_activity.py @@ -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: diff --git a/corporate/views/support.py b/corporate/views/support.py index 3ff997fcb2..01299cf146 100644 --- a/corporate/views/support.py +++ b/corporate/views/support.py @@ -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() diff --git a/corporate/views/user_activity.py b/corporate/views/user_activity.py index 29df5b7160..b38647f795 100644 --- a/corporate/views/user_activity.py +++ b/corporate/views/user_activity.py @@ -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)) diff --git a/templates/corporate/support/remote_server_support.html b/templates/corporate/support/remote_server_support.html index 8b4fc42dfb..90528ab77e 100644 --- a/templates/corporate/support/remote_server_support.html +++ b/templates/corporate/support/remote_server_support.html @@ -55,6 +55,7 @@ Has remote realms: {{ remote_realms[remote_server.id] != [] }}

Max monthly messages: {{ remote_server_to_max_monthly_messages[remote_server.id] }}
+ Last audit log update (UTC): {{ format_optional_datetime(remote_server.last_audit_log_update, True) }}
Plan type: {{ get_plan_type_name(remote_server.plan_type) }}
Non-guest user count: {{ remote_servers_support_data[remote_server.id].user_data.non_guest_user_count }}
Guest user count: {{ remote_servers_support_data[remote_server.id].user_data.guest_user_count }}