Added an unenroll link (and confirmation) to the dashboard. Enrolling is now a POST of a form.
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
from collections import defaultdict
|
||||
import json
|
||||
import logging
|
||||
import urllib
|
||||
import itertools
|
||||
@@ -8,7 +9,7 @@ from django.core.context_processors import csrf
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.http import Http404
|
||||
from django.http import Http404, HttpResponse
|
||||
from django.shortcuts import redirect
|
||||
from mitxmako.shortcuts import render_to_response, render_to_string
|
||||
#from django.views.decorators.csrf import ensure_csrf_cookie
|
||||
@@ -271,14 +272,37 @@ def course_about(request, course_id):
|
||||
|
||||
|
||||
@login_required
|
||||
@ensure_csrf_cookie
|
||||
def enroll(request, course_id):
|
||||
course = check_course(course_id, course_must_be_open=False)
|
||||
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
|
||||
|
||||
enrollment, created = CourseEnrollment.objects.get_or_create(user=user, course_id=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
|
||||
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.'}))
|
||||
|
||||
return redirect(reverse('dashboard'))
|
||||
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@@ -295,5 +319,3 @@ def university_profile(request, org_id):
|
||||
template_file = "university_profile/{0}.html".format(org_id).lower()
|
||||
|
||||
return render_to_response(template_file, context)
|
||||
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
<section class="course-status">
|
||||
<p>Class Starts - <span>9/2/2012</span></div>
|
||||
</section>
|
||||
<a href="#unenroll-modal" class="unenroll" rel="leanModal" data-course-id="${course.id}" data-course-number="${course.number}">Unenroll</a>
|
||||
<section class="meta">
|
||||
<div class="course-work-icon"></div>
|
||||
<div class="progress">
|
||||
@@ -75,3 +76,52 @@
|
||||
|
||||
</section>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section id="unenroll-modal" class="modal unenroll-modal">
|
||||
<div class="inner-wrapper">
|
||||
<header>
|
||||
<h2>Are you sure you want to unenroll from <span id="unenroll_course_number"></span>?</h2>
|
||||
<hr>
|
||||
</header>
|
||||
|
||||
<form id="unenroll_form" method="post" data-remote="true" action="${reverse('change_enrollment')}">
|
||||
<input name="course_id" id="unenroll_course_id" type="hidden" />
|
||||
<input name="enrollment_action" type="hidden" value="unenroll" />
|
||||
<div class="submit">
|
||||
<input name="submit" type="submit" value="Unenroll" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="close-modal">
|
||||
<div class="inner">
|
||||
<p>✕</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
|
||||
$(".unenroll").click(function(event) {
|
||||
$("#unenroll_course_id").val( $(event.target).data("course-id") );
|
||||
$("#unenroll_course_number").text( $(event.target).data("course-number") );
|
||||
|
||||
});
|
||||
|
||||
$(document).delegate('#unenroll_form', 'ajax:success', function(data, json, xhr) {
|
||||
if(json.success) {
|
||||
location.href="${reverse('dashboard')}";
|
||||
} else {
|
||||
if($('#unenroll_error').length == 0) {
|
||||
$('#unenroll_form').prepend('<div id="unenroll_error" class="modal-form-error"></div>');
|
||||
}
|
||||
$('#unenroll_error').text(json.error).stop().css("display", "block");
|
||||
}
|
||||
});
|
||||
})(this)
|
||||
</script>
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
%if registered:
|
||||
<span class="register disabled">You are registered for this course (${course.number}).</span>
|
||||
%else:
|
||||
<a href="${reverse('enroll', args=[course.id])}" class="register">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>
|
||||
@@ -105,4 +105,30 @@
|
||||
</section>
|
||||
</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 class="submit">
|
||||
<input name="submit" type="submit" value="enroll">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
$(".register").click(function() {
|
||||
$("#enroll_form").submit();
|
||||
});
|
||||
|
||||
$(document).delegate('#enroll_form', 'ajax:success', function(data, json, xhr) {
|
||||
if(json.success) {
|
||||
location.href="${reverse('dashboard')}";
|
||||
}
|
||||
});
|
||||
})(this)
|
||||
</script>
|
||||
%endif
|
||||
|
||||
|
||||
<%include file="../video_modal.html" />
|
||||
|
||||
@@ -100,14 +100,16 @@ if settings.COURSEWARE_ENABLED:
|
||||
url(r'^save_circuit/(?P<circuit>[^/]*)$', 'circuit.views.save_circuit'),
|
||||
url(r'^calculate$', 'util.views.calculate'),
|
||||
url(r'^heartbeat$', include('heartbeat.urls')),
|
||||
|
||||
|
||||
|
||||
url(r'^change_enrollment$',
|
||||
'courseware.views.change_enrollment', name="change_enrollment"),
|
||||
|
||||
# Multicourse related:
|
||||
url(r'^courses/?$', 'courseware.views.courses', name="courses"),
|
||||
#About the course
|
||||
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/about$',
|
||||
'courseware.views.course_about', name="about_course"),
|
||||
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/enroll$',
|
||||
'courseware.views.enroll', name="enroll"),
|
||||
|
||||
#Inside the course
|
||||
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/info$',
|
||||
|
||||
Reference in New Issue
Block a user