127 lines
5.4 KiB
Python
127 lines
5.4 KiB
Python
"""
|
|
E-commerce Tab Instructor Dashboard Query Registration Code Status.
|
|
"""
|
|
from django.core.urlresolvers import reverse
|
|
from django.views.decorators.http import require_GET, require_POST
|
|
from lms.djangoapps.instructor.enrollment import get_email_params, send_mail_to_student
|
|
from django.utils.translation import ugettext as _
|
|
from courseware.courses import get_course_by_id
|
|
from lms.djangoapps.instructor.views.api import require_level
|
|
from student.models import CourseEnrollment
|
|
from util.json_request import JsonResponse
|
|
from shoppingcart.models import CourseRegistrationCode, RegistrationCodeRedemption
|
|
from opaque_keys.edx.locations import SlashSeparatedCourseKey
|
|
from django.views.decorators.cache import cache_control
|
|
import logging
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
@cache_control(no_cache=True, no_store=True, must_revalidate=True)
|
|
@require_level('staff')
|
|
@require_GET
|
|
def look_up_registration_code(request, course_id):
|
|
"""
|
|
Look for the registration_code in the database.
|
|
and check if it is still valid, allowed to redeem or not.
|
|
"""
|
|
course_key = SlashSeparatedCourseKey.from_deprecated_string(course_id)
|
|
code = request.GET.get('registration_code')
|
|
course = get_course_by_id(course_key, depth=0)
|
|
try:
|
|
registration_code = CourseRegistrationCode.objects.get(code=code)
|
|
except CourseRegistrationCode.DoesNotExist:
|
|
return JsonResponse({
|
|
'is_registration_code_exists': False,
|
|
'is_registration_code_valid': False,
|
|
'is_registration_code_redeemed': False,
|
|
'message': _('The enrollment code ({code}) was not found for the {course_name} course.').format(
|
|
code=code, course_name=course.display_name
|
|
)
|
|
}, status=400) # status code 200: OK by default
|
|
|
|
reg_code_already_redeemed = RegistrationCodeRedemption.is_registration_code_redeemed(code)
|
|
|
|
registration_code_detail_url = reverse('registration_code_details', kwargs={'course_id': unicode(course_id)})
|
|
|
|
return JsonResponse({
|
|
'is_registration_code_exists': True,
|
|
'is_registration_code_valid': registration_code.is_valid,
|
|
'is_registration_code_redeemed': reg_code_already_redeemed,
|
|
'registration_code_detail_url': registration_code_detail_url
|
|
}) # status code 200: OK by default
|
|
|
|
|
|
@cache_control(no_cache=True, no_store=True, must_revalidate=True)
|
|
@require_level('staff')
|
|
@require_POST
|
|
def registration_code_details(request, course_id):
|
|
"""
|
|
Post handler to mark the registration code as
|
|
1) valid
|
|
2) invalid
|
|
3) Unredeem.
|
|
|
|
"""
|
|
course_key = SlashSeparatedCourseKey.from_deprecated_string(course_id)
|
|
code = request.POST.get('registration_code')
|
|
action_type = request.POST.get('action_type')
|
|
course = get_course_by_id(course_key, depth=0)
|
|
action_type_messages = {
|
|
'invalidate_registration_code': _('This enrollment code has been canceled. It can no longer be used.'),
|
|
'unredeem_registration_code': _('This enrollment code has been marked as unused.'),
|
|
'validate_registration_code': _('The enrollment code has been restored.')
|
|
}
|
|
try:
|
|
registration_code = CourseRegistrationCode.objects.get(code=code)
|
|
except CourseRegistrationCode.DoesNotExist:
|
|
return JsonResponse({
|
|
'message': _('The enrollment code ({code}) was not found for the {course_name} course.').format(
|
|
code=code, course_name=course.display_name
|
|
)}, status=400)
|
|
|
|
if action_type == 'invalidate_registration_code':
|
|
registration_code.is_valid = False
|
|
registration_code.save()
|
|
if RegistrationCodeRedemption.is_registration_code_redeemed(code):
|
|
code_redemption = RegistrationCodeRedemption.get_registration_code_redemption(code, course_key)
|
|
delete_redemption_entry(request, code_redemption, course_key)
|
|
|
|
if action_type == 'validate_registration_code':
|
|
registration_code.is_valid = True
|
|
registration_code.save()
|
|
|
|
if action_type == 'unredeem_registration_code':
|
|
code_redemption = RegistrationCodeRedemption.get_registration_code_redemption(code, course_key)
|
|
if code_redemption is None:
|
|
return JsonResponse({
|
|
'message': _('The redemption does not exist against enrollment code ({code}).').format(
|
|
code=code)}, status=400)
|
|
|
|
delete_redemption_entry(request, code_redemption, course_key)
|
|
|
|
return JsonResponse({'message': action_type_messages[action_type]})
|
|
|
|
|
|
def delete_redemption_entry(request, code_redemption, course_key):
|
|
"""
|
|
delete the redemption entry from the table and
|
|
unenroll the user who used the registration code
|
|
for the enrollment and send him/her the unenrollment email.
|
|
"""
|
|
user = code_redemption.redeemed_by
|
|
email_address = code_redemption.redeemed_by.email
|
|
full_name = code_redemption.redeemed_by.profile.name
|
|
CourseEnrollment.unenroll(user, course_key, skip_refund=True)
|
|
|
|
course = get_course_by_id(course_key, depth=0)
|
|
email_params = get_email_params(course, True, secure=request.is_secure())
|
|
email_params['message'] = 'enrolled_unenroll'
|
|
email_params['email_address'] = email_address
|
|
email_params['full_name'] = full_name
|
|
send_mail_to_student(email_address, email_params)
|
|
|
|
# remove the redemption entry from the database.
|
|
log.info('deleting redemption entry (%s) from the database.', code_redemption.id)
|
|
code_redemption.delete()
|