confirmation: Remove ConfirmationManager.

Also adds Confirmation.type, and cleans up the rest of Confirmation to look
more like the model definitions in zerver.

In the migration, all existing confirmations adopt the type
USER_REGISTRATION, to be conservative. In a few commits, different
confirmation types will have different validity periods, and
USER_REGISTRATION will have the shortest default.
This commit is contained in:
Rishi Gupta
2017-07-07 21:25:05 -07:00
committed by Tim Abbott
parent 0f4b71b766
commit 5d168c90f9
4 changed files with 52 additions and 26 deletions

View File

@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-07-08 04:23
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('confirmation', '0003_emailchangeconfirmation'),
]
operations = [
migrations.DeleteModel(
name='EmailChangeConfirmation',
),
migrations.AlterModelOptions(
name='confirmation',
options={},
),
migrations.AddField(
model_name='confirmation',
name='type',
field=models.PositiveSmallIntegerField(default=1),
preserve_default=False,
),
migrations.AlterField(
model_name='confirmation',
name='confirmation_key',
field=models.CharField(max_length=40),
),
migrations.AlterField(
model_name='confirmation',
name='date_sent',
field=models.DateTimeField(),
),
]

View File

@@ -4,6 +4,7 @@
__revision__ = '$Id: models.py 28 2009-10-22 15:03:02Z jarek.zgoda $'
import datetime
import re
from django.db import models
@@ -46,7 +47,8 @@ def get_object_from_key(confirmation_key):
def create_confirmation_link(obj, host, confirmation_type):
# type: (Union[ContentType, int], str, int) -> str
key = generate_key()
Confirmation.objects.create(content_object=obj, date_sent=timezone_now(), confirmation_key=key)
Confirmation.objects.create(content_object=obj, date_sent=timezone_now(), confirmation_key=key,
type=confirmation_type)
return confirmation_url(key, host, confirmation_type)
def confirmation_url(confirmation_key, host, confirmation_type):
@@ -56,40 +58,24 @@ def confirmation_url(confirmation_key, host, confirmation_type):
reverse(_properties[confirmation_type].url_name,
kwargs={'confirmation_key': confirmation_key}))
class ConfirmationManager(models.Manager):
pass
class EmailChangeConfirmationManager(ConfirmationManager):
pass
class Confirmation(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object_id = models.PositiveIntegerField() # type: int
content_object = GenericForeignKey('content_type', 'object_id')
date_sent = models.DateTimeField('sent')
confirmation_key = models.CharField('activation key', max_length=40)
date_sent = models.DateTimeField() # type: datetime.datetime
confirmation_key = models.CharField(max_length=40) # type: str
# The following list is the set of valid types
USER_REGISTRATION = 1
INVITATION = 2
EMAIL_CHANGE = 3
UNSUBSCRIBE = 4
SERVER_REGISTRATION = 5
objects = ConfirmationManager()
class Meta(object):
verbose_name = 'confirmation email'
verbose_name_plural = 'confirmation emails'
type = models.PositiveSmallIntegerField() # type: int
def __unicode__(self):
# type: () -> Text
return 'confirmation email for %s' % (self.content_object,)
class EmailChangeConfirmation(Confirmation):
class Meta(object):
proxy = True
objects = EmailChangeConfirmationManager()
return '<Confirmation: %s>' % (self.content_object,)
class ConfirmationType(object):
def __init__(self, url_name):

View File

@@ -59,7 +59,8 @@ class EmailChangeTestCase(ZulipTestCase):
date_sent = now() - datetime.timedelta(days=2)
Confirmation.objects.create(content_object=obj,
date_sent=date_sent,
confirmation_key=key)
confirmation_key=key,
type=Confirmation.EMAIL_CHANGE)
url = confirmation_url(key, user_profile.realm.host, Confirmation.EMAIL_CHANGE)
response = self.client_get(url)
self.assert_in_success_response(["Whoops"], response)
@@ -78,7 +79,8 @@ class EmailChangeTestCase(ZulipTestCase):
key = generate_key()
Confirmation.objects.create(content_object=obj,
date_sent=now(),
confirmation_key=key)
confirmation_key=key,
type=Confirmation.EMAIL_CHANGE)
url = confirmation_url(key, user_profile.realm.host, Confirmation.EMAIL_CHANGE)
response = self.client_get(url)

View File

@@ -26,7 +26,7 @@ from zerver.lib.users import check_change_full_name
from zerver.lib.timezone import get_all_timezones
from zerver.models import UserProfile, Realm, name_changes_disabled, \
EmailChangeStatus
from confirmation.models import EmailChangeConfirmation, get_object_from_key
from confirmation.models import get_object_from_key
@zulip_login_required
def confirm_email_change(request, confirmation_key):