snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled

This commit is contained in:
upstream-mirror
2026-09-15 15:05:30 +05:00
commit 64898b2c79
8999 changed files with 1757358 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zerver", "0001_initial"),
]
operations = [
migrations.CreateModel(
name="Deployment",
fields=[
(
"id",
models.AutoField(
verbose_name="ID", serialize=False, auto_created=True, primary_key=True
),
),
("is_active", models.BooleanField(default=True)),
("api_key", models.CharField(max_length=32, null=True)),
("base_api_url", models.CharField(max_length=128)),
("base_site_url", models.CharField(max_length=128)),
("realms", models.ManyToManyField(related_name="_deployments", to="zerver.Realm")),
],
options={},
bases=(models.Model,),
),
]

View File

@@ -0,0 +1,595 @@
# Generated by Django 5.0.7 on 2024-08-13 20:11
import django.core.serializers.json
import django.db.models.deletion
import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
replaces = [
("zilencer", "0001_initial"),
("zilencer", "0002_remote_zulip_server"),
("zilencer", "0003_add_default_for_remotezulipserver_last_updated_field"),
("zilencer", "0004_remove_deployment_model"),
("zilencer", "0005_remotepushdevicetoken_fix_uniqueness"),
("zilencer", "0006_customer"),
("zilencer", "0007_remotezulipserver_fix_uniqueness"),
("zilencer", "0008_customer_billing_user"),
("zilencer", "0009_plan"),
("zilencer", "0010_billingprocessor"),
("zilencer", "0011_customer_has_billing_relationship"),
("zilencer", "0012_coupon"),
("zilencer", "0013_remove_customer_billing_user"),
("zilencer", "0014_cleanup_pushdevicetoken"),
("zilencer", "0015_delete_billing"),
("zilencer", "0016_remote_counts"),
("zilencer", "0017_installationcount_indexes"),
("zilencer", "0018_remoterealmauditlog"),
("zilencer", "0019_remotezulipserver_plan_type"),
("zilencer", "0020_remotezulipserverauditlog"),
("zilencer", "0021_alter_remotezulipserver_uuid"),
("zilencer", "0022_remotezulipserver_create_audit_log_backfill"),
("zilencer", "0023_remotezulipserver_deactivated"),
("zilencer", "0024_remotepushdevicetoken_user_uuid"),
("zilencer", "0025_alter_remotepushdevicetoken_user_id_drop_index"),
("zilencer", "0026_auditlog_models_extra_data_json"),
("zilencer", "0027_backfill_remote_realmauditlog_extradata_to_json_field"),
("zilencer", "0028_rename_extradatajson_remoteauditlog_extra_data"),
("zilencer", "0029_update_remoterealm_indexes"),
("zilencer", "0030_alter_remoteinstallationcount_remote_id"),
("zilencer", "0031_alter_remoteinstallationcount_remote_id_and_more"),
("zilencer", "0032_remotepushdevicetoken_backfill_ios_app_id"),
("zilencer", "0033_remoterealm"),
("zilencer", "0034_remoterealmauditlog_remote_realm_and_more"),
("zilencer", "0035_remoterealmcount_remote_realm_and_more"),
("zilencer", "0036_remotezulipserver_last_version"),
("zilencer", "0037_alter_remoteinstallationcount_unique_together_and_more"),
("zilencer", "0038_unique_server_remote_id"),
("zilencer", "0039_remoterealm_org_type"),
("zilencer", "0040_remoterealm_authentication_methods_remoterealm_name"),
("zilencer", "0041_remotezulipserver_org_type"),
("zilencer", "0042_alter_remoterealmauditlog_realm_id"),
("zilencer", "0043_remotepushdevicetoken_remote_realm"),
("zilencer", "0044_remoterealmbillinguser"),
("zilencer", "0045_remoterealmauditlog_zilencer_remoterealmauditlog_server_realm_and_more"),
("zilencer", "0046_remotezulipserver_last_audit_log_update"),
("zilencer", "0047_preregistrationremoteserverbillinguser_and_more"),
("zilencer", "0048_remotezulipserver_last_api_feature_level"),
("zilencer", "0049_alter_remoterealmbillinguser_unique_together_and_more"),
("zilencer", "0050_preregistrationremoterealmbillinguser_created_user_and_more"),
("zilencer", "0051_remoterealm_is_system_bot_realm"),
("zilencer", "0052_alter_remoterealm_plan_type_and_more"),
("zilencer", "0053_remoterealmauditlog_acting_remote_user_and_more"),
("zilencer", "0054_remoterealmbillinguser_enable_maintenance_release_emails_and_more"),
("zilencer", "0055_remoteserverbillinguser_tos_version"),
("zilencer", "0056_remoterealm_realm_locally_deleted"),
("zilencer", "0057_remoterealm_last_request_timestamp_and_more"),
("zilencer", "0058_remoteinstallationcount_add_mobile_pushes_forwarded_index"),
("zilencer", "0059_remoterealmauditlog_add_synced_billing_event_type_index"),
(
"zilencer",
"0060_remove_remoterealmcount_unique_remote_realm_installation_count_and_more",
),
("zilencer", "0061_clean_count_tables"),
("zilencer", "0062_alter_remoteinstallationcount_id_and_more"),
("zilencer", "0063_convert_ids_to_bigints"),
("zilencer", "0064_remotezulipserver_last_merge_base"),
]
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="RemoteZulipServer",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("uuid", models.UUIDField(unique=True)),
("api_key", models.CharField(max_length=64)),
("hostname", models.CharField(max_length=128)),
("contact_email", models.EmailField(blank=True, max_length=254)),
("last_updated", models.DateTimeField(auto_now=True, verbose_name="last updated")),
("plan_type", models.PositiveSmallIntegerField(default=100)),
("deactivated", models.BooleanField(default=False)),
("last_version", models.CharField(max_length=128, null=True)),
(
"org_type",
models.PositiveSmallIntegerField(
choices=[
(0, "Unspecified"),
(10, "Business"),
(20, "Open-source project"),
(30, "Education (non-profit)"),
(35, "Education (for-profit)"),
(40, "Research"),
(50, "Event or conference"),
(60, "Non-profit (registered)"),
(70, "Government"),
(80, "Political group"),
(90, "Community"),
(100, "Personal"),
(1000, "Other"),
],
default=0,
),
),
("last_audit_log_update", models.DateTimeField(null=True)),
("last_api_feature_level", models.PositiveIntegerField(null=True)),
("last_request_datetime", models.DateTimeField(null=True)),
("last_merge_base", models.CharField(max_length=128, null=True)),
],
),
migrations.CreateModel(
name="RemoteRealm",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("uuid", models.UUIDField(unique=True)),
("uuid_owner_secret", models.TextField()),
("host", models.TextField()),
("last_updated", models.DateTimeField(auto_now=True, verbose_name="last updated")),
("registration_deactivated", models.BooleanField(default=False)),
("realm_deactivated", models.BooleanField(default=False)),
("realm_date_created", models.DateTimeField()),
("plan_type", models.PositiveSmallIntegerField(db_index=True, default=100)),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
(
"org_type",
models.PositiveSmallIntegerField(
choices=[
(0, "Unspecified"),
(10, "Business"),
(20, "Open-source project"),
(30, "Education (non-profit)"),
(35, "Education (for-profit)"),
(40, "Research"),
(50, "Event or conference"),
(60, "Non-profit (registered)"),
(70, "Government"),
(80, "Political group"),
(90, "Community"),
(100, "Personal"),
(1000, "Other"),
],
default=0,
),
),
("authentication_methods", models.JSONField(default=dict)),
("name", models.TextField(default="")),
("is_system_bot_realm", models.BooleanField(default=False)),
("realm_locally_deleted", models.BooleanField(default=False)),
("last_request_datetime", models.DateTimeField(null=True)),
],
),
migrations.CreateModel(
name="RemoteServerBillingUser",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("email", models.EmailField(max_length=254)),
("full_name", models.TextField(default="")),
(
"remote_server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
("date_joined", models.DateTimeField(default=django.utils.timezone.now)),
("is_active", models.BooleanField(default=True)),
("last_login", models.DateTimeField(null=True)),
("enable_maintenance_release_emails", models.BooleanField(default=True)),
("enable_major_release_emails", models.BooleanField(default=True)),
("tos_version", models.TextField(default="-1")),
],
options={
"unique_together": {("remote_server", "email")},
},
),
migrations.CreateModel(
name="RemoteRealmBillingUser",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("user_uuid", models.UUIDField()),
("full_name", models.TextField(default="")),
("email", models.EmailField(max_length=254)),
("tos_version", models.TextField(default="-1")),
(
"remote_realm",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remoterealm"
),
),
("date_joined", models.DateTimeField(default=django.utils.timezone.now)),
("is_active", models.BooleanField(default=True)),
("last_login", models.DateTimeField(null=True)),
("enable_maintenance_release_emails", models.BooleanField(default=True)),
("enable_major_release_emails", models.BooleanField(default=True)),
],
options={
"unique_together": {("remote_realm", "user_uuid")},
},
),
migrations.CreateModel(
name="RemoteInstallationCount",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("property", models.CharField(max_length=32)),
("subgroup", models.CharField(max_length=16, null=True)),
("end_time", models.DateTimeField()),
("value", models.BigIntegerField()),
("remote_id", models.IntegerField(null=True)),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
],
options={
"unique_together": set(),
"indexes": [
models.Index(
condition=models.Q(("property", "mobile_pushes_forwarded::day")),
fields=["server_id", "end_time"],
name="zilencer_remoteinstallationcount_server_end_time_mobile_pushes_forwarded",
)
],
"constraints": [
models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", False)),
fields=("server", "property", "subgroup", "end_time"),
name="unique_remote_installation_count",
),
models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", True)),
fields=("server", "property", "end_time"),
name="unique_remote_installation_count_null_subgroup",
),
models.UniqueConstraint(
condition=models.Q(("remote_id__isnull", False)),
fields=("server", "remote_id"),
name="unique_remote_installation_count_server_id_remote_id",
),
],
},
),
migrations.CreateModel(
name="RemoteRealmCount",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("property", models.CharField(max_length=32)),
("subgroup", models.CharField(max_length=16, null=True)),
("end_time", models.DateTimeField()),
("value", models.BigIntegerField()),
("realm_id", models.IntegerField(null=True)),
("remote_id", models.IntegerField(null=True)),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
(
"remote_realm",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="zilencer.remoterealm",
),
),
],
options={
"unique_together": set(),
"indexes": [
models.Index(
fields=["property", "end_time"],
name="zilencer_remoterealmcount_property_end_time_506a0b38_idx",
),
models.Index(
condition=models.Q(("remote_realm__isnull", True)),
fields=["server", "realm_id"],
name="zilencer_remoterealmcount_server_realm",
),
models.Index(
condition=models.Q(("remote_realm__isnull", True)),
fields=["server"],
name="zilencer_remoterealmcount_server",
),
],
"constraints": [
models.UniqueConstraint(
condition=models.Q(("remote_id__isnull", False)),
fields=("server", "remote_id"),
name="unique_remote_realm_installation_count_server_id_remote_id",
),
models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", False)),
fields=("server", "realm_id", "property", "subgroup", "end_time"),
name="unique_server_realm_installation_count",
),
models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", True)),
fields=("server", "realm_id", "property", "end_time"),
name="unique_server_realm_installation_count_null_subgroup",
),
models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", False)),
fields=("remote_realm_id", "property", "subgroup", "end_time"),
name="unique_remote_realm_installation_count",
),
models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", True)),
fields=("remote_realm_id", "property", "end_time"),
name="unique_remote_realm_installation_count_null_subgroup",
),
],
},
),
migrations.CreateModel(
name="PreregistrationRemoteRealmBillingUser",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("user_uuid", models.UUIDField()),
("email", models.EmailField(max_length=254)),
("status", models.IntegerField(default=0)),
("next_page", models.TextField(null=True)),
("uri_scheme", models.TextField()),
(
"remote_realm",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remoterealm"
),
),
(
"created_user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="zilencer.remoterealmbillinguser",
),
),
("date_joined", models.DateTimeField(default=django.utils.timezone.now)),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="PreregistrationRemoteServerBillingUser",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("email", models.EmailField(max_length=254)),
("status", models.IntegerField(default=0)),
("next_page", models.TextField(null=True)),
(
"remote_server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
(
"created_user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="zilencer.remoteserverbillinguser",
),
),
("date_joined", models.DateTimeField(default=django.utils.timezone.now)),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="RemotePushDeviceToken",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("user_id", models.BigIntegerField(null=True)),
("kind", models.PositiveSmallIntegerField(choices=[(1, "apns"), (2, "gcm")])),
("token", models.CharField(db_index=True, max_length=4096)),
("last_updated", models.DateTimeField(auto_now=True)),
("ios_app_id", models.TextField(null=True)),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
("user_uuid", models.UUIDField(null=True)),
(
"remote_realm",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="zilencer.remoterealm",
),
),
],
options={
"unique_together": {
("server", "user_id", "kind", "token"),
("server", "user_uuid", "kind", "token"),
},
},
),
migrations.CreateModel(
name="RemoteRealmAuditLog",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("realm_id", models.IntegerField(blank=True, null=True)),
("remote_id", models.IntegerField(null=True)),
("event_time", models.DateTimeField(db_index=True)),
("backfilled", models.BooleanField(default=False)),
("event_type", models.PositiveSmallIntegerField()),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
(
"extra_data",
models.JSONField(
default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder
),
),
(
"remote_realm",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="zilencer.remoterealm",
),
),
(
"acting_remote_user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="zilencer.remoterealmbillinguser",
),
),
(
"acting_support_user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"constraints": [
models.UniqueConstraint(
fields=("server", "remote_id"),
name="zilencer_remoterealmauditlog_server_remote",
)
],
"indexes": [
models.Index(
fields=["server", "realm_id", "remote_id"],
name="zilencer_remoterealmauditlog_server_realm_remote",
),
models.Index(
condition=models.Q(("remote_realm__isnull", True)),
fields=["server", "realm_id"],
name="zilencer_remoterealmauditlog_server_realm",
),
models.Index(
condition=models.Q(("remote_realm__isnull", True)),
fields=["server"],
name="zilencer_remoterealmauditlog_server",
),
models.Index(
condition=models.Q(
("event_type__in", [101, 102, 103, 104, 105, 201, 202, 229])
),
fields=["remote_realm_id", "id"],
name="zilencer_remoterealmauditlog_synced_billing_events",
),
],
},
),
migrations.CreateModel(
name="RemoteZulipServerAuditLog",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("event_time", models.DateTimeField(db_index=True)),
("backfilled", models.BooleanField(default=False)),
("event_type", models.PositiveSmallIntegerField()),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
(
"extra_data",
models.JSONField(
default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder
),
),
(
"acting_remote_user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="zilencer.remoteserverbillinguser",
),
),
(
"acting_support_user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"abstract": False,
},
),
]

