diff --git a/zerver/lib/export.py b/zerver/lib/export.py index 06322519c4..67f7db0625 100644 --- a/zerver/lib/export.py +++ b/zerver/lib/export.py @@ -98,6 +98,7 @@ ALL_ZULIP_TABLES = { 'zerver_emailchangestatus', 'zerver_huddle', 'zerver_message', + 'zerver_missedmessageemailaddress', 'zerver_multiuseinvite', 'zerver_multiuseinvite_streams', 'zerver_preregistrationuser', @@ -145,6 +146,11 @@ NON_EXPORTED_TABLES = { 'zerver_preregistrationuser', 'zerver_preregistrationuser_streams', + # Missed message addresses are low value to export since + # missed-message email addresses include the server's hostname and + # expire after a few days. + 'zerver_missedmessageemailaddress', + # When switching servers, clients will need to re-login and # reregister for push notifications anyway. 'zerver_pushdevicetoken', diff --git a/zerver/migrations/0259_missedmessageemailaddress.py b/zerver/migrations/0259_missedmessageemailaddress.py new file mode 100644 index 0000000000..a1fd4a932a --- /dev/null +++ b/zerver/migrations/0259_missedmessageemailaddress.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.26 on 2020-01-06 01:23 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('zerver', '0258_enable_online_push_notifications_default'), + ] + + operations = [ + migrations.CreateModel( + name='MissedMessageEmailAddress', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('email_token', models.CharField(db_index=True, max_length=34, unique=True)), + ('timestamp', models.DateTimeField(db_index=True, default=django.utils.timezone.now)), + ('times_used', models.PositiveIntegerField(db_index=True, default=0)), + ('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='zerver.Message')), + ('user_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/zerver/models.py b/zerver/models.py index 3fa6e2b94b..d4aa0131c4 100644 --- a/zerver/models.py +++ b/zerver/models.py @@ -2509,6 +2509,21 @@ class ScheduledEmail(AbstractScheduledJob): self.address or list(self.users.all()), self.scheduled_timestamp) +class MissedMessageEmailAddress(models.Model): + EXPIRY_SECONDS = 60 * 60 * 24 * 5 + + message = models.ForeignKey(Message, on_delete=CASCADE) # type: Message + user_profile = models.ForeignKey(UserProfile, on_delete=CASCADE) # type: UserProfile + email_token = models.CharField(max_length=34, unique=True, db_index=True) # type: str + + # Timestamp of when the missed message address generated. + # The address is valid until timestamp + EXPIRY_SECONDS. + timestamp = models.DateTimeField(db_index=True, default=timezone_now) # type: datetime.datetime + times_used = models.PositiveIntegerField(default=0, db_index=True) # type: int + + def __str__(self) -> str: + return settings.EMAIL_GATEWAY_PATTERN % (self.email_token,) + class ScheduledMessage(models.Model): sender = models.ForeignKey(UserProfile, on_delete=CASCADE) # type: UserProfile recipient = models.ForeignKey(Recipient, on_delete=CASCADE) # type: Recipient