mirror of
https://github.com/zulip/zulip.git
synced 2025-10-24 08:33:43 +00:00
Migrate all `ids` of anything which does not have a foreign key from the Message or UserMessage table (and would thus require walking those) to be `bigint`. This is done by removing explicit `BigAutoField`s, trading them for explicit `AutoField`s on the tables to not be migrated, while updating `DEFAULT_AUTO_FIELD` to the new default. In general, the tables adjusted in this commit are small tables -- at least compared to Messages and UserMessages. Many-to-many tables without their own model class are adjusted by a custom Operation, since they do not automatically pick up migrations when `DEFAULT_AUTO_FIELD` changes[^1]. Note that this does multiple scans over tables to update foreign keys[^2]. Large installs may wish to hand-optimize this using the output of `./manage.py sqlmigrate` to join multiple `ALTER TABLE` statements into one, to speed up the migration. This is unfortunately not possible to do generically, as constraint names may differ between installations. This leaves the following primary keys as non-`bigint`: - `auth_group.id` - `auth_group_permissions.id` - `auth_permission.id` - `django_content_type.id` - `django_migrations.id` - `otp_static_staticdevice.id` - `otp_static_statictoken.id` - `otp_totp_totpdevice.id` - `two_factor_phonedevice.id` - `zerver_archivedmessage.id` - `zerver_client.id` - `zerver_message.id` - `zerver_realm.id` - `zerver_recipient.id` - `zerver_userprofile.id` [^1]: https://code.djangoproject.com/ticket/32674 [^2]: https://code.djangoproject.com/ticket/24203
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
from datetime import timedelta
|
|
|
|
from django.db import models
|
|
from django.db.models import CASCADE
|
|
|
|
from zerver.models.clients import Client
|
|
from zerver.models.users import UserProfile
|
|
|
|
|
|
class UserActivity(models.Model):
|
|
"""Data table recording the last time each user hit Zulip endpoints
|
|
via which Clients; unlike UserPresence, these data are not exposed
|
|
to users via the Zulip API.
|
|
|
|
Useful for debugging as well as to answer analytics questions like
|
|
"How many users have accessed the Zulip mobile app in the last
|
|
month?" or "Which users/organizations have recently used API
|
|
endpoint X that is about to be desupported" for communications
|
|
and database migration purposes.
|
|
"""
|
|
|
|
user_profile = models.ForeignKey(UserProfile, on_delete=CASCADE)
|
|
client = models.ForeignKey(Client, on_delete=CASCADE)
|
|
query = models.CharField(max_length=50, db_index=True)
|
|
|
|
count = models.IntegerField()
|
|
last_visit = models.DateTimeField("last visit")
|
|
|
|
class Meta:
|
|
unique_together = ("user_profile", "client", "query")
|
|
|
|
|
|
class UserActivityInterval(models.Model):
|
|
MIN_INTERVAL_LENGTH = timedelta(minutes=15)
|
|
|
|
user_profile = models.ForeignKey(UserProfile, on_delete=CASCADE)
|
|
start = models.DateTimeField("start time", db_index=True)
|
|
end = models.DateTimeField("end time", db_index=True)
|
|
|
|
class Meta:
|
|
indexes = [
|
|
models.Index(
|
|
fields=["user_profile", "end"],
|
|
name="zerver_useractivityinterval_user_profile_id_end_bb3bfc37_idx",
|
|
),
|
|
]
|