Bulk Email: Add design styling

Switch to using decorators; refactor and cleanup tests.
This commit is contained in:
Sarina Canelake
2013-08-16 12:00:14 -04:00
parent 3b32d4216c
commit 65f7b098dd
12 changed files with 381 additions and 148 deletions

View File

@@ -27,6 +27,7 @@ from django_future.csrf import ensure_csrf_cookie
from django.utils.http import cookie_date
from django.utils.http import base36_to_int
from django.utils.translation import ugettext as _
from django.views.decorators.http import require_POST
from ratelimitbackend.exceptions import RateLimitException
@@ -68,8 +69,7 @@ Article = namedtuple('Article', 'title url author image deck publication publish
def csrf_token(context):
''' A csrf token that can be included in a form.
'''
"""A csrf token that can be included in a form."""
csrf_token = context.get('csrf_token', '')
if csrf_token == 'NOTPROVIDED':
return ''
@@ -82,12 +82,12 @@ def csrf_token(context):
# This means that it should always return the same thing for anon
# users. (in particular, no switching based on query params allowed)
def index(request, extra_context={}, user=None):
'''
"""
Render the edX main page.
extra_context is used to allow immediate display of certain modal windows, eg signup,
as used by external_auth.
'''
"""
# The course selection work is done in courseware.courses.
domain = settings.MITX_FEATURES.get('FORCE_UNIVERSITY_DOMAIN') # normally False
@@ -411,7 +411,7 @@ def accounts_login(request, error=""):
# Need different levels of logging
@ensure_csrf_cookie
def login_user(request, error=""):
''' AJAX request to log in the user. '''
"""AJAX request to log in the user."""
if 'email' not in request.POST or 'password' not in request.POST:
return HttpResponse(json.dumps({'success': False,
'value': _('There was an error receiving your login information. Please email us.')})) # TODO: User error message
@@ -494,11 +494,11 @@ def login_user(request, error=""):
@ensure_csrf_cookie
def logout_user(request):
'''
"""
HTTP request to log out the user. Redirects to marketing page.
Deletes both the CSRF and sessionid cookies so the marketing
site can determine the logged in state of the user
'''
"""
# We do not log here, because we have a handler registered
# to perform logging on successful logouts.
logout(request)
@@ -512,8 +512,7 @@ def logout_user(request):
@login_required
@ensure_csrf_cookie
def change_setting(request):
''' JSON call to change a profile setting: Right now, location
'''
"""JSON call to change a profile setting: Right now, location"""
# TODO (vshnayder): location is no longer used
up = UserProfile.objects.get(user=request.user) # request.user.profile_cache
if 'location' in request.POST:
@@ -581,10 +580,10 @@ def _do_create_account(post_vars):
@ensure_csrf_cookie
def create_account(request, post_override=None):
'''
"""
JSON call to create new edX account.
Used by form in signup_modal.html, which is included into navigation.html
'''
"""
js = {'success': False}
post_vars = post_override if post_override else request.POST
@@ -818,10 +817,10 @@ def begin_exam_registration(request, course_id):
@ensure_csrf_cookie
def create_exam_registration(request, post_override=None):
'''
"""
JSON call to create a test center exam registration.
Called by form in test_center_register.html
'''
"""
post_vars = post_override if post_override else request.POST
# first determine if we need to create a new TestCenterUser, or if we are making any update
@@ -974,8 +973,7 @@ def auto_auth(request):
@ensure_csrf_cookie
def activate_account(request, key):
''' When link in activation e-mail is clicked
'''
"""When link in activation e-mail is clicked"""
r = Registration.objects.filter(activation_key=key)
if len(r) == 1:
user_logged_in = request.user.is_authenticated()
@@ -1010,7 +1008,7 @@ def activate_account(request, key):
@ensure_csrf_cookie
def password_reset(request):
''' Attempts to send a password reset e-mail. '''
""" Attempts to send a password reset e-mail. """
if request.method != "POST":
raise Http404
@@ -1032,9 +1030,9 @@ def password_reset_confirm_wrapper(
uidb36=None,
token=None,
):
''' A wrapper around django.contrib.auth.views.password_reset_confirm.
""" A wrapper around django.contrib.auth.views.password_reset_confirm.
Needed because we want to set the user as active at this step.
'''
"""
# cribbed from django.contrib.auth.views.password_reset_confirm
try:
uid_int = base36_to_int(uidb36)
@@ -1076,8 +1074,8 @@ def reactivation_email_for_user(user):
@ensure_csrf_cookie
def change_email_request(request):
''' AJAX call from the profile page. User wants a new e-mail.
'''
""" AJAX call from the profile page. User wants a new e-mail.
"""
## Make sure it checks for existing e-mail conflicts
if not request.user.is_authenticated:
raise Http404
@@ -1132,9 +1130,9 @@ def change_email_request(request):
@ensure_csrf_cookie
@transaction.commit_manually
def confirm_email_change(request, key):
''' User requested a new e-mail. This is called when the activation
""" User requested a new e-mail. This is called when the activation
link is clicked. We confirm with the old e-mail, and update
'''
"""
try:
try:
pec = PendingEmailChange.objects.get(activation_key=key)
@@ -1191,7 +1189,7 @@ def confirm_email_change(request, key):
@ensure_csrf_cookie
def change_name_request(request):
''' Log a request for a new name. '''
""" Log a request for a new name. """
if not request.user.is_authenticated:
raise Http404
@@ -1215,7 +1213,7 @@ def change_name_request(request):
@ensure_csrf_cookie
def pending_name_changes(request):
''' Web page which allows staff to approve or reject name changes. '''
""" Web page which allows staff to approve or reject name changes. """
if not request.user.is_staff:
raise Http404
@@ -1231,7 +1229,7 @@ def pending_name_changes(request):
@ensure_csrf_cookie
def reject_name_change(request):
''' JSON: Name change process. Course staff clicks 'reject' on a given name change '''
""" JSON: Name change process. Course staff clicks 'reject' on a given name change """
if not request.user.is_staff:
raise Http404
@@ -1269,32 +1267,31 @@ def accept_name_change_by_id(id):
@ensure_csrf_cookie
def accept_name_change(request):
''' JSON: Name change process. Course staff clicks 'accept' on a given name change
""" JSON: Name change process. Course staff clicks 'accept' on a given name change
We used this during the prototype but now we simply record name changes instead
of manually approving them. Still keeping this around in case we want to go
back to this approval method.
'''
"""
if not request.user.is_staff:
raise Http404
return accept_name_change_by_id(int(request.POST['id']))
@require_POST
@login_required
@ensure_csrf_cookie
def change_email_settings(request):
"""Modify logged-in user's setting for receiving emails from a course."""
if request.method != "POST":
return HttpResponseNotAllowed(["POST"])
user = request.user
if not user.is_authenticated():
return HttpResponseForbidden()
course_id = request.POST.get("course_id")
receive_emails = request.POST.get("receive_emails")
if receive_emails:
Optout.objects.filter(email=user.email, course_id=course_id).delete()
optout_object = Optout.objects.filter(email=user.email, course_id=course_id)
if optout_object:
optout_object.delete()
log.info(u"User {0} ({1}) opted to receive emails from course {2}".format(user.username, user.email, course_id))
track.views.server_track(request, "change-email-settings", {"receive_emails": "yes", "course": course_id}, page='dashboard')
else: