models: Add MissedMessageEmailAddress class.

Preparatory commit for making the email mirror use the database instead
of redis for missed message addresses.

This model will represent missed message email addresses, which
currently have their data stored in redis.
The redis data will be converted and migrated into these models and
the email mirror will start using them in the main commit.
This commit is contained in:
Mateusz Mandera
2019-12-25 22:28:05 +01:00
committed by Tim Abbott
parent a38976f25d
commit 8a1d2bb5b6
3 changed files with 50 additions and 0 deletions

View File

@@ -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',

View File

@@ -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)),
],
),
]

View File

@@ -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