Commit b9056f96 by Cliff Dyer Committed by GitHub

Merge pull request #12951 from edx/release

Release
parents c72d2b56 e6c88a24
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
Test the Studio help links. Test the Studio help links.
""" """
from flaky import flaky
from .base_studio_test import StudioCourseTest from .base_studio_test import StudioCourseTest
from ...pages.studio.index import DashboardPage from ...pages.studio.index import DashboardPage
from ...pages.studio.utils import click_studio_help, studio_help_links from ...pages.studio.utils import click_studio_help, studio_help_links
...@@ -10,6 +12,7 @@ from ...pages.studio.utils import click_studio_help, studio_help_links ...@@ -10,6 +12,7 @@ from ...pages.studio.utils import click_studio_help, studio_help_links
class StudioHelpTest(StudioCourseTest): class StudioHelpTest(StudioCourseTest):
"""Tests for Studio help.""" """Tests for Studio help."""
@flaky # TODO: TNL-4954
def test_studio_help_links(self): def test_studio_help_links(self):
"""Test that the help links are present and have the correct content.""" """Test that the help links are present and have the correct content."""
page = DashboardPage(self.browser) page = DashboardPage(self.browser)
......
...@@ -5,6 +5,7 @@ Tests for UserPartitionTransformer. ...@@ -5,6 +5,7 @@ Tests for UserPartitionTransformer.
from collections import namedtuple from collections import namedtuple
import ddt import ddt
from nose.plugins.attrib import attr from nose.plugins.attrib import attr
import string
from openedx.core.djangoapps.course_groups.partition_scheme import CohortPartitionScheme from openedx.core.djangoapps.course_groups.partition_scheme import CohortPartitionScheme
from openedx.core.djangoapps.course_groups.tests.helpers import CohortFactory, config_course_cohorts from openedx.core.djangoapps.course_groups.tests.helpers import CohortFactory, config_course_cohorts
...@@ -25,7 +26,7 @@ class UserPartitionTestMixin(object): ...@@ -25,7 +26,7 @@ class UserPartitionTestMixin(object):
""" """
TRANSFORMER_CLASS_TO_TEST = UserPartitionTransformer TRANSFORMER_CLASS_TO_TEST = UserPartitionTransformer
def setup_groups_partitions(self, num_user_partitions=1, num_groups=4): def setup_groups_partitions(self, num_user_partitions=1, num_groups=4, active=True):
""" """
Sets up groups and user partitions for testing. Sets up groups and user partitions for testing.
""" """
...@@ -42,7 +43,8 @@ class UserPartitionTestMixin(object): ...@@ -42,7 +43,8 @@ class UserPartitionTestMixin(object):
name='Partition ' + unicode(user_partition_num), name='Partition ' + unicode(user_partition_num),
description='This is partition ' + unicode(user_partition_num), description='This is partition ' + unicode(user_partition_num),
groups=self.groups, groups=self.groups,
scheme=CohortPartitionScheme scheme=CohortPartitionScheme,
active=active,
) )
user_partition.scheme.name = "cohort" user_partition.scheme.name = "cohort"
self.user_partitions.append(user_partition) self.user_partitions.append(user_partition)
...@@ -72,15 +74,16 @@ class UserPartitionTransformerTestCase(UserPartitionTestMixin, CourseStructureTe ...@@ -72,15 +74,16 @@ class UserPartitionTransformerTestCase(UserPartitionTestMixin, CourseStructureTe
""" """
UserPartitionTransformer Test UserPartitionTransformer Test
""" """
def setUp(self): def setup_partitions_and_course(self, active=True):
""" """
Setup course structure and create user for user partition Setup course structure and create user for user partition
transformer test. transformer test.
Args:
active: boolean representing if the user partitions are
active or not
""" """
super(UserPartitionTransformerTestCase, self).setUp()
# Set up user partitions and groups. # Set up user partitions and groups.
self.setup_groups_partitions() self.setup_groups_partitions(active=active)
self.user_partition = self.user_partitions[0] self.user_partition = self.user_partitions[0]
# Build course. # Build course.
...@@ -89,7 +92,9 @@ class UserPartitionTransformerTestCase(UserPartitionTestMixin, CourseStructureTe ...@@ -89,7 +92,9 @@ class UserPartitionTransformerTestCase(UserPartitionTestMixin, CourseStructureTe
self.course = self.blocks['course'] self.course = self.blocks['course']
# Enroll user in course. # Enroll user in course.
CourseEnrollmentFactory.create(user=self.user, course_id=self.course.id, is_active=True) CourseEnrollmentFactory.create(
user=self.user, course_id=self.course.id, is_active=True
)
# Set up cohorts. # Set up cohorts.
self.setup_cohorts(self.course) self.setup_cohorts(self.course)
...@@ -199,6 +204,7 @@ class UserPartitionTransformerTestCase(UserPartitionTestMixin, CourseStructureTe ...@@ -199,6 +204,7 @@ class UserPartitionTransformerTestCase(UserPartitionTestMixin, CourseStructureTe
) )
@ddt.unpack @ddt.unpack
def test_transform(self, group_id, expected_blocks): def test_transform(self, group_id, expected_blocks):
self.setup_partitions_and_course()
if group_id: if group_id:
cohort = self.partition_cohorts[self.user_partition.id - 1][group_id - 1] cohort = self.partition_cohorts[self.user_partition.id - 1][group_id - 1]
add_user_to_cohort(cohort, self.user.username) add_user_to_cohort(cohort, self.user.username)
...@@ -213,6 +219,27 @@ class UserPartitionTransformerTestCase(UserPartitionTestMixin, CourseStructureTe ...@@ -213,6 +219,27 @@ class UserPartitionTransformerTestCase(UserPartitionTestMixin, CourseStructureTe
self.get_block_key_set(self.blocks, *expected_blocks) self.get_block_key_set(self.blocks, *expected_blocks)
) )
def test_transform_on_inactive_partition(self):
"""
Tests UserPartitionTransformer for inactive UserPartition.
"""
self.setup_partitions_and_course(active=False)
# we expect to find all blocks because the UserPartitions are all
# inactive
expected_blocks = ('course',) + tuple(string.ascii_uppercase[:15])
trans_block_structure = get_course_blocks(
self.user,
self.course.location,
self.transformers,
)
self.assertSetEqual(
set(trans_block_structure.get_block_keys()),
self.get_block_key_set(self.blocks, *expected_blocks)
)
@attr('shard_3') @attr('shard_3')
@ddt.ddt @ddt.ddt
......
...@@ -42,7 +42,11 @@ class UserPartitionTransformer(FilteringTransformerMixin, BlockStructureTransfor ...@@ -42,7 +42,11 @@ class UserPartitionTransformer(FilteringTransformerMixin, BlockStructureTransfor
# Because user partitions are course-wide, only store data for # Because user partitions are course-wide, only store data for
# them on the root block. # them on the root block.
root_block = block_structure.get_xblock(block_structure.root_block_usage_key) root_block = block_structure.get_xblock(block_structure.root_block_usage_key)
user_partitions = getattr(root_block, 'user_partitions', []) or [] user_partitions = [
user_partition
for user_partition in getattr(root_block, 'user_partitions', [])
if user_partition.active
]
block_structure.set_transformer_data(cls, 'user_partitions', user_partitions) block_structure.set_transformer_data(cls, 'user_partitions', user_partitions)
# If there are no user partitions, this transformation is a # If there are no user partitions, this transformation is a
......
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
HtmlUtils.HTML('<span class="fa fa-plus placeholder" aria-hidden="true"></span><span class="sr">'), HtmlUtils.HTML('<span class="fa fa-plus placeholder" aria-hidden="true"></span><span class="sr">'),
gettext("Placeholder"), gettext("Placeholder"),
HtmlUtils.HTML('</span>') HtmlUtils.HTML('</span>')
) ),
}, },
messages: { messages: {
...@@ -98,8 +98,8 @@ ...@@ -98,8 +98,8 @@
return (this.modelValue() === true); return (this.modelValue() === true);
}, },
title: function (text) { title: function (title) {
return this.$('.u-field-title').text(text); return HtmlUtils.setHtml(this.$('.u-field-title'), title);
}, },
getMessage: function(message_status) { getMessage: function(message_status) {
...@@ -528,7 +528,8 @@ ...@@ -528,7 +528,8 @@
placeholderValue: this.options.placeholderValue placeholderValue: this.options.placeholderValue
})); }));
this.delegateEvents(); this.delegateEvents();
this.title((this.modelValue() || this.mode === 'edit') ? this.options.title : this.indicators['plus'] + this.options.title); this.title((this.modelValue() || this.mode === 'edit') ?
this.options.title : HtmlUtils.joinHtml(this.indicators.plus, this.options.title));
if (this.editable === 'toggle') { if (this.editable === 'toggle') {
this.showCanEditMessage(this.mode === 'display'); this.showCanEditMessage(this.mode === 'display');
......
...@@ -135,8 +135,6 @@ footer#footer-edx-v3 { ...@@ -135,8 +135,6 @@ footer#footer-edx-v3 {
} }
.app-link { .app-link {
position: absolute;
top: 0;
&:first-of-type { &:first-of-type {
@include left(0); @include left(0);
......
<%! from django.utils.translation import ugettext as _ %> <%! from django.utils.translation import ugettext as _ %>
${_("Thank you for creating an account with {platform_name}!").format(platform_name=settings.PLATFORM_NAME)} ${_("Thank you for creating an account with {platform_name}!").format(platform_name=settings.PLATFORM_NAME)}
"There’s just one more step before you can enroll in a course: " ${_("There's just one more step before you can enroll in a course: "
"You need to activate your {platform_name} account. To activate " "You need to activate your {platform_name} account. To activate "
"your account, click the following link. If that doesn't work, " "your account, click the following link. If that doesn't work, "
"copy and paste the link into your browser's address bar.").format( "copy and paste the link into your browser's address bar.").format(
......
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