diff --git a/humbug/urls.py b/humbug/urls.py
index 40566b3288..e2efa09395 100644
--- a/humbug/urls.py
+++ b/humbug/urls.py
@@ -24,6 +24,8 @@ urlpatterns = patterns('',
url(r'^accounts/password/done/$', 'django.contrib.auth.views.password_reset_complete',
{'template_name': 'zephyr/reset_done.html'}),
+ url(r'^accounts/customer30/', 'zephyr.views.accounts_customer30'),
+
url(r'^activity$', 'zephyr.views.get_activity'),
diff --git a/templates/zephyr/accounts_customer30.html b/templates/zephyr/accounts_customer30.html
new file mode 100644
index 0000000000..0fb92a7089
--- /dev/null
+++ b/templates/zephyr/accounts_customer30.html
@@ -0,0 +1,81 @@
+{% extends "zephyr/portico_signup.html" %}
+
+{% comment %}
+Get ToS acceptance and handle account creation for CUSTOMER30 users
+
+Form is validated both client-side using jquery-validate (see signup.js) and server-side.
+{% endcomment %}
+
+{% block for_you %}for {% if company_name %} {{company_name}} {% else %} __________ {% endif %} {% endblock %}
+{% block portico_content %}
+
+
(Welcome! We think you'll like it here.)
+
+
+
+
You're almost there. We just need you to do one last thing.
+
Confirm your registration
+
+
+
+
+
+
+{% endblock %}
diff --git a/zephyr/views.py b/zephyr/views.py
index e4ea39dfe0..80811e9486 100644
--- a/zephyr/views.py
+++ b/zephyr/views.py
@@ -2,7 +2,7 @@ from django.conf import settings
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
-from django.http import HttpResponse, HttpResponseRedirect
+from django.http import HttpResponse, HttpResponseRedirect, HttpResponseBadRequest
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext, loader
from django.utils.timezone import utc, now
@@ -23,7 +23,7 @@ from zephyr.lib.actions import do_add_subscription, do_remove_subscription, \
create_stream_if_needed
from zephyr.forms import RegistrationForm, HomepageForm, ToSForm, is_unique, \
is_active, isnt_mit
-from django.views.decorators.csrf import csrf_exempt
+from django.views.decorators.csrf import csrf_exempt, requires_csrf_token
from zephyr.decorator import require_post, \
authenticated_api_view, authenticated_json_post_view, \
@@ -98,6 +98,55 @@ def principal_to_user_profile(agent, principal):
return principal_user_profile
+# This view is both CSRF exempt and requires the token. This is because
+# depending on whether the user arrived here via a redirect from Thymes
+# or is submitting the form we either want to validate CSRF or not.
+#
+# See also:
+#
+@require_post
+@csrf_exempt
+@requires_csrf_token
+def accounts_customer30(request):
+ domain = 'customer30.invalid'
+
+ # support a username, realname via either GET or POST
+ try:
+ username = request.POST['username']
+ realname = request.POST['realname']
+ except KeyError:
+ return HttpResponseBadRequest('You must POST with username and realname parameters.')
+
+ if not username.isalnum():
+ return HttpResponseBadRequest("Your username was non-alphanumeric and is not allowed.")
+ email = username + '@' + domain
+ try:
+ is_unique(email)
+ except ValidationError:
+ return HttpResponseBadRequest("That username is already registered with Humbug.")
+
+ try:
+ request.POST['terms']
+ except KeyError:
+ return render_to_response('zephyr/accounts_customer30.html',
+ {'username': username,
+ 'realname': realname,
+ 'company_name': domain},
+ context_instance=RequestContext(request))
+
+ # We want CSRF protection if you're actually registering, not if you're just displaying the form
+ return accounts_customer30_register(request, username, realname, email, domain)
+
+def accounts_customer30_register(request, username, realname, email, domain):
+ user_profile = do_create_user(email,
+ "xxxxxxxxxxx",
+ Realm.objects.get_or_create(domain=domain)[0],
+ realname,
+ username)
+ add_default_subs(user_profile)
+ login(request, authenticate(username=email, password="xxxxxxxxxxx"))
+ return HttpResponseRedirect(reverse('zephyr.views.home'))
+
@require_post
def accounts_register(request):
key = request.POST['key']