Commit 095b0727 by Alexander Kryklia Committed by cahrens

Unflag Group Configurations, Render only existing children in staff view of split_test.

parent b875a429
...@@ -7,7 +7,6 @@ from contentstore.utils import reverse_course_url, reverse_usage_url ...@@ -7,7 +7,6 @@ from contentstore.utils import reverse_course_url, reverse_usage_url
from contentstore.views.component import SPLIT_TEST_COMPONENT_TYPE from contentstore.views.component import SPLIT_TEST_COMPONENT_TYPE
from contentstore.views.course import GroupConfiguration from contentstore.views.course import GroupConfiguration
from contentstore.tests.utils import CourseTestCase from contentstore.tests.utils import CourseTestCase
from util.testing import UrlResetMixin
from xmodule.partitions.partitions import Group, UserPartition from xmodule.partitions.partitions import Group, UserPartition
from xmodule.modulestore.tests.factories import ItemFactory from xmodule.modulestore.tests.factories import ItemFactory
from xmodule.split_test_module import ValidationMessage, ValidationMessageType from xmodule.split_test_module import ValidationMessage, ValidationMessageType
...@@ -165,11 +164,10 @@ class GroupConfigurationsBaseTestCase(object): ...@@ -165,11 +164,10 @@ class GroupConfigurationsBaseTestCase(object):
# pylint: disable=no-member # pylint: disable=no-member
class GroupConfigurationsListHandlerTestCase(UrlResetMixin, CourseTestCase, GroupConfigurationsBaseTestCase, HelperMethods): class GroupConfigurationsListHandlerTestCase(CourseTestCase, GroupConfigurationsBaseTestCase, HelperMethods):
""" """
Test cases for group_configurations_list_handler. Test cases for group_configurations_list_handler.
""" """
@patch.dict("django.conf.settings.FEATURES", {"ENABLE_GROUP_CONFIGURATIONS": True})
def setUp(self): def setUp(self):
""" """
Set up GroupConfigurationsListHandlerTestCase. Set up GroupConfigurationsListHandlerTestCase.
...@@ -261,14 +259,13 @@ class GroupConfigurationsListHandlerTestCase(UrlResetMixin, CourseTestCase, Grou ...@@ -261,14 +259,13 @@ class GroupConfigurationsListHandlerTestCase(UrlResetMixin, CourseTestCase, Grou
# pylint: disable=no-member # pylint: disable=no-member
class GroupConfigurationsDetailHandlerTestCase(UrlResetMixin, CourseTestCase, GroupConfigurationsBaseTestCase, HelperMethods): class GroupConfigurationsDetailHandlerTestCase(CourseTestCase, GroupConfigurationsBaseTestCase, HelperMethods):
""" """
Test cases for group_configurations_detail_handler. Test cases for group_configurations_detail_handler.
""" """
ID = 0 ID = 0
@patch.dict("django.conf.settings.FEATURES", {"ENABLE_GROUP_CONFIGURATIONS": True})
def setUp(self): def setUp(self):
""" """
Set up GroupConfigurationsDetailHandlerTestCase. Set up GroupConfigurationsDetailHandlerTestCase.
...@@ -420,12 +417,11 @@ class GroupConfigurationsDetailHandlerTestCase(UrlResetMixin, CourseTestCase, Gr ...@@ -420,12 +417,11 @@ class GroupConfigurationsDetailHandlerTestCase(UrlResetMixin, CourseTestCase, Gr
# pylint: disable=no-member # pylint: disable=no-member
class GroupConfigurationsUsageInfoTestCase(UrlResetMixin, CourseTestCase, HelperMethods): class GroupConfigurationsUsageInfoTestCase(CourseTestCase, HelperMethods):
""" """
Tests for usage information of configurations. Tests for usage information of configurations.
""" """
@patch.dict("django.conf.settings.FEATURES", {"ENABLE_GROUP_CONFIGURATIONS": True})
def setUp(self): def setUp(self):
super(GroupConfigurationsUsageInfoTestCase, self).setUp() super(GroupConfigurationsUsageInfoTestCase, self).setUp()
...@@ -542,7 +538,6 @@ class GroupConfigurationsValidationTestCase(CourseTestCase, HelperMethods): ...@@ -542,7 +538,6 @@ class GroupConfigurationsValidationTestCase(CourseTestCase, HelperMethods):
""" """
Tests for validation in Group Configurations. Tests for validation in Group Configurations.
""" """
@patch.dict("django.conf.settings.FEATURES", {"ENABLE_GROUP_CONFIGURATIONS": True})
def setUp(self): def setUp(self):
super(GroupConfigurationsValidationTestCase, self).setUp() super(GroupConfigurationsValidationTestCase, self).setUp()
......
...@@ -180,7 +180,6 @@ class GetItem(ItemTest): ...@@ -180,7 +180,6 @@ class GetItem(ItemTest):
self.assertIn('Zooming', html) self.assertIn('Zooming', html)
@skipUnless(os.environ.get('FEATURE_GROUP_CONFIGURATIONS'), 'Tests Group Configurations feature')
def test_split_test_edited(self): def test_split_test_edited(self):
""" """
Test that rename of a group changes display name of child vertical. Test that rename of a group changes display name of child vertical.
...@@ -194,7 +193,7 @@ class GetItem(ItemTest): ...@@ -194,7 +193,7 @@ class GetItem(ItemTest):
resp = self.create_xblock(category='split_test', parent_usage_key=root_usage_key) resp = self.create_xblock(category='split_test', parent_usage_key=root_usage_key)
split_test_usage_key = self.response_usage_key(resp) split_test_usage_key = self.response_usage_key(resp)
self.client.ajax_post( self.client.ajax_post(
reverse_usage_url("xblock_handler", split_test_usage_key), reverse_usage_url("xblock_handler", split_test_usage_key),
data={'metadata': {'user_partition_id': str(0)}} data={'metadata': {'user_partition_id': str(0)}}
) )
html, __ = self._get_container_preview(split_test_usage_key) html, __ = self._get_container_preview(split_test_usage_key)
......
...@@ -24,6 +24,7 @@ class CourseMetadata(object): ...@@ -24,6 +24,7 @@ class CourseMetadata(object):
'graded', 'graded',
'hide_from_toc', 'hide_from_toc',
'pdf_textbooks', 'pdf_textbooks',
'user_partitions',
'name', # from xblock 'name', # from xblock
'tags', # from xblock 'tags', # from xblock
'visible_to_staff_only' 'visible_to_staff_only'
......
...@@ -104,9 +104,6 @@ FEATURES = { ...@@ -104,9 +104,6 @@ FEATURES = {
# Turn off Advanced Security by default # Turn off Advanced Security by default
'ADVANCED_SECURITY': False, 'ADVANCED_SECURITY': False,
# Toggles Group Configuration editing functionality
'ENABLE_GROUP_CONFIGURATIONS': os.environ.get('FEATURE_GROUP_CONFIGURATIONS'),
# Modulestore to use for new courses # Modulestore to use for new courses
'DEFAULT_STORE_FOR_NEW_COURSE': 'mongo', 'DEFAULT_STORE_FOR_NEW_COURSE': 'mongo',
} }
......
...@@ -381,7 +381,7 @@ define([ ...@@ -381,7 +381,7 @@ define([
this.view.$('form').submit(); this.view.$('form').submit();
// See error message // See error message
expect(this.view.$(SELECTORS.errorMessage)).toContainText( expect(this.view.$(SELECTORS.errorMessage)).toContainText(
'Group Configuration name is required' 'Group Configuration name is required.'
); );
// No request // No request
expect(requests.length).toBe(0); expect(requests.length).toBe(0);
......
...@@ -330,7 +330,7 @@ require(["domReady!", "jquery", "js/models/settings/course_details", "js/views/s ...@@ -330,7 +330,7 @@ require(["domReady!", "jquery", "js/models/settings/course_details", "js/views/s
<li class="nav-item"><a href="${grading_config_url}">${_("Grading")}</a></li> <li class="nav-item"><a href="${grading_config_url}">${_("Grading")}</a></li>
<li class="nav-item"><a href="${course_team_url}">${_("Course Team")}</a></li> <li class="nav-item"><a href="${course_team_url}">${_("Course Team")}</a></li>
<li class="nav-item"><a href="${advanced_config_url}">${_("Advanced Settings")}</a></li> <li class="nav-item"><a href="${advanced_config_url}">${_("Advanced Settings")}</a></li>
% if settings.FEATURES.get('ENABLE_GROUP_CONFIGURATIONS') and "split_test" in context_course.advanced_modules: % if "split_test" in context_course.advanced_modules:
<li class="nav-item"><a href="${utils.reverse_course_url('group_configurations_list_handler', context_course.id)}">${_("Group Configurations")}</a></li> <li class="nav-item"><a href="${utils.reverse_course_url('group_configurations_list_handler', context_course.id)}">${_("Group Configurations")}</a></li>
% endif % endif
</ul> </ul>
......
...@@ -126,7 +126,7 @@ require(["domReady!", "jquery", "gettext", "js/models/settings/advanced", "js/vi ...@@ -126,7 +126,7 @@ require(["domReady!", "jquery", "gettext", "js/models/settings/advanced", "js/vi
<li class="nav-item"><a href="${details_url}">${_("Details &amp; Schedule")}</a></li> <li class="nav-item"><a href="${details_url}">${_("Details &amp; Schedule")}</a></li>
<li class="nav-item"><a href="${grading_url}">${_("Grading")}</a></li> <li class="nav-item"><a href="${grading_url}">${_("Grading")}</a></li>
<li class="nav-item"><a href="${course_team_url}">${_("Course Team")}</a></li> <li class="nav-item"><a href="${course_team_url}">${_("Course Team")}</a></li>
% if settings.FEATURES.get('ENABLE_GROUP_CONFIGURATIONS') and "split_test" in context_course.advanced_modules: % if "split_test" in context_course.advanced_modules:
<li class="nav-item"><a href="${utils.reverse_course_url('group_configurations_list_handler', context_course.id)}">${_("Group Configurations")}</a></li> <li class="nav-item"><a href="${utils.reverse_course_url('group_configurations_list_handler', context_course.id)}">${_("Group Configurations")}</a></li>
% endif % endif
</ul> </ul>
......
...@@ -148,7 +148,7 @@ require(["domReady!", "jquery", "js/views/settings/grading", "js/models/settings ...@@ -148,7 +148,7 @@ require(["domReady!", "jquery", "js/views/settings/grading", "js/models/settings
<li class="nav-item"><a href="${detailed_settings_url}">${_("Details &amp; Schedule")}</a></li> <li class="nav-item"><a href="${detailed_settings_url}">${_("Details &amp; Schedule")}</a></li>
<li class="nav-item"><a href="${course_team_url}">${_("Course Team")}</a></li> <li class="nav-item"><a href="${course_team_url}">${_("Course Team")}</a></li>
<li class="nav-item"><a href="${advanced_settings_url}">${_("Advanced Settings")}</a></li> <li class="nav-item"><a href="${advanced_settings_url}">${_("Advanced Settings")}</a></li>
% if settings.FEATURES.get('ENABLE_GROUP_CONFIGURATIONS') and "split_test" in context_course.advanced_modules: % if "split_test" in context_course.advanced_modules:
<li class="nav-item"><a href="${utils.reverse_course_url('group_configurations_list_handler', context_course.id)}">${_("Group Configurations")}</a></li> <li class="nav-item"><a href="${utils.reverse_course_url('group_configurations_list_handler', context_course.id)}">${_("Group Configurations")}</a></li>
% endif % endif
</ul> </ul>
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
<li class="nav-item nav-course-settings-advanced"> <li class="nav-item nav-course-settings-advanced">
<a href="${advanced_settings_url}">${_("Advanced Settings")}</a> <a href="${advanced_settings_url}">${_("Advanced Settings")}</a>
</li> </li>
% if settings.FEATURES.get('ENABLE_GROUP_CONFIGURATIONS') and "split_test" in context_course.advanced_modules: % if "split_test" in context_course.advanced_modules:
<li class="nav-item nav-course-settings-group-configurations"> <li class="nav-item nav-course-settings-group-configurations">
<a href="${reverse('contentstore.views.group_configurations_list_handler', kwargs={'course_key_string': unicode(course_key)})}">${_("Group Configurations")}</a> <a href="${reverse('contentstore.views.group_configurations_list_handler', kwargs={'course_key_string': unicode(course_key)})}">${_("Group Configurations")}</a>
</li> </li>
......
...@@ -91,15 +91,11 @@ urlpatterns += patterns( ...@@ -91,15 +91,11 @@ urlpatterns += patterns(
url(r'^settings/advanced/{}$'.format(settings.COURSE_KEY_PATTERN), 'advanced_settings_handler'), url(r'^settings/advanced/{}$'.format(settings.COURSE_KEY_PATTERN), 'advanced_settings_handler'),
url(r'^textbooks/{}$'.format(settings.COURSE_KEY_PATTERN), 'textbooks_list_handler'), url(r'^textbooks/{}$'.format(settings.COURSE_KEY_PATTERN), 'textbooks_list_handler'),
url(r'^textbooks/{}/(?P<textbook_id>\d[^/]*)$'.format(settings.COURSE_KEY_PATTERN), 'textbooks_detail_handler'), url(r'^textbooks/{}/(?P<textbook_id>\d[^/]*)$'.format(settings.COURSE_KEY_PATTERN), 'textbooks_detail_handler'),
url(r'^group_configurations/{}$'.format(settings.COURSE_KEY_PATTERN), 'group_configurations_list_handler'),
url(r'^group_configurations/{}/(?P<group_configuration_id>\d+)/?$'.format(settings.COURSE_KEY_PATTERN),
'group_configurations_detail_handler'),
) )
if settings.FEATURES.get('ENABLE_GROUP_CONFIGURATIONS'):
urlpatterns += patterns('contentstore.views',
url(r'^group_configurations/{}$'.format(settings.COURSE_KEY_PATTERN), 'group_configurations_list_handler'),
url(r'^group_configurations/{}/(?P<group_configuration_id>\d+)/?$'.format(settings.COURSE_KEY_PATTERN),
'group_configurations_detail_handler'),
)
js_info_dict = { js_info_dict = {
'domain': 'djangojs', 'domain': 'djangojs',
# We need to explicitly include external Django apps that are not in LOCALE_PATHS. # We need to explicitly include external Django apps that are not in LOCALE_PATHS.
......
...@@ -6,6 +6,7 @@ import logging ...@@ -6,6 +6,7 @@ import logging
import json import json
from webob import Response from webob import Response
from uuid import uuid4 from uuid import uuid4
from operator import itemgetter
from xmodule.progress import Progress from xmodule.progress import Progress
from xmodule.seq_module import SequenceDescriptor from xmodule.seq_module import SequenceDescriptor
...@@ -235,24 +236,41 @@ class SplitTestModule(SplitTestFields, XModule, StudioEditableModule): ...@@ -235,24 +236,41 @@ class SplitTestModule(SplitTestFields, XModule, StudioEditableModule):
Render the staff view for a split test module. Render the staff view for a split test module.
""" """
fragment = Fragment() fragment = Fragment()
contents = [] active_contents = []
inactive_contents = []
for group_id in self.group_id_to_child: for child_location in self.children: # pylint: disable=no-member
child_location = self.group_id_to_child[group_id]
child_descriptor = self.get_child_descriptor_by_location(child_location) child_descriptor = self.get_child_descriptor_by_location(child_location)
child = self.system.get_module(child_descriptor) child = self.system.get_module(child_descriptor)
rendered_child = child.render(STUDENT_VIEW, context) rendered_child = child.render(STUDENT_VIEW, context)
fragment.add_frag_resources(rendered_child) fragment.add_frag_resources(rendered_child)
group_name, updated_group_id = self.get_data_for_vertical(child)
contents.append({
'group_id': group_id, if updated_group_id is None: # inactive group
group_name = child.display_name
updated_group_id = [g_id for g_id, loc in self.group_id_to_child.items() if loc == child_location][0]
inactive_contents.append({
'group_name': _(u'{group_name} (inactive)').format(group_name=group_name),
'id': child.location.to_deprecated_string(),
'content': rendered_child.content,
'group_id': updated_group_id,
})
continue
active_contents.append({
'group_name': group_name,
'id': child.location.to_deprecated_string(), 'id': child.location.to_deprecated_string(),
'content': rendered_child.content 'content': rendered_child.content,
'group_id': updated_group_id,
}) })
# Sort active and inactive contents by group name.
sorted_active_contents = sorted(active_contents, key=itemgetter('group_name'))
sorted_inactive_contents = sorted(inactive_contents, key=itemgetter('group_name'))
# Use the new template # Use the new template
fragment.add_content(self.system.render_template('split_test_staff_view.html', { fragment.add_content(self.system.render_template('split_test_staff_view.html', {
'items': contents, 'items': sorted_active_contents + sorted_inactive_contents,
})) }))
fragment.add_css('.split-test-child { display: none; }') fragment.add_css('.split-test-child { display: none; }')
fragment.add_javascript_url(self.runtime.local_resource_url(self, 'public/js/split_test_staff.js')) fragment.add_javascript_url(self.runtime.local_resource_url(self, 'public/js/split_test_staff.js'))
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
split_test = context.get('split_test') split_test = context.get('split_test')
user_partition = split_test.descriptor.get_selected_partition() user_partition = split_test.descriptor.get_selected_partition()
messages = split_test.descriptor.validation_messages() messages = split_test.descriptor.validation_messages()
show_link = settings.FEATURES.get('ENABLE_GROUP_CONFIGURATIONS') and group_configuration_url is not None show_link = group_configuration_url is not None
%> %>
% if is_root and not is_configured: % if is_root and not is_configured:
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<select class="split-test-select"> <select class="split-test-select">
% for idx, item in enumerate(items): % for idx, item in enumerate(items):
## Translators: The 'Group' here refers to the group of users that has been sorted into group_id ## Translators: The 'Group' here refers to the group of users that has been sorted into group_id
<option value="${item['group_id']}">${_("Group {group_id}").format(group_id=item['group_id'])}</option> <option value="${item['group_id']}">${item['group_name']}</option>
%endfor %endfor
</select> </select>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment