Implement MIT signups.

Here we introduce a new manage.py command, activate_mit, which takes a
number of usernames and sends out emails to the users with instructions on
how to activate their accounts.

(imported from commit f14401b55f915698e83ff27b86434f53e64685f3)
This commit is contained in:
Luke Faraone
2012-10-29 14:08:18 -04:00
parent 50e40d3f47
commit 5dad59e864
7 changed files with 117 additions and 8 deletions

View File

@@ -0,0 +1,14 @@
{% extends "zephyr/base.html" %}
{% block content %}
<form id="register" action="/accounts/register/" method="post">
{% csrf_token %}
<input type="hidden" value="{{ key }}" name="key"/>
<input type="hidden" value="1" name="from_confirmation"/>
</form>
<script type="text/javascript">
$("#register").submit();
</script>
{% endblock %}

View File

@@ -0,0 +1,37 @@
Hello,
Thanks for agreeing to help test out Humbug.
There are a few steps you need to take to ensure Humbug works with your
MIT Zephyr account.
1) Create a password and activate your account:
<{{ activate_url }}>
2) Get your API key from the "Settings" panel and put it in your
Athena home directory at ~/Private/.humbug-api-key.
3) Copy over your Zephyr subscriptions by running the command below:
/mit/tabbott/humbug/zephyr_mirror.py --sync-subscriptions
4) Run the Zephyr mirroring script on a server with long-lived tickets.
/mit/tabbott/humbug/zephyr_mirror.py
The script copies personals you receive on Zephyr to Humbug, and
copies messages you send from Humbug to Zephyr. You should keep this
script always running in a session with Kerberos tickets.
You may want to run this with owl-screen or kchen's
cont-renew-notify.
5) Visit the running app at:
<https://humbughq.com/>
Feel free to send us a message via the Feedback button from within the
app if you have any questions or encounter any problems.
Cheers,
Jeff, Waseem, Jessica, Tim, Keegan, Luke, and Zev

View File

@@ -0,0 +1 @@
Activate your Humbug account

View File

@@ -10,6 +10,13 @@ def is_unique(value):
except User.DoesNotExist:
pass
def is_active(value):
try:
if User.objects.get(email=value).is_active:
raise ValidationError(u'%s is already active' % value)
except User.DoesNotExist:
pass
class UniqueEmailField(forms.EmailField):
default_validators = [validators.validate_email, is_unique]

View File

@@ -0,0 +1,26 @@
from optparse import make_option
from django.core.management.base import BaseCommand
from confirmation.models import Confirmation
from zephyr.models import User, MitUser
class Command(BaseCommand):
option_list = BaseCommand.option_list + (
make_option('--resend', '-r', dest='resend', action='store_true',
help='Send tokens even if tokens were previously sent for the user.'),)
help = "Generate an activation email to send to MIT users."
def handle(self, *args, **options):
for username in args:
email = username + "@mit.edu"
try:
User.objects.get(email=email)
except User.DoesNotExist:
print username + ": User does not exist in database"
continue
mit_user, created = MitUser.objects.get_or_create(email=email)
if not created and not options["resend"]:
print username + ": User already exists. Use -r to resend."
else:
Confirmation.objects.send_confirmation(mit_user, email)
print username + ": Mailed."

View File

@@ -161,7 +161,14 @@ class UserProfile(models.Model):
class PreregistrationUser(models.Model):
email = models.EmailField(unique=True)
# 0 is inactive, 1 is active
# status: whether an object has been confirmed.
# if confirmed, set to confirmation.settings.STATUS_ACTIVE
status = models.IntegerField(default=0)
class MitUser(models.Model):
email = models.EmailField(unique=True)
# status: whether an object has been confirmed.
# if confirmed, set to confirmation.settings.STATUS_ACTIVE
status = models.IntegerField(default=0)
# create_user_hack is the same as Django's User.objects.create_user,

View File

@@ -11,10 +11,12 @@ from django.contrib.auth.views import login as django_login_page
from zephyr.models import Message, UserProfile, Stream, Subscription, \
Recipient, get_display_recipient, get_huddle, Realm, UserMessage, \
do_add_subscription, do_remove_subscription, do_change_password, \
do_change_full_name, \
do_change_full_name, do_activate_user, \
create_user, do_send_message, create_user_if_needed, \
create_stream_if_needed, PreregistrationUser, get_client
from zephyr.forms import RegistrationForm, HomepageForm, is_unique
create_stream_if_needed, PreregistrationUser, get_client, MitUser, \
User
from zephyr.forms import RegistrationForm, HomepageForm, is_unique, \
is_active
from django.views.decorators.csrf import csrf_exempt
from zephyr.decorator import asynchronous
@@ -98,10 +100,18 @@ def get_stream(stream_name, realm):
@require_post
def accounts_register(request):
key = request.POST['key']
email = Confirmation.objects.get(confirmation_key=key).content_object.email
confirmation = Confirmation.objects.get(confirmation_key=key)
email = confirmation.content_object.email
mit_beta_user = isinstance(confirmation.content_object, MitUser)
company_name = email.split('@')[-1]
try:
if mit_beta_user:
# MIT users already exist, but are supposed to be inactive.
is_active(email)
else:
# Other users should not already exist at all.
is_unique(email)
except ValidationError:
return HttpResponseRedirect(reverse('django.contrib.auth.views.login') + '?email=' + urllib.quote_plus(email))
@@ -117,8 +127,15 @@ def accounts_register(request):
domain = email.split('@')[-1]
(realm, _) = Realm.objects.get_or_create(domain=domain)
if mit_beta_user:
user = User.objects.get(email=email)
do_activate_user(user)
do_change_password(user, password)
do_change_full_name(user.userprofile, full_name)
else:
# FIXME: sanitize email addresses
create_user(email, password, realm, full_name, short_name)
login(request, authenticate(username=email, password=password))
return HttpResponseRedirect(reverse('zephyr.views.home'))