mirror of https://github.com/zulip/zulip.git
models: Extract zerver.models.realm_audit_logs.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
parent
c9c819e1d7
commit
68d3b9f629
|
@ -31,7 +31,7 @@ def update_realmauditlog_values(apps: StateApps, schema_editor: BaseDatabaseSche
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
RealmAuditLog = apps.get_model("zerver", "RealmAuditLog")
|
RealmAuditLog = apps.get_model("zerver", "RealmAuditLog")
|
||||||
# Constants from models/__init__.py
|
# Constants from models/realm_audit_logs.py
|
||||||
USER_DEFAULT_SENDING_STREAM_CHANGED = 129
|
USER_DEFAULT_SENDING_STREAM_CHANGED = 129
|
||||||
USER_DEFAULT_REGISTER_STREAM_CHANGED = 130
|
USER_DEFAULT_REGISTER_STREAM_CHANGED = 130
|
||||||
USER_DEFAULT_ALL_PUBLIC_STREAMS_CHANGED = 131
|
USER_DEFAULT_ALL_PUBLIC_STREAMS_CHANGED = 131
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
# https://github.com/typeddjango/django-stubs/issues/1698
|
|
||||||
# mypy: disable-error-code="explicit-override"
|
|
||||||
|
|
||||||
from typing import Any, Callable, Dict, List, Tuple, TypeVar, Union
|
from typing import Any, Callable, Dict, List, Tuple, TypeVar, Union
|
||||||
|
|
||||||
import orjson
|
import orjson
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.core.serializers.json import DjangoJSONEncoder
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.backends.base.base import BaseDatabaseWrapper
|
from django.db.backends.base.base import BaseDatabaseWrapper
|
||||||
from django.db.models import CASCADE, Q, QuerySet
|
from django.db.models import CASCADE, QuerySet
|
||||||
from django.db.models.signals import post_delete, post_save
|
from django.db.models.signals import post_delete, post_save
|
||||||
from django.db.models.sql.compiler import SQLCompiler
|
from django.db.models.sql.compiler import SQLCompiler
|
||||||
from django.utils.timezone import now as timezone_now
|
from django.utils.timezone import now as timezone_now
|
||||||
|
@ -74,6 +70,8 @@ from zerver.models.presence import UserPresence as UserPresence
|
||||||
from zerver.models.presence import UserStatus as UserStatus
|
from zerver.models.presence import UserStatus as UserStatus
|
||||||
from zerver.models.push_notifications import AbstractPushDeviceToken as AbstractPushDeviceToken
|
from zerver.models.push_notifications import AbstractPushDeviceToken as AbstractPushDeviceToken
|
||||||
from zerver.models.push_notifications import PushDeviceToken as PushDeviceToken
|
from zerver.models.push_notifications import PushDeviceToken as PushDeviceToken
|
||||||
|
from zerver.models.realm_audit_logs import AbstractRealmAuditLog as AbstractRealmAuditLog
|
||||||
|
from zerver.models.realm_audit_logs import RealmAuditLog as RealmAuditLog
|
||||||
from zerver.models.realm_emoji import RealmEmoji as RealmEmoji
|
from zerver.models.realm_emoji import RealmEmoji as RealmEmoji
|
||||||
from zerver.models.realm_playgrounds import RealmPlayground as RealmPlayground
|
from zerver.models.realm_playgrounds import RealmPlayground as RealmPlayground
|
||||||
from zerver.models.realms import Realm as Realm
|
from zerver.models.realms import Realm as Realm
|
||||||
|
@ -154,229 +152,6 @@ def query_for_ids(
|
||||||
return query
|
return query
|
||||||
|
|
||||||
|
|
||||||
class AbstractRealmAuditLog(models.Model):
|
|
||||||
"""Defines fields common to RealmAuditLog and RemoteRealmAuditLog."""
|
|
||||||
|
|
||||||
event_time = models.DateTimeField(db_index=True)
|
|
||||||
# If True, event_time is an overestimate of the true time. Can be used
|
|
||||||
# by migrations when introducing a new event_type.
|
|
||||||
backfilled = models.BooleanField(default=False)
|
|
||||||
|
|
||||||
# Keys within extra_data, when extra_data is a json dict. Keys are strings because
|
|
||||||
# json keys must always be strings.
|
|
||||||
OLD_VALUE = "1"
|
|
||||||
NEW_VALUE = "2"
|
|
||||||
ROLE_COUNT = "10"
|
|
||||||
ROLE_COUNT_HUMANS = "11"
|
|
||||||
ROLE_COUNT_BOTS = "12"
|
|
||||||
|
|
||||||
extra_data = models.JSONField(default=dict, encoder=DjangoJSONEncoder)
|
|
||||||
|
|
||||||
# Event types
|
|
||||||
USER_CREATED = 101
|
|
||||||
USER_ACTIVATED = 102
|
|
||||||
USER_DEACTIVATED = 103
|
|
||||||
USER_REACTIVATED = 104
|
|
||||||
USER_ROLE_CHANGED = 105
|
|
||||||
USER_DELETED = 106
|
|
||||||
USER_DELETED_PRESERVING_MESSAGES = 107
|
|
||||||
|
|
||||||
USER_SOFT_ACTIVATED = 120
|
|
||||||
USER_SOFT_DEACTIVATED = 121
|
|
||||||
USER_PASSWORD_CHANGED = 122
|
|
||||||
USER_AVATAR_SOURCE_CHANGED = 123
|
|
||||||
USER_FULL_NAME_CHANGED = 124
|
|
||||||
USER_EMAIL_CHANGED = 125
|
|
||||||
USER_TERMS_OF_SERVICE_VERSION_CHANGED = 126
|
|
||||||
USER_API_KEY_CHANGED = 127
|
|
||||||
USER_BOT_OWNER_CHANGED = 128
|
|
||||||
USER_DEFAULT_SENDING_STREAM_CHANGED = 129
|
|
||||||
USER_DEFAULT_REGISTER_STREAM_CHANGED = 130
|
|
||||||
USER_DEFAULT_ALL_PUBLIC_STREAMS_CHANGED = 131
|
|
||||||
USER_SETTING_CHANGED = 132
|
|
||||||
USER_DIGEST_EMAIL_CREATED = 133
|
|
||||||
|
|
||||||
REALM_DEACTIVATED = 201
|
|
||||||
REALM_REACTIVATED = 202
|
|
||||||
REALM_SCRUBBED = 203
|
|
||||||
REALM_PLAN_TYPE_CHANGED = 204
|
|
||||||
REALM_LOGO_CHANGED = 205
|
|
||||||
REALM_EXPORTED = 206
|
|
||||||
REALM_PROPERTY_CHANGED = 207
|
|
||||||
REALM_ICON_SOURCE_CHANGED = 208
|
|
||||||
REALM_DISCOUNT_CHANGED = 209
|
|
||||||
REALM_SPONSORSHIP_APPROVED = 210
|
|
||||||
REALM_BILLING_MODALITY_CHANGED = 211
|
|
||||||
REALM_REACTIVATION_EMAIL_SENT = 212
|
|
||||||
REALM_SPONSORSHIP_PENDING_STATUS_CHANGED = 213
|
|
||||||
REALM_SUBDOMAIN_CHANGED = 214
|
|
||||||
REALM_CREATED = 215
|
|
||||||
REALM_DEFAULT_USER_SETTINGS_CHANGED = 216
|
|
||||||
REALM_ORG_TYPE_CHANGED = 217
|
|
||||||
REALM_DOMAIN_ADDED = 218
|
|
||||||
REALM_DOMAIN_CHANGED = 219
|
|
||||||
REALM_DOMAIN_REMOVED = 220
|
|
||||||
REALM_PLAYGROUND_ADDED = 221
|
|
||||||
REALM_PLAYGROUND_REMOVED = 222
|
|
||||||
REALM_LINKIFIER_ADDED = 223
|
|
||||||
REALM_LINKIFIER_CHANGED = 224
|
|
||||||
REALM_LINKIFIER_REMOVED = 225
|
|
||||||
REALM_EMOJI_ADDED = 226
|
|
||||||
REALM_EMOJI_REMOVED = 227
|
|
||||||
REALM_LINKIFIERS_REORDERED = 228
|
|
||||||
REALM_IMPORTED = 229
|
|
||||||
|
|
||||||
SUBSCRIPTION_CREATED = 301
|
|
||||||
SUBSCRIPTION_ACTIVATED = 302
|
|
||||||
SUBSCRIPTION_DEACTIVATED = 303
|
|
||||||
SUBSCRIPTION_PROPERTY_CHANGED = 304
|
|
||||||
|
|
||||||
USER_MUTED = 350
|
|
||||||
USER_UNMUTED = 351
|
|
||||||
|
|
||||||
STRIPE_CUSTOMER_CREATED = 401
|
|
||||||
STRIPE_CARD_CHANGED = 402
|
|
||||||
STRIPE_PLAN_CHANGED = 403
|
|
||||||
STRIPE_PLAN_QUANTITY_RESET = 404
|
|
||||||
|
|
||||||
CUSTOMER_CREATED = 501
|
|
||||||
CUSTOMER_PLAN_CREATED = 502
|
|
||||||
CUSTOMER_SWITCHED_FROM_MONTHLY_TO_ANNUAL_PLAN = 503
|
|
||||||
CUSTOMER_SWITCHED_FROM_ANNUAL_TO_MONTHLY_PLAN = 504
|
|
||||||
|
|
||||||
STREAM_CREATED = 601
|
|
||||||
STREAM_DEACTIVATED = 602
|
|
||||||
STREAM_NAME_CHANGED = 603
|
|
||||||
STREAM_REACTIVATED = 604
|
|
||||||
STREAM_MESSAGE_RETENTION_DAYS_CHANGED = 605
|
|
||||||
STREAM_PROPERTY_CHANGED = 607
|
|
||||||
STREAM_GROUP_BASED_SETTING_CHANGED = 608
|
|
||||||
|
|
||||||
USER_GROUP_CREATED = 701
|
|
||||||
USER_GROUP_DELETED = 702
|
|
||||||
USER_GROUP_DIRECT_USER_MEMBERSHIP_ADDED = 703
|
|
||||||
USER_GROUP_DIRECT_USER_MEMBERSHIP_REMOVED = 704
|
|
||||||
USER_GROUP_DIRECT_SUBGROUP_MEMBERSHIP_ADDED = 705
|
|
||||||
USER_GROUP_DIRECT_SUBGROUP_MEMBERSHIP_REMOVED = 706
|
|
||||||
USER_GROUP_DIRECT_SUPERGROUP_MEMBERSHIP_ADDED = 707
|
|
||||||
USER_GROUP_DIRECT_SUPERGROUP_MEMBERSHIP_REMOVED = 708
|
|
||||||
# 709 to 719 reserved for membership changes
|
|
||||||
USER_GROUP_NAME_CHANGED = 720
|
|
||||||
USER_GROUP_DESCRIPTION_CHANGED = 721
|
|
||||||
USER_GROUP_GROUP_BASED_SETTING_CHANGED = 722
|
|
||||||
|
|
||||||
# The following values are only for RemoteZulipServerAuditLog
|
|
||||||
# Values should be exactly 10000 greater than the corresponding
|
|
||||||
# value used for the same purpose in RealmAuditLog (e.g.
|
|
||||||
# REALM_DEACTIVATED = 201, and REMOTE_SERVER_DEACTIVATED = 10201).
|
|
||||||
REMOTE_SERVER_DEACTIVATED = 10201
|
|
||||||
REMOTE_SERVER_PLAN_TYPE_CHANGED = 10204
|
|
||||||
REMOTE_SERVER_DISCOUNT_CHANGED = 10209
|
|
||||||
REMOTE_SERVER_SPONSORSHIP_APPROVED = 10210
|
|
||||||
REMOTE_SERVER_BILLING_MODALITY_CHANGED = 10211
|
|
||||||
REMOTE_SERVER_SPONSORSHIP_PENDING_STATUS_CHANGED = 10213
|
|
||||||
REMOTE_SERVER_CREATED = 10215
|
|
||||||
|
|
||||||
# This value is for RemoteRealmAuditLog entries tracking changes to the
|
|
||||||
# RemoteRealm model resulting from modified realm information sent to us
|
|
||||||
# via send_server_data_to_push_bouncer.
|
|
||||||
REMOTE_REALM_VALUE_UPDATED = 20001
|
|
||||||
REMOTE_PLAN_TRANSFERRED_SERVER_TO_REALM = 20002
|
|
||||||
REMOTE_REALM_LOCALLY_DELETED = 20003
|
|
||||||
|
|
||||||
event_type = models.PositiveSmallIntegerField()
|
|
||||||
|
|
||||||
# event_types synced from on-prem installations to Zulip Cloud 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,
|
|
||||||
REALM_IMPORTED,
|
|
||||||
]
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
abstract = True
|
|
||||||
|
|
||||||
|
|
||||||
class RealmAuditLog(AbstractRealmAuditLog):
|
|
||||||
"""
|
|
||||||
RealmAuditLog tracks important changes to users, streams, and
|
|
||||||
realms in Zulip. It is intended to support both
|
|
||||||
debugging/introspection (e.g. determining when a user's left a
|
|
||||||
given stream?) as well as help with some database migrations where
|
|
||||||
we might be able to do a better data backfill with it. Here are a
|
|
||||||
few key details about how this works:
|
|
||||||
|
|
||||||
* acting_user is the user who initiated the state change
|
|
||||||
* modified_user (if present) is the user being modified
|
|
||||||
* modified_stream (if present) is the stream being modified
|
|
||||||
* modified_user_group (if present) is the user group being modified
|
|
||||||
|
|
||||||
For example:
|
|
||||||
* When a user subscribes another user to a stream, modified_user,
|
|
||||||
acting_user, and modified_stream will all be present and different.
|
|
||||||
* When an administrator changes an organization's realm icon,
|
|
||||||
acting_user is that administrator and modified_user,
|
|
||||||
modified_stream and modified_user_group will be None.
|
|
||||||
"""
|
|
||||||
|
|
||||||
realm = models.ForeignKey(Realm, on_delete=CASCADE)
|
|
||||||
acting_user = models.ForeignKey(
|
|
||||||
UserProfile,
|
|
||||||
null=True,
|
|
||||||
related_name="+",
|
|
||||||
on_delete=CASCADE,
|
|
||||||
)
|
|
||||||
modified_user = models.ForeignKey(
|
|
||||||
UserProfile,
|
|
||||||
null=True,
|
|
||||||
related_name="+",
|
|
||||||
on_delete=CASCADE,
|
|
||||||
)
|
|
||||||
modified_stream = models.ForeignKey(
|
|
||||||
Stream,
|
|
||||||
null=True,
|
|
||||||
on_delete=CASCADE,
|
|
||||||
)
|
|
||||||
modified_user_group = models.ForeignKey(
|
|
||||||
UserGroup,
|
|
||||||
null=True,
|
|
||||||
on_delete=CASCADE,
|
|
||||||
)
|
|
||||||
event_last_message_id = models.IntegerField(null=True)
|
|
||||||
|
|
||||||
@override
|
|
||||||
def __str__(self) -> str:
|
|
||||||
if self.modified_user is not None:
|
|
||||||
return f"{self.modified_user!r} {self.event_type} {self.event_time} {self.id}"
|
|
||||||
if self.modified_stream is not None:
|
|
||||||
return f"{self.modified_stream!r} {self.event_type} {self.event_time} {self.id}"
|
|
||||||
if self.modified_user_group is not None:
|
|
||||||
return f"{self.modified_user_group!r} {self.event_type} {self.event_time} {self.id}"
|
|
||||||
return f"{self.realm!r} {self.event_type} {self.event_time} {self.id}"
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
indexes = [
|
|
||||||
models.Index(
|
|
||||||
name="zerver_realmauditlog_user_subscriptions_idx",
|
|
||||||
fields=["modified_user", "modified_stream"],
|
|
||||||
condition=Q(
|
|
||||||
event_type__in=[
|
|
||||||
AbstractRealmAuditLog.SUBSCRIPTION_CREATED,
|
|
||||||
AbstractRealmAuditLog.SUBSCRIPTION_ACTIVATED,
|
|
||||||
AbstractRealmAuditLog.SUBSCRIPTION_DEACTIVATED,
|
|
||||||
]
|
|
||||||
),
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class OnboardingStep(models.Model):
|
class OnboardingStep(models.Model):
|
||||||
user = models.ForeignKey(UserProfile, on_delete=CASCADE)
|
user = models.ForeignKey(UserProfile, on_delete=CASCADE)
|
||||||
onboarding_step = models.CharField(max_length=30)
|
onboarding_step = models.CharField(max_length=30)
|
||||||
|
|
|
@ -0,0 +1,235 @@
|
||||||
|
# https://github.com/typeddjango/django-stubs/issues/1698
|
||||||
|
# mypy: disable-error-code="explicit-override"
|
||||||
|
|
||||||
|
from django.core.serializers.json import DjangoJSONEncoder
|
||||||
|
from django.db import models
|
||||||
|
from django.db.models import CASCADE, Q
|
||||||
|
from typing_extensions import override
|
||||||
|
|
||||||
|
from zerver.models.groups import UserGroup
|
||||||
|
from zerver.models.realms import Realm
|
||||||
|
from zerver.models.streams import Stream
|
||||||
|
from zerver.models.users import UserProfile
|
||||||
|
|
||||||
|
|
||||||
|
class AbstractRealmAuditLog(models.Model):
|
||||||
|
"""Defines fields common to RealmAuditLog and RemoteRealmAuditLog."""
|
||||||
|
|
||||||
|
event_time = models.DateTimeField(db_index=True)
|
||||||
|
# If True, event_time is an overestimate of the true time. Can be used
|
||||||
|
# by migrations when introducing a new event_type.
|
||||||
|
backfilled = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
# Keys within extra_data, when extra_data is a json dict. Keys are strings because
|
||||||
|
# json keys must always be strings.
|
||||||
|
OLD_VALUE = "1"
|
||||||
|
NEW_VALUE = "2"
|
||||||
|
ROLE_COUNT = "10"
|
||||||
|
ROLE_COUNT_HUMANS = "11"
|
||||||
|
ROLE_COUNT_BOTS = "12"
|
||||||
|
|
||||||
|
extra_data = models.JSONField(default=dict, encoder=DjangoJSONEncoder)
|
||||||
|
|
||||||
|
# Event types
|
||||||
|
USER_CREATED = 101
|
||||||
|
USER_ACTIVATED = 102
|
||||||
|
USER_DEACTIVATED = 103
|
||||||
|
USER_REACTIVATED = 104
|
||||||
|
USER_ROLE_CHANGED = 105
|
||||||
|
USER_DELETED = 106
|
||||||
|
USER_DELETED_PRESERVING_MESSAGES = 107
|
||||||
|
|
||||||
|
USER_SOFT_ACTIVATED = 120
|
||||||
|
USER_SOFT_DEACTIVATED = 121
|
||||||
|
USER_PASSWORD_CHANGED = 122
|
||||||
|
USER_AVATAR_SOURCE_CHANGED = 123
|
||||||
|
USER_FULL_NAME_CHANGED = 124
|
||||||
|
USER_EMAIL_CHANGED = 125
|
||||||
|
USER_TERMS_OF_SERVICE_VERSION_CHANGED = 126
|
||||||
|
USER_API_KEY_CHANGED = 127
|
||||||
|
USER_BOT_OWNER_CHANGED = 128
|
||||||
|
USER_DEFAULT_SENDING_STREAM_CHANGED = 129
|
||||||
|
USER_DEFAULT_REGISTER_STREAM_CHANGED = 130
|
||||||
|
USER_DEFAULT_ALL_PUBLIC_STREAMS_CHANGED = 131
|
||||||
|
USER_SETTING_CHANGED = 132
|
||||||
|
USER_DIGEST_EMAIL_CREATED = 133
|
||||||
|
|
||||||
|
REALM_DEACTIVATED = 201
|
||||||
|
REALM_REACTIVATED = 202
|
||||||
|
REALM_SCRUBBED = 203
|
||||||
|
REALM_PLAN_TYPE_CHANGED = 204
|
||||||
|
REALM_LOGO_CHANGED = 205
|
||||||
|
REALM_EXPORTED = 206
|
||||||
|
REALM_PROPERTY_CHANGED = 207
|
||||||
|
REALM_ICON_SOURCE_CHANGED = 208
|
||||||
|
REALM_DISCOUNT_CHANGED = 209
|
||||||
|
REALM_SPONSORSHIP_APPROVED = 210
|
||||||
|
REALM_BILLING_MODALITY_CHANGED = 211
|
||||||
|
REALM_REACTIVATION_EMAIL_SENT = 212
|
||||||
|
REALM_SPONSORSHIP_PENDING_STATUS_CHANGED = 213
|
||||||
|
REALM_SUBDOMAIN_CHANGED = 214
|
||||||
|
REALM_CREATED = 215
|
||||||
|
REALM_DEFAULT_USER_SETTINGS_CHANGED = 216
|
||||||
|
REALM_ORG_TYPE_CHANGED = 217
|
||||||
|
REALM_DOMAIN_ADDED = 218
|
||||||
|
REALM_DOMAIN_CHANGED = 219
|
||||||
|
REALM_DOMAIN_REMOVED = 220
|
||||||
|
REALM_PLAYGROUND_ADDED = 221
|
||||||
|
REALM_PLAYGROUND_REMOVED = 222
|
||||||
|
REALM_LINKIFIER_ADDED = 223
|
||||||
|
REALM_LINKIFIER_CHANGED = 224
|
||||||
|
REALM_LINKIFIER_REMOVED = 225
|
||||||
|
REALM_EMOJI_ADDED = 226
|
||||||
|
REALM_EMOJI_REMOVED = 227
|
||||||
|
REALM_LINKIFIERS_REORDERED = 228
|
||||||
|
REALM_IMPORTED = 229
|
||||||
|
|
||||||
|
SUBSCRIPTION_CREATED = 301
|
||||||
|
SUBSCRIPTION_ACTIVATED = 302
|
||||||
|
SUBSCRIPTION_DEACTIVATED = 303
|
||||||
|
SUBSCRIPTION_PROPERTY_CHANGED = 304
|
||||||
|
|
||||||
|
USER_MUTED = 350
|
||||||
|
USER_UNMUTED = 351
|
||||||
|
|
||||||
|
STRIPE_CUSTOMER_CREATED = 401
|
||||||
|
STRIPE_CARD_CHANGED = 402
|
||||||
|
STRIPE_PLAN_CHANGED = 403
|
||||||
|
STRIPE_PLAN_QUANTITY_RESET = 404
|
||||||
|
|
||||||
|
CUSTOMER_CREATED = 501
|
||||||
|
CUSTOMER_PLAN_CREATED = 502
|
||||||
|
CUSTOMER_SWITCHED_FROM_MONTHLY_TO_ANNUAL_PLAN = 503
|
||||||
|
CUSTOMER_SWITCHED_FROM_ANNUAL_TO_MONTHLY_PLAN = 504
|
||||||
|
|
||||||
|
STREAM_CREATED = 601
|
||||||
|
STREAM_DEACTIVATED = 602
|
||||||
|
STREAM_NAME_CHANGED = 603
|
||||||
|
STREAM_REACTIVATED = 604
|
||||||
|
STREAM_MESSAGE_RETENTION_DAYS_CHANGED = 605
|
||||||
|
STREAM_PROPERTY_CHANGED = 607
|
||||||
|
STREAM_GROUP_BASED_SETTING_CHANGED = 608
|
||||||
|
|
||||||
|
USER_GROUP_CREATED = 701
|
||||||
|
USER_GROUP_DELETED = 702
|
||||||
|
USER_GROUP_DIRECT_USER_MEMBERSHIP_ADDED = 703
|
||||||
|
USER_GROUP_DIRECT_USER_MEMBERSHIP_REMOVED = 704
|
||||||
|
USER_GROUP_DIRECT_SUBGROUP_MEMBERSHIP_ADDED = 705
|
||||||
|
USER_GROUP_DIRECT_SUBGROUP_MEMBERSHIP_REMOVED = 706
|
||||||
|
USER_GROUP_DIRECT_SUPERGROUP_MEMBERSHIP_ADDED = 707
|
||||||
|
USER_GROUP_DIRECT_SUPERGROUP_MEMBERSHIP_REMOVED = 708
|
||||||
|
# 709 to 719 reserved for membership changes
|
||||||
|
USER_GROUP_NAME_CHANGED = 720
|
||||||
|
USER_GROUP_DESCRIPTION_CHANGED = 721
|
||||||
|
USER_GROUP_GROUP_BASED_SETTING_CHANGED = 722
|
||||||
|
|
||||||
|
# The following values are only for RemoteZulipServerAuditLog
|
||||||
|
# Values should be exactly 10000 greater than the corresponding
|
||||||
|
# value used for the same purpose in RealmAuditLog (e.g.
|
||||||
|
# REALM_DEACTIVATED = 201, and REMOTE_SERVER_DEACTIVATED = 10201).
|
||||||
|
REMOTE_SERVER_DEACTIVATED = 10201
|
||||||
|
REMOTE_SERVER_PLAN_TYPE_CHANGED = 10204
|
||||||
|
REMOTE_SERVER_DISCOUNT_CHANGED = 10209
|
||||||
|
REMOTE_SERVER_SPONSORSHIP_APPROVED = 10210
|
||||||
|
REMOTE_SERVER_BILLING_MODALITY_CHANGED = 10211
|
||||||
|
REMOTE_SERVER_SPONSORSHIP_PENDING_STATUS_CHANGED = 10213
|
||||||
|
REMOTE_SERVER_CREATED = 10215
|
||||||
|
|
||||||
|
# This value is for RemoteRealmAuditLog entries tracking changes to the
|
||||||
|
# RemoteRealm model resulting from modified realm information sent to us
|
||||||
|
# via send_server_data_to_push_bouncer.
|
||||||
|
REMOTE_REALM_VALUE_UPDATED = 20001
|
||||||
|
REMOTE_PLAN_TRANSFERRED_SERVER_TO_REALM = 20002
|
||||||
|
REMOTE_REALM_LOCALLY_DELETED = 20003
|
||||||
|
|
||||||
|
event_type = models.PositiveSmallIntegerField()
|
||||||
|
|
||||||
|
# event_types synced from on-prem installations to Zulip Cloud 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,
|
||||||
|
REALM_IMPORTED,
|
||||||
|
]
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
|
class RealmAuditLog(AbstractRealmAuditLog):
|
||||||
|
"""
|
||||||
|
RealmAuditLog tracks important changes to users, streams, and
|
||||||
|
realms in Zulip. It is intended to support both
|
||||||
|
debugging/introspection (e.g. determining when a user's left a
|
||||||
|
given stream?) as well as help with some database migrations where
|
||||||
|
we might be able to do a better data backfill with it. Here are a
|
||||||
|
few key details about how this works:
|
||||||
|
|
||||||
|
* acting_user is the user who initiated the state change
|
||||||
|
* modified_user (if present) is the user being modified
|
||||||
|
* modified_stream (if present) is the stream being modified
|
||||||
|
* modified_user_group (if present) is the user group being modified
|
||||||
|
|
||||||
|
For example:
|
||||||
|
* When a user subscribes another user to a stream, modified_user,
|
||||||
|
acting_user, and modified_stream will all be present and different.
|
||||||
|
* When an administrator changes an organization's realm icon,
|
||||||
|
acting_user is that administrator and modified_user,
|
||||||
|
modified_stream and modified_user_group will be None.
|
||||||
|
"""
|
||||||
|
|
||||||
|
realm = models.ForeignKey(Realm, on_delete=CASCADE)
|
||||||
|
acting_user = models.ForeignKey(
|
||||||
|
UserProfile,
|
||||||
|
null=True,
|
||||||
|
related_name="+",
|
||||||
|
on_delete=CASCADE,
|
||||||
|
)
|
||||||
|
modified_user = models.ForeignKey(
|
||||||
|
UserProfile,
|
||||||
|
null=True,
|
||||||
|
related_name="+",
|
||||||
|
on_delete=CASCADE,
|
||||||
|
)
|
||||||
|
modified_stream = models.ForeignKey(
|
||||||
|
Stream,
|
||||||
|
null=True,
|
||||||
|
on_delete=CASCADE,
|
||||||
|
)
|
||||||
|
modified_user_group = models.ForeignKey(
|
||||||
|
UserGroup,
|
||||||
|
null=True,
|
||||||
|
on_delete=CASCADE,
|
||||||
|
)
|
||||||
|
event_last_message_id = models.IntegerField(null=True)
|
||||||
|
|
||||||
|
@override
|
||||||
|
def __str__(self) -> str:
|
||||||
|
if self.modified_user is not None:
|
||||||
|
return f"{self.modified_user!r} {self.event_type} {self.event_time} {self.id}"
|
||||||
|
if self.modified_stream is not None:
|
||||||
|
return f"{self.modified_stream!r} {self.event_type} {self.event_time} {self.id}"
|
||||||
|
if self.modified_user_group is not None:
|
||||||
|
return f"{self.modified_user_group!r} {self.event_type} {self.event_time} {self.id}"
|
||||||
|
return f"{self.realm!r} {self.event_type} {self.event_time} {self.id}"
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
indexes = [
|
||||||
|
models.Index(
|
||||||
|
name="zerver_realmauditlog_user_subscriptions_idx",
|
||||||
|
fields=["modified_user", "modified_stream"],
|
||||||
|
condition=Q(
|
||||||
|
event_type__in=[
|
||||||
|
AbstractRealmAuditLog.SUBSCRIPTION_CREATED,
|
||||||
|
AbstractRealmAuditLog.SUBSCRIPTION_ACTIVATED,
|
||||||
|
AbstractRealmAuditLog.SUBSCRIPTION_DEACTIVATED,
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
]
|
Loading…
Reference in New Issue