diff --git a/cms/templates/signup.html b/cms/templates/signup.html index d3eedc8070863f7cdad4b556b90da42fb69f23b1..f22e3c7950bce863fa4a581ea644cd3f8da5ea69 100644 --- a/cms/templates/signup.html +++ b/cms/templates/signup.html @@ -10,10 +10,10 @@ <hr> </header> - <div id="enroll"> + <div id="register"> - <form id="enroll_form" method="post"> - <div id="enroll_error" name="enroll_error"></div> + <form id="register_form" method="post"> + <div id="register_error" name="register_error"></div> <label>E-mail</label> <input name="email" type="email" placeholder="E-mail"> <label>Password</label> @@ -64,17 +64,17 @@ }); } - $('form#enroll_form').submit(function(e) { + $('form#register_form').submit(function(e) { e.preventDefault(); - var submit_data = $('#enroll_form').serialize(); + var submit_data = $('#register_form').serialize(); postJSON('/create_account', submit_data, function(json) { if(json.success) { - $('#enroll').html(json.value); + $('#register').html(json.value); } else { - $('#enroll_error').html(json.value).stop().css("background-color", "#933").animate({ backgroundColor: "#333"}, 2000); + $('#register_error').html(json.value).stop().css("background-color", "#933").animate({ backgroundColor: "#333"}, 2000); } } ); diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 003500b48e6980e030fb878b37c5dc9b0f1beadc..1f7ea626a57a3badfe455473e55058423d14fcba 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -79,6 +79,9 @@ def index(request): return render_to_response('index.html', {'universities': universities, 'entries': entries}) +def course_from_id(id): + course_loc = CourseDescriptor.id_to_location(id) + return modulestore().get_item(course_loc) @login_required @ensure_csrf_cookie @@ -86,10 +89,6 @@ def dashboard(request): user = request.user enrollments = CourseEnrollment.objects.filter(user=user) - def course_from_id(id): - course_loc = CourseDescriptor.id_to_location(id) - return modulestore().get_item(course_loc) - # Build our courses list for the user, but ignore any courses that no longer # exist (because the course IDs have changed). Still, we don't delete those # enrollments, because it could have been a data push snafu. @@ -110,6 +109,45 @@ def dashboard(request): return render_to_response('dashboard.html', context) +@login_required +def change_enrollment_view(request): + return HttpResponse(json.dumps(change_enrollment(request))) + +def change_enrollment(request): + if request.method != "POST": + raise Http404 + + action = request.POST.get("enrollment_action" , "") + user = request.user + course_id = request.POST.get("course_id", None) + if course_id == None: + return HttpResponse(json.dumps({'success': False, 'error': 'There was an error receiving the course id.'})) + + if action == "enroll": + # Make sure the course exists + # We don't do this check on unenroll, or a bad course id can't be unenrolled from + try: + course = course_from_id(course_id) + except ItemNotFoundError: + log.error("User {0} tried to enroll in non-existant course {1}" + .format(user.username, enrollment.course_id)) + return {'success': False, 'error': 'The course requested does not exist.'} + + enrollment, created = CourseEnrollment.objects.get_or_create(user=user, course_id=course.id) + return {'success': True} + + elif action == "unenroll": + try: + enrollment = CourseEnrollment.objects.get(user=user, course_id=course_id) + enrollment.delete() + return {'success': True} + except CourseEnrollment.DoesNotExist: + return {'success': False, 'error': 'You are not enrolled for this course.'} + else: + return {'success': False, 'error': 'Invalid enrollment_action.'} + + return {'success': False, 'error': 'We weren\'t able to unenroll you. Please try again.'} + # Need different levels of logging @ensure_csrf_cookie def login_user(request, error=""): @@ -147,6 +185,16 @@ def login_user(request, error=""): log.exception(e) log.info("Login success - {0} ({1})".format(username, email)) + + if 'enrollment_action' in request.POST: + try: + enrollment_output = change_enrollment(request) + # There isn't really a way to display the results to the user, so we just log it + # We expect the enrollment to be a success, and will show up on the dashboard anyway + log.info("Attempted to automatically enroll after login. Results: {0}".format(enrollment_output)) + except Exception, e: + log.error("Exception automatically enrolling after login: {0}".format(str(e))) + return HttpResponse(json.dumps({'success':True})) log.warning("Login failed - Account not active for user {0}".format(username)) @@ -287,6 +335,15 @@ def create_account(request, post_override=None): login(request, login_user) request.session.set_expiry(0) + if 'enrollment_action' in request.POST: + try: + enrollment_output = change_enrollment(request) + # There isn't really a way to display the results to the user, so we just log it + # We expect the enrollment to be a success, and will show up on the dashboard anyway + log.info("Attempted to automatically enroll after login. Results: {0}".format(enrollment_output)) + except Exception, e: + log.error("Exception automatically enrolling after login: {0}".format(str(e))) + js={'success': True} return HttpResponse(json.dumps(js), mimetype="application/json") diff --git a/common/djangoapps/util/cache.py b/common/djangoapps/util/cache.py index e253b5b63327c8164c6d1182b5d90b4e169e7f34..35715946a9f100e2960c43bb4bf8e02702372df2 100644 --- a/common/djangoapps/util/cache.py +++ b/common/djangoapps/util/cache.py @@ -38,7 +38,7 @@ def cache_if_anonymous(view_func): @wraps(view_func) def _decorated(request, *args, **kwargs): - if not request.user.is_authenticated(): + if False and not request.user.is_authenticated(): #Use the cache cache_key = "cache_if_anonymous." + request.path response = cache.get(cache_key) diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py index 77ecc990c3929524db16cf1944baa659efb8d1ca..d5f24db9d00b744e91d23e12cf6f96a30a9a7e92 100644 --- a/lms/djangoapps/courseware/views.py +++ b/lms/djangoapps/courseware/views.py @@ -269,39 +269,6 @@ def course_about(request, course_id): course = check_course(course_id, course_must_be_open=False) registered = registered_for_course(course, request.user) return render_to_response('portal/course_about.html', {'course': course, 'registered': registered}) - - -@login_required -def change_enrollment(request): - if request.method != "POST": - raise Http404 - - course_id = request.POST.get("course_id", None) - if course_id == None: - return HttpResponse(json.dumps({'success': False, 'error': 'There was an error receiving the course id.'})) - action = request.POST.get("enrollment_action" , "") - - user = request.user - - if action == "enroll": - # Make sure the course exists - # We don't do this check on unenroll, or a bad course id can't be unenrolled from - course = check_course(course_id, course_must_be_open=False) - - enrollment, created = CourseEnrollment.objects.get_or_create(user=user, course_id=course.id) - return HttpResponse(json.dumps({'success': True})) - - elif action == "unenroll": - try: - enrollment = CourseEnrollment.objects.get(user=user, course_id=course_id) - enrollment.delete() - return HttpResponse(json.dumps({'success': True})) - except CourseEnrollment.DoesNotExist: - return HttpResponse(json.dumps({'success': False, 'error': 'You are not enrolled for this course.'})) - else: - return HttpResponse(json.dumps({'success': False, 'error': 'Invalid enrollment_action.'})) - - return HttpResponse(json.dumps({'success': False, 'error': 'We weren\'t able to unenroll you. Please try again.'})) diff --git a/lms/static/sass/sass_old/layout/_leanmodal.scss b/lms/static/sass/sass_old/layout/_leanmodal.scss index 81639493ee83c922e690cf67b670cefb505d3470..0c96e6524a7f84117dc52576d35dd4bed5cca2cd 100644 --- a/lms/static/sass/sass_old/layout/_leanmodal.scss +++ b/lms/static/sass/sass_old/layout/_leanmodal.scss @@ -84,7 +84,7 @@ div.leanModal_box { form { text-align: left; - div#enroll_error, div#login_error, div#pwd_error { + div#register_error, div#login_error, div#pwd_error { $error-color: #333; background-color: $error-color; border: darken($error-color, 20%); diff --git a/lms/templates/portal/course_about.html b/lms/templates/portal/course_about.html index a6d01061381dd8799d096ce4a84fa8e99548c8a7..730e3f89cfaab33fd1734243ef8b1add0e844ad9 100644 --- a/lms/templates/portal/course_about.html +++ b/lms/templates/portal/course_about.html @@ -25,7 +25,7 @@ %if registered: <span class="register disabled">You are registered for this course (${course.number}).</span> %else: - <a href="#" class="register submit_registration">Register for ${course.number}</a> + <a href="#" class="register">Register for ${course.number}</a> %endif %else: <a href="#signup-modal" class="register" rel="leanModal" data-notice="You must Sign Up in order to register">Register for ${course.number}</a> @@ -108,28 +108,49 @@ </section> %if not registered: - <div display="hidden"> - <form id="enroll_form" method="post" data-remote="true" action="${reverse('change_enrollment')}"> - <input name="course_id" type="hidden" value="${course.id}"> - <input name="enrollment_action" type="hidden" value="enroll"> + <div style="display: none;"> + <form id="class_enroll_form" method="post" data-remote="true" action="${reverse('change_enrollment')}"> + <fieldset class="enroll_fieldset"> + <input name="course_id" type="hidden" value="${course.id}"> + <input name="enrollment_action" type="hidden" value="enroll"> + </fieldset> <div class="submit"> <input name="submit" type="submit" value="enroll"> </div> </form> </div> - <script type="text/javascript"> - (function() { - $(".submit_registration").click(function() { - $("#enroll_form").submit(); - }); + %if user.is_authenticated(): + ## If the user is authenticated, clicking the enroll button just submits a form + <script type="text/javascript"> + (function() { + $(".register").click(function() { + $("#class_enroll_form").submit(); + }); - $(document).delegate('#enroll_form', 'ajax:success', function(data, json, xhr) { - if(json.success) { - location.href="${reverse('dashboard')}"; - } - }); - })(this) - </script> + $(document).delegate('#class_enroll_form', 'ajax:success', function(data, json, xhr) { + if(json.success) { + location.href="${reverse('dashboard')}"; + } + }); + })(this) + </script> + %else: + ## If the user is not authenticated, clicking the enroll button pops up the register + ## field. We also slip in the registration fields into the login/register fields so + ## the user is automatically registered after logging in / registering + <script type="text/javascript"> + (function() { + $(".register").click(function() { + if ($("#login_form .enroll_fieldset").length === 0) { + $("#login_form").append( $(".enroll_fieldset").first().clone() ); + } + if ($("#register_form .enroll_fieldset").length === 0) { + $("#register_form").append( $(".enroll_fieldset").first().clone() ); + } + }); + })(this) + </script> + %endif %endif diff --git a/lms/templates/signup_modal.html b/lms/templates/signup_modal.html index acbba87eab809cd2f4bb3e99e94932f36f5c997b..a707dfdd3afbe43d689a2fead324faa97dc25a50 100644 --- a/lms/templates/signup_modal.html +++ b/lms/templates/signup_modal.html @@ -7,16 +7,16 @@ <section id="signup-modal" class="modal signup-modal"> <div class="inner-wrapper"> - <div id="enroll"> + <div id="register"> <header> <h2>Sign Up for <span class="edx">edX</span></h2> <hr> </header> - <form id="enroll_form" method="post" data-remote="true" action="/create_account"> + <form id="register_form" method="post" data-remote="true" action="/create_account"> <div class="notice"></div> - <div id="enroll_error" class="modal-form-error" name="enroll_error"></div> - <div id="enroll_error" name="enroll_error"></div> + <div id="register_error" class="modal-form-error" name="register_error"></div> + <div id="register_error" name="register_error"></div> <div class="input-group"> <label>E-mail*</label> @@ -119,11 +119,11 @@ <script type="text/javascript"> (function() { - $(document).delegate('#enroll_form', 'ajax:success', function(data, json, xhr) { + $(document).delegate('#register_form', 'ajax:success', function(data, json, xhr) { if(json.success) { location.href="${reverse('dashboard')}"; } else { - $('#enroll_error').html(json.value).stop().css("display", "block"); + $('#register_error').html(json.value).stop().css("display", "block"); } }); })(this) diff --git a/lms/urls.py b/lms/urls.py index ce03d9ef14c70f04c2a1ad100a31eb80f0f824b3..e5be297637687752a5e84c484054aef1715c0c36 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -101,7 +101,7 @@ if settings.COURSEWARE_ENABLED: url(r'^courses/?$', 'courseware.views.courses', name="courses"), url(r'^change_enrollment$', - 'courseware.views.change_enrollment', name="change_enrollment"), + 'student.views.change_enrollment_view', name="change_enrollment"), #About the course url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/about$',