Commit ceacc3b4 by ihoover

moved auto_auth view to students.view and fixed flag conflicts

parent e5f44165
...@@ -19,6 +19,7 @@ from django.core.context_processors import csrf ...@@ -19,6 +19,7 @@ from django.core.context_processors import csrf
from django.core.mail import send_mail from django.core.mail import send_mail
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.validators import validate_email, validate_slug, ValidationError from django.core.validators import validate_email, validate_slug, ValidationError
from django.core.exceptions import ObjectDoesNotExist
from django.db import IntegrityError, transaction from django.db import IntegrityError, transaction
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseNotAllowed, Http404 from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseNotAllowed, Http404
from django.shortcuts import redirect from django.shortcuts import redirect
...@@ -674,18 +675,20 @@ def create_account(request, post_override=None): ...@@ -674,18 +675,20 @@ def create_account(request, post_override=None):
subject = ''.join(subject.splitlines()) subject = ''.join(subject.splitlines())
message = render_to_string('emails/activation_email.txt', d) message = render_to_string('emails/activation_email.txt', d)
try: # dont send email if we are doing load testing or random user generation for some reason
if settings.MITX_FEATURES.get('REROUTE_ACTIVATION_EMAIL'): if not (settings.GENERATE_RANDOM_USER_CREDENTIALS or settings.MITX_FEATURES.get('AUTOMATIC_AUTH_FOR_LOAD_TESTING')):
dest_addr = settings.MITX_FEATURES['REROUTE_ACTIVATION_EMAIL'] try:
message = ("Activation for %s (%s): %s\n" % (user, user.email, profile.name) + if settings.MITX_FEATURES.get('REROUTE_ACTIVATION_EMAIL'):
'-' * 80 + '\n\n' + message) dest_addr = settings.MITX_FEATURES['REROUTE_ACTIVATION_EMAIL']
send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [dest_addr], fail_silently=False) message = ("Activation for %s (%s): %s\n" % (user, user.email, profile.name) +
elif not settings.GENERATE_RANDOM_USER_CREDENTIALS: '-' * 80 + '\n\n' + message)
res = user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL) send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [dest_addr], fail_silently=False)
except: else:
log.warning('Unable to send activation email to user', exc_info=True) res = user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
js['value'] = _('Could not send activation e-mail.') except:
return HttpResponse(json.dumps(js)) log.warning('Unable to send activation email to user', exc_info=True)
js['value'] = _('Could not send activation e-mail.')
return HttpResponse(json.dumps(js))
# Immediately after a user creates an account, we log them in. They are only # Immediately after a user creates an account, we log them in. They are only
# logged in until they close the browser. They can't log in again until they click # logged in until they close the browser. They can't log in again until they click
...@@ -918,25 +921,19 @@ def get_random_post_override(): ...@@ -918,25 +921,19 @@ def get_random_post_override():
'honor_code': u'true', 'honor_code': u'true',
'terms_of_service': u'true', } 'terms_of_service': u'true', }
def get_planned_post_override(username, password):
"""
Return a dictionary suitable for passing to post_vars of _do_create_account or post_override
of create_account, with specified username and password.
"""
def id_generator(size=6, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits):
return ''.join(random.choice(chars) for x in range(size))
return {'username': username,
'email': id_generator(size=10, chars=string.ascii_lowercase) + "_dummy_test@mitx.mit.edu",
'password': password,
'name': (id_generator(size=5, chars=string.ascii_lowercase) + " " +
id_generator(size=7, chars=string.ascii_lowercase)),
'honor_code': u'true',
'terms_of_service': u'true', }
def create_random_account(create_account_function): def create_random_account(create_account_function):
def inner_create_random_account(request): def inner_create_random_account(request, post_override=None):
return create_account_function(request, post_override=get_random_post_override())
# This logic ensures that even if we have both
# GENERATE_RANDOM_USER_CREDENTIALS and
# settings.MITX_FEATURES['AUTOMATIC_AUTH_FOR_LOAD_TESTING']
# set to true, then create_account will behave they way
# each feature for automated account generation expects
if post_override is None:
post_override = get_random_post_override()
return create_account_function(request, post_override)
return inner_create_random_account return inner_create_random_account
...@@ -944,16 +941,56 @@ def create_random_account(create_account_function): ...@@ -944,16 +941,56 @@ def create_random_account(create_account_function):
if settings.GENERATE_RANDOM_USER_CREDENTIALS: if settings.GENERATE_RANDOM_USER_CREDENTIALS:
create_account = create_random_account(create_account) create_account = create_random_account(create_account)
def create_random_account_with_name_and_password(create_account_function):
def inner_create_random_account(request, username, password):
return create_account_function(request, post_override=get_planned_post_override(username, password))
return inner_create_random_account def auto_auth(request):
"""
Automatically logs the user in with a generated random credentials
This view is only accessible when
settings.MITX_SETTINGS['AUTOMATIC_AUTH_FOR_LOAD_TESTING'] is true.
"""
def get_dummy_post_data(username, password):
"""
Return a dictionary suitable for passing to post_vars of _do_create_account or post_override
of create_account, with specified username and password.
"""
return {'username': username,
'email': username + "_dummy_test@mitx.mit.edu",
'password': password,
'name': username + " " + username,
'honor_code': u'true',
'terms_of_service': u'true', }
# generate random user ceredentials from a small name space (determined by settings)
name_base = 'USER_'
pass_base = 'PASS_'
max_users = 200
if hasattr(settings, 'MAX_AUTO_AUTH_USERS'):
max_users = settings.MAX_AUTO_AUTH_USERS
number = random.randint(1, max_users)
username = name_base + str(number)
password = pass_base + str(number)
# if they already are a user, log in
try:
user = User.objects.get(username=username)
user = authenticate(username=username, password=password)
login(request, user)
# else create and activate account info
except ObjectDoesNotExist:
post_override = get_dummy_post_data(username, password)
create_account(request, post_override=post_override)
request.user.is_active = True
request.user.save()
# return empty success
return HttpResponse('')
# for load testing we want to create lots of accounts
# with controlled username and password
if settings.MITX_FEATURES.get('AUTOMATIC_AUTH_FOR_LOAD_TESTING'):
create_account = create_random_account_with_name_and_password(create_account)
@ensure_csrf_cookie @ensure_csrf_cookie
def activate_account(request, key): def activate_account(request, key):
......
...@@ -49,39 +49,3 @@ def courses(request): ...@@ -49,39 +49,3 @@ def courses(request):
return courseware.views.courses(request) return courseware.views.courses(request)
return courseware.views.university_profile(request, university) return courseware.views.university_profile(request, university)
def auto_auth(request):
"""
Automatically logs the user in with a generated random credentials
This view is only accessible when settings.AUTOMATIC_AUTH_FOR_LOAD_TESTING is
true.
"""
from django.contrib.auth.models import User
from django.contrib.auth import login, authenticate
from random import randint
# generate random user ceredentials from a small name space (determined by settings)
name_base = 'USER_'
pass_base = 'PASS_'
number = randint(1, settings.MAX_AUTO_AUTH_USERS)
username = name_base + str(number)
password = pass_base + str(number)
# if they already are a user, log in
try:
user = User.objects.get(username=username)
user = authenticate(username=username, password=password)
login(request, user)
# else create and activate account info
except:
student.views.create_account(request, username, password)
request.user.is_active = True
request.user.save()
# redirect to home-page
return redirect('root')
...@@ -38,7 +38,7 @@ COURSEWARE_ENABLED = True ...@@ -38,7 +38,7 @@ COURSEWARE_ENABLED = True
ENABLE_JASMINE = False ENABLE_JASMINE = False
# only relevant if MITX_FEATURES['AUTOMATIC_AUTH_FOR_LOAD_TESTING'] = True # only relevant if MITX_FEATURES['AUTOMATIC_AUTH_FOR_LOAD_TESTING'] = True
MAX_AUTO_AUTH_USERS = 20 MAX_AUTO_AUTH_USERS = 200
GENERATE_RANDOM_USER_CREDENTIALS = False GENERATE_RANDOM_USER_CREDENTIALS = False
PERFSTATS = False PERFSTATS = False
......
...@@ -442,7 +442,7 @@ if settings.DEBUG: ...@@ -442,7 +442,7 @@ if settings.DEBUG:
# enable automatic login # enable automatic login
if settings.MITX_FEATURES.get('AUTOMATIC_AUTH_FOR_LOAD_TESTING'): if settings.MITX_FEATURES.get('AUTOMATIC_AUTH_FOR_LOAD_TESTING'):
urlpatterns += ( urlpatterns += (
url(r'^auto_auth$', 'branding.views.auto_auth'), url(r'^auto_auth$', 'student.views.auto_auth'),
) )
#Custom error pages #Custom error pages
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment