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
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:
28
zilencer/migrations/0001_initial.py
Normal file
28
zilencer/migrations/0001_initial.py
Normal 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,),
|
||||
),
|
||||
]
|
||||
@@ -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,
|
||||
},
|
||||
),
|
||||
]
|
||||
50
zilencer/migrations/0002_remote_zulip_server.py
Normal file
50
zilencer/migrations/0002_remote_zulip_server.py
Normal 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"
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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"),
|
||||
),
|
||||
]
|
||||
18
zilencer/migrations/0004_remove_deployment_model.py
Normal file
18
zilencer/migrations/0004_remove_deployment_model.py
Normal 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",
|
||||
),
|
||||
]
|
||||
@@ -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")},
|
||||
),
|
||||
]
|
||||
32
zilencer/migrations/0006_customer.py
Normal file
32
zilencer/migrations/0006_customer.py
Normal 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"
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
17
zilencer/migrations/0007_remotezulipserver_fix_uniqueness.py
Normal file
17
zilencer/migrations/0007_remotezulipserver_fix_uniqueness.py
Normal 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),
|
||||
),
|
||||
]
|
||||
22
zilencer/migrations/0008_customer_billing_user.py
Normal file
22
zilencer/migrations/0008_customer_billing_user.py
Normal 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
|
||||
),
|
||||
),
|
||||
]
|
||||
25
zilencer/migrations/0009_plan.py
Normal file
25
zilencer/migrations/0009_plan.py
Normal 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)),
|
||||
],
|
||||
),
|
||||
]
|
||||
39
zilencer/migrations/0010_billingprocessor.py
Normal file
39
zilencer/migrations/0010_billingprocessor.py
Normal 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"
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
25
zilencer/migrations/0012_coupon.py
Normal file
25
zilencer/migrations/0012_coupon.py
Normal 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)),
|
||||
],
|
||||
),
|
||||
]
|
||||
16
zilencer/migrations/0013_remove_customer_billing_user.py
Normal file
16
zilencer/migrations/0013_remove_customer_billing_user.py
Normal 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",
|
||||
),
|
||||
]
|
||||
16
zilencer/migrations/0014_cleanup_pushdevicetoken.py
Normal file
16
zilencer/migrations/0014_cleanup_pushdevicetoken.py
Normal 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")},
|
||||
),
|
||||
]
|
||||
36
zilencer/migrations/0015_delete_billing.py
Normal file
36
zilencer/migrations/0015_delete_billing.py
Normal 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",
|
||||
),
|
||||
]
|
||||
73
zilencer/migrations/0016_remote_counts.py
Normal file
73
zilencer/migrations/0016_remote_counts.py
Normal 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")},
|
||||
),
|
||||
]
|
||||
26
zilencer/migrations/0017_installationcount_indexes.py
Normal file
26
zilencer/migrations/0017_installationcount_indexes.py
Normal 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",
|
||||
),
|
||||
),
|
||||
]
|
||||
36
zilencer/migrations/0018_remoterealmauditlog.py
Normal file
36
zilencer/migrations/0018_remoterealmauditlog.py
Normal 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"
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
17
zilencer/migrations/0019_remotezulipserver_plan_type.py
Normal file
17
zilencer/migrations/0019_remotezulipserver_plan_type.py
Normal 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),
|
||||
),
|
||||
]
|
||||
37
zilencer/migrations/0020_remotezulipserverauditlog.py
Normal file
37
zilencer/migrations/0020_remotezulipserverauditlog.py
Normal 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,
|
||||
},
|
||||
),
|
||||
]
|
||||
17
zilencer/migrations/0021_alter_remotezulipserver_uuid.py
Normal file
17
zilencer/migrations/0021_alter_remotezulipserver_uuid.py
Normal 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),
|
||||
),
|
||||
]
|
||||
@@ -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,
|
||||
)
|
||||
]
|
||||
17
zilencer/migrations/0023_remotezulipserver_deactivated.py
Normal file
17
zilencer/migrations/0023_remotezulipserver_deactivated.py
Normal 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),
|
||||
),
|
||||
]
|
||||
29
zilencer/migrations/0024_remotepushdevicetoken_user_uuid.py
Normal file
29
zilencer/migrations/0024_remotepushdevicetoken_user_uuid.py
Normal 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"),
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
27
zilencer/migrations/0026_auditlog_models_extra_data_json.py
Normal file
27
zilencer/migrations/0026_auditlog_models_extra_data_json.py
Normal 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
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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,
|
||||
),
|
||||
]
|
||||
@@ -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",
|
||||
),
|
||||
]
|
||||
45
zilencer/migrations/0029_update_remoterealm_indexes.py
Normal file
45
zilencer/migrations/0029_update_remoterealm_indexes.py
Normal 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",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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(),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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,
|
||||
),
|
||||
]
|
||||
38
zilencer/migrations/0033_remoterealm.py
Normal file
38
zilencer/migrations/0033_remoterealm.py
Normal 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"
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
17
zilencer/migrations/0036_remotezulipserver_last_version.py
Normal file
17
zilencer/migrations/0036_remotezulipserver_last_version.py
Normal 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),
|
||||
),
|
||||
]
|
||||
@@ -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(),
|
||||
),
|
||||
]
|
||||
34
zilencer/migrations/0038_unique_server_remote_id.py
Normal file
34
zilencer/migrations/0038_unique_server_remote_id.py
Normal 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",
|
||||
),
|
||||
]
|
||||
34
zilencer/migrations/0039_remoterealm_org_type.py
Normal file
34
zilencer/migrations/0039_remoterealm_org_type.py
Normal 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,
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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=""),
|
||||
),
|
||||
]
|
||||
34
zilencer/migrations/0041_remotezulipserver_org_type.py
Normal file
34
zilencer/migrations/0041_remotezulipserver_org_type.py
Normal 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,
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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"
|
||||
),
|
||||
),
|
||||
]
|
||||
34
zilencer/migrations/0044_remoterealmbillinguser.py
Normal file
34
zilencer/migrations/0044_remoterealmbillinguser.py
Normal 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"
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -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",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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")},
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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,
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
17
zilencer/migrations/0051_remoterealm_is_system_bot_realm.py
Normal file
17
zilencer/migrations/0051_remoterealm_is_system_bot_realm.py
Normal 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),
|
||||
),
|
||||
]
|
||||
@@ -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
|
||||
),
|
||||
]
|
||||
@@ -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
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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"),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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",
|
||||
),
|
||||
),
|
||||
]
|
||||
30
zilencer/migrations/0061_clean_count_tables.py
Normal file
30
zilencer/migrations/0061_clean_count_tables.py
Normal 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,
|
||||
),
|
||||
]
|
||||
@@ -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"
|
||||
),
|
||||
),
|
||||
]
|
||||
75
zilencer/migrations/0063_convert_ids_to_bigints.py
Normal file
75
zilencer/migrations/0063_convert_ids_to_bigints.py
Normal 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"
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
47
zilencer/migrations/0065_remotepushdevice.py
Normal file
47
zilencer/migrations/0065_remotepushdevice.py
Normal 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",
|
||||
)
|
||||
],
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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(),
|
||||
),
|
||||
]
|
||||
@@ -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",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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",
|
||||
),
|
||||
]
|
||||
@@ -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",
|
||||
),
|
||||
),
|
||||
]
|
||||
0
zilencer/migrations/__init__.py
Normal file
0
zilencer/migrations/__init__.py
Normal file
Reference in New Issue
Block a user