View File

@@ -0,0 +1,50 @@
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0001_initial"),
]
operations = [
migrations.CreateModel(
name="RemotePushDeviceToken",
fields=[
(
"id",
models.AutoField(
serialize=False, auto_created=True, verbose_name="ID", primary_key=True
),
),
("user_id", models.BigIntegerField()),
("kind", models.PositiveSmallIntegerField(choices=[(1, "apns"), (2, "gcm")])),
("token", models.CharField(unique=True, max_length=4096)),
("last_updated", models.DateTimeField(auto_now=True)),
("ios_app_id", models.TextField(null=True)),
],
),
migrations.CreateModel(
name="RemoteZulipServer",
fields=[
(
"id",
models.AutoField(
serialize=False, auto_created=True, verbose_name="ID", primary_key=True
),
),
("uuid", models.CharField(unique=True, max_length=36)),
("api_key", models.CharField(max_length=64)),
("hostname", models.CharField(unique=True, max_length=128)),
("contact_email", models.EmailField(max_length=254, blank=True)),
("last_updated", models.DateTimeField(verbose_name="last updated")),
],
),
migrations.AddField(
model_name="remotepushdevicetoken",
name="server",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.RemoteZulipServer"
),
),
]

View File

@@ -0,0 +1,16 @@
# Generated by Django 1.10.5 on 2017-05-16 00:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0002_remote_zulip_server"),
]
operations = [
migrations.AlterField(
model_name="remotezulipserver",
name="last_updated",
field=models.DateTimeField(auto_now=True, verbose_name="last updated"),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 1.11.5 on 2017-10-12 06:27
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0003_add_default_for_remotezulipserver_last_updated_field"),
]
operations = [
migrations.RemoveField(
model_name="deployment",
name="realms",
),
migrations.DeleteModel(
name="Deployment",
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 1.11.5 on 2017-10-19 04:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0004_remove_deployment_model"),
]
operations = [
migrations.AlterField(
model_name="remotepushdevicetoken",
name="token",
field=models.CharField(db_index=True, max_length=4096),
),
migrations.AlterField(
model_name="remotepushdevicetoken",
name="user_id",
field=models.BigIntegerField(db_index=True),
),
migrations.AlterUniqueTogether(
name="remotepushdevicetoken",
unique_together={("server", "token")},
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 1.11.6 on 2018-01-13 11:54
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0005_remotepushdevicetoken_fix_uniqueness"),
("zerver", "0001_initial"),
]
operations = [
migrations.CreateModel(
name="Customer",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("stripe_customer_id", models.CharField(max_length=255, unique=True)),
(
"realm",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE, to="zerver.Realm"
),
),
],
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 1.11.11 on 2018-04-30 06:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0006_customer"),
]
operations = [
migrations.AlterField(
model_name="remotezulipserver",
name="hostname",
field=models.CharField(max_length=128),
),
]

View File

@@ -0,0 +1,22 @@
# Generated by Django 1.11.11 on 2018-04-12 01:14
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("zilencer", "0007_remotezulipserver_fix_uniqueness"),
]
operations = [
migrations.AddField(
model_name="customer",
name="billing_user",
field=models.ForeignKey(
null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL
),
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 1.11.11 on 2018-04-12 01:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0008_customer_billing_user"),
]
operations = [
migrations.CreateModel(
name="Plan",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("nickname", models.CharField(max_length=40, unique=True)),
("stripe_plan_id", models.CharField(max_length=255, unique=True)),
],
),
]

View File

@@ -0,0 +1,39 @@
# Generated by Django 1.11.14 on 2018-08-13 23:15
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zerver", "0182_set_initial_value_is_private_flag"),
("zilencer", "0009_plan"),
]
operations = [
migrations.CreateModel(
name="BillingProcessor",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("state", models.CharField(max_length=20)),
("last_modified", models.DateTimeField(auto_now=True)),
(
"log_row",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zerver.RealmAuditLog"
),
),
(
"realm",
models.OneToOneField(
null=True, on_delete=django.db.models.deletion.CASCADE, to="zerver.Realm"
),
),
],
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 1.11.14 on 2018-08-14 01:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0010_billingprocessor"),
]
operations = [
migrations.AddField(
model_name="customer",
name="has_billing_relationship",
field=models.BooleanField(default=False),
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 1.11.14 on 2018-08-23 05:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0011_customer_has_billing_relationship"),
]
operations = [
migrations.CreateModel(
name="Coupon",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("percent_off", models.SmallIntegerField(unique=True)),
("stripe_coupon_id", models.CharField(max_length=255, unique=True)),
],
),
]

