From e3179c37cd1e43e0a89f5aede5e7dec5b0fa44da Mon Sep 17 00:00:00 2001 From: Sarina Canelake Date: Wed, 13 Aug 2014 16:06:03 -0400 Subject: [PATCH] Clean up Email section of legacy dashboard --- .../instructor/tests/test_legacy_email.py | 144 ------------------ lms/djangoapps/instructor/views/legacy.py | 77 +--------- .../legacy_instructor_dashboard.html | 73 +-------- 3 files changed, 2 insertions(+), 292 deletions(-) delete mode 100644 lms/djangoapps/instructor/tests/test_legacy_email.py diff --git a/lms/djangoapps/instructor/tests/test_legacy_email.py b/lms/djangoapps/instructor/tests/test_legacy_email.py deleted file mode 100644 index a740a2ef15..0000000000 --- a/lms/djangoapps/instructor/tests/test_legacy_email.py +++ /dev/null @@ -1,144 +0,0 @@ -""" -Unit tests for email feature flag in legacy instructor dashboard. -Additionally tests that bulk email is always disabled for non-Mongo -backed courses, regardless of email feature flag, and that the -view is conditionally available when Course Auth is turned on. -""" -from django.test.utils import override_settings -from django.conf import settings -from django.core.urlresolvers import reverse -from mock import patch - -from xmodule.modulestore.tests.django_utils import TEST_DATA_MOCK_MODULESTORE -from student.tests.factories import AdminFactory -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase -from xmodule.modulestore.tests.factories import CourseFactory -from xmodule.modulestore import ModuleStoreEnum - -from bulk_email.models import CourseAuthorization - - -@override_settings(MODULESTORE=TEST_DATA_MOCK_MODULESTORE) -class TestInstructorDashboardEmailView(ModuleStoreTestCase): - """ - Check for email view displayed with flag - """ - def setUp(self): - self.course = CourseFactory.create() - - # Create instructor account - instructor = AdminFactory.create() - self.client.login(username=instructor.username, password="test") - - # URL for instructor dash - self.url = reverse('instructor_dashboard_legacy', kwargs={'course_id': self.course.id.to_deprecated_string()}) - # URL for email view - self.email_link = 'Email' - - def tearDown(self): - """ - Undo all patches. - """ - patch.stopall() - - @patch.dict(settings.FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': False}) - def test_email_flag_true(self): - # Assert that the URL for the email view is in the response - response = self.client.get(self.url) - self.assertTrue(self.email_link in response.content) - - # Select the Email view of the instructor dash - session = self.client.session - session[u'idash_mode:{0}'.format(self.course.location.course_key.to_deprecated_string())] = 'Email' - session.save() - response = self.client.get(self.url) - - # Ensure we've selected the view properly and that the send_to field is present. - selected_email_link = 'Email' - self.assertTrue(selected_email_link in response.content) - send_to_label = '' - self.assertTrue(send_to_label in response.content) - - @patch.dict(settings.FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': True}) - def test_email_flag_unauthorized(self): - # Assert that the URL for the email view is not in the response - # email is enabled, but this course is not authorized to send email - response = self.client.get(self.url) - self.assertFalse(self.email_link in response.content) - - @patch.dict(settings.FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': True}) - def test_email_flag_authorized(self): - # Assert that the URL for the email view is in the response - # email is enabled, and this course is authorized to send email - - # Assert that instructor email is not enabled for this course - self.assertFalse(CourseAuthorization.instructor_email_enabled(self.course.id)) - response = self.client.get(self.url) - self.assertFalse(self.email_link in response.content) - - # Authorize the course to use email - cauth = CourseAuthorization(course_id=self.course.id, email_enabled=True) - cauth.save() - - # Assert that instructor email is enabled for this course - self.assertTrue(CourseAuthorization.instructor_email_enabled(self.course.id)) - response = self.client.get(self.url) - self.assertTrue(self.email_link in response.content) - - @patch.dict(settings.FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': False}) - def test_email_flag_false(self): - # Assert that the URL for the email view is not in the response - response = self.client.get(self.url) - self.assertFalse(self.email_link in response.content) - - @patch.dict(settings.FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True}) - def test_email_flag_true_xml_store(self): - # If the enable email setting is enabled, but this is an XML backed course, - # the email view shouldn't be available on the instructor dashboard. - - # The course factory uses a MongoModuleStore backing, so patch the - # `get_modulestore_type` method to pretend to be XML-backed. - # This is OK; we're simply testing that the `is_mongo_modulestore_type` flag - # in `instructor/views/legacy.py` is doing the correct thing. - - with patch('xmodule.modulestore.mongo.base.MongoModuleStore.get_modulestore_type') as mock_modulestore: - mock_modulestore.return_value = ModuleStoreEnum.Type.xml - - # Assert that the URL for the email view is not in the response - response = self.client.get(self.url) - self.assertFalse(self.email_link in response.content) - - @patch.dict(settings.FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True}) - def test_send_mail_unauthorized(self): - """ Test 'Send email' action returns an error if course is not authorized to send email. """ - - response = self.client.post( - self.url, { - 'action': 'Send email', - 'to_option': 'all', - 'subject': "Welcome to the course!", - 'message': "Lets start with an introduction!" - } - ) - self.assertContains(response, "Email is not enabled for this course.") - - @patch.dict(settings.FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True}) - def test_send_mail_authorized(self): - """ Test 'Send email' action when course is authorized to send email. """ - - course_authorization = CourseAuthorization(course_id=self.course.id, email_enabled=True) - course_authorization.save() - - session = self.client.session - session[u'idash_mode:{0}'.format(self.course.location.course_key.to_deprecated_string())] = 'Email' - session.save() - - response = self.client.post( - self.url, { - 'action': 'Send email', - 'to_option': 'all', - 'subject': 'Welcome to the course!', - 'message': 'Lets start with an introduction!', - } - ) - self.assertContains(response, "Your email was successfully queued for sending.") diff --git a/lms/djangoapps/instructor/views/legacy.py b/lms/djangoapps/instructor/views/legacy.py index 4276a8c067..e5b7da7da8 100644 --- a/lms/djangoapps/instructor/views/legacy.py +++ b/lms/djangoapps/instructor/views/legacy.py @@ -58,8 +58,7 @@ from instructor_task.api import ( get_instructor_task_history, submit_rescore_problem_for_all_students, submit_rescore_problem_for_student, - submit_reset_problem_attempts_for_all_students, - submit_bulk_course_email + submit_reset_problem_attempts_for_all_students ) from instructor_task.views import get_task_completion_info from edxmako.shortcuts import render_to_response, render_to_string @@ -445,55 +444,6 @@ def instructor_dashboard(request, course_id): ret = _do_enroll_students(course, course_key, students, secure=secure, overload=overload) datatable = ret['datatable'] - #---------------------------------------- - # email - - elif action == 'Send email': - email_to_option = request.POST.get("to_option") - email_subject = request.POST.get("subject") - html_message = request.POST.get("message") - - if bulk_email_is_enabled_for_course(course_key): - try: - # Create the CourseEmail object. This is saved immediately, so that - # any transaction that has been pending up to this point will also be - # committed. - email = CourseEmail.create( - course_key.to_deprecated_string(), request.user, email_to_option, email_subject, html_message - ) - - # Submit the task, so that the correct InstructorTask object gets created (for monitoring purposes) - submit_bulk_course_email(request, course_key, email.id) # pylint: disable=no-member - - except Exception as err: # pylint: disable=broad-except - # Catch any errors and deliver a message to the user - error_msg = "Failed to send email! ({0})".format(err) - msg += "" + error_msg + "" - log.exception(error_msg) - - else: - # If sending the task succeeds, deliver a success message to the user. - if email_to_option == "all": - text = _( - "Your email was successfully queued for sending. " - "Please note that for large classes, it may take up to an hour " - "(or more, if other courses are simultaneously sending email) " - "to send all emails." - ) - else: - text = _('Your email was successfully queued for sending.') - email_msg = '

