def courses(request, show_hidden): """ Renders the courses list for the API. :param request: The django HttpRequest object. :param show_hidden: True or False, (controlled from the urls.py file) to show courses with upcoming enrollment date. :return: JsonResponse with a list of the courses. """ courses_list = branding.get_visible_courses() if not show_hidden: # Using `AnonymousUser()` to hide unpublished courses anonymous_user = AnonymousUser() # The logic bellow has been copied (with amendments) from `courseware.courses.get_courses`, # Just in case something changes with edX releases. permission_name = settings.COURSE_CATALOG_VISIBILITY_PERMISSION courses_list = [ c for c in courses_list if has_access(anonymous_user, permission_name, c) ] courses_list = sort_by_announcement(courses_list) courses_list = edraak_courses_logic(courses_list) courses_json_list = [] prefix = get_absolute_url_prefix(request) for course in courses_list: video_tag = get_course_about_section(course, "video") youtube_id = video_tag[video_tag.find("embed") + 6:video_tag.find("?")] courses_json_list.append({ "id": unicode(course.id), "number": course.display_number_with_default, "name": course.display_name_with_default, "organization": course.display_org_with_default, "description": get_course_about_section(course, "short_description").strip(), "startDate": course.start, "endDate": course.end, "enrollmentStartDate": course.enrollment_start, "enrollmentEndDate": course.enrollment_end, "overview": get_course_about_section(course, "overview").strip(), "aboutPage": prefix + reverse('about_course', args=[unicode(course.id)]), "image": prefix + course_image_url(course), "state": _get_course_status(course), "youtube_id": youtube_id, "effort": get_course_about_section(course, "effort").strip(), }) return JsonResponse(courses_json_list)
def activation(request): access_token = request.GET['access_token'] user_email = request.GET['email'] course_name = request.GET['course_name'] course_id = request.GET['course_id'] cert_end = request.GET['cert_end'] user_id = request.user.id secret_key = settings.BAYT_SECRET_KEY my_string = user_email + course_name + secret_key current_access_token = hashlib.md5(my_string.encode('UTF-8')).hexdigest() if current_access_token == access_token: connection = Http() resp, content = connection.request('{base}?{params}'.format( base='https://api.bayt.com/api/edraak-api/post.adp', params=urllib.urlencode({ 'secret_key': settings.BAYT_SECRET_KEY, 'valid_until': cert_end, 'certificate_name': course_name.encode('UTF-8'), 'email_address': user_email }), )) json_content = simplejson.loads(content) if json_content['status'] == 'NOT EXISTS': # redirect user to bayt registration return render_to_response('bayt/callback.html', { 'status': False, 'redirect_url': '{bayt_base}{register}'.format( bayt_base=settings.BAYT_BASE, register='/en/register-j/', ) }) BaytPublishedCertificate.objects.create(user_id=user_id, course_id=course_id) return render_to_response('bayt/callback.html', { 'status': True, 'redirect_url': '{base}{view}'.format( base=get_absolute_url_prefix(request), view=reverse('dashboard'), ), }) else: log.warning( 'Access tokens don\'t match: current=\'%s\' original=\'%s\'', current_access_token, access_token, ) return JsonResponse({'success': False, 'error': True, 'redirect_to': False})
def get_student_email(request): user_email = request.POST['bayt_email'] course_name = request.POST['course_name'] course_id = request.POST['course_id'] cert_end = request.POST['cert_end'] user_id = request.user.id try: validate_email(user_email) except ValidationError: return JsonResponse({'success': False, 'error': _('Invalid Email')}) try: user = User.objects.get(id=user_id) except User.DoesNotExist: ## close the pop-up because there is sth wrong return JsonResponse({'success': False, 'error': 'Invalid ID'}) if user.email == user_email: h = Http() params = { 'secret_key': settings.BAYT_SECRET_KEY, 'valid_until': cert_end, 'certificate_name': course_name.encode('UTF-8'), 'email_address': user_email } url = 'https://api.bayt.com/api/edraak-api/post.adp?' + urllib.urlencode(params) resp, content = h.request(url) json_content = simplejson.loads(content) if json_content['status'] == 'NOT EXISTS': return JsonResponse({ 'success': True, 'error': False, 'redirect_to': '{bayt_base}{register}'.format( bayt_base=settings.BAYT_BASE, register='/en/register-j/', ), 'response': content, }) else: BaytPublishedCertificate.objects.create(user_id=int(user_id), course_id=course_id) return JsonResponse({'success': True, 'error': False, 'redirect_to': False, 'response': content}) else: secret_key = settings.BAYT_SECRET_KEY my_string = user_email + course_name + secret_key access_token = hashlib.md5(my_string.encode('UTF-8')).hexdigest() params = { 'email': user_email, 'course_name': course_name.encode('UTF-8'), 'access_token': access_token, 'course_id': course_id.encode('UTF-8'), 'cert_end': cert_end, 'user_id': user_id, } message = render_to_string('emails/bayt_verification_email.txt', { 'activation_url': '{base}{view}?{params}'.format( base=get_absolute_url_prefix(request), view=reverse('bayt_activation'), params=urllib.urlencode(params) ), }) try: subject = _('Verify your email to share your Edraak certificate on Bayt.com') send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [user_email], fail_silently=False) # here we have to send an auth email to user email that contains a link to # get back to here and then post the certificate return JsonResponse({ 'success': True, 'error': False, 'redirect_to': reverse('bayt_check_email', kwargs={ 'email': user_email, 'course_id': course_id, }), }) except: log.warning('Unable to send activation email to user', exc_info=True) return JsonResponse({ 'success': False, 'error': True, 'redirect_to': False, })
def get_student_email(request): user_email = request.POST['bayt_email'] course_name = request.POST['course_name'] course_id = request.POST['course_id'] cert_end = request.POST['cert_end'] user_id = request.user.id if not validate_email(user_email): return JsonResponse({'success': False, 'error': _('Invalid Email')}) try: user = User.objects.get(id=user_id) except User.DoesNotExist: ## close the pop-up because there is sth wrong return JsonResponse({'success': False, 'error': 'Invalid ID'}) if user.email == user_email: h = Http() params = { 'secret_key': settings.BAYT_SECRET_KEY, 'valid_until': cert_end, 'certificate_name': course_name.encode('UTF-8'), 'email_address': user_email } url = 'https://api.bayt.com/api/edraak-api/post.adp?' + urllib.urlencode(params) resp, content = h.request(url) json_content = simplejson.loads(content) if json_content['status'] == 'NOT EXISTS': return JsonResponse({ 'success': True, 'error': False, 'redirect_to': '{bayt_base}{register}'.format( bayt_base=settings.BAYT_BASE, register='/en/register-j/', ), 'response': content, }) else: BaytPublishedCertificate.objects.create(user_id=int(user_id), course_id=course_id) return JsonResponse({'success': True, 'error': False, 'redirect_to': False, 'response': content}) else: secret_key = settings.BAYT_SECRET_KEY my_string = user_email + course_name + secret_key access_token = hashlib.md5(my_string.encode('UTF-8')).hexdigest() params = { 'email': user_email, 'course_name': course_name.encode('UTF-8'), 'access_token': access_token, 'course_id': course_id.encode('UTF-8'), 'cert_end': cert_end, 'user_id': user_id, } message = render_to_string('bayt/verification_email.txt', { 'activation_url': '{base}{view}?{params}'.format( base=get_absolute_url_prefix(request), view=reverse('bayt_activation'), params=urllib.urlencode(params) ), }) try: subject = _('Verify your email to share your Edraak certificate on Bayt.com') send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [user_email], fail_silently=False) # here we have to send an auth email to user email that contains a link to # get back to here and then post the certificate return JsonResponse({ 'success': True, 'error': False, 'redirect_to': reverse('bayt_check_email', kwargs={ 'email': user_email, 'course_id': course_id, }), }) except: log.warning('Unable to send activation email to user', exc_info=True) return JsonResponse({ 'success': False, 'error': True, 'redirect_to': False, })
def courses(request, show_hidden): """ Renders the courses list for the API. :param request: The django HttpRequest object. :param show_hidden: True or False, (controlled from the urls.py file) to show courses with upcoming enrollment date. :return: JsonResponse with a list of the courses. """ courses_list = branding.get_visible_courses() if not show_hidden: # Using `AnonymousUser()` to hide unpublished courses anonymous_user = AnonymousUser() # The logic bellow has been copied (with amendments) from `courseware.courses.get_courses`, # Just in case something changes with edX releases. permission_name = settings.COURSE_CATALOG_VISIBILITY_PERMISSION courses_list = [ c for c in courses_list if has_access(anonymous_user, permission_name, c) ] courses_list = sort_by_announcement(courses_list) courses_list = edraak_courses_logic(courses_list) courses_json_list = [] prefix = get_absolute_url_prefix(request) for course_overview in courses_list: try: course = get_course(course_overview.id) video_tag = get_course_about_section(request, course, "video") youtube_id = video_tag[video_tag.find("embed") + 6:video_tag.find("?")] courses_json_list.append({ "id": unicode(course.id), "number": course.display_number_with_default, "name": course.display_name_with_default_escaped, "organization": course.display_org_with_default, "description": get_course_about_section(request, course, "short_description").strip(), "startDate": course.start, "endDate": course.end, "enrollmentStartDate": course.enrollment_start, "enrollmentEndDate": course.enrollment_end, "overview": get_course_about_section(request, course, "overview").strip(), "aboutPage": prefix + reverse('about_course', args=[unicode(course.id)]), "image": prefix + course_image_url(course), "state": _get_course_status(course), "youtube_id": youtube_id, "effort": get_course_about_section(request, course, "effort").strip(), }) except ValueError: log.error(u"Course with id '{0}' not found".format(course_overview.id)) return JsonResponse(courses_json_list)