View File

@@ -0,0 +1,16 @@
# Generated by Django 1.11.14 on 2018-08-22 06:31
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0012_coupon"),
]
operations = [
migrations.RemoveField(
model_name="customer",
name="billing_user",
),
]

View File

@@ -0,0 +1,16 @@
# Generated by Django 1.11.14 on 2018-10-10 22:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0013_remove_customer_billing_user"),
]
operations = [
migrations.AlterUniqueTogether(
name="remotepushdevicetoken",
unique_together={("server", "user_id", "kind", "token")},
),
]

View File

@@ -0,0 +1,36 @@
# Generated by Django 1.11.14 on 2018-09-25 12:01
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0014_cleanup_pushdevicetoken"),
]
operations = [
migrations.RemoveField(
model_name="billingprocessor",
name="log_row",
),
migrations.RemoveField(
model_name="billingprocessor",
name="realm",
),
migrations.DeleteModel(
name="Coupon",
),
migrations.RemoveField(
model_name="customer",
name="realm",
),
migrations.DeleteModel(
name="Plan",
),
migrations.DeleteModel(
name="BillingProcessor",
),
migrations.DeleteModel(
name="Customer",
),
]

View File

@@ -0,0 +1,73 @@
# Generated by Django 1.11.18 on 2019-02-02 06:02
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0015_delete_billing"),
]
operations = [
migrations.CreateModel(
name="RemoteInstallationCount",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("property", models.CharField(max_length=32)),
("subgroup", models.CharField(max_length=16, null=True)),
("end_time", models.DateTimeField()),
("value", models.BigIntegerField()),
("remote_id", models.IntegerField(db_index=True)),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.RemoteZulipServer"
),
),
],
),
migrations.CreateModel(
name="RemoteRealmCount",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("property", models.CharField(max_length=32)),
("subgroup", models.CharField(max_length=16, null=True)),
("end_time", models.DateTimeField()),
("value", models.BigIntegerField()),
("realm_id", models.IntegerField(db_index=True)),
("remote_id", models.IntegerField(db_index=True)),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.RemoteZulipServer"
),
),
],
),
migrations.AlterUniqueTogether(
name="remoterealmcount",
unique_together={("server", "realm_id", "property", "subgroup", "end_time")},
),
migrations.AddIndex(
model_name="remoterealmcount",
index=models.Index(
fields=["property", "end_time"],
name="zilencer_remoterealmcount_property_end_time_506a0b38_idx",
),
),
migrations.AlterUniqueTogether(
name="remoteinstallationcount",
unique_together={("server", "property", "subgroup", "end_time")},
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 1.11.20 on 2019-04-23 20:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0016_remote_counts"),
]
operations = [
migrations.AddIndex(
model_name="remoteinstallationcount",
index=models.Index(
fields=["server", "remote_id"],
name="zilencer_remoteinstallat_server_id_remote_id_f72e4c30_idx",
),
),
migrations.AddIndex(
model_name="remoterealmcount",
index=models.Index(
fields=["server", "remote_id"],
name="zilencer_remoterealmcount_server_id_remote_id_de1573d8_idx",
),
),
]

View File

@@ -0,0 +1,36 @@
# Generated by Django 1.11.24 on 2019-10-03 00:10
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0017_installationcount_indexes"),
]
operations = [
migrations.CreateModel(
name="RemoteRealmAuditLog",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("realm_id", models.IntegerField(db_index=True)),
("remote_id", models.IntegerField(db_index=True)),
("event_time", models.DateTimeField(db_index=True)),
("backfilled", models.BooleanField(default=False)),
("extra_data", models.TextField(null=True)),
("event_type", models.PositiveSmallIntegerField()),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.RemoteZulipServer"
),
),
],
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 3.2.9 on 2021-12-01 16:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0018_remoterealmauditlog"),
]
operations = [
migrations.AddField(
model_name="remotezulipserver",
name="plan_type",
field=models.PositiveSmallIntegerField(default=1),
),
]

View File

@@ -0,0 +1,37 @@
# Generated by Django 3.2.9 on 2021-12-06 18:35
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0019_remotezulipserver_plan_type"),
]
operations = [
migrations.CreateModel(
name="RemoteZulipServerAuditLog",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("event_time", models.DateTimeField(db_index=True)),
("backfilled", models.BooleanField(default=False)),
("extra_data", models.TextField(null=True)),
("event_type", models.PositiveSmallIntegerField()),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
],
options={
"abstract": False,
},
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 3.2.9 on 2021-12-22 10:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0020_remotezulipserverauditlog"),
]
operations = [
migrations.AlterField(
model_name="remotezulipserver",
name="uuid",
field=models.UUIDField(unique=True),
),
]

View File

