Commit b147117d by Diana Huang

Merge pull request #8055 from edx/diana/team-advanced-setting

New teams advanced setting
parents dd20badc 358aa775
...@@ -74,6 +74,10 @@ class CourseMetadata(object): ...@@ -74,6 +74,10 @@ class CourseMetadata(object):
not settings.FEATURES.get("DASHBOARD_SHARE_SETTINGS").get("CUSTOM_COURSE_URLS")): not settings.FEATURES.get("DASHBOARD_SHARE_SETTINGS").get("CUSTOM_COURSE_URLS")):
filtered_list.append('social_sharing_url') filtered_list.append('social_sharing_url')
# Do not show teams configuration if feature is disabled.
if not settings.FEATURES.get('ENABLE_TEAMS'):
filtered_list.append('teams_configuration')
return filtered_list return filtered_list
@classmethod @classmethod
......
...@@ -68,6 +68,9 @@ FEATURES['ENABLE_PREREQUISITE_COURSES'] = True ...@@ -68,6 +68,9 @@ FEATURES['ENABLE_PREREQUISITE_COURSES'] = True
# Enable student notes # Enable student notes
FEATURES['ENABLE_EDXNOTES'] = True FEATURES['ENABLE_EDXNOTES'] = True
# Enable teams feature
FEATURES['ENABLE_TEAMS'] = True
########################### Entrance Exams ################################# ########################### Entrance Exams #################################
FEATURES['ENTRANCE_EXAMS'] = True FEATURES['ENTRANCE_EXAMS'] = True
......
...@@ -155,7 +155,10 @@ FEATURES = { ...@@ -155,7 +155,10 @@ FEATURES = {
'DASHBOARD_SHARE_SETTINGS': { 'DASHBOARD_SHARE_SETTINGS': {
# Note: Ensure 'CUSTOM_COURSE_URLS' has a matching value in lms/envs/common.py # Note: Ensure 'CUSTOM_COURSE_URLS' has a matching value in lms/envs/common.py
'CUSTOM_COURSE_URLS': False 'CUSTOM_COURSE_URLS': False
} },
# Teams feature
'ENABLE_TEAMS': False,
} }
ENABLE_JASMINE = False ENABLE_JASMINE = False
......
...@@ -271,5 +271,9 @@ FEATURES['ENABLE_COURSEWARE_INDEX'] = True ...@@ -271,5 +271,9 @@ FEATURES['ENABLE_COURSEWARE_INDEX'] = True
FEATURES['ENABLE_LIBRARY_INDEX'] = True FEATURES['ENABLE_LIBRARY_INDEX'] = True
SEARCH_ENGINE = "search.tests.mock_search_engine.MockSearchEngine" SEARCH_ENGINE = "search.tests.mock_search_engine.MockSearchEngine"
# teams feature
FEATURES['ENABLE_TEAMS'] = True
# Dummy secret key for dev/test # Dummy secret key for dev/test
SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd' SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd'
...@@ -846,6 +846,15 @@ class CourseFields(object): ...@@ -846,6 +846,15 @@ class CourseFields(object):
scope=Scope.settings, scope=Scope.settings,
) )
teams_configuration = Dict(
display_name=_("Teams Configuration"),
help=_(
"Enter configuration for the teams feature. Expects two entries: max_team_size and topics, where "
"topics is a list of topics."
),
scope=Scope.settings
)
class CourseModule(CourseFields, SequenceModule): # pylint: disable=abstract-method class CourseModule(CourseFields, SequenceModule): # pylint: disable=abstract-method
""" """
...@@ -1408,3 +1417,28 @@ class CourseDescriptor(CourseFields, SequenceDescriptor): ...@@ -1408,3 +1417,28 @@ class CourseDescriptor(CourseFields, SequenceDescriptor):
return "course_{}".format( return "course_{}".format(
b32encode(unicode(self.location.course_key)).replace('=', padding_char) b32encode(unicode(self.location.course_key)).replace('=', padding_char)
) )
@property
def teams_enabled(self):
"""
Returns whether or not teams has been enabled for this course.
Currently, teams are considered enabled when at least one topic has been configured for the course.
"""
if self.teams_configuration:
return len(self.teams_configuration.get('topics', [])) > 0
return False
@property
def teams_max_size(self):
"""
Returns the max size for teams if teams has been configured, else None.
"""
return self.teams_configuration.get('max_team_size', None)
@property
def teams_topics(self):
"""
Returns the topics that have been configured for teams for this course, else None.
"""
return self.teams_configuration.get('topics', None)
...@@ -4,6 +4,7 @@ from datetime import datetime, timedelta ...@@ -4,6 +4,7 @@ from datetime import datetime, timedelta
from fs.memoryfs import MemoryFS from fs.memoryfs import MemoryFS
from mock import Mock, patch from mock import Mock, patch
import itertools
from xblock.runtime import KvsFieldData, DictKeyValueStore from xblock.runtime import KvsFieldData, DictKeyValueStore
...@@ -277,3 +278,73 @@ class DiscussionTopicsTestCase(unittest.TestCase): ...@@ -277,3 +278,73 @@ class DiscussionTopicsTestCase(unittest.TestCase):
def test_default_discussion_topics(self): def test_default_discussion_topics(self):
d = get_dummy_course('2012-12-02T12:00') d = get_dummy_course('2012-12-02T12:00')
self.assertEqual({'General': {'id': 'i4x-test_org-test_course-course-test'}}, d.discussion_topics) self.assertEqual({'General': {'id': 'i4x-test_org-test_course-course-test'}}, d.discussion_topics)
class TeamsConfigurationTestCase(unittest.TestCase):
"""
Tests for the configuration of teams and the helper methods for accessing them.
"""
def setUp(self):
super(TeamsConfigurationTestCase, self).setUp()
self.course = get_dummy_course('2012-12-02T12:00')
self.course.teams_configuration = dict()
self.count = itertools.count()
def add_team_configuration(self, max_team_size=3, topics=None):
""" Add a team configuration to the course. """
teams_configuration = {}
teams_configuration["topics"] = [] if topics is None else topics
if max_team_size is not None:
teams_configuration["max_team_size"] = max_team_size
self.course.teams_configuration = teams_configuration
def make_topic(self):
""" Make a sample topic dictionary. """
next_num = self.count.next()
topic_id = "topic_id_{}".format(next_num)
display_name = "Display Name {}".format(next_num)
description = "Description {}".format(next_num)
return {"display_name": display_name, "description": description, "id": topic_id}
def test_teams_enabled_new_course(self):
# Make sure we can detect when no teams exist.
self.assertFalse(self.course.teams_enabled)
# add topics
self.add_team_configuration(max_team_size=4, topics=[self.make_topic()])
self.assertTrue(self.course.teams_enabled)
# remove them again
self.add_team_configuration(max_team_size=4, topics=[])
self.assertFalse(self.course.teams_enabled)
def test_teams_enabled_max_size_only(self):
self.add_team_configuration(max_team_size=4)
self.assertFalse(self.course.teams_enabled)
def test_teams_enabled_no_max_size(self):
self.add_team_configuration(max_team_size=None, topics=[self.make_topic()])
self.assertTrue(self.course.teams_enabled)
def test_teams_max_size_no_teams_configuration(self):
self.assertIsNone(self.course.teams_max_size)
def test_teams_max_size_with_teams_configured(self):
size = 4
self.add_team_configuration(max_team_size=size, topics=[self.make_topic(), self.make_topic()])
self.assertTrue(self.course.teams_enabled)
self.assertEqual(size, self.course.teams_max_size)
def test_teams_topics_no_teams(self):
self.assertIsNone(self.course.teams_topics)
def test_teams_topics_no_topics(self):
self.add_team_configuration(max_team_size=4)
self.assertEqual(self.course.teams_topics, [])
def test_teams_topics_with_topics(self):
topics = [self.make_topic(), self.make_topic()]
self.add_team_configuration(max_team_size=4, topics=topics)
self.assertTrue(self.course.teams_enabled)
self.assertEqual(self.course.teams_topics, topics)
...@@ -198,4 +198,5 @@ class AdvancedSettingsPage(CoursePage): ...@@ -198,4 +198,5 @@ class AdvancedSettingsPage(CoursePage):
'text_customization', 'text_customization',
'annotation_storage_url', 'annotation_storage_url',
'social_sharing_url', 'social_sharing_url',
'teams_configuration',
] ]
...@@ -96,6 +96,9 @@ FEATURES['ENABLE_PREREQUISITE_COURSES'] = True ...@@ -96,6 +96,9 @@ FEATURES['ENABLE_PREREQUISITE_COURSES'] = True
# Enable student notes # Enable student notes
FEATURES['ENABLE_EDXNOTES'] = True FEATURES['ENABLE_EDXNOTES'] = True
# Enable teams feature
FEATURES['ENABLE_TEAMS'] = True
# Unfortunately, we need to use debug mode to serve staticfiles # Unfortunately, we need to use debug mode to serve staticfiles
DEBUG = True DEBUG = True
......
...@@ -386,6 +386,9 @@ FEATURES = { ...@@ -386,6 +386,9 @@ FEATURES = {
# Software secure fake page feature flag # Software secure fake page feature flag
'ENABLE_SOFTWARE_SECURE_FAKE': False, 'ENABLE_SOFTWARE_SECURE_FAKE': False,
# Teams feature
'ENABLE_TEAMS': False,
} }
# Ignore static asset files on import which match this pattern # Ignore static asset files on import which match this pattern
......
...@@ -449,6 +449,9 @@ MONGODB_LOG = { ...@@ -449,6 +449,9 @@ MONGODB_LOG = {
# Enable EdxNotes for tests. # Enable EdxNotes for tests.
FEATURES['ENABLE_EDXNOTES'] = True FEATURES['ENABLE_EDXNOTES'] = True
# Enable teams feature for tests.
FEATURES['ENABLE_TEAMS'] = True
# Add milestones to Installed apps for testing # Add milestones to Installed apps for testing
INSTALLED_APPS += ('milestones', ) INSTALLED_APPS += ('milestones', )
......
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