{text}

'.format(text=text) - else: - msg += "Email is not enabled for this course." - - elif "Show Background Email Task History" in action: - message, datatable = get_background_task_table(course_key, task_type='bulk_course_email') - msg += message - - elif "Show Background Email Task History" in action: - message, datatable = get_background_task_table(course_key, task_type='bulk_course_email') - msg += message - #---------------------------------------- # psychometrics @@ -578,27 +528,6 @@ def instructor_dashboard(request, course_id): if is_studio_course: studio_url = get_cms_course_link(course) - email_editor = None - # HTML editor for email - if idash_mode == 'Email' and is_studio_course: - html_module = HtmlDescriptor( - course.system, - DictFieldData({'data': html_message}), - ScopeIds(None, None, None, course_key.make_usage_key('html', 'dummy')) - ) - fragment = html_module.render('studio_view') - fragment = wrap_xblock( - 'LmsRuntime', html_module, 'studio_view', fragment, None, - extra_data={"course-id": course_key.to_deprecated_string()}, - usage_id_serializer=lambda usage_id: quote_slashes(usage_id.to_deprecated_string()), - request_token=request_token(request), - ) - email_editor = fragment.content - - # Enable instructor email only if the following conditions are met: - # 1. Feature flag is on - # 2. We have explicitly enabled email for the given course via django-admin - # 3. It is NOT an XML course if bulk_email_is_enabled_for_course(course_key): show_email_tab = True @@ -628,10 +557,6 @@ def instructor_dashboard(request, course_id): 'modeflag': {idash_mode: 'selectedmode'}, 'studio_url': studio_url, - 'to_option': email_to_option, # email - 'subject': email_subject, # email - 'editor': email_editor, # email - 'email_msg': email_msg, # email 'show_email_tab': show_email_tab, # email 'problems': problems, # psychometrics diff --git a/lms/templates/courseware/legacy_instructor_dashboard.html b/lms/templates/courseware/legacy_instructor_dashboard.html index b8edc06560..fad8fed6c5 100644 --- a/lms/templates/courseware/legacy_instructor_dashboard.html +++ b/lms/templates/courseware/legacy_instructor_dashboard.html @@ -407,78 +407,7 @@ function goto( mode) ##----------------------------------------------------------------------------- %if modeflag.get('Email'): - %if email_msg: -

${email_msg}

- %endif - - - -
-

${_("Please try not to email students more than once per week. Important things to consider before sending:")}

- -
-

${_("CAUTION!")} - ${_("Once the 'Send Email' button is clicked, your email will be queued for sending.")} - ${_("A queued email CANNOT be cancelled.")}

-
-
- -
- - -
-

These email actions run in the background, and status for active email tasks will appear in a table below. - To see status for all bulk email tasks submitted for this course, click on this button: -

-

- -

+

${_("To send email, please visit the 'Email' section of the instructor dashboard.")}

%endif