@@ -0,0 +1,44 @@
from django.db import migrations
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
def backfill_remote_zulip_server_creation_log_events(
apps: StateApps, schema_editor: BaseDatabaseSchemaEditor
) -> None:
RemoteZulipServer = apps.get_model("zilencer", "RemoteZulipServer")
RemoteZulipServerAuditLog = apps.get_model("zilencer", "RemoteZulipServerAuditLog")
RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED = 10215
objects_to_create = []
for remote_server in RemoteZulipServer.objects.all().iterator():
entry = RemoteZulipServerAuditLog(
server=remote_server,
event_type=RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED,
event_time=remote_server.last_updated,
backfilled=True,
)
objects_to_create.append(entry)
RemoteZulipServerAuditLog.objects.bulk_create(objects_to_create)
def reverse_code(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None:
RemoteZulipServerAuditLog = apps.get_model("zilencer", "RemoteZulipServerAuditLog")
RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED = 10215
RemoteZulipServerAuditLog.objects.filter(
event_type=RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED, backfilled=True
).delete()
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0021_alter_remotezulipserver_uuid"),
]
operations = [
migrations.RunPython(
backfill_remote_zulip_server_creation_log_events,
reverse_code=reverse_code,
elidable=True,
)
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 3.2.9 on 2021-12-15 17:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0022_remotezulipserver_create_audit_log_backfill"),
]
operations = [
migrations.AddField(
model_name="remotezulipserver",
name="deactivated",
field=models.BooleanField(default=False),
),
]

View File

@@ -0,0 +1,29 @@
# Generated by Django 3.2.9 on 2021-12-27 21:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0023_remotezulipserver_deactivated"),
]
operations = [
migrations.AlterField(
model_name="remotepushdevicetoken",
name="user_id",
field=models.BigIntegerField(db_index=True, null=True),
),
migrations.AddField(
model_name="remotepushdevicetoken",
name="user_uuid",
field=models.UUIDField(null=True),
),
migrations.AlterUniqueTogether(
name="remotepushdevicetoken",
unique_together={
("server", "user_uuid", "kind", "token"),
("server", "user_id", "kind", "token"),
},
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 3.2.12 on 2022-03-10 12:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0024_remotepushdevicetoken_user_uuid"),
]
operations = [
migrations.AlterField(
model_name="remotepushdevicetoken",
name="user_id",
field=models.BigIntegerField(null=True),
),
]

View File

@@ -0,0 +1,27 @@
# Generated by Django 4.0.7 on 2022-09-30 20:25
import django
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0025_alter_remotepushdevicetoken_user_id_drop_index"),
]
operations = [
migrations.AddField(
model_name="remoterealmauditlog",
name="extra_data_json",
field=models.JSONField(
default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder
),
),
migrations.AddField(
model_name="remotezulipserverauditlog",
name="extra_data_json",
field=models.JSONField(
default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder
),
),
]

View File

@@ -0,0 +1,152 @@
# Generated by Django 4.0.7 on 2022-09-30 20:30
import ast
from collections.abc import Callable
import orjson
from django.db import migrations, transaction
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
from django.db.models import F, JSONField, Model
from django.db.models.functions import Cast
# This migration is mostly the same as
# backfill_realmauditlog_extradata_to_json_field in zerver.
OLD_VALUE = "1"
NEW_VALUE = "2"
USER_FULL_NAME_CHANGED = 124
REALM_DISCOUNT_CHANGED = 209
BATCH_SIZE = 5000
OVERWRITE_TEMPLATE = """Audit log entry with id {id} has extra_data_json been inconsistently overwritten.
The old value is:
{old_value}
The new value is:
{new_value}
"""
@transaction.atomic
def do_bulk_backfill_extra_data(
audit_log_model: type[Model], id_lower_bound: int, id_upper_bound: int
) -> None:
inconsistent_extra_data_json: list[tuple[int, str, object, object]] = []
# A dict converted with str() will start with a open bracket followed by a
# single quote, as opposed to a JSON-encoded value, which will use a
# _double_ quote. We use this to filter out those entries with malformed
# extra_data to be handled later. This should only update rows with
# extra_data populated with orjson.dumps.
# The first query below checks for entries that would have extra_data_json
# being overwritten by the migration with a value inconsistent with its
# previous value.
inconsistent_extra_data_json.extend(
audit_log_model._default_manager.filter(
extra_data__isnull=False, id__range=(id_lower_bound, id_upper_bound)
)
.annotate(new_extra_data_json=Cast("extra_data", output_field=JSONField()))
.exclude(extra_data__startswith="{'")
.exclude(extra_data_json={})
.exclude(extra_data_json=F("new_extra_data_json"))
.values_list("id", "extra_data", "extra_data_json", "new_extra_data_json")
)
(
audit_log_model._default_manager.filter(
extra_data__isnull=False,
id__range=(id_lower_bound, id_upper_bound),
extra_data_json__inconsistent_old_extra_data__isnull=True,
)
.exclude(extra_data__startswith="{'")
.update(extra_data_json=Cast("extra_data", output_field=JSONField()))
)
python_valued_audit_log_entries = audit_log_model._default_manager.filter(
extra_data__startswith="{'",
id__range=(id_lower_bound, id_upper_bound),
extra_data_json__inconsistent_old_extra_data__isnull=True,
)
for audit_log_entry in python_valued_audit_log_entries:
# extra_data for entries that store dict stringified with builtins.str()
# are converted back with ast.literal_eval for safety and efficiency.
old_value = audit_log_entry.extra_data_json # type: ignore[attr-defined] # The migration cannot depend on zerver.models, which contains the real type of the RealmAuditLog model, so it cannot be properly typed.
new_value = ast.literal_eval(audit_log_entry.extra_data) # type: ignore[attr-defined] # Explained above.
if old_value not in ({}, new_value):
inconsistent_extra_data_json.append(
(audit_log_entry.id, audit_log_entry.extra_data, old_value, new_value) # type: ignore[attr-defined] # Explained above.
)
audit_log_entry.extra_data_json = new_value # type: ignore[attr-defined] # Explained above.
audit_log_model._default_manager.bulk_update(
python_valued_audit_log_entries, fields=["extra_data_json"]
)
if inconsistent_extra_data_json:
audit_log_entries = []
for (
audit_log_entry_id,
old_extra_data,
old_extra_data_json,
new_extra_data_json,
) in inconsistent_extra_data_json:
audit_log_entry = audit_log_model._default_manager.get(id=audit_log_entry_id)
assert isinstance(old_extra_data_json, dict)
if "inconsistent_old_extra_data" in old_extra_data_json:
# Skip entries that have been backfilled and detected as
# anomalies before.
continue
assert isinstance(new_extra_data_json, dict)
audit_log_entry.extra_data_json = { # type: ignore[attr-defined] # Explained above.
**new_extra_data_json,
"inconsistent_old_extra_data": old_extra_data,
"inconsistent_old_extra_data_json": old_extra_data_json,
}
audit_log_entries.append(audit_log_entry)
print(
OVERWRITE_TEMPLATE.format(
id=audit_log_entry_id,
old_value=orjson.dumps(old_extra_data_json).decode(),
new_value=orjson.dumps(new_extra_data_json).decode(),
)
)
audit_log_model._default_manager.bulk_update(audit_log_entries, fields=["extra_data_json"])
def backfill_extra_data(model_name: str) -> Callable[[StateApps, BaseDatabaseSchemaEditor], None]:
def inner(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None:
audit_log_model = apps.get_model("zilencer", model_name)
if not audit_log_model.objects.filter(extra_data__isnull=False).exists():
return
audit_log_entries = audit_log_model.objects.filter(extra_data__isnull=False)
id_lower_bound = audit_log_entries.earliest("id").id
id_upper_bound = audit_log_entries.latest("id").id
while id_lower_bound <= id_upper_bound:
do_bulk_backfill_extra_data(
audit_log_model, id_lower_bound, min(id_lower_bound + BATCH_SIZE, id_upper_bound)
)
id_lower_bound += BATCH_SIZE + 1
do_bulk_backfill_extra_data(audit_log_model, id_lower_bound, id_upper_bound)
return inner
class Migration(migrations.Migration):
atomic = False
dependencies = [
("zilencer", "0026_auditlog_models_extra_data_json"),
]
operations = [
migrations.RunPython(
backfill_extra_data("RemoteRealmAuditLog"),
reverse_code=migrations.RunPython.noop,
elidable=True,
),
migrations.RunPython(
backfill_extra_data("RemoteZulipServerAuditLog"),
reverse_code=migrations.RunPython.noop,
elidable=True,
),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 4.0.7 on 2022-10-02 17:02
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0027_backfill_remote_realmauditlog_extradata_to_json_field"),
]
operations = [
migrations.RemoveField(
model_name="remoterealmauditlog",
name="extra_data",
),
migrations.RemoveField(
model_name="remotezulipserverauditlog",
name="extra_data",
),
migrations.RenameField(
model_name="remoterealmauditlog",
old_name="extra_data_json",
new_name="extra_data",
),
migrations.RenameField(
model_name="remotezulipserverauditlog",
old_name="extra_data_json",
new_name="extra_data",
),
]

View File

@@ -0,0 +1,45 @@
# Generated by Django 4.2.5 on 2023-09-13 05:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0028_rename_extradatajson_remoteauditlog_extra_data"),
]
operations = [
migrations.AlterField(
model_name="remoterealmauditlog",
name="realm_id",
field=models.IntegerField(),
),
migrations.AlterField(
model_name="remoterealmauditlog",
name="remote_id",
field=models.IntegerField(),
),
migrations.AlterField(
model_name="remoterealmcount",
name="realm_id",
field=models.IntegerField(),
),
migrations.AlterField(
model_name="remoterealmcount",
name="remote_id",
field=models.IntegerField(),
),
migrations.AddConstraint(
model_name="remoterealmauditlog",
constraint=models.UniqueConstraint(
fields=("server", "remote_id"), name="zilencer_remoterealmauditlog_server_remote"
),
),
migrations.AddIndex(
model_name="remoterealmauditlog",
index=models.Index(
fields=["server", "realm_id", "remote_id"],
name="zilencer_remoterealmauditlog_server_realm_remote",
),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.6 on 2023-10-20 00:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0029_update_remoterealm_indexes"),
]
operations = [
migrations.AlterField(
model_name="remoteinstallationcount",
name="remote_id",
field=models.IntegerField(),
),
]

View File

@@ -0,0 +1,22 @@
# Generated by Django 4.2.6 on 2023-10-23 20:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0030_alter_remoteinstallationcount_remote_id"),
]
operations = [
migrations.AlterField(
model_name="remoteinstallationcount",
name="remote_id",
field=models.IntegerField(null=True),
),
migrations.AlterField(
model_name="remoterealmcount",
name="remote_id",
field=models.IntegerField(null=True),
),
]

