billing: Sync realm activation events for on-prem billing.

This commit is contained in:
Rishi Gupta
2019-10-07 21:05:22 -07:00
committed by Tim Abbott
parent 01bf99ec65
commit b86142089b
3 changed files with 29 additions and 9 deletions

View File

@@ -716,7 +716,9 @@ def do_deactivate_realm(realm: Realm, acting_user: Optional[UserProfile]=None) -
event_time = timezone_now()
RealmAuditLog.objects.create(
realm=realm, event_type=RealmAuditLog.REALM_DEACTIVATED, event_time=event_time,
acting_user=acting_user)
acting_user=acting_user, extra_data=ujson.dumps({
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(realm)
}))
ScheduledEmail.objects.filter(realm=realm).delete()
for user in active_humans_in_realm(realm):
@@ -735,7 +737,10 @@ def do_reactivate_realm(realm: Realm) -> None:
event_time = timezone_now()
RealmAuditLog.objects.create(
realm=realm, event_type=RealmAuditLog.REALM_REACTIVATED, event_time=event_time)
realm=realm, event_type=RealmAuditLog.REALM_REACTIVATED, event_time=event_time,
extra_data=ujson.dumps({
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(realm)
}))
def do_change_realm_subdomain(realm: Realm, new_subdomain: str) -> None:
realm.string_id = new_subdomain

View File

@@ -2579,14 +2579,10 @@ class RealmAuditLog(models.Model):
ROLE_COUNT = '10'
ROLE_COUNT_HUMANS = '11'
ROLE_COUNT_BOTS = '12'
extra_data = models.TextField(null=True) # type: Optional[str]
# USER_* event_types between 100 and 119 are synced from on-prem installations
# to zulipchat.com when billing for mobile push notifications is enabled.
# Every billing event_type must have ROLE_COUNT populated in extra_data.
MIN_BILLING_EVENT_TYPE = 100
MAX_BILLING_EVENT_TYPE = 119
# Event types
USER_CREATED = 101
USER_ACTIVATED = 102
USER_DEACTIVATED = 103
@@ -2624,6 +2620,13 @@ class RealmAuditLog(models.Model):
event_type = models.PositiveSmallIntegerField() # type: int
# event_types synced from on-prem installations to zulipchat.com when
# billing for mobile push notifications is enabled. Every billing
# event_type should have ROLE_COUNT populated in extra_data.
SYNCED_BILLING_EVENTS = [
USER_CREATED, USER_ACTIVATED, USER_DEACTIVATED, USER_REACTIVATED, USER_ROLE_CHANGED,
REALM_DEACTIVATED, REALM_REACTIVATED]
def __str__(self) -> str:
if self.modified_user is not None:
return "<RealmAuditLog: %s %s %s %s>" % (

View File

@@ -5,7 +5,7 @@ from zerver.lib.actions import do_create_user, do_deactivate_user, \
do_change_user_delivery_email, do_change_avatar_fields, do_change_bot_owner, \
do_regenerate_api_key, do_change_tos_version, \
bulk_add_subscriptions, bulk_remove_subscriptions, get_streams_traffic, \
do_change_is_admin, do_change_is_guest
do_change_is_admin, do_change_is_guest, do_deactivate_realm, do_reactivate_realm
from zerver.lib.test_classes import ZulipTestCase
from zerver.models import RealmAuditLog, get_client, get_realm, UserProfile
from analytics.models import StreamCount
@@ -173,3 +173,15 @@ class TestRealmAuditLog(ZulipTestCase):
self.assertEqual(subscription_deactivation_logs.count(), 1)
self.assertEqual(subscription_deactivation_logs[0].modified_stream.id, stream[0].id)
self.assertEqual(subscription_deactivation_logs[0].modified_user, user[0])
def test_realm_activation(self) -> None:
realm = get_realm('zulip')
do_deactivate_realm(realm)
log_entry = RealmAuditLog.objects.get(realm=realm, event_type=RealmAuditLog.REALM_DEACTIVATED)
extra_data = ujson.loads(log_entry.extra_data)
self.check_role_count_schema(extra_data[RealmAuditLog.ROLE_COUNT])
do_reactivate_realm(realm)
log_entry = RealmAuditLog.objects.get(realm=realm, event_type=RealmAuditLog.REALM_REACTIVATED)
extra_data = ujson.loads(log_entry.extra_data)
self.check_role_count_schema(extra_data[RealmAuditLog.ROLE_COUNT])