support: Include mobile users and mobile push data.

Adds the count for mobile users and mobile pushes forwarded to
the remote support view for both servers and realms.
This commit is contained in:
Lauryn Menard
2024-01-05 22:22:44 +01:00
committed by Tim Abbott
parent 92ebeb7baa
commit 63dd057298
3 changed files with 44 additions and 1 deletions

View File

@@ -1,10 +1,11 @@
from dataclasses import dataclass
from datetime import datetime
from datetime import datetime, timedelta
from decimal import Decimal
from typing import Optional, TypedDict
from urllib.parse import urlencode, urljoin, urlunsplit
from django.conf import settings
from django.db.models import Sum
from django.urls import reverse
from django.utils.timezone import now as timezone_now
@@ -24,6 +25,9 @@ from zerver.models.realms import get_org_type_display_name, get_realm
from zilencer.lib.remote_counts import MissingDataError
from zilencer.models import (
RemoteCustomerUserCount,
RemoteInstallationCount,
RemotePushDeviceToken,
RemoteRealmCount,
RemoteZulipServerAuditLog,
get_remote_realm_guest_and_non_guest_count,
get_remote_server_guest_and_non_guest_count,
@@ -62,12 +66,19 @@ class PlanData:
estimated_next_plan_revenue: Optional[int] = None
@dataclass
class MobilePushData:
mobile_users: Optional[int] = None
mobile_pushes_forwarded: Optional[int] = None
@dataclass
class SupportData:
date_created: datetime
plan_data: PlanData
sponsorship_data: SponsorshipData
user_data: RemoteCustomerUserCount
mobile_push_data: MobilePushData
def get_realm_support_url(realm: Realm) -> str:
@@ -194,10 +205,36 @@ def get_data_for_support_view(billing_session: BillingSession) -> SupportData:
event_type=RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED,
server__id=billing_session.remote_server.id,
).event_time
mobile_users = (
RemotePushDeviceToken.objects.filter(server=billing_session.remote_server)
.distinct("user_id", "user_uuid")
.count()
)
mobile_pushes = RemoteInstallationCount.objects.filter(
server=billing_session.remote_server,
property="mobile_pushes_forwarded::day",
end_time__gte=timezone_now() - timedelta(days=7),
).aggregate(total_forwarded=Sum("value", default=0))
mobile_data = MobilePushData(
mobile_users=mobile_users, mobile_pushes_forwarded=mobile_pushes["total_forwarded"]
)
else:
assert isinstance(billing_session, RemoteRealmBillingSession)
user_data = get_remote_realm_guest_and_non_guest_count(billing_session.remote_realm)
date_created = billing_session.remote_realm.realm_date_created
mobile_users = (
RemotePushDeviceToken.objects.filter(remote_realm=billing_session.remote_realm)
.distinct("user_id", "user_uuid")
.count()
)
mobile_pushes = RemoteRealmCount.objects.filter(
remote_realm=billing_session.remote_realm,
property="mobile_pushes_forwarded::day",
end_time__gte=timezone_now() - timedelta(days=7),
).aggregate(total_forwarded=Sum("value", default=0))
mobile_data = MobilePushData(
mobile_users=mobile_users, mobile_pushes_forwarded=mobile_pushes["total_forwarded"]
)
plan_data = get_current_plan_data_for_support_view(billing_session)
customer = billing_session.get_customer()
if customer is not None:
@@ -210,4 +247,5 @@ def get_data_for_support_view(billing_session: BillingSession) -> SupportData:
plan_data=plan_data,
sponsorship_data=sponsorship_data,
user_data=user_data,
mobile_push_data=mobile_data,
)