View File

@@ -0,0 +1,37 @@
from django.db import migrations
class Migration(migrations.Migration):
"""
Previous versions of zilencer dropped the ios_app_id on the floor
when registering a push token, and then effectively assumed
the value was "org.zulip.Zulip".
We're going to start actually using that parameter. To preserve
the existing behavior for existing tokens, backfill the value.
"""
dependencies = [
("zilencer", "0031_alter_remoteinstallationcount_remote_id_and_more"),
]
FORMERLY_IMPLICIT_IOS_APP_ID = "org.zulip.Zulip"
operations = [
migrations.RunSQL(
sql=[
(
"""
UPDATE zilencer_remotepushdevicetoken
SET ios_app_id = %s
WHERE kind = 1 AND ios_app_id IS NULL
""",
[FORMERLY_IMPLICIT_IOS_APP_ID],
)
],
# The updated table is still valid with the old schema;
# so to reverse, a no-op suffices.
reverse_sql=[],
elidable=True,
),
]

View File

@@ -0,0 +1,38 @@
# Generated by Django 4.2.6 on 2023-11-02 23:22
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0032_remotepushdevicetoken_backfill_ios_app_id"),
]
operations = [
migrations.CreateModel(
name="RemoteRealm",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("uuid", models.UUIDField(unique=True)),
("uuid_owner_secret", models.TextField()),
("host", models.TextField()),
("last_updated", models.DateTimeField(auto_now=True, verbose_name="last updated")),
("registration_deactivated", models.BooleanField(default=False)),
("realm_deactivated", models.BooleanField(default=False)),
("realm_date_created", models.DateTimeField()),
("plan_type", models.PositiveSmallIntegerField(db_index=True, default=1)),
(
"server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
],
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 4.2.6 on 2023-11-08 23:17
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0033_remoterealm"),
]
operations = [
migrations.AddField(
model_name="remoterealmauditlog",
name="remote_realm",
field=models.ForeignKey(
null=True, on_delete=django.db.models.deletion.CASCADE, to="zilencer.remoterealm"
),
),
migrations.AlterField(
model_name="remoterealmauditlog",
name="remote_id",
field=models.IntegerField(null=True),
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 4.2.6 on 2023-11-09 17:23
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0034_remoterealmauditlog_remote_realm_and_more"),
]
operations = [
migrations.AddField(
model_name="remoterealmcount",
name="remote_realm",
field=models.ForeignKey(
null=True, on_delete=django.db.models.deletion.CASCADE, to="zilencer.remoterealm"
),
),
migrations.AlterField(
model_name="remoterealmcount",
name="realm_id",
field=models.IntegerField(null=True),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.7 on 2023-11-17 20:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0035_remoterealmcount_remote_realm_and_more"),
]
operations = [
migrations.AddField(
model_name="remotezulipserver",
name="last_version",
field=models.CharField(max_length=128, null=True),
),
]

View File

@@ -0,0 +1,95 @@
from django.db import migrations, models
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
from django.db.models import Count, Min
def clear_duplicate_counts(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None:
"""Clean up duplicated RemoteRealmCount and RemoteInstallationCount rows.
This is the equivalent of analytics' 0015_clear_duplicate_counts
migration -- but it also has additional duplicates if there are
multiple servers submitting information with the same UUID.
We drop the behaviour of rolling up and updating the value to the
sum, since the active_users_log:is_bot:day field has a subgroup
(and is thus not affected by the bug), and the few cases for
`invites_sent::day` seem more likely to be re-submissions of the
same data, not duplicates to roll up.
We must do this step before switching the non-unique indexes to be
unique, as there are currently violations.
"""
count_tables = dict(
realm=apps.get_model("zilencer", "RemoteRealmCount"),
installation=apps.get_model("zilencer", "RemoteInstallationCount"),
)
for name, count_table in count_tables.items():
value = ["realm_id", "server_id", "property", "end_time"]
if name == "installation":
value = ["server_id", "property", "end_time"]
duplicated_rows = (
count_table.objects.filter(subgroup=None)
.values(*value)
.annotate(Count("id"), Min("id"))
.filter(id__count__gt=1)
)
for duplicated_row in duplicated_rows:
duplicated_row.pop("id__count")
first_id = duplicated_row.pop("id__min")
count_table.objects.filter(**duplicated_row, id__gt=first_id).delete()
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0036_remotezulipserver_last_version"),
]
operations = [
migrations.RunPython(
clear_duplicate_counts, reverse_code=migrations.RunPython.noop, elidable=True
),
migrations.AddConstraint(
model_name="remoteinstallationcount",
constraint=models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", False)),
fields=("server", "property", "subgroup", "end_time"),
name="unique_remote_installation_count",
),
),
migrations.AddConstraint(
model_name="remoteinstallationcount",
constraint=models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", True)),
fields=("server", "property", "end_time"),
name="unique_remote_installation_count_null_subgroup",
),
),
migrations.AddConstraint(
model_name="remoterealmcount",
constraint=models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", False)),
fields=("server", "realm_id", "property", "subgroup", "end_time"),
name="unique_remote_realm_installation_count",
),
),
migrations.AddConstraint(
model_name="remoterealmcount",
constraint=models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", True)),
fields=("server", "realm_id", "property", "end_time"),
name="unique_remote_realm_installation_count_null_subgroup",
),
),
migrations.AlterUniqueTogether(
name="remoteinstallationcount",
unique_together=set(),
),
migrations.AlterUniqueTogether(
name="remoterealmcount",
unique_together=set(),
),
]

View File

