def test_wrap_xblock(self, course_id, data_usage_id): """ Verify that new content is added and the resources are the same. """ fragment = self.create_fragment(u"<h1>Test!</h1>") fragment.initialize_js( 'BlockMain' ) # wrap_block() sets some attributes only if there is JS. course = getattr(self, course_id) test_wrap_output = wrap_xblock( runtime_class='TestRuntime', block=course, view='baseview', frag=fragment, context={"wrap_xblock_data": { "custom-attribute": "custom-value" }}, usage_id_serializer=lambda usage_id: quote_slashes( six.text_type(usage_id)), request_token=uuid.uuid1().hex) assert isinstance(test_wrap_output, Fragment) assert 'xblock-baseview' in test_wrap_output.content assert 'data-runtime-class="TestRuntime"' in test_wrap_output.content assert data_usage_id in test_wrap_output.content assert '<h1>Test!</h1>' in test_wrap_output.content assert 'data-custom-attribute="custom-value"' in test_wrap_output.content assert test_wrap_output.resources[ 0].data == u'body {background-color:red;}' assert test_wrap_output.resources[1].data == 'alert("Hi!");'
def test_wrap_xblock(self, course_id, data_usage_id): """ Verify that new content is added and the resources are the same. """ fragment = self.create_fragment(u"<h1>Test!</h1>") course = getattr(self, course_id) test_wrap_output = wrap_xblock( runtime_class='TestRuntime', block=course, view='baseview', frag=fragment, context={"wrap_xblock_data": { "custom-attribute": "custom-value" }}, usage_id_serializer=lambda usage_id: quote_slashes( unicode(usage_id)), request_token=uuid.uuid1().get_hex()) self.assertIsInstance(test_wrap_output, Fragment) self.assertIn('xblock-baseview', test_wrap_output.content) self.assertIn('data-runtime-class="TestRuntime"', test_wrap_output.content) self.assertIn(data_usage_id, test_wrap_output.content) self.assertIn('<h1>Test!</h1>', test_wrap_output.content) self.assertIn('data-custom-attribute="custom-value"', test_wrap_output.content) self.assertEqual(test_wrap_output.resources[0].data, u'body {background-color:red;}') self.assertEqual(test_wrap_output.resources[1].data, 'alert("Hi!");')
def _section_send_email(course, access): """ Provide data for the corresponding bulk email section """ course_key = course.id # Monkey-patch applicable_aside_types to return no asides for the duration of this render with patch.object(course.runtime, 'applicable_aside_types', null_applicable_aside_types): # This HtmlDescriptor is only being used to generate a nice text editor. html_module = HtmlDescriptor( course.system, DictFieldData({'data': ''}), ScopeIds(None, None, None, course_key.make_usage_key('html', 'fake'))) fragment = course.system.render(html_module, 'studio_view') fragment = wrap_xblock( 'LmsRuntime', html_module, 'studio_view', fragment, None, extra_data={"course-id": unicode(course_key)}, usage_id_serializer=lambda usage_id: quote_slashes(unicode(usage_id)), # Generate a new request_token here at random, because this module isn't connected to any other # xblock rendering. request_token=uuid.uuid1().get_hex()) cohorts = [] if is_course_cohorted(course_key): cohorts = get_course_cohorts(course) email_editor = fragment.content section_data = { 'section_key': 'send_email', 'section_display_name': _('Email'), 'access': access, 'send_email': reverse('send_email', kwargs={'course_id': unicode(course_key)}), 'editor': email_editor, 'cohorts': cohorts, 'default_cohort_name': DEFAULT_COHORT_NAME, 'list_instructor_tasks_url': reverse('list_instructor_tasks', kwargs={'course_id': unicode(course_key)}), 'email_background_tasks_url': reverse('list_background_email_tasks', kwargs={'course_id': unicode(course_key)}), 'email_content_history_url': reverse('list_email_content', kwargs={'course_id': unicode(course_key)}), } return section_data
def _section_send_email(course, access): """ Provide data for the corresponding bulk email section """ course_key = course.id # Monkey-patch applicable_aside_types to return no asides for the duration of this render with patch.object(course.runtime, 'applicable_aside_types', null_applicable_aside_types): # This HtmlBlock is only being used to generate a nice text editor. html_module = HtmlBlock( course.system, DictFieldData({'data': ''}), ScopeIds(None, None, None, course_key.make_usage_key('html', 'fake')) ) fragment = course.system.render(html_module, 'studio_view') fragment = wrap_xblock( 'LmsRuntime', html_module, 'studio_view', fragment, None, extra_data={"course-id": str(course_key)}, usage_id_serializer=lambda usage_id: quote_slashes(str(usage_id)), # Generate a new request_token here at random, because this module isn't connected to any other # xblock rendering. request_token=uuid.uuid1().hex ) cohorts = [] if is_course_cohorted(course_key): cohorts = get_course_cohorts(course) course_modes = [] if not VerifiedTrackCohortedCourse.is_verified_track_cohort_enabled(course_key): course_modes = CourseMode.modes_for_course(course_key, include_expired=True, only_selectable=False) email_editor = fragment.content section_data = { 'section_key': 'send_email', 'section_display_name': _('Email'), 'access': access, 'send_email': reverse('send_email', kwargs={'course_id': str(course_key)}), 'editor': email_editor, 'cohorts': cohorts, 'course_modes': course_modes, 'default_cohort_name': DEFAULT_COHORT_NAME, 'list_instructor_tasks_url': reverse( 'list_instructor_tasks', kwargs={'course_id': str(course_key)} ), 'email_background_tasks_url': reverse( 'list_background_email_tasks', kwargs={'course_id': str(course_key)} ), 'email_content_history_url': reverse( 'list_email_content', kwargs={'course_id': str(course_key)} ), } if settings.FEATURES.get("ENABLE_NEW_BULK_EMAIL_EXPERIENCE", False) is not False: section_data[ "communications_mfe_url" ] = f"{settings.COMMUNICATIONS_MICROFRONTEND_URL}/courses/{str(course_key)}/bulk_email" return section_data
def _section_send_email(course, access): """ Provide data for the corresponding bulk email section """ course_key = course.id # Monkey-patch applicable_aside_types to return no asides for the duration of this render with patch.object(course.runtime, 'applicable_aside_types', null_applicable_aside_types): # This HtmlDescriptor is only being used to generate a nice text editor. html_module = HtmlDescriptor( course.system, DictFieldData({'data': ''}), ScopeIds(None, None, None, course_key.make_usage_key('html', 'fake')) ) fragment = course.system.render(html_module, 'studio_view') fragment = wrap_xblock( 'LmsRuntime', html_module, 'studio_view', fragment, None, extra_data={"course-id": unicode(course_key)}, usage_id_serializer=lambda usage_id: quote_slashes(unicode(usage_id)), # Generate a new request_token here at random, because this module isn't connected to any other # xblock rendering. request_token=uuid.uuid1().get_hex() ) cohorts = [] if is_course_cohorted(course_key): cohorts = get_course_cohorts(course) course_modes = [] if not VerifiedTrackCohortedCourse.is_verified_track_cohort_enabled(course_key): course_modes = CourseMode.modes_for_course(course_key, include_expired=True, only_selectable=False) email_editor = fragment.content section_data = { 'section_key': 'send_email', 'section_display_name': _('Email'), 'access': access, 'send_email': reverse('send_email', kwargs={'course_id': unicode(course_key)}), 'editor': email_editor, 'cohorts': cohorts, 'course_modes': course_modes, 'default_cohort_name': DEFAULT_COHORT_NAME, 'list_instructor_tasks_url': reverse( 'list_instructor_tasks', kwargs={'course_id': unicode(course_key)} ), 'email_background_tasks_url': reverse( 'list_background_email_tasks', kwargs={'course_id': unicode(course_key)} ), 'email_content_history_url': reverse( 'list_email_content', kwargs={'course_id': unicode(course_key)} ), } from openedx.stanford.lms.djangoapps.instructor.views.instructor_dashboard import send_email_section_data section_data.update(send_email_section_data()) return section_data
def _section_send_email(course, access): """ Provide data for the corresponding bulk email section """ course_key = course.id queries = GroupedQuery.objects.filter(course_id=course_key) query_options = tuple( (query.id, query.title or u'Query saved at ' + query.created.strftime("%m-%d-%y %H:%M")) for query in queries ) # Monkey-patch applicable_aside_types to return no asides for the duration of this render with patch.object(course.runtime, 'applicable_aside_types', null_applicable_aside_types): # This HtmlDescriptor is only being used to generate a nice text editor. html_module = HtmlDescriptor( course.system, DictFieldData({'data': ''}), ScopeIds(None, None, None, course_key.make_usage_key('html', 'fake')) ) fragment = course.system.render(html_module, 'studio_view') fragment = wrap_xblock( 'LmsRuntime', html_module, 'studio_view', fragment, None, extra_data={"course-id": unicode(course_key)}, usage_id_serializer=lambda usage_id: quote_slashes(unicode(usage_id)), # Generate a new request_token here at random, because this module isn't connected to any other # xblock rendering. request_token=uuid.uuid1().get_hex() ) email_editor = fragment.content section_data = { 'section_key': 'send_email', 'section_display_name': _('Email'), 'keywords_supported': get_keywords_supported(), 'access': access, 'to_options': query_options, 'send_email': reverse('send_email', kwargs={'course_id': unicode(course_key)}), 'editor': email_editor, 'list_instructor_tasks_url': reverse( 'list_instructor_tasks', kwargs={'course_id': unicode(course_key)} ), 'email_background_tasks_url': reverse( 'list_background_email_tasks', kwargs={'course_id': unicode(course_key)} ), 'email_content_history_url': reverse( 'list_email_content', kwargs={'course_id': unicode(course_key)} ), } return section_data
def test_wrap_xblock(self, course_id, data_usage_id): """ Verify that new content is added and the resources are the same. """ fragment = self.create_fragment(u"<h1>Test!</h1>") course = getattr(self, course_id) test_wrap_output = wrap_xblock( runtime_class='TestRuntime', block=course, view='baseview', frag=fragment, context=None, usage_id_serializer=lambda usage_id: quote_slashes(unicode(usage_id)), request_token=uuid.uuid1().get_hex() ) self.assertIsInstance(test_wrap_output, Fragment) self.assertIn('xblock-baseview', test_wrap_output.content) self.assertIn('data-runtime-class="TestRuntime"', test_wrap_output.content) self.assertIn(data_usage_id, test_wrap_output.content) self.assertIn('<h1>Test!</h1>', test_wrap_output.content) self.assertEqual(test_wrap_output.resources[0].data, u'body {background-color:red;}') self.assertEqual(test_wrap_output.resources[1].data, 'alert("Hi!");')
def _section_send_email(course, access): """ Provide data for the corresponding bulk email section """ course_key = course.id # Monkey-patch applicable_aside_types to return no asides for the duration of this render with patch.object(course.runtime, "applicable_aside_types", null_applicable_aside_types): # This HtmlDescriptor is only being used to generate a nice text editor. html_module = HtmlDescriptor( course.system, DictFieldData({"data": ""}), ScopeIds(None, None, None, course_key.make_usage_key("html", "fake")), ) fragment = course.system.render(html_module, "studio_view") fragment = wrap_xblock( "LmsRuntime", html_module, "studio_view", fragment, None, extra_data={"course-id": unicode(course_key)}, usage_id_serializer=lambda usage_id: quote_slashes(unicode(usage_id)), # Generate a new request_token here at random, because this module isn't connected to any other # xblock rendering. request_token=uuid.uuid1().get_hex(), ) email_editor = fragment.content section_data = { "section_key": "send_email", "section_display_name": _("Email"), "access": access, "send_email": reverse("send_email", kwargs={"course_id": unicode(course_key)}), "editor": email_editor, "list_instructor_tasks_url": reverse("list_instructor_tasks", kwargs={"course_id": unicode(course_key)}), "email_background_tasks_url": reverse("list_background_email_tasks", kwargs={"course_id": unicode(course_key)}), "email_content_history_url": reverse("list_email_content", kwargs={"course_id": unicode(course_key)}), } return section_data
def _section_recap(request, course, recap_blocks, access): """Provide data for the Recap dashboard section """ course_key = course.id recap_items = [] recap_fragments = [] # Get list of enrolled students for this course user_list = User.objects.filter( courseenrollment__course_id=course_key, courseenrollment__is_active=1, ).order_by('username').select_related('profile') for block in recap_blocks: recap_items.append({ 'name': block.display_name, 'block_list': block.xblock_list, 'url_base': reverse( 'xblock_view', args=[course.id, block.location, 'recap_blocks_listing_view']), 'make_pdf_json': reverse('xblock_handler', args=[course.id, block.location, 'make_pdf_json']), }) recap_block = recap_blocks[0] block, __ = get_module_by_usage_id(request, unicode(course_key), unicode(recap_block.location), disable_staff_debug_info=True, course=course) # Set up recap instructor dashboard fragment, pass data to the context fragment = block.render('recap_blocks_listing_view', context={ 'recap_items': recap_items, 'users': user_list, }) # Wrap the fragment and get all resources associated with this XBlock view fragment = wrap_xblock( 'LmsRuntime', recap_block, 'recap_blocks_listing_view', fragment, None, extra_data={"course-id": unicode(course_key)}, usage_id_serializer=lambda usage_id: quote_slashes(unicode(usage_id)), # Generate a new request_token here at random, because this module isn't connected to any other # xblock rendering. request_token=uuid.uuid1().get_hex()) section_data = { 'fragment': fragment, 'users': user_list, 'section_key': 'recap', 'section_display_name': _('Recap'), 'access': access, 'course_id': unicode(course_key) } return section_data