def test_subbing_no_userid_or_courseid(self): """ Tests that no subbing occurs if no user_id or no course_id is given. """ test_string = 'This string should not be subbed here %%USER_ID%%' result = Ks.substitute_keywords_with_data(test_string, None, self.course.id) self.assertEqual(test_string, result) result = Ks.substitute_keywords_with_data(test_string, self.user.id, None) self.assertEqual(test_string, result)
def _render(format_string, message_body, context): """ Create a text message using a template, message body and context. Convert message body (`message_body`) into an email message using the provided template. The template is a format string, which is rendered using format() with the provided `context` dict. Any keywords encoded in the form %%KEYWORD%% found in the message body are substituted with user data before the body is inserted into the template. Output is returned as a unicode string. It is not encoded as utf-8. Such encoding is left to the email code, which will use the value of settings.DEFAULT_CHARSET to encode the message. """ # Substitute all %%-encoded keywords in the message body if 'user_id' in context and 'course_id' in context: message_body = substitute_keywords_with_data(message_body, context) result = format_string.format(**context) # Note that the body tag in the template will now have been # "formatted", so we need to do the same to the tag being # searched for. message_body_tag = COURSE_EMAIL_MESSAGE_BODY_TAG.format() result = result.replace(message_body_tag, message_body, 1) # finally, return the result, after wrapping long lines and without converting to an encoded byte array. return wrap_message(result)
def get_course_info_section(request, user, course, section_key): """ This returns the snippet of html to be rendered on the course info page, given the key for the section. Valid keys: - handouts - guest_handouts - updates - guest_updates """ info_module = get_course_info_section_module(request, user, course, section_key) html = '' if info_module is not None: try: html = info_module.render(STUDENT_VIEW).content context = { 'username': request.user.username, 'user_id': request.user.id, 'name': request.user.profile.name, 'course_title': course.display_name, 'course_id': course.id, 'course_start_date': get_default_time_display(course.start), 'course_end_date': get_default_time_display(course.end), } html = substitute_keywords_with_data(html, context) except Exception: # pylint: disable=broad-except html = render_to_string('courseware/error-message.html', None) log.exception(u"Error rendering course_id=%s, section_key=%s", unicode(course.id), section_key) return html
def test_name_sub(self): test_string = "This is the test string. subthis: %%USER_FULLNAME%% into user name" user_name = self.user.profile.name result = Ks.substitute_keywords_with_data(test_string, self.user.id, self.course.id) self.assertNotIn('%%USER_FULLNAME%%', result) self.assertIn(user_name, result)
def test_course_name_sub(self, test_info): """ Tests subbing course name in various scenarios """ course_name = self.course.display_name result = Ks.substitute_keywords_with_data(test_info['test_string'], self.user.id, self.course.id) self.assertIn(course_name, result) self.assertEqual(result, test_info['expected'])
def _render(format_string, message_body, context): """ Create a text message using a template, message body and context. Convert message body (`message_body`) into an email message using the provided template. The template is a format string, which is rendered using format() with the provided `context` dict. Any keywords encoded in the form %%KEYWORD%% found in the message body are subtituted with user data before the body is inserted into the template. Output is returned as a unicode string. It is not encoded as utf-8. Such encoding is left to the email code, which will use the value of settings.DEFAULT_CHARSET to encode the message. """ # Substitute all %%-encoded keywords in the message body if 'user_id' in context and 'course_id' in context: message_body = substitute_keywords_with_data(message_body, context) result = format_string.format(**context) # Note that the body tag in the template will now have been # "formatted", so we need to do the same to the tag being # searched for. message_body_tag = COURSE_EMAIL_MESSAGE_BODY_TAG.format() result = result.replace(message_body_tag, message_body, 1) # finally, return the result, after wrapping long lines and without converting to an encoded byte array. return wrap_message(result)
def get_course_info_section(request, course, section_key): """ This returns the snippet of html to be rendered on the course info page, given the key for the section. Valid keys: - handouts - guest_handouts - updates - guest_updates """ info_module = get_course_info_section_module(request, course, section_key) html = '' if info_module is not None: try: html = info_module.render(STUDENT_VIEW).content context = { 'username': request.user.username, 'user_id': request.user.id, 'name': request.user.profile.name, 'course_title': course.display_name, 'course_id': course.id, 'course_start_date': get_default_time_display(course.start), 'course_end_date': get_default_time_display(course.end), } html = substitute_keywords_with_data(html, context) except Exception: # pylint: disable=broad-except html = render_to_string('courseware/error-message.html', None) log.exception( u"Error rendering course=%s, section_key=%s", course, section_key ) return html
def test_subbing_no_userid_or_courseid(self): """ Tests that no subbing occurs if no user_id or no course_id is given. """ test_string = 'This string should not be subbed here %%USER_ID%%' no_course_context = dict( (key, value) for key, value in self.context.iteritems() if key != 'course_title' ) result = Ks.substitute_keywords_with_data(test_string, no_course_context) self.assertEqual(test_string, result) no_user_id_context = dict( (key, value) for key, value in self.context.iteritems() if key != 'user_id' ) result = Ks.substitute_keywords_with_data(test_string, no_user_id_context) self.assertEqual(test_string, result)
def test_should_not_sub(self): """ Test that sub-ing doesn't work without subtags """ test_string = "this string has no subtags" result = Ks.substitute_keywords_with_data(test_string, self.user.id, self.course.id) self.assertEquals(test_string, result)
def test_illegal_subtag(self): """ Test that sub-ing doesn't ocurr with illegal tags """ test_string = "%%user_id%%" result = Ks.substitute_keywords_with_data(test_string, self.user.id, self.course.id) self.assertEquals(test_string, result)
def test_anonymous_id_subs(self, test_info): """ Tests subbing anon user id in various scenarios """ anon_id = '123456789' with patch.dict(Ks.KEYWORD_FUNCTION_MAP, {'%%USER_ID%%': lambda x, y: anon_id}): result = Ks.substitute_keywords_with_data(test_info['test_string'], self.user.id, self.course.id) self.assertIn(anon_id, result) self.assertEqual(result, test_info['expected'])
def test_course_name_sub(self, test_string, expected): """ Tests subbing course name in various scenarios """ course_name = self.course.display_name result = Ks.substitute_keywords_with_data( test_string, self.context, ) self.assertIn(course_name, result) self.assertEqual(result, expected)
def test_sub_multiple_tags(self, test_info): """ Test that subbing works with multiple subtags """ anon_id = '123456789' with patch('util.keyword_substitution.anonymous_id_from_user_id', lambda user_id: anon_id): result = Ks.substitute_keywords_with_data( test_info['test_string'], self.context, ) self.assertEqual(result, test_info['expected'])
def test_anonymous_id_sub(self): """ Test that anonymous_id is subbed """ test_string = "Turn %%USER_ID%% into anonymous id" anonymous_id = Ks.anonymous_id_from_user_id(self.user.id) result = Ks.substitute_keywords_with_data( test_string, self.context, ) self.assertNotIn('%%USER_ID%%', result) self.assertIn(anonymous_id, result)
def test_name_sub(self): """ Test that the user's full name is correctly subbed """ test_string = "This is the test string. subthis: %%USER_FULLNAME%% into user name" user_name = self.user.profile.name result = Ks.substitute_keywords_with_data( test_string, self.context, ) self.assertNotIn('%%USER_FULLNAME%%', result) self.assertIn(user_name, result)
def test_no_subbing_empty_subtable(self): """ Test that no sub-ing occurs when the sub table is empty. """ # Set the keyword sub mapping to be empty Ks.KEYWORD_FUNCTION_MAP = {} test_string = 'This user\'s name is %%USER_FULLNAME%%' result = Ks.substitute_keywords_with_data(test_string, self.user.id, self.course.id) self.assertNotIn(self.user.profile.name, result) self.assertIn('%%USER_FULLNAME%%', result)
def test_sub_mutiltple_tags(self, test_info): """ Test that subbing works with multiple subtags """ anon_id = '123456789' patched_dict = { '%%USER_ID%%': lambda x, y: anon_id, '%%USER_FULLNAME%%': lambda x, y: self.user.profile.name, '%%COURSE_DISPLAY_NAME': lambda x, y: self.course.display_name, '%%COURSE_END_DATE': lambda x, y: get_default_time_display(self.course.end) } with patch.dict(Ks.KEYWORD_FUNCTION_MAP, patched_dict): result = Ks.substitute_keywords_with_data(test_info['test_string'], self.user.id, self.course.id) self.assertEqual(result, test_info['expected'])
def notify_enrollment_by_email(course, user, request): """ Updates the user about the course enrollment by email. If the Course has already started, use post_enrollment_email If the Course has not yet started, use pre_enrollment_email """ if (not (settings.FEATURES.get('AUTOMATIC_AUTH_FOR_TESTING')) and course.enable_enrollment_email): from_address = configuration_helpers.get_value( 'email_from_address', settings.DEFAULT_FROM_EMAIL, ) try: if course.has_started(): subject = get_course_about_section( request, course, 'post_enrollment_email_subject', ) message = get_course_about_section( request, course, 'post_enrollment_email', ) else: subject = get_course_about_section( request, course, 'pre_enrollment_email_subject', ) message = get_course_about_section( request, course, 'pre_enrollment_email', ) subject = ''.join(subject.splitlines()) context = { 'username': user.username, 'user_id': user.id, 'name': user.profile.name, 'course_title': course.display_name, 'course_id': course.id, 'course_start_date': get_default_time_display(course.start), 'course_end_date': get_default_time_display(course.end), } message = substitute_keywords_with_data(message, context) user.email_user(subject, message, from_address) except Exception: log.error( "unable to send course enrollment verification email to user from '{from_address}'".format( from_address=from_address, ), exc_info=True, ) return JsonResponse({ 'is_success': False, 'error': _('Could not send enrollment email to the user'), }) return JsonResponse({ 'is_success': True, 'subject': subject, 'message': message, }) else: return JsonResponse({ 'email_did_fire': False, })