@@ -0,0 +1,34 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0037_alter_remoteinstallationcount_unique_together_and_more"),
]
operations = [
migrations.AddConstraint(
model_name="remoteinstallationcount",
constraint=models.UniqueConstraint(
condition=models.Q(("remote_id__isnull", False)),
fields=("server", "remote_id"),
name="unique_remote_installation_count_server_id_remote_id",
),
),
migrations.RemoveIndex(
model_name="remoteinstallationcount",
name="zilencer_remoteinstallat_server_id_remote_id_f72e4c30_idx",
),
migrations.AddConstraint(
model_name="remoterealmcount",
constraint=models.UniqueConstraint(
condition=models.Q(("remote_id__isnull", False)),
fields=("server", "remote_id"),
name="unique_remote_realm_installation_count_server_id_remote_id",
),
),
migrations.RemoveIndex(
model_name="remoterealmcount",
name="zilencer_remoterealmcount_server_id_remote_id_de1573d8_idx",
),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 4.2.7 on 2023-11-27 00:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0038_unique_server_remote_id"),
]
operations = [
migrations.AddField(
model_name="remoterealm",
name="org_type",
field=models.PositiveSmallIntegerField(
choices=[
(0, "Unspecified"),
(10, "Business"),
(20, "Open-source project"),
(30, "Education (non-profit)"),
(35, "Education (for-profit)"),
(40, "Research"),
(50, "Event or conference"),
(60, "Non-profit (registered)"),
(70, "Government"),
(80, "Political group"),
(90, "Community"),
(100, "Personal"),
(1000, "Other"),
],
default=0,
),
),
]

View File

@@ -0,0 +1,22 @@
# Generated by Django 4.2.7 on 2023-11-29 22:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0039_remoterealm_org_type"),
]
operations = [
migrations.AddField(
model_name="remoterealm",
name="authentication_methods",
field=models.JSONField(default=dict),
),
migrations.AddField(
model_name="remoterealm",
name="name",
field=models.TextField(default=""),
),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 4.2.7 on 2023-11-29 05:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0040_remoterealm_authentication_methods_remoterealm_name"),
]
operations = [
migrations.AddField(
model_name="remotezulipserver",
name="org_type",
field=models.PositiveSmallIntegerField(
choices=[
(0, "Unspecified"),
(10, "Business"),
(20, "Open-source project"),
(30, "Education (non-profit)"),
(35, "Education (for-profit)"),
(40, "Research"),
(50, "Event or conference"),
(60, "Non-profit (registered)"),
(70, "Government"),
(80, "Political group"),
(90, "Community"),
(100, "Personal"),
(1000, "Other"),
],
default=0,
),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.7 on 2023-11-30 11:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0041_remotezulipserver_org_type"),
]
operations = [
migrations.AlterField(
model_name="remoterealmauditlog",
name="realm_id",
field=models.IntegerField(blank=True, null=True),
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.2.7 on 2023-12-01 15:52
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0042_alter_remoterealmauditlog_realm_id"),
]
operations = [
migrations.AddField(
model_name="remotepushdevicetoken",
name="remote_realm",
field=models.ForeignKey(
null=True, on_delete=django.db.models.deletion.SET_NULL, to="zilencer.remoterealm"
),
),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 4.2.7 on 2023-12-05 01:15
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0043_remotepushdevicetoken_remote_realm"),
]
operations = [
migrations.CreateModel(
name="RemoteRealmBillingUser",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("user_uuid", models.UUIDField()),
("full_name", models.TextField(default="")),
("email", models.EmailField(max_length=254)),
("tos_version", models.TextField(default="-1")),
(
"remote_realm",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remoterealm"
),
),
],
),
]

View File

@@ -0,0 +1,47 @@
# Generated by Django 4.2.7 on 2023-12-05 19:33
from django.contrib.postgres.operations import AddIndexConcurrently
from django.db import migrations, models
class Migration(migrations.Migration):
atomic = False
dependencies = [
("zilencer", "0044_remoterealmbillinguser"),
]
operations = [
AddIndexConcurrently(
model_name="remoterealmauditlog",
index=models.Index(
condition=models.Q(("remote_realm__isnull", True)),
fields=["server", "realm_id"],
name="zilencer_remoterealmauditlog_server_realm",
),
),
AddIndexConcurrently(
model_name="remoterealmauditlog",
index=models.Index(
condition=models.Q(("remote_realm__isnull", True)),
fields=["server"],
name="zilencer_remoterealmauditlog_server",
),
),
AddIndexConcurrently(
model_name="remoterealmcount",
index=models.Index(
condition=models.Q(("remote_realm__isnull", True)),
fields=["server", "realm_id"],
name="zilencer_remoterealmcount_server_realm",
),
),
AddIndexConcurrently(
model_name="remoterealmcount",
index=models.Index(
condition=models.Q(("remote_realm__isnull", True)),
fields=["server"],
name="zilencer_remoterealmcount_server",
),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.7 on 2023-12-06 18:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0045_remoterealmauditlog_zilencer_remoterealmauditlog_server_realm_and_more"),
]
operations = [
migrations.AddField(
model_name="remotezulipserver",
name="last_audit_log_update",
field=models.DateTimeField(null=True),
),
]

View File

@@ -0,0 +1,58 @@
# Generated by Django 4.2.8 on 2023-12-08 19:13
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0046_remotezulipserver_last_audit_log_update"),
]
operations = [
migrations.CreateModel(
name="PreregistrationRemoteServerBillingUser",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("email", models.EmailField(max_length=254)),
("status", models.IntegerField(default=0)),
("next_page", models.TextField(null=True)),
(
"remote_server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="RemoteServerBillingUser",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("email", models.EmailField(max_length=254)),
("full_name", models.TextField(default="")),
(
"remote_server",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remotezulipserver"
),
),
],
options={
"unique_together": {("remote_server", "email")},
},
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.8 on 2023-12-09 18:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0047_preregistrationremoteserverbillinguser_and_more"),
]
operations = [
migrations.AddField(
model_name="remotezulipserver",
name="last_api_feature_level",
field=models.PositiveIntegerField(null=True),
),
]

View File

@@ -0,0 +1,42 @@
# Generated by Django 4.2.8 on 2023-12-10 01:01
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0048_remotezulipserver_last_api_feature_level"),
]
operations = [
migrations.AlterUniqueTogether(
name="remoterealmbillinguser",
unique_together={("remote_realm", "user_uuid")},
),
migrations.CreateModel(
name="PreregistrationRemoteRealmBillingUser",
fields=[
(
"id",
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("user_uuid", models.UUIDField()),
("email", models.EmailField(max_length=254)),
("status", models.IntegerField(default=0)),
("next_page", models.TextField(null=True)),
("uri_scheme", models.TextField()),
(
"remote_realm",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="zilencer.remoterealm"
),
),
],
options={
"abstract": False,
},
),
]

View File

@@ -0,0 +1,72 @@
# Generated by Django 4.2.8 on 2023-12-11 12:55
import django.db.models.deletion
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0049_alter_remoterealmbillinguser_unique_together_and_more"),
]
operations = [
migrations.AddField(
model_name="preregistrationremoterealmbillinguser",
name="created_user",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="zilencer.remoterealmbillinguser",
),
),
migrations.AddField(
model_name="preregistrationremoterealmbillinguser",
name="date_joined",
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AddField(
model_name="preregistrationremoteserverbillinguser",
name="created_user",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="zilencer.remoteserverbillinguser",
),
),
migrations.AddField(
model_name="preregistrationremoteserverbillinguser",
name="date_joined",
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AddField(
model_name="remoterealmbillinguser",
name="date_joined",
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AddField(
model_name="remoterealmbillinguser",
name="is_active",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="remoterealmbillinguser",
name="last_login",
field=models.DateTimeField(null=True),
),
migrations.AddField(
model_name="remoteserverbillinguser",
name="date_joined",
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AddField(
model_name="remoteserverbillinguser",
name="is_active",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="remoteserverbillinguser",
name="last_login",
field=models.DateTimeField(null=True),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.8 on 2023-12-11 20:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0050_preregistrationremoterealmbillinguser_created_user_and_more"),
]
operations = [
migrations.AddField(
model_name="remoterealm",
name="is_system_bot_realm",
field=models.BooleanField(default=False),
),
]

View File

@@ -0,0 +1,41 @@
# Generated by Django 4.2.8 on 2023-12-13 23:20
from django.db import migrations, models
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
PLAN_TYPE_SELF_HOSTED = 1
PLAN_TYPE_SELF_MANAGED = 100
def renumber_plan_types(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None:
RemoteZulipServer = apps.get_model("zilencer", "RemoteZulipServer")
RemoteRealm = apps.get_model("zilencer", "RemoteRealm")
RemoteRealm.objects.filter(plan_type=PLAN_TYPE_SELF_HOSTED).update(
plan_type=PLAN_TYPE_SELF_MANAGED
)
RemoteZulipServer.objects.filter(plan_type=PLAN_TYPE_SELF_HOSTED).update(
plan_type=PLAN_TYPE_SELF_MANAGED
)
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0051_remoterealm_is_system_bot_realm"),
]
operations = [
migrations.AlterField(
model_name="remoterealm",
name="plan_type",
field=models.PositiveSmallIntegerField(db_index=True, default=PLAN_TYPE_SELF_MANAGED),
),
migrations.AlterField(
model_name="remotezulipserver",
name="plan_type",
field=models.PositiveSmallIntegerField(default=PLAN_TYPE_SELF_MANAGED),
),
migrations.RunPython(
renumber_plan_types, reverse_code=migrations.RunPython.noop, elidable=True
),
]

View File

@@ -0,0 +1,47 @@
# Generated by Django 4.2.8 on 2023-12-14 14:18
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("zilencer", "0052_alter_remoterealm_plan_type_and_more"),
]
operations = [
migrations.AddField(
model_name="remoterealmauditlog",
name="acting_remote_user",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="zilencer.remoterealmbillinguser",
),
),
migrations.AddField(
model_name="remoterealmauditlog",
name="acting_support_user",
field=models.ForeignKey(
null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL
),
),
migrations.AddField(
model_name="remotezulipserverauditlog",
name="acting_remote_user",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="zilencer.remoteserverbillinguser",
),
),
migrations.AddField(
model_name="remotezulipserverauditlog",
name="acting_support_user",
field=models.ForeignKey(
null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL
),
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 4.2.8 on 2023-12-14 17:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0053_remoterealmauditlog_acting_remote_user_and_more"),
]
operations = [
migrations.AddField(
model_name="remoterealmbillinguser",
name="enable_maintenance_release_emails",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="remoterealmbillinguser",
name="enable_major_release_emails",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="remoteserverbillinguser",
name="enable_maintenance_release_emails",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="remoteserverbillinguser",
name="enable_major_release_emails",
field=models.BooleanField(default=True),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.8 on 2023-12-14 17:27
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0054_remoterealmbillinguser_enable_maintenance_release_emails_and_more"),
]
operations = [
migrations.AddField(
model_name="remoteserverbillinguser",
name="tos_version",
field=models.TextField(default="-1"),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.8 on 2023-12-15 13:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0055_remoteserverbillinguser_tos_version"),
]
operations = [
migrations.AddField(
model_name="remoterealm",
name="realm_locally_deleted",
field=models.BooleanField(default=False),
),
]

View File

@@ -0,0 +1,22 @@
# Generated by Django 4.2.8 on 2023-12-25 00:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0056_remoterealm_realm_locally_deleted"),
]
operations = [
migrations.AddField(
model_name="remoterealm",
name="last_request_datetime",
field=models.DateTimeField(null=True),
),
migrations.AddField(
model_name="remotezulipserver",
name="last_request_datetime",
field=models.DateTimeField(null=True),
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.2.9 on 2024-02-01 13:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0057_remoterealm_last_request_timestamp_and_more"),
]
operations = [
migrations.AddIndex(
model_name="remoteinstallationcount",
index=models.Index(
condition=models.Q(("property", "mobile_pushes_forwarded::day")),
fields=["server_id", "end_time"],
name="zilencer_remoteinstallationcount_server_end_time_mobile_pushes_forwarded",
),
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.2.9 on 2024-02-20 12:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0058_remoteinstallationcount_add_mobile_pushes_forwarded_index"),
]
operations = [
migrations.AddIndex(
model_name="remoterealmauditlog",
index=models.Index(
condition=models.Q(("event_type__in", [101, 102, 103, 104, 105, 201, 202, 229])),
fields=["remote_realm_id", "id"],
name="zilencer_remoterealmauditlog_synced_billing_events",
),
),
]

View File

@@ -0,0 +1,81 @@
# Generated by Django 5.0.5 on 2024-05-06 15:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0059_remoterealmauditlog_add_synced_billing_event_type_index"),
]
operations = [
migrations.SeparateDatabaseAndState(
# Django does not provide a RenameConstraint operation.
# "Constraints" are created as indexes in PostgreSQL, so
# we rename the underlying indexes.
database_operations=[
migrations.RunSQL(
sql=(
"ALTER INDEX unique_remote_realm_installation_count "
"RENAME TO unique_server_realm_installation_count"
),
reverse_sql=(
"ALTER INDEX unique_server_realm_installation_count "
"RENAME TO unique_remote_realm_installation_count"
),
),
migrations.RunSQL(
sql=(
"ALTER INDEX unique_remote_realm_installation_count_null_subgroup "
"RENAME TO unique_server_realm_installation_count_null_subgroup"
),
reverse_sql=(
"ALTER INDEX unique_server_realm_installation_count_null_subgroup "
"RENAME TO unique_remote_realm_installation_count_null_subgroup"
),
),
],
state_operations=[
migrations.RemoveConstraint(
model_name="remoterealmcount",
name="unique_remote_realm_installation_count",
),
migrations.RemoveConstraint(
model_name="remoterealmcount",
name="unique_remote_realm_installation_count_null_subgroup",
),
migrations.AddConstraint(
model_name="remoterealmcount",
constraint=models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", False)),
fields=("server", "realm_id", "property", "subgroup", "end_time"),
name="unique_server_realm_installation_count",
),
),
migrations.AddConstraint(
model_name="remoterealmcount",
constraint=models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", True)),
fields=("server", "realm_id", "property", "end_time"),
name="unique_server_realm_installation_count_null_subgroup",
),
),
],
),
migrations.AddConstraint(
model_name="remoterealmcount",
constraint=models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", False)),
fields=("remote_realm_id", "property", "subgroup", "end_time"),
name="unique_remote_realm_installation_count",
),
),
migrations.AddConstraint(
model_name="remoterealmcount",
constraint=models.UniqueConstraint(
condition=models.Q(("subgroup__isnull", True)),
fields=("remote_realm_id", "property", "end_time"),
name="unique_remote_realm_installation_count_null_subgroup",
),
),
]

View File

@@ -0,0 +1,30 @@
from django.db import migrations
# This matches analytics.lib.counts.LOGGING_COUNT_STAT_PROPERTIES_NOT_SENT_TO_BOUNCER
IGNORED = (
"invites_sent::day",
"mobile_pushes_sent::day",
"active_users_log:is_bot:day",
"active_users:is_bot:day",
)
class Migration(migrations.Migration):
elidable = True
dependencies = [
(
"zilencer",
"0060_remove_remoterealmcount_unique_remote_realm_installation_count_and_more",
),
]
operations = [
migrations.RunSQL(
[
("DELETE FROM zilencer_remoterealmcount WHERE property IN %s", (IGNORED,)),
("DELETE FROM zilencer_remoteinstallationcount WHERE property IN %s", (IGNORED,)),
],
elidable=True,
),
]

View File

@@ -0,0 +1,26 @@
from django.db import migrations, models
class Migration(migrations.Migration):
atomic = False
dependencies = [
("zilencer", "0061_clean_count_tables"),
]
operations = [
migrations.AlterField(
model_name="remoteinstallationcount",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="remoterealmcount",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
]

View File

@@ -0,0 +1,75 @@
from django.db import migrations, models
class Migration(migrations.Migration):
atomic = False
dependencies = [
("zilencer", "0062_alter_remoteinstallationcount_id_and_more"),
]
operations = [
migrations.AlterField(
model_name="preregistrationremoterealmbillinguser",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="preregistrationremoteserverbillinguser",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="remotepushdevicetoken",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="remoterealm",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="remoterealmauditlog",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="remoterealmbillinguser",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="remoteserverbillinguser",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="remotezulipserver",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="remotezulipserverauditlog",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 5.0.6 on 2024-06-23 00:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0063_convert_ids_to_bigints"),
]
operations = [
migrations.AddField(
model_name="remotezulipserver",
name="last_merge_base",
field=models.CharField(max_length=128, null=True),
),
]

View File

@@ -0,0 +1,47 @@
# Generated by Django 5.2.3 on 2025-06-24 07:49
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zerver", "0725_realmuserdefault_web_left_sidebar_unreads_count_summary_and_more"),
("zilencer", "0001_squashed_0064_remotezulipserver_last_merge_base"),
]
operations = [
migrations.CreateModel(
name="RemotePushDevice",
fields=[
("device_id", models.BigAutoField(primary_key=True, serialize=False)),
("token", models.CharField(max_length=4096)),
("token_kind", models.PositiveSmallIntegerField(choices=[(1, "APNs"), (2, "FCM")])),
("push_account_id", models.BigIntegerField()),
("expired_time", models.DateTimeField(null=True)),
("ios_app_id", models.TextField(null=True)),
(
"realm",
models.ForeignKey(
null=True, on_delete=django.db.models.deletion.CASCADE, to="zerver.realm"
),
),
(
"remote_realm",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="zilencer.remoterealm",
),
),
],
options={
"constraints": [
models.UniqueConstraint(
fields=("push_account_id", "token"),
name="unique_remote_push_device_push_account_id_token",
)
],
},
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 5.2.3 on 2025-07-09 13:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0065_remotepushdevice"),
]
operations = [
migrations.AlterField(
model_name="remotepushdevice",
name="token_kind",
field=models.CharField(choices=[("apns", "APNs"), ("fcm", "FCM")], max_length=4),
),
]

View File

@@ -0,0 +1,141 @@
import django.db.models.functions.text
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0066_alter_remotepushdevice_token_kind"),
]
operations = [
# This parallels zerver/migrations/0740 but must account for
# the user_id / user_uuid split.
migrations.RunSQL(
"""
WITH dups AS (
SELECT server_id, user_id, kind, LOWER(token) AS token, MAX(last_updated) AS max_last_updated
FROM zilencer_remotepushdevicetoken
WHERE kind = 1
AND user_uuid IS NULL
GROUP BY server_id, user_id, kind, LOWER(token)
HAVING COUNT(*) > 1
)
UPDATE zilencer_remotepushdevicetoken
SET last_updated = dups.max_last_updated
FROM dups
WHERE zilencer_remotepushdevicetoken.server_id = dups.server_id
AND zilencer_remotepushdevicetoken.user_id = dups.user_id
AND zilencer_remotepushdevicetoken.user_uuid IS NULL
AND zilencer_remotepushdevicetoken.kind = dups.kind
AND LOWER(zilencer_remotepushdevicetoken.token) = dups.token
"""
),
migrations.RunSQL(
"""
WITH dups AS (
SELECT server_id, user_id, kind, LOWER(token) AS token, MIN(id) AS min_id
FROM zilencer_remotepushdevicetoken
WHERE kind = 1
AND user_uuid IS NULL
GROUP BY server_id, user_id, kind, LOWER(token)
HAVING COUNT(*) > 1
)
DELETE FROM zilencer_remotepushdevicetoken
USING dups
WHERE zilencer_remotepushdevicetoken.server_id = dups.server_id
AND zilencer_remotepushdevicetoken.user_id = dups.user_id
AND zilencer_remotepushdevicetoken.user_uuid IS NULL
AND zilencer_remotepushdevicetoken.kind = dups.kind
AND LOWER(zilencer_remotepushdevicetoken.token) = dups.token
AND zilencer_remotepushdevicetoken.id != dups.min_id
"""
),
migrations.AddConstraint(
model_name="remotepushdevicetoken",
constraint=models.UniqueConstraint(
models.F("server_id"),
models.F("user_id"),
models.F("kind"),
django.db.models.functions.text.Lower(models.F("token")),
condition=models.Q(("kind", 1)),
name="zilencer_remotepushdevicetoken_apns_server_user_id_kind_token",
),
),
migrations.AddConstraint(
model_name="remotepushdevicetoken",
constraint=models.UniqueConstraint(
models.F("server_id"),
models.F("user_id"),
models.F("kind"),
models.F("token"),
condition=models.Q(("kind", 2)),
name="zilencer_remotepushdevicetoken_fcm_server_user_id_kind_token",
),
),
migrations.RunSQL(
"""
WITH dups AS (
SELECT server_id, user_uuid, kind, LOWER(token) AS token, MAX(last_updated) AS max_last_updated
FROM zilencer_remotepushdevicetoken
WHERE kind = 1
AND user_id IS NULL
GROUP BY server_id, user_uuid, kind, LOWER(token)
HAVING COUNT(*) > 1
)
UPDATE zilencer_remotepushdevicetoken
SET last_updated = dups.max_last_updated
FROM dups
WHERE zilencer_remotepushdevicetoken.server_id = dups.server_id
AND zilencer_remotepushdevicetoken.user_uuid = dups.user_uuid
AND zilencer_remotepushdevicetoken.user_id IS NULL
AND zilencer_remotepushdevicetoken.kind = dups.kind
AND LOWER(zilencer_remotepushdevicetoken.token) = dups.token
"""
),
migrations.RunSQL(
"""
WITH dups AS (
SELECT server_id, user_uuid, kind, LOWER(token) AS token, MIN(id) AS min_id
FROM zilencer_remotepushdevicetoken
WHERE kind = 1
AND user_id IS NULL
GROUP BY server_id, user_uuid, kind, LOWER(token)
HAVING COUNT(*) > 1
)
DELETE FROM zilencer_remotepushdevicetoken
USING dups
WHERE zilencer_remotepushdevicetoken.server_id = dups.server_id
AND zilencer_remotepushdevicetoken.user_uuid = dups.user_uuid
AND zilencer_remotepushdevicetoken.user_id IS NULL
AND zilencer_remotepushdevicetoken.kind = dups.kind
AND LOWER(zilencer_remotepushdevicetoken.token) = dups.token
AND zilencer_remotepushdevicetoken.id != dups.min_id
"""
),
migrations.AddConstraint(
model_name="remotepushdevicetoken",
constraint=models.UniqueConstraint(
models.F("server_id"),
models.F("user_uuid"),
models.F("kind"),
django.db.models.functions.text.Lower(models.F("token")),
condition=models.Q(("kind", 1)),
name="zilencer_remotepushdevicetoken_apns_server_uuid_kind_token",
),
),
migrations.AddConstraint(
model_name="remotepushdevicetoken",
constraint=models.UniqueConstraint(
models.F("server_id"),
models.F("user_uuid"),
models.F("kind"),
models.F("token"),
condition=models.Q(("kind", 2)),
name="zilencer_remotepushdevicetoken_fcm_server_uuid_kind_token",
),
),
migrations.AlterUniqueTogether(
name="remotepushdevicetoken",
unique_together=set(),
),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 5.2.10 on 2026-02-02 17:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zerver", "0779_device"),
("zilencer", "0067_remotepushdevicetoken_apns_case_insensitive"),
]
operations = [
migrations.RemoveConstraint(
model_name="remotepushdevice",
name="unique_remote_push_device_push_account_id_token",
),
migrations.AddField(
model_name="remotepushdevice",
name="token_id",
field=models.BigIntegerField(default=None),
preserve_default=False,
),
migrations.AddConstraint(
model_name="remotepushdevice",
constraint=models.UniqueConstraint(
fields=("token_id", "realm", "remote_realm"),
name="unique_remote_push_device_token_id_realm_remote_realm",
),
),
]

View File

@@ -0,0 +1,16 @@
# Generated by Django 5.2.10 on 2026-02-03 16:35
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0068_add_remotepushdevice_token_id_and_more"),
]
operations = [
migrations.RemoveField(
model_name="remotepushdevice",
name="push_account_id",
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 5.2.12 on 2026-04-08 16:02
from django.contrib.postgres.operations import AddIndexConcurrently, RemoveIndexConcurrently
from django.db import migrations, models
class Migration(migrations.Migration):
atomic = False
dependencies = [
("zilencer", "0069_remove_remotepushdevice_push_account_id"),
]
operations = [
RemoveIndexConcurrently(
model_name="remoterealmauditlog",
name="zilencer_remoterealmauditlog_synced_billing_events",
),
AddIndexConcurrently(
model_name="remoterealmauditlog",
index=models.Index(
condition=models.Q(
(
"event_type__in",
[101, 102, 103, 104, 105, 201, 202, 229, 725],
)
),
fields=["remote_realm_id", "id"],
name="zilencer_remoterealmauditlog_synced_billing_events",
),
),
]

View File